]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
Import boost 1.41.
authorbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Dec 2009 01:06:50 +0000 (01:06 +0000)
committerbangerth <bangerth@0785d39b-7218-0410-832d-ea1e28bc413d>
Fri, 11 Dec 2009 01:06:50 +0000 (01:06 +0000)
git-svn-id: https://svn.dealii.org/trunk@20225 0785d39b-7218-0410-832d-ea1e28bc413d

4314 files changed:
deal.II/contrib/boost-1.41.0/include/boost/algorithm/minmax.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/minmax.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/minmax_element.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/minmax_element.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/case_conv.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/case_conv.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/classification.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/classification.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/compare.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/compare.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/concept.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/concept.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/config.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/constants.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/constants.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/case_conv.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/case_conv.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/classification.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/classification.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_format.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_format.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_format_all.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_format_all.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_format_store.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_format_store.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_iterator.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/finder.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/finder.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/finder_regex.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/finder_regex.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/formatter.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/formatter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/formatter_regex.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/formatter_regex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/predicate.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/predicate.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/replace_storage.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/replace_storage.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/sequence.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/sequence.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/trim.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/trim.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/util.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/detail/util.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/erase.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/erase.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/find.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find_format.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/find_format.hpp with 82% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find_iterator.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/find_iterator.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/finder.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/finder.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/formatter.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/formatter.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/iter_find.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/iter_find.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/join.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/join.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/predicate.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/predicate.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/predicate_facade.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/predicate_facade.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/regex.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/regex.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/regex_find_format.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/regex_find_format.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/replace.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/replace.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/sequence_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/sequence_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/split.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/split.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/std/list_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/std/list_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/std/rope_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/std/rope_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/std/slist_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/std/slist_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/std/string_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/std/string_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/std_containers_traits.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/std_containers_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/trim.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/trim.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/yes_no_type.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string/yes_no_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/algorithm/string_regex.hpp [moved from deal.II/contrib/boost/include/boost/algorithm/string_regex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/aligned_storage.hpp [moved from deal.II/contrib/boost/include/boost/aligned_storage.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/any.hpp [moved from deal.II/contrib/boost/include/boost/any.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/archive/add_facet.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/archive_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_archive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iprimitive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oprimitive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_streambuf_locale_saver.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iprimitive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oprimitive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_archive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_wiarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/binary_woarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/codecvt_null.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_prefix.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_suffix.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/archive_serializer_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_archive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_warchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_archive_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_config.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_iserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_oserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/check.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/decl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/iserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/oserializer.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_iarchive_route.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_oarchive_route.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/register_archive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/detail/utf8_codecvt_facet.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/dinkumware.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/archive_serializer_map.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iprimitive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oprimitive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iprimitive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oprimitive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_grammar.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_iarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_oarchive.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_iarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_oarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_wiarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_woarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_iarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_oarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_wiarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_woarchive_impl.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_from_binary.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/binary_from_base64.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/escape.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/head_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/insert_linebreaks.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/istream_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/mb_from_wchar.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/ostream_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/remove_whitespace.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/transform_width.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/unescape.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/wchar_from_mb.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_escape.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_wiarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_woarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_wiarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_woarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/shared_ptr_helper.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/text_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/text_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/text_wiarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/text_woarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/tmpdir.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/wcslen.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/xml_archive_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/xml_iarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/xml_oarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/xml_wiarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/archive/xml_woarchive.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/array.hpp [moved from deal.II/contrib/boost/include/boost/array.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/asio.hpp [moved from deal.II/contrib/boost/include/boost/asio.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/assert.hpp [moved from deal.II/contrib/boost/include/boost/assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/assign.hpp [moved from deal.II/contrib/boost/include/boost/assign.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bimap.hpp [moved from deal.II/contrib/boost/include/boost/bimap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/bind/apply.hpp [moved from deal.II/contrib/boost/include/boost/bind/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/arg.hpp [moved from deal.II/contrib/boost/include/boost/bind/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/bind.hpp [moved from deal.II/contrib/boost/include/boost/bind.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/bind_cc.hpp [moved from deal.II/contrib/boost/include/boost/bind/bind_cc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/bind_mf2_cc.hpp [moved from deal.II/contrib/boost/include/boost/bind/bind_mf2_cc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/bind_mf_cc.hpp [moved from deal.II/contrib/boost/include/boost/bind/bind_mf_cc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/bind_template.hpp [moved from deal.II/contrib/boost/include/boost/bind/bind_template.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/make_adaptable.hpp [moved from deal.II/contrib/boost/include/boost/bind/make_adaptable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/mem_fn.hpp [moved from deal.II/contrib/boost/include/boost/mem_fn.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/mem_fn_cc.hpp [moved from deal.II/contrib/boost/include/boost/bind/mem_fn_cc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/mem_fn_template.hpp [moved from deal.II/contrib/boost/include/boost/bind/mem_fn_template.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/mem_fn_vw.hpp [moved from deal.II/contrib/boost/include/boost/bind/mem_fn_vw.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/bind/placeholders.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/bind/protect.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/bind/storage.hpp [moved from deal.II/contrib/boost/include/boost/bind/storage.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/blank.hpp [moved from deal.II/contrib/boost/include/boost/blank.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/blank_fwd.hpp [moved from deal.II/contrib/boost/include/boost/blank_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/call_traits.hpp [moved from deal.II/contrib/boost/include/boost/call_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/cast.hpp [moved from deal.II/contrib/boost/include/boost/cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/cerrno.hpp [moved from deal.II/contrib/boost/include/boost/cerrno.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/checked_delete.hpp [moved from deal.II/contrib/boost/include/boost/checked_delete.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/circular_buffer.hpp [moved from deal.II/contrib/boost/include/boost/circular_buffer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/circular_buffer_fwd.hpp [moved from deal.II/contrib/boost/include/boost/circular_buffer_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cassert [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cassert with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cctype [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cctype with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cerrno [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cerrno with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cfloat [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cfloat with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/climits [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/climits with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/clocale [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/clocale with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cmath [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cmath with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/csetjmp [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/csetjmp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/csignal [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/csignal with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cstdarg [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cstdarg with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cstddef [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cstddef with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cstdio [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cstdio with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cstdlib [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cstdlib with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cstring [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cstring with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/ctime [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/ctime with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cwchar [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cwchar with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compatibility/cpp_c_headers/cwctype [moved from deal.II/contrib/boost/include/boost/compatibility/cpp_c_headers/cwctype with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/compressed_pair.hpp [moved from deal.II/contrib/boost/include/boost/compressed_pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/assert.hpp [moved from deal.II/contrib/boost/include/boost/concept/assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/borland.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/borland.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/concept_def.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/concept_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/concept_undef.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/concept_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/general.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/general.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/has_constraints.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/has_constraints.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/detail/msvc.hpp [moved from deal.II/contrib/boost/include/boost/concept/detail/msvc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/requires.hpp [moved from deal.II/contrib/boost/include/boost/concept/requires.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept/usage.hpp [moved from deal.II/contrib/boost/include/boost/concept/usage.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_archetype.hpp [moved from deal.II/contrib/boost/include/boost/concept_archetype.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_check.hpp [moved from deal.II/contrib/boost/include/boost/concept_check.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_check/borland.hpp [moved from deal.II/contrib/boost/include/boost/concept_check/borland.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_check/general.hpp [moved from deal.II/contrib/boost/include/boost/concept_check/general.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_check/has_constraints.hpp [moved from deal.II/contrib/boost/include/boost/concept_check/has_constraints.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/concept_check/msvc.hpp [moved from deal.II/contrib/boost/include/boost/concept_check/msvc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config.hpp [moved from deal.II/contrib/boost/include/boost/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi/borland_prefix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi/borland_prefix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi/borland_suffix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi/borland_suffix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi/msvc_prefix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi/msvc_prefix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi/msvc_suffix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi/msvc_suffix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi_prefix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi_prefix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/abi_suffix.hpp [moved from deal.II/contrib/boost/include/boost/config/abi_suffix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/auto_link.hpp [moved from deal.II/contrib/boost/include/boost/config/auto_link.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/borland.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/borland.hpp with 82% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/codegear.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/codegear.hpp with 71% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/comeau.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/comeau.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/common_edg.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/common_edg.hpp with 64% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/compaq_cxx.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/compaq_cxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/digitalmars.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/digitalmars.hpp with 72% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/gcc.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/gcc.hpp with 66% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/gcc_xml.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/gcc_xml.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/greenhills.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/greenhills.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/hp_acc.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/hp_acc.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/intel.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/intel.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/kai.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/kai.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/metrowerks.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/metrowerks.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/mpw.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/mpw.hpp with 65% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/pgi.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/pgi.hpp with 50% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/sgi_mipspro.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/sgi_mipspro.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/sunpro_cc.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/sunpro_cc.hpp with 80% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/vacpp.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/vacpp.hpp with 68% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/compiler/visualc.hpp [moved from deal.II/contrib/boost/include/boost/config/compiler/visualc.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/no_tr1/cmath.hpp [moved from deal.II/contrib/boost/include/boost/config/no_tr1/cmath.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/no_tr1/complex.hpp [moved from deal.II/contrib/boost/include/boost/config/no_tr1/complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/no_tr1/functional.hpp [moved from deal.II/contrib/boost/include/boost/config/no_tr1/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/no_tr1/memory.hpp [moved from deal.II/contrib/boost/include/boost/config/no_tr1/memory.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/no_tr1/utility.hpp [moved from deal.II/contrib/boost/include/boost/config/no_tr1/utility.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/aix.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/aix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/amigaos.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/amigaos.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/beos.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/beos.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/bsd.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/bsd.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/cygwin.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/cygwin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/hpux.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/hpux.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/irix.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/irix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/linux.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/linux.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/macos.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/macos.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/qnxnto.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/qnxnto.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/solaris.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/solaris.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/vxworks.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/config/platform/win32.hpp [moved from deal.II/contrib/boost/include/boost/config/platform/win32.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/posix_features.hpp [moved from deal.II/contrib/boost/include/boost/config/posix_features.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/requires_threads.hpp [moved from deal.II/contrib/boost/include/boost/config/requires_threads.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/select_compiler_config.hpp [moved from deal.II/contrib/boost/include/boost/config/select_compiler_config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/select_platform_config.hpp [moved from deal.II/contrib/boost/include/boost/config/select_platform_config.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/select_stdlib_config.hpp [moved from deal.II/contrib/boost/include/boost/config/select_stdlib_config.hpp with 74% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/dinkumware.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/dinkumware.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/libcomo.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/libcomo.hpp with 59% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/libstdcpp3.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/libstdcpp3.hpp with 60% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/modena.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/msl.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/msl.hpp with 59% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/roguewave.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/roguewave.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/sgi.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/sgi.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/stlport.hpp [moved from deal.II/contrib/boost/include/boost/config/stdlib/stlport.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/vacpp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/config/suffix.hpp [moved from deal.II/contrib/boost/include/boost/config/suffix.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/user.hpp [moved from deal.II/contrib/boost/include/boost/config/user.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/config/warning_disable.hpp [moved from deal.II/contrib/boost/include/boost/config/warning_disable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/crc.hpp [moved from deal.II/contrib/boost/include/boost/crc.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/cregex.hpp [moved from deal.II/contrib/boost/include/boost/cregex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/cstdint.hpp [moved from deal.II/contrib/boost/include/boost/cstdint.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/cstdlib.hpp [moved from deal.II/contrib/boost/include/boost/cstdlib.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/current_function.hpp [moved from deal.II/contrib/boost/include/boost/current_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time.hpp [moved from deal.II/contrib/boost/include/boost/date_time.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/adjust_functors.hpp [moved from deal.II/contrib/boost/include/boost/date_time/adjust_functors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/c_local_time_adjustor.hpp [moved from deal.II/contrib/boost/include/boost/date_time/c_local_time_adjustor.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/c_time.hpp [moved from deal.II/contrib/boost/include/boost/date_time/c_time.hpp with 72% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/compiler_config.hpp [moved from deal.II/contrib/boost/include/boost/date_time/compiler_config.hpp with 80% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/constrained_value.hpp [moved from deal.II/contrib/boost/include/boost/date_time/constrained_value.hpp with 67% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_clock_device.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_clock_device.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_defs.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_defs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_duration.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_duration.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_duration_types.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_duration_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_facet.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_facet.hpp with 73% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_format_simple.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_format_simple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_formatting.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_formatting.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_formatting_limited.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_formatting_limited.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_formatting_locales.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_formatting_locales.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generator_formatter.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_generator_formatter.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generator_parser.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_generator_parser.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generators.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_generators.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_iterator.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_names_put.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_names_put.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/date_parsing.hpp [moved from deal.II/contrib/boost/include/boost/date_time/date_parsing.hpp with 69% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/dst_rules.hpp [moved from deal.II/contrib/boost/include/boost/date_time/dst_rules.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/dst_transition_generators.hpp [moved from deal.II/contrib/boost/include/boost/date_time/dst_transition_generators.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/filetime_functions.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/date_time/format_date_parser.hpp [moved from deal.II/contrib/boost/include/boost/date_time/format_date_parser.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/conversion.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/formatters.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/formatters.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/formatters_limited.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/formatters_limited.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_calendar.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_calendar.hpp with 74% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_date.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_date.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_day.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_day.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_day_of_year.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_day_of_year.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_duration.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_duration_types.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_duration_types.hpp with 62% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_facet.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_facet.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_month.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_month.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_serialize.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_serialize.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_weekday.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_weekday.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_year.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_year.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_ymd.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_ymd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/gregorian.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/gregorian.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/gregorian_io.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/gregorian_io.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/gregorian_types.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/gregorian_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/parsers.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian/parsers.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian_calendar.hpp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian_calendar.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian_calendar.ipp [moved from deal.II/contrib/boost/include/boost/date_time/gregorian_calendar.ipp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/int_adapter.hpp [moved from deal.II/contrib/boost/include/boost/date_time/int_adapter.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/iso_format.hpp [moved from deal.II/contrib/boost/include/boost/date_time/iso_format.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/conversion.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/conversion.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/custom_time_zone.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/custom_time_zone.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/date_duration_operators.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/date_duration_operators.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/dst_transition_day_rules.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/dst_transition_day_rules.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_date_time.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/local_date_time.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_time.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/local_time.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_time_io.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/local_time_io.hpp with 57% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_time_types.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/local_time_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/posix_time_zone.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/posix_time_zone.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/tz_database.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time/tz_database.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time_adjustor.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_time_adjustor.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/local_timezone_defs.hpp [moved from deal.II/contrib/boost/include/boost/date_time/local_timezone_defs.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/locale_config.hpp [moved from deal.II/contrib/boost/include/boost/date_time/locale_config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/microsec_time_clock.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/date_time/parse_format_base.hpp [moved from deal.II/contrib/boost/include/boost/date_time/parse_format_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/period.hpp [moved from deal.II/contrib/boost/include/boost/date_time/period.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/period_formatter.hpp [moved from deal.II/contrib/boost/include/boost/date_time/period_formatter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/period_parser.hpp [moved from deal.II/contrib/boost/include/boost/date_time/period_parser.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/conversion.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/conversion.hpp with 70% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/date_duration_operators.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/date_duration_operators.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_config.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_config.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_duration.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_duration.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_io.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_io.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_legacy_io.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_legacy_io.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_system.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_system.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_types.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/ptime.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/ptime.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_formatters.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/time_formatters.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_formatters_limited.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/time_formatters_limited.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_parsers.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/time_parsers.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_period.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/time_period.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_serialize.hpp [moved from deal.II/contrib/boost/include/boost/date_time/posix_time/time_serialize.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/special_defs.hpp [moved from deal.II/contrib/boost/include/boost/date_time/special_defs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/special_values_formatter.hpp [moved from deal.II/contrib/boost/include/boost/date_time/special_values_formatter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/special_values_parser.hpp [moved from deal.II/contrib/boost/include/boost/date_time/special_values_parser.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/string_convert.hpp [moved from deal.II/contrib/boost/include/boost/date_time/string_convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/string_parse_tree.hpp [moved from deal.II/contrib/boost/include/boost/date_time/string_parse_tree.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/strings_from_facet.hpp [moved from deal.II/contrib/boost/include/boost/date_time/strings_from_facet.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_clock.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_clock.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_defs.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_defs.hpp with 73% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_duration.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_duration.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_facet.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_facet.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_formatting_streams.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_formatting_streams.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_iterator.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_parsing.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_parsing.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_resolution_traits.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_resolution_traits.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_system_counted.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_system_counted.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_system_split.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_system_split.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_zone_base.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_zone_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/time_zone_names.hpp [moved from deal.II/contrib/boost/include/boost/date_time/time_zone_names.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/tz_db_base.hpp [moved from deal.II/contrib/boost/include/boost/date_time/tz_db_base.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/wrapping_int.hpp [moved from deal.II/contrib/boost/include/boost/date_time/wrapping_int.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/date_time/year_month_day.hpp [moved from deal.II/contrib/boost/include/boost/date_time/year_month_day.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/algorithm.hpp [moved from deal.II/contrib/boost/include/boost/detail/algorithm.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/allocator_utilities.hpp [moved from deal.II/contrib/boost/include/boost/detail/allocator_utilities.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/atomic_count.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/detail/binary_search.hpp [moved from deal.II/contrib/boost/include/boost/detail/binary_search.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/call_traits.hpp [moved from deal.II/contrib/boost/include/boost/detail/call_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/catch_exceptions.hpp [moved from deal.II/contrib/boost/include/boost/detail/catch_exceptions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/compressed_pair.hpp [moved from deal.II/contrib/boost/include/boost/detail/compressed_pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/container_fwd.hpp [moved from deal.II/contrib/boost/include/boost/functional/detail/container_fwd.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/dynamic_bitset.hpp [moved from deal.II/contrib/boost/include/boost/detail/dynamic_bitset.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/endian.hpp [moved from deal.II/contrib/boost/include/boost/detail/endian.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/has_default_constructor.hpp [moved from deal.II/contrib/boost/include/boost/detail/has_default_constructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/identifier.hpp [moved from deal.II/contrib/boost/include/boost/detail/identifier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/indirect_traits.hpp [moved from deal.II/contrib/boost/include/boost/detail/indirect_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/interlocked.hpp [moved from deal.II/contrib/boost/include/boost/detail/interlocked.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/is_function_ref_tester.hpp [moved from deal.II/contrib/boost/include/boost/detail/is_function_ref_tester.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/is_incrementable.hpp [moved from deal.II/contrib/boost/include/boost/detail/is_incrementable.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/is_xxx.hpp [moved from deal.II/contrib/boost/include/boost/detail/is_xxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/iterator.hpp [moved from deal.II/contrib/boost/include/boost/detail/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/lcast_precision.hpp [moved from deal.II/contrib/boost/include/boost/detail/lcast_precision.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_mutex.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_test.hpp [moved from deal.II/contrib/boost/include/boost/detail/lightweight_test.hpp with 65% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_thread.hpp [moved from deal.II/contrib/boost/include/boost/detail/lightweight_thread.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/limits.hpp [moved from deal.II/contrib/boost/include/boost/detail/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/named_template_params.hpp [moved from deal.II/contrib/boost/include/boost/detail/named_template_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/no_exceptions_support.hpp [moved from deal.II/contrib/boost/include/boost/detail/no_exceptions_support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/none_t.hpp [moved from deal.II/contrib/boost/include/boost/detail/none_t.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/numeric_traits.hpp [moved from deal.II/contrib/boost/include/boost/detail/numeric_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/ob_call_traits.hpp [moved from deal.II/contrib/boost/include/boost/detail/ob_call_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/ob_compressed_pair.hpp [moved from deal.II/contrib/boost/include/boost/detail/ob_compressed_pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/quick_allocator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/detail/reference_content.hpp [moved from deal.II/contrib/boost/include/boost/detail/reference_content.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/scoped_enum_emulation.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/detail/select_type.hpp [moved from deal.II/contrib/boost/include/boost/detail/select_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/sp_typeinfo.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_typeinfo.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/templated_streams.hpp [moved from deal.II/contrib/boost/include/boost/detail/templated_streams.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/utf8_codecvt_facet.hpp [moved from deal.II/contrib/boost/include/boost/detail/utf8_codecvt_facet.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/detail/workaround.hpp [moved from deal.II/contrib/boost/include/boost/detail/workaround.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/dynamic_bitset.hpp [moved from deal.II/contrib/boost/include/boost/dynamic_bitset.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/dynamic_bitset_fwd.hpp [moved from deal.II/contrib/boost/include/boost/dynamic_bitset_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/dynamic_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/enable_shared_from_this.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception.hpp [moved from deal.II/contrib/boost/include/boost/exception.hpp with 52% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/all.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/current_exception_cast.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/attribute_noreturn.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/error_info_impl.hpp [moved from deal.II/contrib/boost/include/boost/exception/detail/error_info_impl.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/exception_ptr_base.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/is_output_streamable.hpp [moved from deal.II/contrib/boost/include/boost/exception/detail/is_output_streamable.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/object_hex_dump.hpp [moved from deal.II/contrib/boost/include/boost/exception/detail/object_hex_dump.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/detail/type_info.hpp [moved from deal.II/contrib/boost/include/boost/exception/detail/type_info.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/diagnostic_information.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/enable_current_exception.hpp [moved from deal.II/contrib/boost/include/boost/exception/enable_current_exception.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/enable_error_info.hpp [moved from deal.II/contrib/boost/include/boost/exception/enable_error_info.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_api_function.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_at_line.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_errno.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_handle.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_name.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_open_mode.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_nested_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_type_info_name.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/exception/error_info.hpp [moved from deal.II/contrib/boost/include/boost/exception/error_info.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/exception.hpp [moved from deal.II/contrib/boost/include/boost/exception/exception.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/get_error_info.hpp [moved from deal.II/contrib/boost/include/boost/exception/get_error_info.hpp with 50% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/info.hpp [moved from deal.II/contrib/boost/include/boost/exception/info.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/info_tuple.hpp [moved from deal.II/contrib/boost/include/boost/exception/info_tuple.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/to_string.hpp [moved from deal.II/contrib/boost/include/boost/exception/to_string.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception/to_string_stub.hpp [moved from deal.II/contrib/boost/include/boost/exception/to_string_stub.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/exception_ptr.hpp [moved from deal.II/contrib/boost/include/boost/exception_ptr.hpp with 67% similarity]
deal.II/contrib/boost-1.41.0/include/boost/filesystem.hpp [moved from deal.II/contrib/boost/include/boost/filesystem.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/foreach.hpp [moved from deal.II/contrib/boost/include/boost/foreach.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format.hpp [moved from deal.II/contrib/boost/include/boost/format.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/alt_sstream.hpp [moved from deal.II/contrib/boost/include/boost/format/alt_sstream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/alt_sstream_impl.hpp [moved from deal.II/contrib/boost/include/boost/format/alt_sstream_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/compat_workarounds.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/compat_workarounds.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/config_macros.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/config_macros.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/msvc_disambiguater.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/msvc_disambiguater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/unset_macros.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/unset_macros.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/workarounds_gcc-2_95.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/workarounds_gcc-2_95.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/detail/workarounds_stlport.hpp [moved from deal.II/contrib/boost/include/boost/format/detail/workarounds_stlport.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/exceptions.hpp [moved from deal.II/contrib/boost/include/boost/format/exceptions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/feed_args.hpp [moved from deal.II/contrib/boost/include/boost/format/feed_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/format_class.hpp [moved from deal.II/contrib/boost/include/boost/format/format_class.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/format_fwd.hpp [moved from deal.II/contrib/boost/include/boost/format/format_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/format_implementation.hpp [moved from deal.II/contrib/boost/include/boost/format/format_implementation.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/free_funcs.hpp [moved from deal.II/contrib/boost/include/boost/format/free_funcs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/group.hpp [moved from deal.II/contrib/boost/include/boost/format/group.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/internals.hpp [moved from deal.II/contrib/boost/include/boost/format/internals.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/internals_fwd.hpp [moved from deal.II/contrib/boost/include/boost/format/internals_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/format/parsing.hpp [moved from deal.II/contrib/boost/include/boost/format/parsing.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function.hpp [moved from deal.II/contrib/boost/include/boost/function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/detail/function_iterate.hpp [moved from deal.II/contrib/boost/include/boost/function/detail/function_iterate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/detail/gen_maybe_include.pl [moved from deal.II/contrib/boost/include/boost/function/detail/gen_maybe_include.pl with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/detail/maybe_include.hpp [moved from deal.II/contrib/boost/include/boost/function/detail/maybe_include.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/detail/prologue.hpp [moved from deal.II/contrib/boost/include/boost/function/detail/prologue.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function0.hpp [moved from deal.II/contrib/boost/include/boost/function/function0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function1.hpp [moved from deal.II/contrib/boost/include/boost/function/function1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function10.hpp [moved from deal.II/contrib/boost/include/boost/function/function10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function2.hpp [moved from deal.II/contrib/boost/include/boost/function/function2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function3.hpp [moved from deal.II/contrib/boost/include/boost/function/function3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function4.hpp [moved from deal.II/contrib/boost/include/boost/function/function4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function5.hpp [moved from deal.II/contrib/boost/include/boost/function/function5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function6.hpp [moved from deal.II/contrib/boost/include/boost/function/function6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function7.hpp [moved from deal.II/contrib/boost/include/boost/function/function7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function8.hpp [moved from deal.II/contrib/boost/include/boost/function/function8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function9.hpp [moved from deal.II/contrib/boost/include/boost/function/function9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function_base.hpp [moved from deal.II/contrib/boost/include/boost/function/function_base.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function_fwd.hpp [moved from deal.II/contrib/boost/include/boost/function/function_fwd.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function_template.hpp [moved from deal.II/contrib/boost/include/boost/function/function_template.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/function_typeof.hpp [moved from deal.II/contrib/boost/include/boost/function/function_typeof.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function/gen_function_N.pl [moved from deal.II/contrib/boost/include/boost/function/gen_function_N.pl with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_equal.hpp [moved from deal.II/contrib/boost/include/boost/function_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_output_iterator.hpp [moved from deal.II/contrib/boost/include/boost/function_output_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/components.hpp [moved from deal.II/contrib/boost/include/boost/function_types/components.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/config/cc_names.hpp [moved from deal.II/contrib/boost/include/boost/function_types/config/cc_names.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/config/compiler.hpp [moved from deal.II/contrib/boost/include/boost/function_types/config/compiler.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/config/config.hpp [moved from deal.II/contrib/boost/include/boost/function_types/config/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/class_transform.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/class_transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity10_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity10_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity10_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity10_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity20_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity20_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity20_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity20_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity30_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity30_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity30_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity30_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity40_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity40_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity40_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity40_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity50_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity50_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/arity50_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/arity50_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/classifier_impl/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/classifier_impl/master.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_as_mpl_sequence.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_as_mpl_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity10_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity10_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity10_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity10_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity20_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity20_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity20_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity20_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity30_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity30_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity30_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity30_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity40_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity40_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity40_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity40_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity50_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity50_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/arity50_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/arity50_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/components_impl/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/components_impl/master.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/cv_traits.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/cv_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/encoding/aliases_def.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/encoding/aliases_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/encoding/aliases_undef.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/encoding/aliases_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/encoding/def.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/encoding/def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/encoding/undef.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/encoding/undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_arity_loop.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_arity_loop.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_cc_loop/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_cc_loop/master.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_cc_loop/preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_cc_loop/preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_loop.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_loop.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_retag_default_cc/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_retag_default_cc/master.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_tags/cc_tag.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_tags/cc_tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_tags/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_tags/master.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_tags/preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_tags/preprocessed.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_variate_loop/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_variate_loop/master.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_variate_loop/preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/pp_variate_loop/preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/retag_default_cc.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/retag_default_cc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity10_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity10_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity10_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity10_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity20_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity20_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity20_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity20_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity30_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity30_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity30_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity30_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity40_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity40_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity40_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity40_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity50_0.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity50_0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/arity50_1.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/arity50_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/synthesize_impl/master.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/synthesize_impl/master.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/to_sequence.hpp [moved from deal.II/contrib/boost/include/boost/function_types/detail/to_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/function_arity.hpp [moved from deal.II/contrib/boost/include/boost/function_types/function_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/function_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/function_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/function_reference.hpp [moved from deal.II/contrib/boost/include/boost/function_types/function_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/function_type.hpp [moved from deal.II/contrib/boost/include/boost/function_types/function_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_callable_builtin.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_callable_builtin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_function.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_function_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_function_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_function_reference.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_function_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_member_function_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_member_function_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_member_object_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_member_object_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_member_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_member_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/is_nonmember_callable_builtin.hpp [moved from deal.II/contrib/boost/include/boost/function_types/is_nonmember_callable_builtin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/member_function_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/member_function_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/member_object_pointer.hpp [moved from deal.II/contrib/boost/include/boost/function_types/member_object_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/parameter_types.hpp [moved from deal.II/contrib/boost/include/boost/function_types/parameter_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/property_tags.hpp [moved from deal.II/contrib/boost/include/boost/function_types/property_tags.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/function_types/result_type.hpp [moved from deal.II/contrib/boost/include/boost/function_types/result_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional.hpp [moved from deal.II/contrib/boost/include/boost/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional/detail/container_fwd.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash.hpp [moved from deal.II/contrib/boost/include/boost/functional/hash.hpp with 55% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/float_functions.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_generic.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_x86.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/limits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/extensions.hpp [moved from deal.II/contrib/boost/include/boost/functional/hash/extensions.hpp with 59% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/hash.hpp [moved from deal.II/contrib/boost/include/boost/functional/hash/hash.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash/hash_fwd.hpp [moved from deal.II/contrib/boost/include/boost/functional/hash_fwd.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/functional/hash_fwd.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/array_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/array_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/category_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/category_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/is_sequence_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/is_sequence_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/is_view_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/is_view_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/array/tag_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/array/tag_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/category_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/is_sequence_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/is_view_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/tag_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/tag_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_assoc_class.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_class.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/class_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_key_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/begin_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/category_of_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/category_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/category_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/empty_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/empty_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/has_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/has_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/is_sequence_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/is_view_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/is_view_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/mpl/mpl_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/mpl/mpl_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/category_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/category_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/is_sequence_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/is_sequence_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/is_view_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/is_view_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/std_pair_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/std_pair_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/std_pair/tag_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/std_pair/tag_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/adapt_assoc_struct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/adapt_struct.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/adapt_struct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/category_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/category_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/has_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/has_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/is_sequence_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/is_sequence_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/is_view_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/detail/value_at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/detail/value_at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/extension.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/extension.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/struct_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/adapted/struct/struct_iterator.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/accumulate.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/accumulate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/detail/fold.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/detail/fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/detail/for_each.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/detail/for_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/fold.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/iteration/for_each.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/iteration/for_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/all.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/all.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/any.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/any.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/count.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/count.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/count_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/count_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/all.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/all.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/any.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/any.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/assoc_find.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/assoc_find.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/count.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/count.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/count_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/count_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/find_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/find_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/ext_/find_if_s.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/find.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/find.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/find_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/find_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/none.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/query/none.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/clear.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/clear.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/detail/replace.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/detail/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/detail/replace_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/detail/replace_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/erase.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/erase.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/erase_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/erase_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/filter.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/filter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/filter_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/filter_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/insert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/insert_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/insert_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/join.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/join.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/push_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/push_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/remove.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/remove.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/remove_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/remove_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/replace.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/replace_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/replace_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/reverse.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/transform.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/zip.hpp [moved from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/zip.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/back_extended_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/back_extended_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/deque_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/deque_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/deque_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/deque_iterator.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/as_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/as_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/convert_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/convert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/deque_forward_ctor.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/deque_forward_ctor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/deque_initial_size.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/deque_initial_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/deque_keyed_values.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/deque_keyed_values_call.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/deque_keyed_values_call.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/keyed_element.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/keyed_element.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/front_extended_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/front_extended_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/deque/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/ext_/tree.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/ext_/tree.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/cons_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/cons_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/deque_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/deque_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/ignore.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/ignore.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/list_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/list_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/make_vector.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/map_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/map_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/pair_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/pair_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/vector_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/generation/vector_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/cons_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/cons_iterator.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/build_cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/build_cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/convert_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/convert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/empty_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/empty_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/equal_to_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/equal_to_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/list_forward_ctor.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/list_forward_ctor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/list_to_cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/list_to_cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/list_to_cons_call.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/list_to_cons_call.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/list_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/list/list_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/as_map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/as_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/convert_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/convert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/lookup_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/lookup_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/map_forward_ctor.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/map_forward_ctor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/map_lookup.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/map_lookup.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/detail/value_at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/detail/value_at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/map/map_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/map/map_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/as_set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/as_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/convert_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/convert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/lookup_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/lookup_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/set_forward_ctor.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/set_forward_ctor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/set_lookup.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/set_lookup.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/detail/value_at_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/detail/value_at_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/set/set_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/set/set_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/advance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/advance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/as_vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/as_vector.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/at_impl.hpp with 69% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/convert_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/convert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/distance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/distance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/equal_to_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/equal_to_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/prior_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/prior_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/vector_forward_ctor.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/vector_forward_ctor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/vector_n.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/vector_n.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp with 62% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector10.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector10.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector20.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector30.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector40.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector50.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/container/vector/vector_iterator.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/detail/access.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/detail/access.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/detail/pow2_explode.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/detail/pow2_explode.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/detail/pt_def.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/detail/pt_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/detail/pt_undef.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/detail/pt_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/fused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/fused.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/fused_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/fused_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/fused_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/fused_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/limits.hpp with 55% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused.hpp [new file with mode: 0755]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused_generic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/unfused_generic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/unfused_lvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/unfused_rvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused_typed.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/adapter/unfused_typed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation.hpp with 76% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/detail/gen_make_adapter.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/detail/gen_make_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_fused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_fused.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_fused_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_fused_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_fused_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_fused_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused_generic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_unfused_generic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused_lvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_unfused_lvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused_rvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/generation/make_unfused_rvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation/detail/that_ptr.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation/detail/that_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation/invoke.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation/invoke.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation/invoke_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation/invoke_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation/invoke_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation/invoke_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/invocation/limits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/functional/invocation/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/accumulate.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/accumulate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/adapt_struct.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/adapt_struct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/adapted.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/adapted.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/adapter.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/advance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/advance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/algorithm.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/algorithm.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/all.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/all.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/any.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/any.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/array.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/as_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/as_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/as_list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/as_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/as_map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/as_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/as_set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/as_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/as_vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/as_vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/at.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/at_c.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/at_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/at_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/at_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/begin.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/boost_tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/boost_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/category_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/category_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/clear.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/comparison.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/comparison.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/cons_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/cons_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/container.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/container.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/count.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/count.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/count_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/count_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deduce.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deduce.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deduce_sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deduce_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deque_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deque_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deque_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deque_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/deref.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/deref.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/distance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/distance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/empty.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/end.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/erase.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/erase.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/erase_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/erase_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/filter.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/filter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/filter_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/filter_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/filter_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/filter_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/find.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/find.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/find_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/find_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/fold.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/for_each.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/for_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/functional.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/fused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/fused.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/fused_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/fused_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/fused_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/fused_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/generation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/generation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/greater.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/has_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/has_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/ignore.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/ignore.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/in.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/in.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/insert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/insert_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/insert_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/intrinsic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/intrinsic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/invocation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/invocation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/invoke.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/invoke.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/invoke_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/invoke_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/invoke_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/invoke_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/io.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/io.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/is_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/is_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/is_sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/is_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/is_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/is_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/iteration.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/iteration.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/iterator_base.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/iterator_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/iterator_facade.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/iterator_facade.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/join.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/join.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/joint_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/joint_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/less.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/list_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/list_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/list_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/list_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_cons.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_cons.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_deque.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_fused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_fused.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_fused_function_object.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_fused_function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_fused_procedure.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_fused_procedure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_list.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_unfused_generic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_unfused_generic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_unfused_lvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_unfused_lvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_unfused_rvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_unfused_rvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/make_vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/make_vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/map.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/map_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/map_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/map_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/map_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/mpl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/mpl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/next.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/next.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/none.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/none.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/nview.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/out.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/out.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/pair.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/pair_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/pair_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/prior.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/prior.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/push_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/push_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/query.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/query.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/remove.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/remove.hpp with 73% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/remove_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/remove_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/repetetive_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/repetetive_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/replace.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/replace_if.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/replace_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/reverse.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/reverse_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/reverse_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/sequence_base.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/sequence_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/sequence_facade.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/sequence_facade.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/set.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/set_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/set_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/single_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/single_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/size.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/std_pair.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/std_pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/struct.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/struct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/support.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/swap.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/swap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/tag_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/tag_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/tag_of_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/tag_of_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/transform.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/transform_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/transform_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/transformation.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/transformation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/tuple_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/tuple_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/tuple_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/tuple_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/unfused_generic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/unfused_generic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/unfused_lvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/unfused_lvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/unfused_rvalue_args.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/unfused_rvalue_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/unfused_typed.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/unfused_typed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/unused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/unused.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/value_at.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/value_at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/value_at_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/value_at_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/value_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/value_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector10.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector20.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector30.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector40.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector50.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/vector_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/vector_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/void.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/void.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/zip.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/zip.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/include/zip_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/include/zip_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/advance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/advance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/deref.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/deref.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/detail/adapt_deref_traits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/detail/adapt_deref_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/detail/adapt_value_traits.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/detail/adapt_value_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/detail/advance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/detail/advance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/detail/distance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/detail/distance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/distance.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/distance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/iterator_facade.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/iterator_facade.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/mpl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/mpl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/mpl/convert_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/mpl/convert_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/mpl/fusion_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/mpl/fusion_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/next.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/next.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/prior.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/prior.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/value_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/iterator/value_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/at.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/begin.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/clear.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/detail/clear.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/detail/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/empty.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/end.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/erase.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/erase.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/erase_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/erase_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/has_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/has_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/insert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/insert_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/insert_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/push_back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/push_front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/mpl/size.hpp [moved from deal.II/contrib/boost/include/boost/fusion/mpl/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/enable_comparison.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/greater.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/less.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/detail/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/greater.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/less.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/comparison/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/comparison/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/convert.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/convert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/at.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/at.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/at_c.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/at_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/at_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/at_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/back.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/begin.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/empty.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/end.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/ext_/segments.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/ext_/segments.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/ext_/size_s.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/front.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/has_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/has_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/size.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/swap.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/swap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/value_at.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/value_at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/value_at_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/value_at_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/in.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/in.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/manip.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/manip.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/out.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/out.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/in.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io/in.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/out.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/io/out.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/sequence_facade.hpp [moved from deal.II/contrib/boost/include/boost/fusion/sequence/sequence_facade.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/category_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/category_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/deduce.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/deduce.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/deduce_sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/deduce_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/access.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/access.hpp with 70% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/as_fusion_element.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/as_fusion_element.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/category_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/category_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/is_mpl_sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/is_mpl_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/is_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/is_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/mpl_iterator_category.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/mpl_iterator_category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/unknown_key.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/detail/unknown_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/ext_/is_segmented.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/ext_/is_segmented.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/is_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/is_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/is_sequence.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/is_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/is_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/is_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/iterator_base.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/iterator_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/pair.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/sequence_base.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/sequence_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/tag_of.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/tag_of.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/tag_of_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/tag_of_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/unused.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/unused.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/support/void.hpp [moved from deal.II/contrib/boost/include/boost/fusion/support/void.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple/detail/tuple_expand.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple/detail/tuple_expand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple/make_tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple/make_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple/tuple.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple/tuple_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple/tuple_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/tuple/tuple_tie.hpp [moved from deal.II/contrib/boost/include/boost/fusion/tuple/tuple_tie.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/detail/strictest_traversal.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/detail/strictest_traversal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/ext_/multiple_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/ext_/multiple_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/ext_/segmented_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/ext_/segmented_iterator.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/ext_/segmented_iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/ext_/segmented_iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/equal_to_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/equal_to_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/filter_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/filter_view.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/filter_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/filter_view/filter_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/iterator_range/iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/iterator_range/iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/joint_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/joint_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/joint_view/joint_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/joint_view/joint_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/advance_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/at_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/begin_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/deref_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/distance_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/end_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/equal_to_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/next_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/nview_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/prior_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/size_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_at_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_of_impl.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/repetitive_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/repetitive_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/advance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/advance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/distance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/distance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/prior_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/prior_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/reverse_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/reverse_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/reverse_view/reverse_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/reverse_view/reverse_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/single_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/single_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/single_view/single_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/single_view/single_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/advance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/advance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/apply_transform_result.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/apply_transform_result.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/distance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/distance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/equal_to_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/equal_to_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/prior_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/prior_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/transform_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/transform_view.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/transform_view_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/transform_view_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/transform_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/transform_view/transform_view_iterator.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/advance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/advance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/begin_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/begin_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/deref_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/deref_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/distance_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/distance_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/end_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/equal_to_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/equal_to_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/next_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/next_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/prior_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/prior_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/value_at_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/value_at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/detail/value_of_impl.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/detail/value_of_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/zip_view.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/zip_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/zip_view_iterator.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/zip_view_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp [moved from deal.II/contrib/boost/include/boost/fusion/view/zip_view/zip_view_iterator_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/generator_iterator.hpp [moved from deal.II/contrib/boost/include/boost/generator_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/get_pointer.hpp [moved from deal.II/contrib/boost/include/boost/get_pointer.hpp with 69% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/accounting.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/adj_list_serialize.hpp [moved from deal.II/contrib/boost/include/boost/graph/adj_list_serialize.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_iterator.hpp [moved from deal.II/contrib/boost/include/boost/graph/adjacency_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_list.hpp [moved from deal.II/contrib/boost/include/boost/graph/adjacency_list.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_list_io.hpp [moved from deal.II/contrib/boost/include/boost/graph/adjacency_list_io.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_matrix.hpp [moved from deal.II/contrib/boost/include/boost/graph/adjacency_matrix.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/astar_search.hpp [moved from deal.II/contrib/boost/include/boost/graph/astar_search.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/bandwidth.hpp [moved from deal.II/contrib/boost/include/boost/graph/bandwidth.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/bc_clustering.hpp [moved from deal.II/contrib/boost/include/boost/graph/bc_clustering.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/bellman_ford_shortest_paths.hpp [moved from deal.II/contrib/boost/include/boost/graph/bellman_ford_shortest_paths.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/betweenness_centrality.hpp [moved from deal.II/contrib/boost/include/boost/graph/betweenness_centrality.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/biconnected_components.hpp [moved from deal.II/contrib/boost/include/boost/graph/biconnected_components.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/boyer_myrvold_planar_test.hpp [moved from deal.II/contrib/boost/include/boost/graph/boyer_myrvold_planar_test.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/breadth_first_search.hpp [moved from deal.II/contrib/boost/include/boost/graph/breadth_first_search.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/bron_kerbosch_all_cliques.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/chrobak_payne_drawing.hpp [moved from deal.II/contrib/boost/include/boost/graph/chrobak_payne_drawing.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/circle_layout.hpp [moved from deal.II/contrib/boost/include/boost/graph/circle_layout.hpp with 73% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/closeness_centrality.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/clustering_coefficient.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/compressed_sparse_row_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/connected_components.hpp [moved from deal.II/contrib/boost/include/boost/graph/connected_components.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/copy.hpp [moved from deal.II/contrib/boost/include/boost/graph/copy.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/core_numbers.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/create_condensation_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/create_condensation_graph.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/cuthill_mckee_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/cuthill_mckee_ordering.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/dag_shortest_paths.hpp [moved from deal.II/contrib/boost/include/boost/graph/dag_shortest_paths.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/degree_centrality.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/depth_first_search.hpp [moved from deal.II/contrib/boost/include/boost/graph/depth_first_search.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/adj_list_edge_iterator.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/adj_list_edge_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/adjacency_list.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/adjacency_list.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/array_binary_tree.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/array_binary_tree.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/compressed_sparse_row_struct.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/connected_components.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/connected_components.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/d_ary_heap.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/edge.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/edge.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/geodesic.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/histogram_sort.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/incidence_iterator.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/incidence_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/incremental_components.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/index.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/indexed_properties.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/indexed_properties.hpp with 70% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/is_same.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/is_same.hpp with 72% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/labeled_graph_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/list_base.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/list_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/permutation.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/permutation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/read_graphviz_new.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/read_graphviz_spirit.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/read_graphviz_spirit.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/self_avoiding_walk.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/self_avoiding_walk.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/set_adaptor.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/set_adaptor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/shadow_iterator.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/shadow_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/detail/sparse_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/detail/sparse_ordering.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/dijkstra_shortest_paths.hpp [moved from deal.II/contrib/boost/include/boost/graph/dijkstra_shortest_paths.hpp with 60% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/dijkstra_shortest_paths_no_color_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/dimacs.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/directed_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjacency_list.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/handlers.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/initialize.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/redistribute.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/serialization.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/betweenness_centrality.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/boman_et_al_graph_coloring.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/breadth_first_search.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/compressed_sparse_row_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/concepts.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components_parallel_search.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/crauser_et_al_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/delta_stepping_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/depth_first_search.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/dijkstra_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/filtered_queue.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/mpi_process_group.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/queue.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/remote_update_set.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/tag_allocator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dijkstra_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/distributed_graph_utility.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/eager_dijkstra_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/filtered_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/fruchterman_reingold.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/graphviz.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/hohberg_biconnected_components.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/local_subgraph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/mpi_process_group.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/named_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/page_rank.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/queue.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/reverse_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/rmat_graph_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/selector.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/shuffled_distribution.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/st_connected.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/strong_components.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/two_bit_color_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/unsafe_serialize.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/vertex_list_adaptor.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/dominator_tree.hpp [moved from deal.II/contrib/boost/include/boost/graph/dominator_tree.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/eccentricity.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/edge_connectivity.hpp [moved from deal.II/contrib/boost/include/boost/graph/edge_connectivity.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/edge_list.hpp [moved from deal.II/contrib/boost/include/boost/graph/edge_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/edmonds_karp_max_flow.hpp [moved from deal.II/contrib/boost/include/boost/graph/edmunds_karp_max_flow.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/edmunds_karp_max_flow.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/erdos_renyi_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/exterior_property.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/filtered_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/filtered_graph.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/floyd_warshall_shortest.hpp [moved from deal.II/contrib/boost/include/boost/graph/floyd_warshall_shortest.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/fruchterman_reingold.hpp [moved from deal.II/contrib/boost/include/boost/graph/fruchterman_reingold.hpp with 52% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/geodesic_distance.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_archetypes.hpp [moved from deal.II/contrib/boost/include/boost/graph/graph_archetypes.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_as_tree.hpp [moved from deal.II/contrib/boost/include/boost/graph/graph_as_tree.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_concepts.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_mutability_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_selectors.hpp [moved from deal.II/contrib/boost/include/boost/graph/graph_selectors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_stats.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_test.hpp [moved from deal.II/contrib/boost/include/boost/graph/graph_test.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/graph_utility.hpp [moved from deal.II/contrib/boost/include/boost/graph/graph_utility.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graphml.hpp [moved from deal.II/contrib/boost/include/boost/graph/graphml.hpp with 74% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/graphviz.hpp [moved from deal.II/contrib/boost/include/boost/graph/graphviz.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/grid_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/gursoy_atun_layout.hpp [moved from deal.II/contrib/boost/include/boost/graph/gursoy_atun_layout.hpp with 63% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/howard_cycle_ratio.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/incremental_components.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/is_kuratowski_subgraph.hpp [moved from deal.II/contrib/boost/include/boost/graph/is_kuratowski_subgraph.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/is_straight_line_drawing.hpp [moved from deal.II/contrib/boost/include/boost/graph/is_straight_line_drawing.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/isomorphism.hpp [moved from deal.II/contrib/boost/include/boost/graph/isomorphism.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/iteration_macros.hpp [moved from deal.II/contrib/boost/include/boost/graph/iteration_macros.hpp with 64% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/iteration_macros_undef.hpp [moved from deal.II/contrib/boost/include/boost/graph/iteration_macros_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/johnson_all_pairs_shortest.hpp [moved from deal.II/contrib/boost/include/boost/graph/johnson_all_pairs_shortest.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/kamada_kawai_spring_layout.hpp [moved from deal.II/contrib/boost/include/boost/graph/kamada_kawai_spring_layout.hpp with 72% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/king_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/king_ordering.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/kolmogorov_max_flow.hpp [moved from deal.II/contrib/boost/include/boost/graph/kolmogorov_max_flow.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/kruskal_min_spanning_tree.hpp [moved from deal.II/contrib/boost/include/boost/graph/kruskal_min_spanning_tree.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/labeled_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/leda_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/leda_graph.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/make_biconnected_planar.hpp [moved from deal.II/contrib/boost/include/boost/graph/make_biconnected_planar.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/make_connected.hpp [moved from deal.II/contrib/boost/include/boost/graph/make_connected.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/make_maximal_planar.hpp [moved from deal.II/contrib/boost/include/boost/graph/make_maximal_planar.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/matrix_as_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/matrix_as_graph.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/max_cardinality_matching.hpp [moved from deal.II/contrib/boost/include/boost/graph/max_cardinality_matching.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/mcgregor_common_subgraphs.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/mesh_graph_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/metis.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/metric_tsp_approx.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/minimum_degree_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/minimum_degree_ordering.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/named_function_params.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/named_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/neighbor_bfs.hpp [moved from deal.II/contrib/boost/include/boost/graph/neighbor_bfs.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/numeric_values.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/overloading.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/page_rank.hpp [moved from deal.II/contrib/boost/include/boost/graph/page_rank.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/algorithm.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/basic_reduce.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/container_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/inplace_all_to_all.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/property_holders.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/untracked_pair.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/distribution.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/process_group.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/properties.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/simple_trigger.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_canonical_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_canonical_ordering.hpp with 82% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/add_edge_visitors.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_detail/add_edge_visitors.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/boyer_myrvold_impl.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_detail/boyer_myrvold_impl.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/bucket_sort.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_detail/bucket_sort.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/face_handles.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_detail/face_handles.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/face_iterators.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_detail/face_iterators.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/planar_face_traversal.hpp [moved from deal.II/contrib/boost/include/boost/graph/planar_face_traversal.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/plod_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/point_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/prim_minimum_spanning_tree.hpp [moved from deal.II/contrib/boost/include/boost/graph/prim_minimum_spanning_tree.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/profile.hpp [moved from deal.II/contrib/boost/include/boost/graph/profile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/properties.hpp [moved from deal.II/contrib/boost/include/boost/graph/properties.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/property_iter_range.hpp [moved from deal.II/contrib/boost/include/boost/graph/property_iter_range.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/constant_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/container_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/matrix_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/null_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/push_relabel_max_flow.hpp [moved from deal.II/contrib/boost/include/boost/graph/push_relabel_max_flow.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/r_c_shortest_paths.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/random.hpp [moved from deal.II/contrib/boost/include/boost/graph/random.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/random_layout.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/read_dimacs.hpp [moved from deal.II/contrib/boost/include/boost/graph/read_dimacs.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/relax.hpp [moved from deal.II/contrib/boost/include/boost/graph/relax.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/reverse_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/reverse_graph.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/rmat_graph_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/sequential_vertex_coloring.hpp [moved from deal.II/contrib/boost/include/boost/graph/sequential_vertex_coloring.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/simple_point.hpp [moved from deal.II/contrib/boost/include/boost/graph/simple_point.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/sloan_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/sloan_ordering.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/small_world_generator.hpp [moved from deal.II/contrib/boost/include/boost/graph/small_world_generator.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/smallest_last_ordering.hpp [moved from deal.II/contrib/boost/include/boost/graph/smallest_last_ordering.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/ssca_graph_generator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/st_connected.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/stanford_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/stanford_graph.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/strong_components.hpp [moved from deal.II/contrib/boost/include/boost/graph/strong_components.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/subgraph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/tiernan_all_cycles.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/topological_sort.hpp [moved from deal.II/contrib/boost/include/boost/graph/topological_sort.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/topology.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/transitive_closure.hpp [moved from deal.II/contrib/boost/include/boost/graph/transitive_closure.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/transitive_reduction.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/transpose_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/transpose_graph.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/tree_traits.hpp [moved from deal.II/contrib/boost/include/boost/graph/tree_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/two_bit_color_map.hpp [moved from deal.II/contrib/boost/include/boost/graph/two_bit_color_map.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/undirected_dfs.hpp [moved from deal.II/contrib/boost/include/boost/graph/undirected_dfs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/undirected_graph.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/use_mpi.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/vector_as_graph.hpp [moved from deal.II/contrib/boost/include/boost/graph/vector_as_graph.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/vertex_and_edge_range.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/graph/visitors.hpp [moved from deal.II/contrib/boost/include/boost/graph/visitors.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/wavefront.hpp [moved from deal.II/contrib/boost/include/boost/graph/wavefront.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/graph/write_dimacs.hpp [moved from deal.II/contrib/boost/include/boost/graph/write_dimacs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/implicit_cast.hpp [moved from deal.II/contrib/boost/include/boost/implicit_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/indirect_reference.hpp [moved from deal.II/contrib/boost/include/boost/indirect_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer.hpp [moved from deal.II/contrib/boost/include/boost/integer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer/integer_mask.hpp [moved from deal.II/contrib/boost/include/boost/integer/integer_mask.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer/static_log2.hpp [moved from deal.II/contrib/boost/include/boost/integer/static_log2.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer/static_min_max.hpp [moved from deal.II/contrib/boost/include/boost/integer/static_min_max.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer_fwd.hpp [moved from deal.II/contrib/boost/include/boost/integer_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/integer_traits.hpp [moved from deal.II/contrib/boost/include/boost/integer_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/any_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/any_hook.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/avl_set.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/avl_set.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/avl_set_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/avl_set_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/avltree.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/avltree.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/avltree_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/avltree_algorithms.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/bs_set_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/bs_set_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/circular_list_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/circular_list_algorithms.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/circular_slist_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/circular_slist_algorithms.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/derivation_value_traits.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/derivation_value_traits.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/any_node_and_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/any_node_and_algorithms.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/assert.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/assert.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/avltree_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/avltree_node.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/clear_on_destructor_base.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/common_slist_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/common_slist_algorithms.hpp with 80% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/config_begin.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/config_begin.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/config_end.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/config_end.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/ebo_functor_holder.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/ebo_functor_holder.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/function_detector.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/generic_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/generic_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/hashtable_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/hashtable_node.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/is_stateful_value_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/list_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/list_node.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/mpl.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/mpl.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/parent_from_member.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/parent_from_member.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/pointer_to_other.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/pointer_to_other.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/rbtree_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/rbtree_node.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/slist_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/slist_node.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/transform_iterator.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/transform_iterator.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/tree_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/tree_algorithms.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/tree_node.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/tree_node.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/utilities.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/utilities.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/workaround.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/detail/workaround.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/hashtable.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/hashtable.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/intrusive_fwd.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/intrusive_fwd.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/linear_slist_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/linear_slist_algorithms.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/link_mode.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/link_mode.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/list.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/list.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/list_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/list_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/member_value_traits.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/member_value_traits.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/options.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/options.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/pointer_plus_bits.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/pointer_plus_bits.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/priority_compare.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/rbtree.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/rbtree.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/rbtree_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/rbtree_algorithms.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/set.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/set.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/set_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/set_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/sg_set.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/sg_set.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/sgtree.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/sgtree.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/sgtree_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/sgtree_algorithms.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/slist.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/slist.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/slist_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/slist_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/splay_set.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/splay_set.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/splay_set_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/splay_set_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/splaytree.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/splaytree.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/splaytree_algorithms.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/splaytree_algorithms.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_algorithms.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_set.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/trivial_value_traits.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/trivial_value_traits.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/unordered_set.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/unordered_set.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive/unordered_set_hook.hpp [moved from deal.II/contrib/boost/include/boost/intrusive/unordered_set_hook.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/intrusive_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/io/ios_state.hpp [moved from deal.II/contrib/boost/include/boost/io/ios_state.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/io_fwd.hpp [moved from deal.II/contrib/boost/include/boost/io_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/categories.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/categories.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/chain.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/chain.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/char_traits.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/char_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/checked_operations.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/checked_operations.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/close.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/close.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/code_converter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/code_converter.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/combine.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/combine.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/compose.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/compose.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/concepts.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/concepts.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/constants.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/constants.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/copy.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/copy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/absolute_path.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/absolute_path.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/access_control.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/access_control.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/concept_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/concept_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/device_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/device_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/direct_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/direct_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/filter_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/filter_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/mode_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/mode_adapter.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/non_blocking_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/non_blocking_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/output_iterator_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/output_iterator_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/range_adapter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/range_adapter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/add_facet.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/add_facet.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/bool_trait_def.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/bool_trait_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/broken_overload_resolution/forward.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/broken_overload_resolution/forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/broken_overload_resolution/stream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/broken_overload_resolution/stream.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/buffer.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/buffer.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/call_traits.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/call_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/char_traits.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/char_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/codecvt_helper.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/codecvt_helper.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/codecvt_holder.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/codecvt_holder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/auto_link.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/auto_link.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/bzip2.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/bzip2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/codecvt.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/codecvt.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/disable_warnings.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/disable_warnings.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/dyn_link.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/dyn_link.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/enable_warnings.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/enable_warnings.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/fpos.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/fpos.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/gcc.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/gcc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/limits.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/overload_resolution.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/overload_resolution.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/rtl.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/rtl.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/wide_streams.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/wide_streams.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/windows_posix.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/windows_posix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/zlib.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/config/zlib.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/counted_array.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/counted_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/current_directory.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/current_directory.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/default_arg.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/default_arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/dispatch.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/dispatch.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/double_object.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/double_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/enable_if_stream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/enable_if_stream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/error.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/error.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/execute.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/execute.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/file_handle.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/forward.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/forward.hpp with 66% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/fstream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/fstream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/functional.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/ios.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/ios.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/iostream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/iostream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/is_dereferenceable.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/is_dereferenceable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/is_iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/is_iterator_range.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/newline.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/newline.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/optional.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/optional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/param_type.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/param_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/path.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/push.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/push.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/push_params.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/push_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/resolve.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/resolve.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/restrict_impl.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/restrict_impl.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/select.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/select.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/select_by_size.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/select_by_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/chainbuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/chainbuf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/direct_streambuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/direct_streambuf.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/linked_streambuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/linked_streambuf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/system_failure.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/system_failure.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/template_params.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/template_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/translate_int_type.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/translate_int_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/vc6/close.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/vc6/close.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/vc6/read.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/vc6/read.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/vc6/write.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/vc6/write.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/wrap_unwrap.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/detail/wrap_unwrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/array.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/device/array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/back_inserter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/device/back_inserter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/file.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/device/file.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/file_descriptor.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/mapped_file.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/null.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/device/null.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/aggregate.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/aggregate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/bzip2.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/bzip2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/counter.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/counter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/grep.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/gzip.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/gzip.hpp with 65% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/line.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/line.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/newline.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/newline.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/regex.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/regex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/stdio.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/stdio.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/symmetric.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/symmetric.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/test.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/test.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/zlib.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filter/zlib.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filtering_stream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filtering_stream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/filtering_streambuf.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/filtering_streambuf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/flush.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/flush.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/get.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/get.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/imbue.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/imbue.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/input_sequence.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/input_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/invert.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/invert.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/operations.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/operations.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/operations_fwd.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/operations_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/optimal_buffer_size.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/optimal_buffer_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/output_sequence.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/output_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/pipeline.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/pipeline.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/positioning.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/positioning.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/put.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/put.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/putback.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/putback.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/read.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/read.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/restrict.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/restrict.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/seek.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/seek.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/skip.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/skip.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/slice.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/slice.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/stream.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/stream.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/stream_buffer.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/stream_buffer.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/tee.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/tee.hpp with 53% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/traits.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/traits.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/traits_fwd.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/traits_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iostreams/write.hpp [moved from deal.II/contrib/boost/include/boost/iostreams/write.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/is_placeholder.hpp [moved from deal.II/contrib/boost/include/boost/is_placeholder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/counting_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/counting_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/any_conversion_eater.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/any_conversion_eater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/config_def.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/config_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/config_undef.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/config_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/enable_if.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/enable_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/facade_iterator_category.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/facade_iterator_category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/detail/minimum_category.hpp [moved from deal.II/contrib/boost/include/boost/iterator/detail/minimum_category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/filter_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/filter_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/indirect_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/indirect_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/interoperable.hpp [moved from deal.II/contrib/boost/include/boost/iterator/interoperable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/is_lvalue_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/is_lvalue_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/is_readable_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/is_readable_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_adaptor.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_adaptor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_archetypes.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_archetypes.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_categories.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_categories.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_concepts.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_concepts.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_facade.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_facade.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/iterator_traits.hpp [moved from deal.II/contrib/boost/include/boost/iterator/iterator_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/new_iterator_tests.hpp [moved from deal.II/contrib/boost/include/boost/iterator/new_iterator_tests.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/permutation_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/permutation_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/reverse_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/reverse_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/transform_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/transform_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator/zip_iterator.hpp [moved from deal.II/contrib/boost/include/boost/iterator/zip_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/iterator_adaptors.hpp [moved from deal.II/contrib/boost/include/boost/iterator_adaptors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/algorithm.hpp [moved from deal.II/contrib/boost/include/boost/lambda/algorithm.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/bind.hpp [moved from deal.II/contrib/boost/include/boost/lambda/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/casts.hpp [moved from deal.II/contrib/boost/include/boost/lambda/casts.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/closures.hpp [moved from deal.II/contrib/boost/include/boost/lambda/closures.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/construct.hpp [moved from deal.II/contrib/boost/include/boost/lambda/construct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/control_structures.hpp [moved from deal.II/contrib/boost/include/boost/lambda/control_structures.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/core.hpp [moved from deal.II/contrib/boost/include/boost/lambda/core.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/actions.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/actions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/arity_code.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/arity_code.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/bind_functions.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/bind_functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/control_constructs_common.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/control_constructs_common.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/control_structures_impl.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/control_structures_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/function_adaptors.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/function_adaptors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/is_instance_of.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/is_instance_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_config.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/lambda_config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_functor_base.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/lambda_functor_base.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_functors.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/lambda_functors.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_fwd.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/lambda_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_traits.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/lambda_traits.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/member_ptr.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/member_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operator_actions.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/operator_actions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operator_lambda_func_base.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/operator_lambda_func_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operator_return_type_traits.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/operator_return_type_traits.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operators.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/operators.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/ret.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/ret.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/return_type_traits.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/return_type_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/select_functions.hpp [moved from deal.II/contrib/boost/include/boost/lambda/detail/select_functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/suppress_unused.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/lambda/exceptions.hpp [moved from deal.II/contrib/boost/include/boost/lambda/exceptions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/if.hpp [moved from deal.II/contrib/boost/include/boost/lambda/if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/lambda.hpp [moved from deal.II/contrib/boost/include/boost/lambda/lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/loops.hpp [moved from deal.II/contrib/boost/include/boost/lambda/loops.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/numeric.hpp [moved from deal.II/contrib/boost/include/boost/lambda/numeric.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lambda/switch.hpp [moved from deal.II/contrib/boost/include/boost/lambda/switch.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/last_value.hpp [moved from deal.II/contrib/boost/include/boost/last_value.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/lexical_cast.hpp [moved from deal.II/contrib/boost/include/boost/lexical_cast.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/limits.hpp [moved from deal.II/contrib/boost/include/boost/limits.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/make_shared.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_digamma.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_lanczos.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/bindings/mpfr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/bindings/rr.hpp [moved from deal.II/contrib/boost/include/boost/math/bindings/rr.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/common_factor.hpp [moved from deal.II/contrib/boost/include/boost/math/common_factor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/common_factor_ct.hpp [moved from deal.II/contrib/boost/include/boost/math/common_factor_ct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/common_factor_rt.hpp [moved from deal.II/contrib/boost/include/boost/math/common_factor_rt.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex.hpp [moved from deal.II/contrib/boost/include/boost/math/complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/acos.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/acos.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/acosh.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/acosh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/asin.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/asin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/asinh.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/asinh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/atan.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/atan.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/atanh.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/atanh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/details.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/details.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/complex/fabs.hpp [moved from deal.II/contrib/boost/include/boost/math/complex/fabs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/concepts/distributions.hpp [moved from deal.II/contrib/boost/include/boost/math/concepts/distributions.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/concepts/real_concept.hpp [moved from deal.II/contrib/boost/include/boost/math/concepts/real_concept.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/concepts/real_type_concept.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/concepts/std_real_concept.hpp [moved from deal.II/contrib/boost/include/boost/math/concepts/std_real_concept.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/constants/constants.hpp [moved from deal.II/contrib/boost/include/boost/math/constants/constants.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/bernoulli.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/bernoulli.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/beta.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/beta.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/binomial.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/binomial.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/cauchy.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/cauchy.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/chi_squared.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/chi_squared.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/complement.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/complement.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/common_error_handling.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/detail/common_error_handling.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/derived_accessors.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/detail/derived_accessors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/generic_mode.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/detail/generic_mode.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/generic_quantile.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/detail/generic_quantile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_cdf.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_pdf.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_quantile.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/inv_discrete_quantile.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/detail/inv_discrete_quantile.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/exponential.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/exponential.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/extreme_value.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/extreme_value.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/find_location.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/find_location.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/find_scale.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/find_scale.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/fisher_f.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/fisher_f.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/fwd.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/fwd.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/gamma.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/gamma.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/hypergeometric.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/laplace.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/logistic.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/lognormal.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/lognormal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/negative_binomial.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/negative_binomial.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_beta.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/non_central_beta.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_chi_squared.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/non_central_chi_squared.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_f.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/non_central_f.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_t.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/non_central_t.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/normal.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/normal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/pareto.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/pareto.hpp with 78% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/poisson.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/poisson.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/rayleigh.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/rayleigh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/students_t.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/students_t.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/triangular.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/triangular.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/uniform.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/uniform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/distributions/weibull.hpp [moved from deal.II/contrib/boost/include/boost/math/distributions/weibull.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/octonion.hpp [moved from deal.II/contrib/boost/include/boost/math/octonion.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/policies/error_handling.hpp [moved from deal.II/contrib/boost/include/boost/math/policies/error_handling.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/policies/policy.hpp [moved from deal.II/contrib/boost/include/boost/math/policies/policy.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/quaternion.hpp [moved from deal.II/contrib/boost/include/boost/math/quaternion.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/acosh.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/acosh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/asinh.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/asinh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/atanh.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/atanh.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/bessel.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/bessel.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/beta.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/beta.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/binomial.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/binomial.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/cbrt.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/cbrt.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/cos_pi.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/cos_pi.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_i0.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_i0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_i1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_i1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_ik.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_ik.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_j0.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_j0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_j1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_j1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jn.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jn.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jy.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jy.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jy_asym.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jy_asym.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_k0.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_k0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_k1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_k1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_kn.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_kn.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_y0.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_y0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_y1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_y1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_yn.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_yn.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/erf_inv.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/erf_inv.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/fp_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/gamma_inva.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/gamma_inva.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/ibeta_inv_ab.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/ibeta_inv_ab.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/ibeta_inverse.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/ibeta_inverse.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/igamma_inverse.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/igamma_inverse.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/igamma_large.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/igamma_large.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/lanczos_sse2.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/lanczos_sse2.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/lgamma_small.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/lgamma_small.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/round_fwd.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/round_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/simple_complex.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/simple_complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/t_distribution_inv.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/t_distribution_inv.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/unchecked_factorial.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/detail/unchecked_factorial.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/digamma.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/digamma.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_1.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_2.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_2.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_3.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_3.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_rc.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_rc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_rd.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_rd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_rf.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_rf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_rj.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/ellint_rj.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/erf.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/erf.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/expint.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/expint.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/expm1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/expm1.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/factorials.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/factorials.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/fpclassify.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/gamma.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/gamma.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/hermite.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/hermite.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/hypot.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/hypot.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/laguerre.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/laguerre.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/lanczos.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/lanczos.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/legendre.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/legendre.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/log1p.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/log1p.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/math_fwd.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/math_fwd.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/modf.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/modf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/next.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/next.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/pow.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/pow.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/powm1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/powm1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/prime.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/round.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/round.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sign.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sin_pi.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/sin_pi.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sinc.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/sinc.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sinhc.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/sinhc.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/spherical_harmonic.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/spherical_harmonic.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sqrt1pm1.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/sqrt1pm1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/trunc.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/trunc.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/zeta.hpp [moved from deal.II/contrib/boost/include/boost/math/special_functions/zeta.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/config.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/config.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner1_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner1_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner2_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner2_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/polynomial_horner3_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/polynomial_horner3_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner1_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner1_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner2_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner2_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_10.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_11.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_11.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_12.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_12.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_13.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_13.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_14.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_14.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_15.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_15.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_16.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_16.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_17.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_17.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_18.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_18.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_19.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_19.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_2.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_20.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_3.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_4.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_5.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_6.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_6.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_7.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_7.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_8.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_8.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/detail/rational_horner3_9.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/detail/rational_horner3_9.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/fraction.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/fraction.hpp with 70% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/minima.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/minima.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/polynomial.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/polynomial.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/precision.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/precision.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/promotion.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/promotion.hpp with 73% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/rational.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/rational.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/real_cast.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/real_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/remez.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/remez.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/roots.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/roots.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/series.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/series.hpp with 66% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/solve.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/solve.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/stats.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/stats.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/test.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/test.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/test_data.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/test_data.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/toms748_solve.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/toms748_solve.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/traits.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/user.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/user.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tools/workaround.hpp [moved from deal.II/contrib/boost/include/boost/math/tools/workaround.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math/tr1.hpp [moved from deal.II/contrib/boost/include/boost/math/tr1.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/math_fwd.hpp [moved from deal.II/contrib/boost/include/boost/math_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mem_fn.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/memory_order.hpp [moved from deal.II/contrib/boost/include/boost/memory_order.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpi.hpp [moved from deal.II/contrib/boost/include/boost/mpi.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/O1_size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/O1_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/O1_size_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/O1_size_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/accumulate.hpp [moved from deal.II/contrib/boost/include/boost/mpl/accumulate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/advance.hpp [moved from deal.II/contrib/boost/include/boost/mpl/advance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/advance_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/advance_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/alias.hpp [moved from deal.II/contrib/boost/include/boost/mpl/alias.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/always.hpp [moved from deal.II/contrib/boost/include/boost/mpl/always.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/arg_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/arg_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/arithmetic.hpp [moved from deal.II/contrib/boost/include/boost/mpl/arithmetic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/as_sequence.hpp [moved from deal.II/contrib/boost/include/boost/mpl/as_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/assert.hpp [moved from deal.II/contrib/boost/include/boost/mpl/assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/at.hpp [moved from deal.II/contrib/boost/include/boost/mpl/at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/at_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/at_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/O1_size_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/O1_size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/adl_barrier.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/adl_barrier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/apply_1st.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/apply_1st.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/arg_typedef.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/arg_typedef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/arithmetic_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/arithmetic_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/arity_spec.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/arity_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/back_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/back_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/begin_end_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/begin_end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/clear_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/clear_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/common_name_wknd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/common_name_wknd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/comparison_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/comparison_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/adl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/adl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/arrays.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/arrays.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/bcc.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/bcc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/compiler.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/compiler.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/dependent_nttp.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/dependent_nttp.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/dtp.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/dtp.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/eti.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/eti.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/forwarding.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/forwarding.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/gcc.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/gcc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/has_apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/has_apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/has_xxx.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/has_xxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/integral.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/integral.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/intel.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/intel.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/msvc.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/msvc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/msvc_typename.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/msvc_typename.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/nttp.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/nttp.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/operators.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/operators.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/overload_resolution.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/overload_resolution.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/pp_counter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/pp_counter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/preprocessor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/preprocessor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/static_constant.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/static_constant.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/ttp.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/ttp.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/typeof.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/typeof.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/use_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/use_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/workaround.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/config/workaround.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/contains_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/contains_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/count_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/count_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/count_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/count_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/empty_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/empty_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/erase_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/erase_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/erase_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/erase_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/filter_iter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/filter_iter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/find_if_pred.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/find_if_pred.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/fold_impl_body.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/fold_impl_body.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/fold_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/fold_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/fold_pred.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/fold_pred.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/front_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/front_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_begin.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_rebind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_rebind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/has_type.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/has_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/include_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/include_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/insert_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/insert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/insert_range_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/insert_range_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/inserter_algorithm.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/inserter_algorithm.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/integral_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/integral_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/is_msvc_eti_arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/is_msvc_eti_arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/iter_apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/iter_apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/iter_push_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/iter_push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/joint_iter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/joint_iter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/lambda_arity_param.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/lambda_arity_param.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/lambda_spec.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/lambda_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/lambda_support.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/lambda_support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/largest_int.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/largest_int.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/logical_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/logical_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/msvc_dtw.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/msvc_dtw.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/msvc_eti_base.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/msvc_eti_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/msvc_is_class.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/msvc_is_class.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/msvc_never_true.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/msvc_never_true.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/msvc_type.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/msvc_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/na.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/na.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/na_assert.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/na_assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/na_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/na_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/na_spec.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/na_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/nested_type_wknd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/nested_type_wknd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/nttp_decl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/nttp_decl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/numeric_cast_utils.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/numeric_cast_utils.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/numeric_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/numeric_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/order_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/order_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/overload_names.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/overload_names.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/partition_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/partition_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/pop_back_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/pop_back_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/pop_front_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/pop_front_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/and.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/apply.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/arg.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessed/plain/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessed/plain/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/add.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/add.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/def_params_tail.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/default_params.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/default_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/enum.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/ext_params.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/ext_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/filter_params.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/filter_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/is_seq.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/is_seq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/params.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/partial_spec_params.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/partial_spec_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/range.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/repeat.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/repeat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/sub.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/sub.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/token_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/token_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/preprocessor/tuple.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/preprocessor/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/ptr_to_ref.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/ptr_to_ref.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/push_back_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/push_back_impl.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/push_front_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/push_front_impl.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/O1_size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/O1_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/empty.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/iterator.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/range_c/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/range_c/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/reverse_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/reverse_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/reverse_fold_impl_body.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/reverse_fold_impl_body.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/reverse_iter_fold_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/reverse_iter_fold_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/sequence_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/sequence_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/shift_op.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/shift_op.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/single_element_iter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/single_element_iter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/sort_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/sort_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/static_cast.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/static_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/template_arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/template_arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/template_arity_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/template_arity_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/test.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/test.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/test/assert.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/test/assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/test/data.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/test/data.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/test/test_case.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/test/test_case.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/traits_lambda_spec.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/traits_lambda_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/transform_iter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/transform_iter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/type_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/type_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/unwrap.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/unwrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/value_wknd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/value_wknd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/yes_no.hpp [moved from deal.II/contrib/boost/include/boost/mpl/aux_/yes_no.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/back_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/back_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/back_inserter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/back_inserter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/base.hpp [moved from deal.II/contrib/boost/include/boost/mpl/base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/begin.hpp [moved from deal.II/contrib/boost/include/boost/mpl/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/begin_end.hpp [moved from deal.II/contrib/boost/include/boost/mpl/begin_end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/begin_end_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/begin_end_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bind.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bind.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bind_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bind_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bitand.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bitor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bitwise.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bitwise.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bool.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bool.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/bool_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/bool_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/char.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/mpl/char_fwd.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/mpl/clear.hpp [moved from deal.II/contrib/boost/include/boost/mpl/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/clear_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/clear_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/comparison.hpp [moved from deal.II/contrib/boost/include/boost/mpl/comparison.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/contains.hpp [moved from deal.II/contrib/boost/include/boost/mpl/contains.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/contains_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/contains_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/copy.hpp [moved from deal.II/contrib/boost/include/boost/mpl/copy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/copy_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/copy_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/count.hpp [moved from deal.II/contrib/boost/include/boost/mpl/count.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/count_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/count_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/count_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/count_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/deque.hpp [moved from deal.II/contrib/boost/include/boost/mpl/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/deref.hpp [moved from deal.II/contrib/boost/include/boost/mpl/deref.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/distance.hpp [moved from deal.II/contrib/boost/include/boost/mpl/distance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/distance_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/distance_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/divides.hpp [moved from deal.II/contrib/boost/include/boost/mpl/divides.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/empty.hpp [moved from deal.II/contrib/boost/include/boost/mpl/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/empty_base.hpp [moved from deal.II/contrib/boost/include/boost/mpl/empty_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/empty_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/empty_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/empty_sequence.hpp [moved from deal.II/contrib/boost/include/boost/mpl/empty_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/end.hpp [moved from deal.II/contrib/boost/include/boost/mpl/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/erase.hpp [moved from deal.II/contrib/boost/include/boost/mpl/erase.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/erase_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/erase_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/erase_key.hpp [moved from deal.II/contrib/boost/include/boost/mpl/erase_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/erase_key_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/erase_key_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/eval_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/eval_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/filter_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/filter_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/find.hpp [moved from deal.II/contrib/boost/include/boost/mpl/find.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/find_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/find_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/fold.hpp [moved from deal.II/contrib/boost/include/boost/mpl/fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/for_each.hpp [moved from deal.II/contrib/boost/include/boost/mpl/for_each.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/front_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/front_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/front_inserter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/front_inserter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/greater.hpp [moved from deal.II/contrib/boost/include/boost/mpl/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/has_key.hpp [moved from deal.II/contrib/boost/include/boost/mpl/has_key.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/has_key_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/has_key_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/has_xxx.hpp [moved from deal.II/contrib/boost/include/boost/mpl/has_xxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/identity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/identity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/index_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/index_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/index_of.hpp [moved from deal.II/contrib/boost/include/boost/mpl/index_of.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/inherit.hpp [moved from deal.II/contrib/boost/include/boost/mpl/inherit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/inherit_linearly.hpp [moved from deal.II/contrib/boost/include/boost/mpl/inherit_linearly.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/insert.hpp [moved from deal.II/contrib/boost/include/boost/mpl/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/insert_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/insert_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/insert_range.hpp [moved from deal.II/contrib/boost/include/boost/mpl/insert_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/insert_range_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/insert_range_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/inserter.hpp [moved from deal.II/contrib/boost/include/boost/mpl/inserter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/int.hpp [moved from deal.II/contrib/boost/include/boost/mpl/int.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/int_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/int_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/integral_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/integral_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/integral_c_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/integral_c_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/integral_c_tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/integral_c_tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/is_placeholder.hpp [moved from deal.II/contrib/boost/include/boost/mpl/is_placeholder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/is_sequence.hpp [moved from deal.II/contrib/boost/include/boost/mpl/is_sequence.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/iter_fold.hpp [moved from deal.II/contrib/boost/include/boost/mpl/iter_fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/iter_fold_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/iter_fold_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/iterator_category.hpp [moved from deal.II/contrib/boost/include/boost/mpl/iterator_category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/mpl/iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/iterator_tags.hpp [moved from deal.II/contrib/boost/include/boost/mpl/iterator_tags.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/joint_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/joint_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/key_type.hpp [moved from deal.II/contrib/boost/include/boost/mpl/key_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/key_type_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/key_type_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/lambda.hpp [moved from deal.II/contrib/boost/include/boost/mpl/lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/lambda_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/lambda_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/less.hpp [moved from deal.II/contrib/boost/include/boost/mpl/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/mpl/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/arity.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/arity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/string.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/unrolling.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/unrolling.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/limits/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/O1_size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/O1_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/begin_end.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/begin_end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/clear.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/empty.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/include_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/include_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/item.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/item.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/iterator.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/numbered.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/numbered.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/numbered_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/numbered_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/push_back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/push_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/aux_/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/aux_/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list0_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list0_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list/list50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list/list50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/list_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/list_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/logical.hpp [moved from deal.II/contrib/boost/include/boost/mpl/logical.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/long.hpp [moved from deal.II/contrib/boost/include/boost/mpl/long.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/long_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/long_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/lower_bound.hpp [moved from deal.II/contrib/boost/include/boost/mpl/lower_bound.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/begin_end_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/begin_end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/clear_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/clear_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/contains_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/contains_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/empty_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/empty_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/erase_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/erase_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/erase_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/erase_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/has_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/has_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/include_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/include_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/insert_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/insert_impl.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/item.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/item.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/iterator.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/key_type_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/key_type_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/map0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/map0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/numbered.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/numbered.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/no_ctps/map10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/no_ctps/map10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/no_ctps/map20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/no_ctps/map20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/no_ctps/map30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/no_ctps/map30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/no_ctps/map40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/no_ctps/map40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/no_ctps/map50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/no_ctps/map50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/plain/map10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/plain/map10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/plain/map20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/plain/map20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/plain/map30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/plain/map30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/plain/map40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/plain/map40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/plain/map50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/plain/map50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/typeof_based/map10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/typeof_based/map20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/typeof_based/map20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/typeof_based/map30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/typeof_based/map30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/typeof_based/map40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/typeof_based/map40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/preprocessed/typeof_based/map50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/preprocessed/typeof_based/map50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/value_type_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/aux_/value_type_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/map/map50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/map/map50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/math/fixed_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/math/fixed_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/math/is_even.hpp [moved from deal.II/contrib/boost/include/boost/mpl/math/is_even.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/math/rational_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/math/rational_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/max.hpp [moved from deal.II/contrib/boost/include/boost/mpl/max.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/max_element.hpp [moved from deal.II/contrib/boost/include/boost/mpl/max_element.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/min.hpp [moved from deal.II/contrib/boost/include/boost/mpl/min.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/min_element.hpp [moved from deal.II/contrib/boost/include/boost/mpl/min_element.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/min_max.hpp [moved from deal.II/contrib/boost/include/boost/mpl/min_max.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/minus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/minus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/modulus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/modulus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiplies.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiplies.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/aux_/count_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/aux_/count_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/aux_/insert_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/aux_/insert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/aux_/item.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/aux_/item.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/aux_/multiset0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/aux_/multiset0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/aux_/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/aux_/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/multiset/multiset0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/multiset/multiset0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/negate.hpp [moved from deal.II/contrib/boost/include/boost/mpl/negate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/next.hpp [moved from deal.II/contrib/boost/include/boost/mpl/next.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/next_prior.hpp [moved from deal.II/contrib/boost/include/boost/mpl/next_prior.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/not.hpp [moved from deal.II/contrib/boost/include/boost/mpl/not.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/not_equal_to.hpp [moved from deal.II/contrib/boost/include/boost/mpl/not_equal_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/numeric_cast.hpp [moved from deal.II/contrib/boost/include/boost/mpl/numeric_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/or.hpp [moved from deal.II/contrib/boost/include/boost/mpl/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/order.hpp [moved from deal.II/contrib/boost/include/boost/mpl/order.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/order_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/order_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pair.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pair.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pair_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pair_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/partition.hpp [moved from deal.II/contrib/boost/include/boost/mpl/partition.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/placeholders.hpp [moved from deal.II/contrib/boost/include/boost/mpl/placeholders.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/plus.hpp [moved from deal.II/contrib/boost/include/boost/mpl/plus.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pop_back_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pop_back_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/pop_front_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/pop_front_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/print.hpp [moved from deal.II/contrib/boost/include/boost/mpl/print.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/prior.hpp [moved from deal.II/contrib/boost/include/boost/mpl/prior.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/protect.hpp [moved from deal.II/contrib/boost/include/boost/mpl/protect.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/push_back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/push_back_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/push_back_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/push_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/push_front_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/push_front_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/quote.hpp [moved from deal.II/contrib/boost/include/boost/mpl/quote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/range_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/range_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/remove.hpp [moved from deal.II/contrib/boost/include/boost/mpl/remove.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/remove_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/remove_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/replace.hpp [moved from deal.II/contrib/boost/include/boost/mpl/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/replace_if.hpp [moved from deal.II/contrib/boost/include/boost/mpl/replace_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/reverse.hpp [moved from deal.II/contrib/boost/include/boost/mpl/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/reverse_fold.hpp [moved from deal.II/contrib/boost/include/boost/mpl/reverse_fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/reverse_iter_fold.hpp [moved from deal.II/contrib/boost/include/boost/mpl/reverse_iter_fold.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/same_as.hpp [moved from deal.II/contrib/boost/include/boost/mpl/same_as.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/sequence_tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/sequence_tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/sequence_tag_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/sequence_tag_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/at_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/at_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/begin_end_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/begin_end_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/clear_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/clear_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/empty_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/empty_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/erase_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/erase_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/erase_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/erase_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/has_key_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/has_key_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/include_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/include_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/insert_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/insert_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/item.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/item.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/iterator.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/key_type_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/key_type_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/numbered.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/numbered.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/numbered_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/numbered_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/preprocessed/plain/set50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/preprocessed/plain/set50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/set0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/set0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/size_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/size_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/aux_/value_type_impl.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/aux_/value_type_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set0_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set0_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set/set50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set/set50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/set_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/set_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/shift_left.hpp [moved from deal.II/contrib/boost/include/boost/mpl/shift_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/shift_right.hpp [moved from deal.II/contrib/boost/include/boost/mpl/shift_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/single_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/single_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/size_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/size_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/size_t.hpp [moved from deal.II/contrib/boost/include/boost/mpl/size_t.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/size_t_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/size_t_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/sizeof.hpp [moved from deal.II/contrib/boost/include/boost/mpl/sizeof.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/sort.hpp [moved from deal.II/contrib/boost/include/boost/mpl/sort.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/stable_partition.hpp [moved from deal.II/contrib/boost/include/boost/mpl/stable_partition.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/string.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/mpl/switch.hpp [moved from deal.II/contrib/boost/include/boost/mpl/switch.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/times.hpp [moved from deal.II/contrib/boost/include/boost/mpl/times.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/transform.hpp [moved from deal.II/contrib/boost/include/boost/mpl/transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/transform_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/transform_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/unique.hpp [moved from deal.II/contrib/boost/include/boost/mpl/unique.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/unpack_args.hpp [moved from deal.II/contrib/boost/include/boost/mpl/unpack_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/upper_bound.hpp [moved from deal.II/contrib/boost/include/boost/mpl/upper_bound.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/value_type.hpp [moved from deal.II/contrib/boost/include/boost/mpl/value_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/value_type_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/value_type_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/O1_size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/O1_size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/at.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/begin_end.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/begin_end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/clear.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/clear.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/empty.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/include_preprocessed.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/include_preprocessed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/item.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/item.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/iterator.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/numbered.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/numbered.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/numbered_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/numbered_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/no_ctps/vector50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/plain/vector50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/plain/vector50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/preprocessed/typeof_based/vector50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/push_back.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/push_front.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/size.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/tag.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/aux_/vector0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/aux_/vector0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector0.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector0.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector0_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector0_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector10.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector10.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector10_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector10_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector20.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector20.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector20_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector20_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector30.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector30.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector30_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector30_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector40.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector40.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector40_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector40_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector50.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector/vector50_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector/vector50_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/vector_c.hpp [moved from deal.II/contrib/boost/include/boost/mpl/vector_c.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/void.hpp [moved from deal.II/contrib/boost/include/boost/mpl/void.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/void_fwd.hpp [moved from deal.II/contrib/boost/include/boost/mpl/void_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/mpl/zip_view.hpp [moved from deal.II/contrib/boost/include/boost/mpl/zip_view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array.hpp [moved from deal.II/contrib/boost/include/boost/multi_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/algorithm.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/algorithm.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/base.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/collection_concept.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/collection_concept.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/concept_checks.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/concept_checks.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/copy_array.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/copy_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/extent_gen.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/extent_gen.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/extent_range.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/extent_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/index_gen.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/index_gen.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/index_range.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/index_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/iterator.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/multi_array_ref.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/multi_array_ref.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/range_list.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/range_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/storage_order.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/storage_order.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/subarray.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/subarray.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/types.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_array/view.hpp [moved from deal.II/contrib/boost/include/boost/multi_array/view.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/composite_key.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/composite_key.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/access_specifier.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/access_specifier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/adl_swap.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/adl_swap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/archive_constructed.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/archive_constructed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/auto_space.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/auto_space.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/base_type.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/base_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/bidir_node_iterator.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/bidir_node_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/bucket_array.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/bucket_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/converter.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/converter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/copy_map.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/copy_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/duplicates_iterator.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/duplicates_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/has_tag.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/has_tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/hash_index_args.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/hash_index_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/hash_index_iterator.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/hash_index_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/hash_index_node.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/hash_index_node.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/header_holder.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/header_holder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/index_base.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/index_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/index_loader.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/index_loader.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/index_matcher.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/index_matcher.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/index_node_base.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/index_node_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/index_saver.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/index_saver.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/invariant_assert.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/invariant_assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/is_index_list.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/is_index_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/iter_adaptor.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/iter_adaptor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/modify_key_adaptor.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/modify_key_adaptor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/msvc_index_specifier.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/msvc_index_specifier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/no_duplicate_tags.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/no_duplicate_tags.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/node_type.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/node_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/ord_index_args.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/ord_index_args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/ord_index_node.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/ord_index_node.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/ord_index_ops.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/ord_index_ops.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/prevent_eti.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/prevent_eti.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_index_loader.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_index_loader.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_index_node.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_index_node.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_index_ops.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_index_ops.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_index_ptr_array.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_index_ptr_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_node_iterator.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_node_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/safe_ctr_proxy.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/safe_ctr_proxy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/safe_mode.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/safe_mode.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/scope_guard.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/scope_guard.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/seq_index_node.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/seq_index_node.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/seq_index_ops.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/seq_index_ops.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/uintptr_type.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/uintptr_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/unbounded.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/unbounded.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/value_compare.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/detail/value_compare.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/global_fun.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/global_fun.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/hashed_index.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/hashed_index.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/hashed_index_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/hashed_index_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/identity.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/identity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/identity_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/identity_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/indexed_by.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/indexed_by.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/key_extractors.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/key_extractors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/mem_fun.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/mem_fun.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/member.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/member.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/ordered_index.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/ordered_index.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/ordered_index_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/ordered_index_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/random_access_index.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/random_access_index.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/random_access_index_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/random_access_index_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/safe_mode_errors.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/safe_mode_errors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/sequenced_index.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/sequenced_index.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/sequenced_index_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/sequenced_index_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index/tag.hpp [moved from deal.II/contrib/boost/include/boost/multi_index/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index_container.hpp [moved from deal.II/contrib/boost/include/boost/multi_index_container.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/multi_index_container_fwd.hpp [moved from deal.II/contrib/boost/include/boost/multi_index_container_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/next_prior.hpp [moved from deal.II/contrib/boost/include/boost/next_prior.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/non_type.hpp [moved from deal.II/contrib/boost/include/boost/non_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/noncopyable.hpp [moved from deal.II/contrib/boost/include/boost/noncopyable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/nondet_random.hpp [moved from deal.II/contrib/boost/include/boost/nondet_random.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/none.hpp [moved from deal.II/contrib/boost/include/boost/none.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/none_t.hpp [moved from deal.II/contrib/boost/include/boost/none_t.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/operators.hpp [moved from deal.II/contrib/boost/include/boost/operators.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/optional.hpp [moved from deal.II/contrib/boost/include/boost/optional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/optional/optional.hpp [moved from deal.II/contrib/boost/include/boost/optional/optional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/optional/optional_fwd.hpp [moved from deal.II/contrib/boost/include/boost/optional/optional_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/optional/optional_io.hpp [moved from deal.II/contrib/boost/include/boost/optional/optional_io.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/parameter.hpp [moved from deal.II/contrib/boost/include/boost/parameter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/arg_list.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/cast.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/default.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/maybe.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/overloads.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parameter_requirements.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parenthesized_type.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/flatten.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/for_each.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker_iterate.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/result_of0.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/set.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tag.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tagged_argument.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/template_keyword.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/unwrap_cv_reference.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/void.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/yesno.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/binding.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/config.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/keyword.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/macros.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/match.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/name.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/parameters.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/preprocessor.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/python.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/parameter/value_type.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/pending/bucket_sorter.hpp [moved from deal.II/contrib/boost/include/boost/pending/bucket_sorter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/container_traits.hpp [moved from deal.II/contrib/boost/include/boost/pending/container_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/cstddef.hpp [moved from deal.II/contrib/boost/include/boost/pending/cstddef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/ct_if.hpp [moved from deal.II/contrib/boost/include/boost/pending/ct_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/detail/disjoint_sets.hpp [moved from deal.II/contrib/boost/include/boost/pending/detail/disjoint_sets.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/detail/int_iterator.hpp [moved from deal.II/contrib/boost/include/boost/pending/detail/int_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/detail/property.hpp [moved from deal.II/contrib/boost/include/boost/pending/detail/property.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/disjoint_sets.hpp [moved from deal.II/contrib/boost/include/boost/pending/disjoint_sets.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/fenced_priority_queue.hpp [moved from deal.II/contrib/boost/include/boost/pending/fenced_priority_queue.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/fibonacci_heap.hpp [moved from deal.II/contrib/boost/include/boost/pending/fibonacci_heap.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/indirect_cmp.hpp [moved from deal.II/contrib/boost/include/boost/pending/indirect_cmp.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/integer_log2.hpp [moved from deal.II/contrib/boost/include/boost/pending/integer_log2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/integer_range.hpp [moved from deal.II/contrib/boost/include/boost/pending/integer_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/is_heap.hpp [moved from deal.II/contrib/boost/include/boost/pending/is_heap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/iterator_adaptors.hpp [moved from deal.II/contrib/boost/include/boost/pending/iterator_adaptors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/iterator_tests.hpp [moved from deal.II/contrib/boost/include/boost/pending/iterator_tests.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/lowest_bit.hpp [moved from deal.II/contrib/boost/include/boost/pending/lowest_bit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/mutable_heap.hpp [moved from deal.II/contrib/boost/include/boost/pending/mutable_heap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/mutable_queue.hpp [moved from deal.II/contrib/boost/include/boost/pending/mutable_queue.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/property.hpp [moved from deal.II/contrib/boost/include/boost/pending/property.hpp with 55% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/property_serialize.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/pending/queue.hpp [moved from deal.II/contrib/boost/include/boost/pending/queue.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/relaxed_heap.hpp [moved from deal.II/contrib/boost/include/boost/pending/relaxed_heap.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pending/stringtok.hpp [moved from deal.II/contrib/boost/include/boost/pending/stringtok.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pointee.hpp [moved from deal.II/contrib/boost/include/boost/pointee.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pointer_cast.hpp [moved from deal.II/contrib/boost/include/boost/pointer_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/pointer_to_other.hpp [moved from deal.II/contrib/boost/include/boost/pointer_to_other.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/add.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/add.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/dec.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/dec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/detail/div_base.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/detail/div_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/div.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/div.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/inc.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/inc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/mod.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/mod.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/mul.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/mul.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/arithmetic/sub.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/arithmetic/sub.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/data.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/data.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/elem.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/elem.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/insert.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/push_back.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/push_front.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/remove.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/remove.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/replace.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/reverse.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/array/size.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/array/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/assert_msg.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/assert_msg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/cat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/cat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comma.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comma.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comma_if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comma_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/equal.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/greater.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/greater.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/greater_equal.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/greater_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/less.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/less.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/less_equal.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/less_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/comparison/not_equal.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/comparison/not_equal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/config/config.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/config/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/config/limits.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/config/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/deduce_d.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/deduce_d.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/detail/dmc/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/detail/dmc/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/detail/edg/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/detail/edg/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/detail/msvc/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/detail/msvc/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/detail/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/detail/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/expr_if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/expr_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/expr_iif.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/expr_iif.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/iif.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/iif.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/control/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/control/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/debug.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/debug.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/debug/assert.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/debug/assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/debug/error.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/debug/error.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/debug/line.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/debug/line.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/dec.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/dec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/auto_rec.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/auto_rec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/check.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/check.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/dmc/auto_rec.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/dmc/auto_rec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/is_binary.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/is_binary.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/is_nullary.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/is_nullary.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/is_unary.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/is_unary.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/null.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/null.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/detail/split.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/detail/split.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/empty.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum_params_with_a_default.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum_params_with_a_default.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum_params_with_defaults.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum_params_with_defaults.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum_shifted.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum_shifted.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/enum_shifted_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/enum_shifted_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/expand.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/expand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/expr_if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/expr_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/apply.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/apply.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/empty.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/expand.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/expand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/identity.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/identity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/intercept.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/intercept.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/is_1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/is_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/is_empty.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/is_empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/facilities/is_empty_or_1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/facilities/is_empty_or_1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/identity.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/identity.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/inc.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/inc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iterate.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iterate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/lower1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/lower1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/lower2.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/lower2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/lower3.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/lower3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/lower4.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/lower4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/lower5.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/lower5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/upper1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/upper1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/upper2.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/upper2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/upper3.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/upper3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/upper4.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/upper4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/bounds/upper5.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/bounds/upper5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/finish.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/finish.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/forward1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/forward1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/forward2.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/forward2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/forward3.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/forward3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/forward4.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/forward4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/forward5.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/forward5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/reverse1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/reverse1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/reverse2.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/reverse2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/reverse3.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/reverse3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/reverse4.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/reverse4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/iter/reverse5.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/iter/reverse5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/local.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/local.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/rlocal.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/rlocal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/self.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/self.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/detail/start.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/detail/start.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/iterate.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/iterate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/local.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/local.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/iteration/self.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/iteration/self.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/library.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/library.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/limits.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/limits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/adt.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/adt.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/append.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/append.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/at.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/at.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/cat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/cat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/detail/dmc/fold_left.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/detail/dmc/fold_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/detail/edg/fold_left.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/detail/edg/fold_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/detail/edg/fold_right.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/detail/edg/fold_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/detail/fold_left.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/detail/fold_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/detail/fold_right.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/detail/fold_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/enum.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/filter.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/filter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/first_n.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/first_n.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/fold_left.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/fold_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/fold_right.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/fold_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/for_each.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/for_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/for_each_i.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/for_each_i.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/for_each_product.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/for_each_product.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/rest_n.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/rest_n.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/reverse.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/size.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/to_tuple.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/to_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/list/transform.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/list/transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/and.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/bitand.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/bitand.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/bitnor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/bitnor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/bitor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/bitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/bitxor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/bitxor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/bool.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/bool.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/compl.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/compl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/nor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/nor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/not.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/not.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/or.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/logical/xor.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/logical/xor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/max.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/max.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/min.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/min.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/punctuation.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/punctuation.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/punctuation/comma.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/punctuation/comma.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/punctuation/comma_if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/punctuation/comma_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/punctuation/paren.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/punctuation/paren.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/punctuation/paren_if.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/punctuation/paren_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat_2nd.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat_2nd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat_3rd.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat_3rd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat_from_to.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat_from_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat_from_to_2nd.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat_from_to_2nd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repeat_from_to_3rd.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repeat_from_to_3rd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/deduce_r.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/deduce_r.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/deduce_z.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/deduce_z.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/detail/dmc/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/detail/dmc/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/detail/edg/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/detail/edg/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/detail/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/detail/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/detail/msvc/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/detail/msvc/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_binary_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_binary_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_params_with_a_default.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_params_with_a_default.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_params_with_defaults.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_params_with_defaults.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_shifted.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_shifted.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_shifted_binary_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_shifted_binary_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_shifted_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_shifted_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_trailing.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_trailing.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_trailing_binary_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_trailing_binary_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/enum_trailing_params.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/enum_trailing_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/for.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/for.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/repeat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/repeat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/repetition/repeat_from_to.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/repetition/repeat_from_to.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/selection.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/selection.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/selection/max.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/selection/max.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/selection/min.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/selection/min.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/cat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/cat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/detail/split.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/detail/split.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/elem.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/elem.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/enum.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/filter.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/filter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/first_n.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/first_n.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/fold_left.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/fold_left.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/fold_right.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/fold_right.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/for_each.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/for_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/for_each_i.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/for_each_i.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/for_each_product.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/for_each_product.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/insert.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/insert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/pop_back.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/pop_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/pop_front.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/pop_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/push_back.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/push_back.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/push_front.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/push_front.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/remove.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/remove.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/replace.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/replace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/rest_n.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/rest_n.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/reverse.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/seq.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/seq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/size.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/subseq.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/subseq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/to_array.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/to_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/to_tuple.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/to_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/seq/transform.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/seq/transform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/counter.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/counter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/counter.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/counter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/def.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/shared.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/shared.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/slot1.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/slot1.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/slot2.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/slot2.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/slot3.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/slot3.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/slot4.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/slot4.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/detail/slot5.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/detail/slot5.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/slot/slot.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/slot/slot.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/stringize.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/stringize.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/eat.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/eat.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/elem.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/elem.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/rem.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/rem.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/reverse.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/reverse.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/to_list.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/to_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/tuple/to_seq.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/tuple/to_seq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/while.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/while.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/preprocessor/wstringize.hpp [moved from deal.II/contrib/boost/include/boost/preprocessor/wstringize.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/program_options.hpp [moved from deal.II/contrib/boost/include/boost/program_options.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/progress.hpp [moved from deal.II/contrib/boost/include/boost/progress.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/dynamic_property_map.hpp [moved from deal.II/contrib/boost/include/boost/dynamic_property_map.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/caching_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/distributed_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/global_index_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/impl/distributed_property_map.ipp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/local_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/property_map.hpp [moved from deal.II/contrib/boost/include/boost/property_map.hpp with 66% similarity]
deal.II/contrib/boost-1.41.0/include/boost/property_map/property_map_iterator.hpp [moved from deal.II/contrib/boost/include/boost/property_map_iterator.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/property_map/shared_array_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map/vector_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/property_map_iterator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/python.hpp [moved from deal.II/contrib/boost/include/boost/python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/arg_from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/arg_from_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/args.hpp [moved from deal.II/contrib/boost/include/boost/python/args.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/args_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/args_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/back_reference.hpp [moved from deal.II/contrib/boost/include/boost/python/back_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/base_type_traits.hpp [moved from deal.II/contrib/boost/include/boost/python/base_type_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/bases.hpp [moved from deal.II/contrib/boost/include/boost/python/bases.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/borrowed.hpp [moved from deal.II/contrib/boost/include/boost/python/borrowed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/call.hpp [moved from deal.II/contrib/boost/include/boost/python/call.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/call_method.hpp [moved from deal.II/contrib/boost/include/boost/python/call_method.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/cast.hpp [moved from deal.II/contrib/boost/include/boost/python/cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/class.hpp [moved from deal.II/contrib/boost/include/boost/python/class.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/class_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/class_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/arg_from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/arg_from_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/arg_to_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/arg_to_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/arg_to_python_base.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/arg_to_python_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/as_to_python_function.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/as_to_python_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/builtin_converters.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/builtin_converters.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/constructor_function.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/constructor_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/context_result_converter.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/context_result_converter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/convertible_function.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/convertible_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/from_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/implicit.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/implicit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/obj_mgr_arg_from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/obj_mgr_arg_from_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/object_manager.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/object_manager.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/pointer_type_id.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/pointer_type_id.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/pyobject_traits.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/pyobject_traits.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/pyobject_type.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/pyobject_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/pytype_function.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/pytype_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/pytype_object_mgr_traits.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/pytype_object_mgr_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/registered.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/registered.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/registered_pointee.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/registered_pointee.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/registrations.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/registrations.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/registry.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/registry.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/return_from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/return_from_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/rvalue_from_python_data.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/rvalue_from_python_data.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/shared_ptr_deleter.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/shared_ptr_deleter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/shared_ptr_from_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/shared_ptr_from_python.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/shared_ptr_to_python.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/shared_ptr_to_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/converter/to_python_function_type.hpp [moved from deal.II/contrib/boost/include/boost/python/converter/to_python_function_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/copy_const_reference.hpp [moved from deal.II/contrib/boost/include/boost/python/copy_const_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/copy_non_const_reference.hpp [moved from deal.II/contrib/boost/include/boost/python/copy_non_const_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/data_members.hpp [moved from deal.II/contrib/boost/include/boost/python/data_members.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/def.hpp [moved from deal.II/contrib/boost/include/boost/python/def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/def_visitor.hpp [moved from deal.II/contrib/boost/include/boost/python/def_visitor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/default_call_policies.hpp [moved from deal.II/contrib/boost/include/boost/python/default_call_policies.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/aix_init_module.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/aix_init_module.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/api_placeholder.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/api_placeholder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/borrowed_ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/borrowed_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/caller.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/caller.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/config.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/construct.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/construct.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/convertible.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/convertible.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/copy_ctor_mutates_rhs.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/copy_ctor_mutates_rhs.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/cv_category.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/cv_category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/dealloc.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/dealloc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/decorated_type_id.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/decorated_type_id.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/decref_guard.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/decref_guard.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/def_helper.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/def_helper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/def_helper_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/def_helper_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/defaults_def.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/defaults_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/defaults_gen.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/defaults_gen.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/dependent.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/dependent.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/destroy.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/destroy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/enable_if.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/enable_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/exception_handler.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/exception_handler.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/force_instantiate.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/force_instantiate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/if_else.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/if_else.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/indirect_traits.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/indirect_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/invoke.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/invoke.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/is_auto_ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/is_auto_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/is_shared_ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/is_shared_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/is_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/is_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/is_xxx.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/is_xxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/make_keyword_range_fn.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/make_keyword_range_fn.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/make_tuple.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/make_tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/map_entry.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/map_entry.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/mpl_lambda.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/mpl_lambda.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/msvc_typeinfo.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/msvc_typeinfo.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/none.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/none.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/not_specified.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/not_specified.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/nullary_function_adaptor.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/nullary_function_adaptor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/operator_id.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/operator_id.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/overloads_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/overloads_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/pointee.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/pointee.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/prefix.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/prefix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/preprocessor.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/preprocessor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/python22_fixed.h [moved from deal.II/contrib/boost/include/boost/python/detail/python22_fixed.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/python_type.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/python_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/raw_pyobject.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/raw_pyobject.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/referent_storage.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/referent_storage.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/result.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/result.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/scope.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/scope.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/sfinae.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/sfinae.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/signature.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/signature.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/string_literal.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/string_literal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/target.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/target.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/translate_exception.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/translate_exception.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/type_list.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/type_list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/type_list_impl.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/type_list_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/type_list_impl_no_pts.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/type_list_impl_no_pts.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/unwind_type.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/unwind_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/unwrap_type_id.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/unwrap_type_id.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/unwrap_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/unwrap_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/value_arg.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/value_arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/value_is_shared_ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/value_is_shared_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/value_is_xxx.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/value_is_xxx.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/void_ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/void_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/void_return.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/void_return.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/wrap_python.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/wrap_python.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/detail/wrapper_base.hpp [moved from deal.II/contrib/boost/include/boost/python/detail/wrapper_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/dict.hpp [moved from deal.II/contrib/boost/include/boost/python/dict.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/docstring_options.hpp [moved from deal.II/contrib/boost/include/boost/python/docstring_options.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/enum.hpp [moved from deal.II/contrib/boost/include/boost/python/enum.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/errors.hpp [moved from deal.II/contrib/boost/include/boost/python/errors.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/exception_translator.hpp [moved from deal.II/contrib/boost/include/boost/python/exception_translator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/exec.hpp [moved from deal.II/contrib/boost/include/boost/python/exec.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/extract.hpp [moved from deal.II/contrib/boost/include/boost/python/extract.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/handle.hpp [moved from deal.II/contrib/boost/include/boost/python/handle.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/handle_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/handle_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/has_back_reference.hpp [moved from deal.II/contrib/boost/include/boost/python/has_back_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/implicit.hpp [moved from deal.II/contrib/boost/include/boost/python/implicit.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/import.hpp [moved from deal.II/contrib/boost/include/boost/python/import.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/init.hpp [moved from deal.II/contrib/boost/include/boost/python/init.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/instance_holder.hpp [moved from deal.II/contrib/boost/include/boost/python/instance_holder.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/iterator.hpp [moved from deal.II/contrib/boost/include/boost/python/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/list.hpp [moved from deal.II/contrib/boost/include/boost/python/list.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/long.hpp [moved from deal.II/contrib/boost/include/boost/python/long.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/lvalue_from_pytype.hpp [moved from deal.II/contrib/boost/include/boost/python/lvalue_from_pytype.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/make_constructor.hpp [moved from deal.II/contrib/boost/include/boost/python/make_constructor.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/make_function.hpp [moved from deal.II/contrib/boost/include/boost/python/make_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/manage_new_object.hpp [moved from deal.II/contrib/boost/include/boost/python/manage_new_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/module.hpp [moved from deal.II/contrib/boost/include/boost/python/module.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/module_init.hpp [moved from deal.II/contrib/boost/include/boost/python/module_init.hpp with 57% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/numeric.hpp [moved from deal.II/contrib/boost/include/boost/python/numeric.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object.hpp [moved from deal.II/contrib/boost/include/boost/python/object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/add_to_namespace.hpp [moved from deal.II/contrib/boost/include/boost/python/object/add_to_namespace.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/class.hpp [moved from deal.II/contrib/boost/include/boost/python/object/class.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/class_detail.hpp [moved from deal.II/contrib/boost/include/boost/python/object/class_detail.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/class_metadata.hpp [moved from deal.II/contrib/boost/include/boost/python/object/class_metadata.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/class_wrapper.hpp [moved from deal.II/contrib/boost/include/boost/python/object/class_wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/enum_base.hpp [moved from deal.II/contrib/boost/include/boost/python/object/enum_base.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/find_instance.hpp [moved from deal.II/contrib/boost/include/boost/python/object/find_instance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/forward.hpp [moved from deal.II/contrib/boost/include/boost/python/object/forward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/function.hpp [moved from deal.II/contrib/boost/include/boost/python/object/function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/function_doc_signature.hpp [moved from deal.II/contrib/boost/include/boost/python/object/function_doc_signature.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/function_handle.hpp [moved from deal.II/contrib/boost/include/boost/python/object/function_handle.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/function_object.hpp [moved from deal.II/contrib/boost/include/boost/python/object/function_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/inheritance.hpp [moved from deal.II/contrib/boost/include/boost/python/object/inheritance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/inheritance_query.hpp [moved from deal.II/contrib/boost/include/boost/python/object/inheritance_query.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/instance.hpp [moved from deal.II/contrib/boost/include/boost/python/object/instance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/iterator.hpp [moved from deal.II/contrib/boost/include/boost/python/object/iterator.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/iterator_core.hpp [moved from deal.II/contrib/boost/include/boost/python/object/iterator_core.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/life_support.hpp [moved from deal.II/contrib/boost/include/boost/python/object/life_support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/make_holder.hpp [moved from deal.II/contrib/boost/include/boost/python/object/make_holder.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/make_instance.hpp [moved from deal.II/contrib/boost/include/boost/python/object/make_instance.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/make_ptr_instance.hpp [moved from deal.II/contrib/boost/include/boost/python/object/make_ptr_instance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/pickle_support.hpp [moved from deal.II/contrib/boost/include/boost/python/object/pickle_support.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/pointer_holder.hpp [moved from deal.II/contrib/boost/include/boost/python/object/pointer_holder.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/py_function.hpp [moved from deal.II/contrib/boost/include/boost/python/object/py_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/stl_iterator_core.hpp [moved from deal.II/contrib/boost/include/boost/python/object/stl_iterator_core.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/value_holder.hpp [moved from deal.II/contrib/boost/include/boost/python/object/value_holder.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object/value_holder_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/object/value_holder_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_attributes.hpp [moved from deal.II/contrib/boost/include/boost/python/object_attributes.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_call.hpp [moved from deal.II/contrib/boost/include/boost/python/object_call.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_core.hpp [moved from deal.II/contrib/boost/include/boost/python/object_core.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_fwd.hpp [moved from deal.II/contrib/boost/include/boost/python/object_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_items.hpp [moved from deal.II/contrib/boost/include/boost/python/object_items.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_operators.hpp [moved from deal.II/contrib/boost/include/boost/python/object_operators.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_protocol.hpp [moved from deal.II/contrib/boost/include/boost/python/object_protocol.hpp with 89% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_protocol_core.hpp [moved from deal.II/contrib/boost/include/boost/python/object_protocol_core.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/object_slices.hpp [moved from deal.II/contrib/boost/include/boost/python/object_slices.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/opaque_pointer_converter.hpp [moved from deal.II/contrib/boost/include/boost/python/opaque_pointer_converter.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/operators.hpp [moved from deal.II/contrib/boost/include/boost/python/operators.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/other.hpp [moved from deal.II/contrib/boost/include/boost/python/other.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/overloads.hpp [moved from deal.II/contrib/boost/include/boost/python/overloads.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/override.hpp [moved from deal.II/contrib/boost/include/boost/python/override.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/pointee.hpp [moved from deal.II/contrib/boost/include/boost/python/pointee.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/proxy.hpp [moved from deal.II/contrib/boost/include/boost/python/proxy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/ptr.hpp [moved from deal.II/contrib/boost/include/boost/python/ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/pure_virtual.hpp [moved from deal.II/contrib/boost/include/boost/python/pure_virtual.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/raw_function.hpp [moved from deal.II/contrib/boost/include/boost/python/raw_function.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/refcount.hpp [moved from deal.II/contrib/boost/include/boost/python/refcount.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/reference_existing_object.hpp [moved from deal.II/contrib/boost/include/boost/python/reference_existing_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/register_ptr_to_python.hpp [moved from deal.II/contrib/boost/include/boost/python/register_ptr_to_python.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/return_arg.hpp [moved from deal.II/contrib/boost/include/boost/python/return_arg.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/return_by_value.hpp [moved from deal.II/contrib/boost/include/boost/python/return_by_value.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/return_internal_reference.hpp [moved from deal.II/contrib/boost/include/boost/python/return_internal_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/return_opaque_pointer.hpp [moved from deal.II/contrib/boost/include/boost/python/return_opaque_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/return_value_policy.hpp [moved from deal.II/contrib/boost/include/boost/python/return_value_policy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/scope.hpp [moved from deal.II/contrib/boost/include/boost/python/scope.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/self.hpp [moved from deal.II/contrib/boost/include/boost/python/self.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/signature.hpp [moved from deal.II/contrib/boost/include/boost/python/signature.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/slice.hpp [moved from deal.II/contrib/boost/include/boost/python/slice.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/slice_nil.hpp [moved from deal.II/contrib/boost/include/boost/python/slice_nil.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/ssize_t.hpp [moved from deal.II/contrib/boost/include/boost/python/ssize_t.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/stl_iterator.hpp [moved from deal.II/contrib/boost/include/boost/python/stl_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/str.hpp [moved from deal.II/contrib/boost/include/boost/python/str.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/suite/indexing/container_utils.hpp [moved from deal.II/contrib/boost/include/boost/python/suite/indexing/container_utils.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/suite/indexing/detail/indexing_suite_detail.hpp [moved from deal.II/contrib/boost/include/boost/python/suite/indexing/detail/indexing_suite_detail.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/suite/indexing/indexing_suite.hpp [moved from deal.II/contrib/boost/include/boost/python/suite/indexing/indexing_suite.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/suite/indexing/map_indexing_suite.hpp [moved from deal.II/contrib/boost/include/boost/python/suite/indexing/map_indexing_suite.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/suite/indexing/vector_indexing_suite.hpp [moved from deal.II/contrib/boost/include/boost/python/suite/indexing/vector_indexing_suite.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/tag.hpp [moved from deal.II/contrib/boost/include/boost/python/tag.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/to_python_converter.hpp [moved from deal.II/contrib/boost/include/boost/python/to_python_converter.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/to_python_indirect.hpp [moved from deal.II/contrib/boost/include/boost/python/to_python_indirect.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/to_python_value.hpp [moved from deal.II/contrib/boost/include/boost/python/to_python_value.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/tuple.hpp [moved from deal.II/contrib/boost/include/boost/python/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/type_id.hpp [moved from deal.II/contrib/boost/include/boost/python/type_id.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/with_custodian_and_ward.hpp [moved from deal.II/contrib/boost/include/boost/python/with_custodian_and_ward.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/python/wrapper.hpp [moved from deal.II/contrib/boost/include/boost/python/wrapper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random.hpp [moved from deal.II/contrib/boost/include/boost/random.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/additive_combine.hpp [moved from deal.II/contrib/boost/include/boost/random/additive_combine.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/bernoulli_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/bernoulli_distribution.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/binomial_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/binomial_distribution.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/cauchy_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/cauchy_distribution.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/config.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/const_mod.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/const_mod.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/iterator_mixin.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/iterator_mixin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/pass_through_engine.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/pass_through_engine.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/ptr_helper.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/ptr_helper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/seed.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/signed_unsigned_tools.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/signed_unsigned_tools.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/detail/uniform_int_float.hpp [moved from deal.II/contrib/boost/include/boost/random/detail/uniform_int_float.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/discard_block.hpp [moved from deal.II/contrib/boost/include/boost/random/discard_block.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/exponential_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/exponential_distribution.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/gamma_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/gamma_distribution.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/geometric_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/geometric_distribution.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/inversive_congruential.hpp [moved from deal.II/contrib/boost/include/boost/random/inversive_congruential.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/lagged_fibonacci.hpp [moved from deal.II/contrib/boost/include/boost/random/lagged_fibonacci.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/linear_congruential.hpp [moved from deal.II/contrib/boost/include/boost/random/linear_congruential.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/linear_feedback_shift.hpp [moved from deal.II/contrib/boost/include/boost/random/linear_feedback_shift.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/lognormal_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/lognormal_distribution.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/mersenne_twister.hpp [moved from deal.II/contrib/boost/include/boost/random/mersenne_twister.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/normal_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/normal_distribution.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/poisson_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/poisson_distribution.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/random_number_generator.hpp [moved from deal.II/contrib/boost/include/boost/random/random_number_generator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/ranlux.hpp [moved from deal.II/contrib/boost/include/boost/random/ranlux.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/shuffle_output.hpp [moved from deal.II/contrib/boost/include/boost/random/shuffle_output.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/subtract_with_carry.hpp [moved from deal.II/contrib/boost/include/boost/random/subtract_with_carry.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/triangle_distribution.hpp [moved from deal.II/contrib/boost/include/boost/random/triangle_distribution.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/uniform_01.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/random/uniform_int.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/random/uniform_on_sphere.hpp [moved from deal.II/contrib/boost/include/boost/random/uniform_on_sphere.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/uniform_real.hpp [moved from deal.II/contrib/boost/include/boost/random/uniform_real.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/uniform_smallint.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/random/variate_generator.hpp [moved from deal.II/contrib/boost/include/boost/random/variate_generator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/random/xor_combine.hpp [moved from deal.II/contrib/boost/include/boost/random/xor_combine.hpp with 80% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range.hpp [moved from deal.II/contrib/boost/include/boost/range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/as_array.hpp [moved from deal.II/contrib/boost/include/boost/range/as_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/as_literal.hpp [moved from deal.II/contrib/boost/include/boost/range/as_literal.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/atl.hpp [moved from deal.II/contrib/boost/include/boost/range/atl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/begin.hpp [moved from deal.II/contrib/boost/include/boost/range/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/category.hpp [moved from deal.II/contrib/boost/include/boost/range/category.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/concepts.hpp [moved from deal.II/contrib/boost/include/boost/range/concepts.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/config.hpp [moved from deal.II/contrib/boost/include/boost/range/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/const_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/const_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/const_reverse_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/const_reverse_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/as_literal.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/as_literal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/begin.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/begin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/collection_traits.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/collection_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/collection_traits_detail.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/collection_traits_detail.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/common.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/common.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/const_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/const_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/detail_str.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/detail_str.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/difference_type.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/difference_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/empty.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/end.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/implementation_help.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/implementation_help.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/microsoft.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/microsoft.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/remove_extent.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/remove_extent.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/sfinae.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/sfinae.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/size.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/size_type.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/size_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/sizer.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/sizer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/str_types.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/str_types.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/value_type.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/value_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/vc6/end.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/vc6/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/detail/vc6/size.hpp [moved from deal.II/contrib/boost/include/boost/range/detail/vc6/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/difference_type.hpp [moved from deal.II/contrib/boost/include/boost/range/difference_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/distance.hpp [moved from deal.II/contrib/boost/include/boost/range/distance.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/empty.hpp [moved from deal.II/contrib/boost/include/boost/range/empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/end.hpp [moved from deal.II/contrib/boost/include/boost/range/end.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/functions.hpp [moved from deal.II/contrib/boost/include/boost/range/functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/iterator_range.hpp [moved from deal.II/contrib/boost/include/boost/range/iterator_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/metafunctions.hpp [moved from deal.II/contrib/boost/include/boost/range/metafunctions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/mfc.hpp [moved from deal.II/contrib/boost/include/boost/range/mfc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/mutable_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/mutable_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/pointer.hpp [moved from deal.II/contrib/boost/include/boost/range/pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/rbegin.hpp [moved from deal.II/contrib/boost/include/boost/range/rbegin.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/reference.hpp [moved from deal.II/contrib/boost/include/boost/range/reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/rend.hpp [moved from deal.II/contrib/boost/include/boost/range/rend.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/result_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/result_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/reverse_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/reverse_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/reverse_result_iterator.hpp [moved from deal.II/contrib/boost/include/boost/range/reverse_result_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/size.hpp [moved from deal.II/contrib/boost/include/boost/range/size.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/size_type.hpp [moved from deal.II/contrib/boost/include/boost/range/size_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/sub_range.hpp [moved from deal.II/contrib/boost/include/boost/range/sub_range.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/range/value_type.hpp [moved from deal.II/contrib/boost/include/boost/range/value_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/rational.hpp [moved from deal.II/contrib/boost/include/boost/rational.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/ref.hpp [moved from deal.II/contrib/boost/include/boost/ref.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/regex.h [moved from deal.II/contrib/boost/include/boost/regex.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/regex.hpp [moved from deal.II/contrib/boost/include/boost/regex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/regex_fwd.hpp [moved from deal.II/contrib/boost/include/boost/regex_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/scoped_array.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/scoped_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/access.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/array.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/assume_abstract.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/base_object.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/binary_object.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/bitset.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_size_type.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_load_imp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_save_imp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/complex.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/config.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/deque.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/get_data.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_count_132.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_132.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_nmt_132.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/stack_constructor.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/ephemeral.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/export.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_no_rtti.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_typeid.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/factory.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/force_include.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_load_imp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_save_imp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_set.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/is_bitwise_serializable.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/level.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/level_enum.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/list.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/nvp.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/optional.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/pfto.hpp [moved from deal.II/contrib/boost/include/boost/pfto.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/serialization/scoped_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/serialization.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/set.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr_132.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/singleton.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/slist.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/smart_cast.hpp [moved from deal.II/contrib/boost/include/boost/smart_cast.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/serialization/split_free.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/split_member.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/state_saver.hpp [moved from deal.II/contrib/boost/include/boost/state_saver.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/serialization/static_warning.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/string.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/strong_typedef.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/throw_exception.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking_enum.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/traits.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/type_info_implementation.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/utility.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/valarray.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/variant.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/vector.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/vector_135.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/version.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast_fwd.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/weak_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/serialization/wrapper.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/shared_array.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/shared_container_iterator.hpp [moved from deal.II/contrib/boost/include/boost/shared_container_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/shared_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/signal.hpp [moved from deal.II/contrib/boost/include/boost/signal.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/signals.hpp [moved from deal.II/contrib/boost/include/boost/signals.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr.hpp [moved from deal.II/contrib/boost/include/boost/smart_ptr.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/bad_weak_ptr.hpp [moved from deal.II/contrib/boost/include/boost/detail/bad_weak_ptr.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count.hpp with 75% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_gcc.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_gcc.hpp with 63% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_gcc_x86.hpp with 76% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_pthreads.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_pthreads.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_solaris.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_solaris.hpp with 82% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_sync.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_sync.hpp with 77% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_win32.hpp [moved from deal.II/contrib/boost/include/boost/detail/atomic_count_win32.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lightweight_mutex.hpp [moved from deal.II/contrib/boost/include/boost/detail/lightweight_mutex.hpp with 67% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_nop.hpp [moved from deal.II/contrib/boost/include/boost/detail/lwm_nop.hpp with 76% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_pthreads.hpp [moved from deal.II/contrib/boost/include/boost/detail/lwm_pthreads.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_win32_cs.hpp [moved from deal.II/contrib/boost/include/boost/detail/lwm_win32_cs.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/operator_bool.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/quick_allocator.hpp [moved from deal.II/contrib/boost/include/boost/detail/quick_allocator.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_array_nmt.hpp [moved from deal.II/contrib/boost/include/boost/detail/shared_array_nmt.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_count.hpp [moved from deal.II/contrib/boost/include/boost/detail/shared_count.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_ptr_nmt.hpp [moved from deal.II/contrib/boost/include/boost/detail/shared_ptr_nmt.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_convertible.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_convertible.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_acc_ia64.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_cw_ppc.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_cw_x86.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_ia64.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_ppc.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_sparc.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_x86.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_nt.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_nt.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_pt.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_pt.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_solaris.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_solaris.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_spin.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_spin.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_sync.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_sync.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_w32.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_base_w32.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_impl.hpp [moved from deal.II/contrib/boost/include/boost/detail/sp_counted_impl.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_has_sync.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock.hpp with 61% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_gcc_arm.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_gcc_arm.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_nt.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_nt.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_pool.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_pool.hpp with 91% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_pt.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_pt.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_sync.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_sync.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_w32.hpp [moved from deal.II/contrib/boost/include/boost/detail/spinlock_w32.hpp with 88% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/yield_k.hpp [moved from deal.II/contrib/boost/include/boost/detail/yield_k.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this2.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/intrusive_ptr.hpp [moved from deal.II/contrib/boost/include/boost/intrusive_ptr.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/make_shared.hpp [moved from deal.II/contrib/boost/include/boost/make_shared.hpp with 71% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/scoped_array.hpp [moved from deal.II/contrib/boost/include/boost/scoped_array.hpp with 59% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/scoped_ptr.hpp [moved from deal.II/contrib/boost/include/boost/scoped_ptr.hpp with 60% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/shared_array.hpp [moved from deal.II/contrib/boost/include/boost/shared_array.hpp with 71% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/shared_ptr.hpp [moved from deal.II/contrib/boost/include/boost/shared_ptr.hpp with 83% similarity]
deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/weak_ptr.hpp [moved from deal.II/contrib/boost/include/boost/weak_ptr.hpp with 74% similarity]
deal.II/contrib/boost-1.41.0/include/boost/spirit.hpp [moved from deal.II/contrib/boost/include/boost/spirit.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/static_assert.hpp [moved from deal.II/contrib/boost/include/boost/static_assert.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/strong_typedef.hpp [moved from deal.II/contrib/boost/include/boost/strong_typedef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/swap.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/thread.hpp [moved from deal.II/contrib/boost/include/boost/thread.hpp with 90% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/barrier.hpp [moved from deal.II/contrib/boost/include/boost/thread/barrier.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/condition.hpp [moved from deal.II/contrib/boost/include/boost/thread/condition.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/condition_variable.hpp [moved from deal.II/contrib/boost/include/boost/thread/condition_variable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/config.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/force_cast.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/force_cast.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/move.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/move.hpp with 92% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/platform.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/platform.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/singleton.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/singleton.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/thread.hpp with 81% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_group.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_heap_alloc.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/thread_heap_alloc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_interruption.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/thread/detail/tss_hooks.hpp [moved from deal.II/contrib/boost/include/boost/thread/detail/tss_hooks.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/exceptions.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/thread/future.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/thread/locks.hpp [moved from deal.II/contrib/boost/include/boost/thread/locks.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/once.hpp [moved from deal.II/contrib/boost/include/boost/thread/once.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/condition_variable.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/condition_variable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/condition_variable_fwd.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/condition_variable_fwd.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/once.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/once.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/pthread_mutex_scoped_lock.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/pthread_mutex_scoped_lock.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/recursive_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/recursive_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/shared_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/shared_mutex.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/thread_data.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/thread_data.hpp with 87% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/thread_heap_alloc.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/thread_heap_alloc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/timespec.hpp [moved from deal.II/contrib/boost/include/boost/thread/pthread/timespec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/recursive_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/recursive_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/shared_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/shared_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/thread.hpp [moved from deal.II/contrib/boost/include/boost/thread/thread.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/thread_time.hpp [moved from deal.II/contrib/boost/include/boost/thread/thread_time.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/tss.hpp [moved from deal.II/contrib/boost/include/boost/thread/tss.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/basic_recursive_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/basic_recursive_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/basic_timed_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/basic_timed_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/condition_variable.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/condition_variable.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/interlocked_read.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/interlocked_read.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/once.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/once.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/recursive_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/recursive_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/shared_mutex.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/shared_mutex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/thread_data.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/thread_data.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/thread_heap_alloc.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/thread_heap_alloc.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/win32/thread_primitives.hpp [moved from deal.II/contrib/boost/include/boost/thread/win32/thread_primitives.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/thread/xtime.hpp [moved from deal.II/contrib/boost/include/boost/thread/xtime.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/throw_exception.hpp [moved from deal.II/contrib/boost/include/boost/throw_exception.hpp with 84% similarity]
deal.II/contrib/boost-1.41.0/include/boost/timer.hpp [moved from deal.II/contrib/boost/include/boost/timer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/token_functions.hpp [moved from deal.II/contrib/boost/include/boost/token_functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/token_iterator.hpp [moved from deal.II/contrib/boost/include/boost/token_iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tokenizer.hpp [moved from deal.II/contrib/boost/include/boost/tokenizer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/array.hpp [moved from deal.II/contrib/boost/include/boost/tr1/array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/cmath.hpp [moved from deal.II/contrib/boost/include/boost/tr1/cmath.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/complex.hpp [moved from deal.II/contrib/boost/include/boost/tr1/complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/config.hpp [moved from deal.II/contrib/boost/include/boost/tr1/detail/config.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/config_all.hpp [moved from deal.II/contrib/boost/include/boost/tr1/detail/config_all.hpp with 79% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/functor2iterator.hpp [moved from deal.II/contrib/boost/include/boost/tr1/detail/functor2iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/math_overloads.hpp [moved from deal.II/contrib/boost/include/boost/tr1/detail/math_overloads.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/functional.hpp [moved from deal.II/contrib/boost/include/boost/tr1/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/memory.hpp [moved from deal.II/contrib/boost/include/boost/tr1/memory.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/random.hpp [moved from deal.II/contrib/boost/include/boost/tr1/random.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/regex.hpp [moved from deal.II/contrib/boost/include/boost/tr1/regex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/algorithm [moved from deal.II/contrib/boost/include/boost/tr1/tr1/algorithm with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/array [moved from deal.II/contrib/boost/include/boost/tr1/tr1/array with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/array.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/array.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/random.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/random.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/regex.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/regex.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/tuple.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/tuple.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/type_tra.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/type_tra.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bcc32/unordere.h [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bcc32/unordere.h with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/bitset [moved from deal.II/contrib/boost/include/boost/tr1/tr1/bitset with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/cmath [moved from deal.II/contrib/boost/include/boost/tr1/tr1/cmath with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/complex [moved from deal.II/contrib/boost/include/boost/tr1/tr1/complex with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/deque [moved from deal.II/contrib/boost/include/boost/tr1/tr1/deque with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/exception [moved from deal.II/contrib/boost/include/boost/tr1/tr1/exception with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/fstream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/fstream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/functional [moved from deal.II/contrib/boost/include/boost/tr1/tr1/functional with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/iomanip [moved from deal.II/contrib/boost/include/boost/tr1/tr1/iomanip with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/ios [moved from deal.II/contrib/boost/include/boost/tr1/tr1/ios with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/iostream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/iostream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/istream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/istream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/iterator [moved from deal.II/contrib/boost/include/boost/tr1/tr1/iterator with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/limits [moved from deal.II/contrib/boost/include/boost/tr1/tr1/limits with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/list [moved from deal.II/contrib/boost/include/boost/tr1/tr1/list with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/locale [moved from deal.II/contrib/boost/include/boost/tr1/tr1/locale with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/map [moved from deal.II/contrib/boost/include/boost/tr1/tr1/map with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/memory [moved from deal.II/contrib/boost/include/boost/tr1/tr1/memory with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/new [moved from deal.II/contrib/boost/include/boost/tr1/tr1/new with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/numeric [moved from deal.II/contrib/boost/include/boost/tr1/tr1/numeric with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/ostream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/ostream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/queue [moved from deal.II/contrib/boost/include/boost/tr1/tr1/queue with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/random [moved from deal.II/contrib/boost/include/boost/tr1/tr1/random with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/regex [moved from deal.II/contrib/boost/include/boost/tr1/tr1/regex with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/set [moved from deal.II/contrib/boost/include/boost/tr1/tr1/set with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sstream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sstream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/stack [moved from deal.II/contrib/boost/include/boost/tr1/tr1/stack with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/stdexcept [moved from deal.II/contrib/boost/include/boost/tr1/tr1/stdexcept with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/streambuf [moved from deal.II/contrib/boost/include/boost/tr1/tr1/streambuf with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/string [moved from deal.II/contrib/boost/include/boost/tr1/tr1/string with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/strstream [moved from deal.II/contrib/boost/include/boost/tr1/tr1/strstream with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/algorithm.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/algorithm.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/array.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/array.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/bcc32.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/bcc32.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/bitset.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/bitset.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/cmath.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/cmath.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/complex.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/complex.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/deque.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/deque.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/exception.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/exception.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/fstream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/fstream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/functional.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/functional.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/iomanip.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/iomanip.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/ios.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/ios.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/iostream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/iostream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/istream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/istream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/iterator.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/iterator.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/limits.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/limits.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/list.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/list.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/locale.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/locale.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/map.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/map.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/memory.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/memory.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/new.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/new.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/numeric.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/numeric.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/ostream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/ostream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/queue.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/queue.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/random.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/random.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/regex.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/regex.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/set.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/set.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/sstream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/sstream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/stack.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/stack.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/stdexcept.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/stdexcept.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/streambuf.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/streambuf.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/string.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/string.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/strstream.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/strstream.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/sun.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/sun.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/tuple.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/tuple.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/type_traits.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/type_traits.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/typeinfo.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/typeinfo.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/unordered_map.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/unordered_map.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/unordered_set.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/unordered_set.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/utility.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/utility.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/valarray.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/valarray.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/sun/vector.SUNWCCh [moved from deal.II/contrib/boost/include/boost/tr1/tr1/sun/vector.SUNWCCh with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/tuple [moved from deal.II/contrib/boost/include/boost/tr1/tr1/tuple with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/type_traits [moved from deal.II/contrib/boost/include/boost/tr1/tr1/type_traits with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/typeinfo [moved from deal.II/contrib/boost/include/boost/tr1/tr1/typeinfo with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/unordered_map [moved from deal.II/contrib/boost/include/boost/tr1/tr1/unordered_map with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/unordered_set [moved from deal.II/contrib/boost/include/boost/tr1/tr1/unordered_set with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/utility [moved from deal.II/contrib/boost/include/boost/tr1/tr1/utility with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/valarray [moved from deal.II/contrib/boost/include/boost/tr1/tr1/valarray with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/vector [moved from deal.II/contrib/boost/include/boost/tr1/tr1/vector with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/tuple.hpp [moved from deal.II/contrib/boost/include/boost/tr1/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/type_traits.hpp [moved from deal.II/contrib/boost/include/boost/tr1/type_traits.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/unordered_map.hpp [moved from deal.II/contrib/boost/include/boost/tr1/unordered_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/unordered_set.hpp [moved from deal.II/contrib/boost/include/boost/tr1/unordered_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tr1/utility.hpp [moved from deal.II/contrib/boost/include/boost/tr1/utility.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tuple/detail/tuple_basic.hpp [moved from deal.II/contrib/boost/include/boost/tuple/detail/tuple_basic.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp [moved from deal.II/contrib/boost/include/boost/tuple/detail/tuple_basic_no_partial_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tuple/tuple.hpp [moved from deal.II/contrib/boost/include/boost/tuple/tuple.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tuple/tuple_comparison.hpp [moved from deal.II/contrib/boost/include/boost/tuple/tuple_comparison.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/tuple/tuple_io.hpp [moved from deal.II/contrib/boost/include/boost/tuple/tuple_io.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type.hpp [moved from deal.II/contrib/boost/include/boost/type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/add_const.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/add_const.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/add_cv.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/add_cv.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/add_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/add_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/add_reference.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/add_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/add_volatile.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/add_volatile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/aligned_storage.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/aligned_storage.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/alignment_of.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/alignment_of.hpp with 86% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/alignment_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/alignment_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/arithmetic_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/arithmetic_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/array_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/array_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/broken_compiler_spec.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/broken_compiler_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/composite_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/composite_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/config.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/config.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/conversion_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/conversion_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/cv_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/cv_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/decay.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/decay.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/bool_trait_def.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/bool_trait_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/bool_trait_undef.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/bool_trait_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/cv_traits_impl.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/cv_traits_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/false_result.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/false_result.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/ice_and.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/ice_and.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/ice_eq.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/ice_eq.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/ice_not.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/ice_not.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/ice_or.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/ice_or.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/is_function_ptr_helper.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/is_function_ptr_helper.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/is_function_ptr_tester.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/is_function_ptr_tester.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/size_t_trait_def.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/size_t_trait_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/size_t_trait_undef.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/size_t_trait_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/template_arity_spec.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/template_arity_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/type_trait_def.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/type_trait_def.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/type_trait_undef.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/type_trait_undef.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/wrap.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/wrap.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/detail/yes_no_type.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/detail/yes_no_type.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/extent.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/extent.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/floating_point_promotion.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/floating_point_promotion.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/function_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/function_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_new_operator.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_nothrow_assign.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_nothrow_assign.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_nothrow_constructor.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_nothrow_constructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_nothrow_copy.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_nothrow_copy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_nothrow_destructor.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_nothrow_destructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_trivial_assign.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_trivial_assign.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_trivial_constructor.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_trivial_constructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_trivial_copy.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_trivial_copy.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_trivial_destructor.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_trivial_destructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_virtual_destructor.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/has_virtual_destructor.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/ice.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/ice.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/integral_constant.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/integral_constant.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/integral_promotion.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/integral_promotion.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/intrinsics.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/intrinsics.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_abstract.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_abstract.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_arithmetic.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_arithmetic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_array.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_array.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_and_derived.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_base_and_derived.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_of.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_base_of.hpp with 66% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_of_tr1.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_class.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_class.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_complex.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_compound.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_compound.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_const.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_const.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_convertible.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_convertible.hpp with 99% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_empty.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_empty.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_enum.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_enum.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_float.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_float.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_floating_point.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_floating_point.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_function.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_function.hpp with 96% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_fundamental.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_fundamental.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_integral.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_integral.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_member_function_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_member_function_pointer.hpp with 97% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_member_object_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_member_object_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_member_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_member_pointer.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_object.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_object.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_pod.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_pod.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_polymorphic.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_polymorphic.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_reference.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_same.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_same.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_scalar.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_scalar.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_signed.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_signed.hpp with 98% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_stateless.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_stateless.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_union.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_union.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_unsigned.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_unsigned.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_virtual_base_of.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_void.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_void.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_volatile.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/is_volatile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/make_signed.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/make_signed.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/make_unsigned.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/make_unsigned.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_all_extents.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_all_extents.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_bounds.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_bounds.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_const.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_const.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_cv.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_cv.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_extent.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_extent.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_reference.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/remove_volatile.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/remove_volatile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/msvc/typeof.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/msvc/typeof.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/object_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/object_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/promote.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/promote.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/rank.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/rank.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/reference_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/reference_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_all_extents.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_all_extents.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_bounds.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_bounds.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_const.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_const.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_cv.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_cv.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_extent.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_extent.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_pointer.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_pointer.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_reference.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_reference.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/remove_volatile.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/remove_volatile.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/same_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/same_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/transform_traits.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/transform_traits.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/transform_traits_spec.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/transform_traits_spec.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/type_traits/type_with_alignment.hpp [moved from deal.II/contrib/boost/include/boost/type_traits/type_with_alignment.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/dmc/typeof_impl.hpp [moved from deal.II/contrib/boost/include/boost/typeof/dmc/typeof_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/encode_decode.hpp [moved from deal.II/contrib/boost/include/boost/typeof/encode_decode.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/encode_decode_params.hpp [moved from deal.II/contrib/boost/include/boost/typeof/encode_decode_params.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/incr_registration_group.hpp [moved from deal.II/contrib/boost/include/boost/typeof/incr_registration_group.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/int_encoding.hpp [moved from deal.II/contrib/boost/include/boost/typeof/int_encoding.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/integral_template_param.hpp [moved from deal.II/contrib/boost/include/boost/typeof/integral_template_param.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/message.hpp [moved from deal.II/contrib/boost/include/boost/typeof/message.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/modifiers.hpp [moved from deal.II/contrib/boost/include/boost/typeof/modifiers.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/msvc/typeof_impl.hpp [moved from deal.II/contrib/boost/include/boost/typeof/msvc/typeof_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/native.hpp [moved from deal.II/contrib/boost/include/boost/typeof/native.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/pointers_data_members.hpp [moved from deal.II/contrib/boost/include/boost/typeof/pointers_data_members.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/register_functions.hpp [moved from deal.II/contrib/boost/include/boost/typeof/register_functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/register_functions_iterate.hpp [moved from deal.II/contrib/boost/include/boost/typeof/register_functions_iterate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/register_fundamental.hpp [moved from deal.II/contrib/boost/include/boost/typeof/register_fundamental.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/register_mem_functions.hpp [moved from deal.II/contrib/boost/include/boost/typeof/register_mem_functions.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/bitset.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/bitset.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/complex.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/complex.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/deque.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/deque.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/fstream.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/fstream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/functional.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/functional.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/iostream.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/iostream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/istream.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/istream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/iterator.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/iterator.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/list.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/list.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/locale.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/locale.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/map.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/memory.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/memory.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/ostream.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/ostream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/queue.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/queue.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/set.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/sstream.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/sstream.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/stack.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/stack.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/streambuf.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/streambuf.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/string.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/string.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/utility.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/utility.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/valarray.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/valarray.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/std/vector.hpp [moved from deal.II/contrib/boost/include/boost/typeof/std/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/template_encoding.hpp [moved from deal.II/contrib/boost/include/boost/typeof/template_encoding.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/template_template_param.hpp [moved from deal.II/contrib/boost/include/boost/typeof/template_template_param.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/type_encoding.hpp [moved from deal.II/contrib/boost/include/boost/typeof/type_encoding.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/type_template_param.hpp [moved from deal.II/contrib/boost/include/boost/typeof/type_template_param.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/typeof.hpp [moved from deal.II/contrib/boost/include/boost/typeof/typeof.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/typeof_impl.hpp [moved from deal.II/contrib/boost/include/boost/typeof/typeof_impl.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/vector.hpp [moved from deal.II/contrib/boost/include/boost/typeof/vector.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/vector100.hpp [moved from deal.II/contrib/boost/include/boost/typeof/vector100.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/vector150.hpp [moved from deal.II/contrib/boost/include/boost/typeof/vector150.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/vector200.hpp [moved from deal.II/contrib/boost/include/boost/typeof/vector200.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/typeof/vector50.hpp [moved from deal.II/contrib/boost/include/boost/typeof/vector50.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/unordered_map.hpp [moved from deal.II/contrib/boost/include/boost/unordered_map.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/unordered_set.hpp [moved from deal.II/contrib/boost/include/boost/unordered_set.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility.hpp [moved from deal.II/contrib/boost/include/boost/utility.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/addressof.hpp [moved from deal.II/contrib/boost/include/boost/utility/addressof.hpp with 62% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/base_from_member.hpp [moved from deal.II/contrib/boost/include/boost/utility/base_from_member.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/binary.hpp [moved from deal.II/contrib/boost/include/boost/utility/binary.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/compare_pointees.hpp [moved from deal.II/contrib/boost/include/boost/utility/compare_pointees.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/detail/in_place_factory_prefix.hpp [moved from deal.II/contrib/boost/include/boost/utility/detail/in_place_factory_prefix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/detail/in_place_factory_suffix.hpp [moved from deal.II/contrib/boost/include/boost/utility/detail/in_place_factory_suffix.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/detail/result_of_iterate.hpp [moved from deal.II/contrib/boost/include/boost/utility/detail/result_of_iterate.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/enable_if.hpp [moved from deal.II/contrib/boost/include/boost/utility/enable_if.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/in_place_factory.hpp [moved from deal.II/contrib/boost/include/boost/utility/in_place_factory.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/result_of.hpp [moved from deal.II/contrib/boost/include/boost/utility/result_of.hpp with 95% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/swap.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/utility/typed_in_place_factory.hpp [moved from deal.II/contrib/boost/include/boost/utility/typed_in_place_factory.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/utility/value_init.hpp [moved from deal.II/contrib/boost/include/boost/utility/value_init.hpp with 85% similarity]
deal.II/contrib/boost-1.41.0/include/boost/variant.hpp [moved from deal.II/contrib/boost/include/boost/variant.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/vector_property_map.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/include/boost/version.hpp [moved from deal.II/contrib/boost/include/boost/version.hpp with 94% similarity]
deal.II/contrib/boost-1.41.0/include/boost/visit_each.hpp [moved from deal.II/contrib/boost/include/boost/visit_each.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/include/boost/wave.hpp [moved from deal.II/contrib/boost/include/boost/wave.hpp with 93% similarity]
deal.II/contrib/boost-1.41.0/include/boost/weak_ptr.hpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/libs/thread/build/Jamfile.v2 [moved from deal.II/contrib/boost/libs/thread/build/Jamfile.v2 with 98% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/Jamfile.v2 [moved from deal.II/contrib/boost/libs/thread/doc/Jamfile.v2 with 57% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/acknowledgements.qbk [moved from deal.II/contrib/boost/libs/thread/doc/acknowledgements.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/barrier.qbk [moved from deal.II/contrib/boost/libs/thread/doc/barrier.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/changes.qbk [moved from deal.II/contrib/boost/libs/thread/doc/changes.qbk with 96% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/condition_variables.qbk [moved from deal.II/contrib/boost/libs/thread/doc/condition_variables.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/future_ref.qbk [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/libs/thread/doc/futures.qbk [new file with mode: 0755]
deal.II/contrib/boost-1.41.0/libs/thread/doc/index.html [moved from deal.II/contrib/boost/libs/thread/doc/index.html with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/mutex_concepts.qbk [moved from deal.II/contrib/boost/libs/thread/doc/mutex_concepts.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/mutexes.qbk [moved from deal.II/contrib/boost/libs/thread/doc/mutexes.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/once.qbk [moved from deal.II/contrib/boost/libs/thread/doc/once.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/overview.qbk [moved from deal.II/contrib/boost/libs/thread/doc/overview.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/shared_mutex_ref.qbk [moved from deal.II/contrib/boost/libs/thread/doc/shared_mutex_ref.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/thread.qbk [moved from deal.II/contrib/boost/libs/thread/doc/thread.qbk with 99% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/thread_ref.qbk [moved from deal.II/contrib/boost/libs/thread/doc/thread_ref.qbk with 98% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/time.qbk [moved from deal.II/contrib/boost/libs/thread/doc/time.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/doc/tss.qbk [moved from deal.II/contrib/boost/libs/thread/doc/tss.qbk with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/Jamfile.v2 [moved from deal.II/contrib/boost/libs/thread/example/Jamfile.v2 with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/condition.cpp [moved from deal.II/contrib/boost/libs/thread/example/condition.cpp with 90% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/monitor.cpp [moved from deal.II/contrib/boost/libs/thread/example/monitor.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/mutex.cpp [moved from deal.II/contrib/boost/libs/thread/example/mutex.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/once.cpp [moved from deal.II/contrib/boost/libs/thread/example/once.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/recursive_mutex.cpp [moved from deal.II/contrib/boost/libs/thread/example/recursive_mutex.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/starvephil.cpp [moved from deal.II/contrib/boost/libs/thread/example/starvephil.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/tennis.cpp [moved from deal.II/contrib/boost/libs/thread/example/tennis.cpp with 98% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/thread.cpp [moved from deal.II/contrib/boost/libs/thread/example/thread.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/thread_group.cpp [moved from deal.II/contrib/boost/libs/thread/example/thread_group.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/tss.cpp [moved from deal.II/contrib/boost/libs/thread/example/tss.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/example/xtime.cpp [moved from deal.II/contrib/boost/libs/thread/example/xtime.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/index.html [moved from deal.II/contrib/boost/libs/thread/index.html with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/pthread/once.cpp [moved from deal.II/contrib/boost/libs/thread/src/pthread/once.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/pthread/thread.cpp [moved from deal.II/contrib/boost/libs/thread/src/pthread/thread.cpp with 78% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/pthread/timeconv.inl [moved from deal.II/contrib/boost/libs/thread/src/pthread/timeconv.inl with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/tss_null.cpp [moved from deal.II/contrib/boost/libs/thread/src/tss_null.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/win32/thread.cpp [moved from deal.II/contrib/boost/libs/thread/src/win32/thread.cpp with 98% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/win32/timeconv.inl [moved from deal.II/contrib/boost/libs/thread/src/win32/timeconv.inl with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/win32/tss_dll.cpp [moved from deal.II/contrib/boost/libs/thread/src/win32/tss_dll.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/src/win32/tss_pe.cpp [moved from deal.II/contrib/boost/libs/thread/src/win32/tss_pe.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/Carbon.r [moved from deal.II/contrib/boost/libs/thread/test/Carbon.r with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/Jamfile.v2 [moved from deal.II/contrib/boost/libs/thread/test/Jamfile.v2 with 94% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/condition_test_common.hpp [moved from deal.II/contrib/boost/libs/thread/test/condition_test_common.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/no_implicit_assign_from_lvalue_thread.cpp [moved from deal.II/contrib/boost/libs/thread/test/no_implicit_assign_from_lvalue_thread.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/no_implicit_move_from_lvalue_thread.cpp [moved from deal.II/contrib/boost/libs/thread/test/no_implicit_move_from_lvalue_thread.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/shared_mutex_locking_thread.hpp [moved from deal.II/contrib/boost/libs/thread/test/shared_mutex_locking_thread.hpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test.mcp [moved from deal.II/contrib/boost/libs/thread/test/test.mcp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_barrier.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_barrier.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_condition.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_condition.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_condition_notify_all.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_condition_notify_all.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_condition_notify_one.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_condition_notify_one.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_condition_timed_wait_times_out.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_condition_timed_wait_times_out.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_futures.cpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_generic_locks.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_generic_locks.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_hardware_concurrency.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_hardware_concurrency.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_lock_concept.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_lock_concept.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_move_function.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_move_function.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_mutex.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_mutex.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_once.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_once.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_shared_mutex.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_shared_mutex.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_shared_mutex_part_2.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_shared_mutex_part_2.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_shared_mutex_timed_locks.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_shared_mutex_timed_locks.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_thread.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_id.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_thread_id.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_launching.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_thread_launching.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_mf.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_thread_mf.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_move.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_thread_move.cpp with 75% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_move_return.cpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_return_local.cpp [new file with mode: 0644]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_tss.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_tss.cpp with 89% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/test_xtime.cpp [moved from deal.II/contrib/boost/libs/thread/test/test_xtime.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/test/util.inl [moved from deal.II/contrib/boost/libs/thread/test/util.inl with 96% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/bounded_buffer.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/bounded_buffer.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/counter.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/counter.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/factorial.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/factorial.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/factorial2.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/factorial2.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/factorial3.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/factorial3.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/helloworld.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/helloworld.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/helloworld2.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/helloworld2.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/helloworld3.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/helloworld3.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/helloworld4.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/helloworld4.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/once.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/once.cpp with 100% similarity]
deal.II/contrib/boost-1.41.0/libs/thread/tutorial/tss.cpp [moved from deal.II/contrib/boost/libs/thread/tutorial/tss.cpp with 100% similarity]
deal.II/contrib/boost/include/boost/bind/protect.hpp [deleted file]
deal.II/contrib/boost/include/boost/config/stdlib/modena.hpp [deleted file]
deal.II/contrib/boost/include/boost/config/stdlib/vacpp.hpp [deleted file]
deal.II/contrib/boost/include/boost/date_time/filetime_functions.hpp [deleted file]
deal.II/contrib/boost/include/boost/date_time/gregorian/conversion.hpp [deleted file]
deal.II/contrib/boost/include/boost/date_time/gregorian/greg_duration.hpp [deleted file]
deal.II/contrib/boost/include/boost/date_time/microsec_time_clock.hpp [deleted file]
deal.II/contrib/boost/include/boost/date_time/testfrmwk.hpp [deleted file]
deal.II/contrib/boost/include/boost/detail/sp_counted_base.hpp [deleted file]
deal.II/contrib/boost/include/boost/enable_shared_from_this.hpp [deleted file]
deal.II/contrib/boost/include/boost/exception/diagnostic_information.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/detail/float_functions.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/detail/hash_float.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/deque.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/list.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/map.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/pair.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/set.hpp [deleted file]
deal.II/contrib/boost/include/boost/functional/hash/vector.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/compressed_sparse_row_graph.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/detail/incremental_components.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/erdos_renyi_generator.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/exception.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/graph_concepts.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/graph_traits.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/howard_cycle_ratio.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/incremental_components.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/named_function_params.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/plod_generator.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/random_layout.hpp [deleted file]
deal.II/contrib/boost/include/boost/graph/subgraph.hpp [deleted file]
deal.II/contrib/boost/include/boost/iostreams/device/file_descriptor.hpp [deleted file]
deal.II/contrib/boost/include/boost/iostreams/device/mapped_file.hpp [deleted file]
deal.II/contrib/boost/include/boost/math/special_functions/fpclassify.hpp [deleted file]
deal.II/contrib/boost/include/boost/math/special_functions/sign.hpp [deleted file]
deal.II/contrib/boost/include/boost/pending/property_serialize.hpp [deleted file]
deal.II/contrib/boost/include/boost/random/uniform_01.hpp [deleted file]
deal.II/contrib/boost/include/boost/random/uniform_int.hpp [deleted file]
deal.II/contrib/boost/include/boost/random/uniform_smallint.hpp [deleted file]
deal.II/contrib/boost/include/boost/static_warning.hpp [deleted file]
deal.II/contrib/boost/include/boost/thread/exceptions.hpp [deleted file]
deal.II/contrib/boost/include/boost/vector_property_map.hpp [deleted file]
deal.II/contrib/boost/libs/thread/src/pthread/exceptions.cpp [deleted file]
deal.II/contrib/boost/libs/thread/src/win32/exceptions.cpp [deleted file]

similarity index 97%
rename from deal.II/contrib/boost/include/boost/algorithm/string/case_conv.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/case_conv.hpp
index 536c022a674adbc11be98cd88a45826ddc3889d0..683340b8ec8d7d039dfc1cbfbbf63a6aadc8a448 100644 (file)
@@ -59,7 +59,7 @@ namespace boost {
         {
             return ::boost::algorithm::detail::transform_range_copy( 
                Output,
-               as_literal(Input),
+               ::boost::as_literal(Input),
                ::boost::algorithm::detail::to_lowerF<
                     typename range_value<RangeT>::type >(Loc));
         }
@@ -93,7 +93,7 @@ namespace boost {
             const std::locale& Loc=std::locale())
         {
             ::boost::algorithm::detail::transform_range(
-                as_literal(Input),
+                ::boost::as_literal(Input),
                 ::boost::algorithm::detail::to_lowerF<
                     typename range_value<WritableRangeT>::type >(Loc));
         }
@@ -124,7 +124,7 @@ namespace boost {
         {
             return ::boost::algorithm::detail::transform_range_copy( 
                Output,
-               as_literal(Input),
+               ::boost::as_literal(Input),
                ::boost::algorithm::detail::to_upperF<
                     typename range_value<RangeT>::type >(Loc));
         }
@@ -158,7 +158,7 @@ namespace boost {
             const std::locale& Loc=std::locale())
         {
             ::boost::algorithm::detail::transform_range(
-                as_literal(Input),
+                ::boost::as_literal(Input),
                 ::boost::algorithm::detail::to_upperF<
                     typename range_value<WritableRangeT>::type >(Loc));
         }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/algorithm/string/classification.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/classification.hpp
index 33ff9be1077c42c6fbab64125be61d4ce351a1a2..ca43602d47207d960ac8ab23152f64c823afc298 100644 (file)
@@ -202,7 +202,7 @@ namespace boost {
             BOOST_STRING_TYPENAME range_value<RangeT>::type> 
         is_any_of( const RangeT& Set )
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(as_literal(Set));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_set(boost::as_literal(Set));
             return detail::is_any_ofF<BOOST_STRING_TYPENAME range_value<RangeT>::type>(lit_set); 
         }
 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/case_conv.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/case_conv.hpp
index 5253454fe02326851263e4767e3778893c14f701..3440c2730930547b9fa6dc721847b4e9e4018a7a 100644 (file)
@@ -105,10 +105,10 @@ namespace boost {
                 FunctorT Functor)
             {
                 return SequenceT(
-                    make_transform_iterator(
+                    ::boost::make_transform_iterator(
                         ::boost::begin(Input),
                         Functor),
-                    make_transform_iterator(
+                    ::boost::make_transform_iterator(
                         ::boost::end(Input), 
                         Functor));
             }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/classification.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/classification.hpp
index 1db5d295fd634b3ae1ba38555770623fa209b40e..9a34bf0059f2116e8fe3bb96ed6a5b0c390bf654 100644 (file)
@@ -171,7 +171,7 @@ namespace boost {
                         // Check what kind of storage are we using right now
                         if(use_fixed_storage(m_Size))
                         {
-                            // Using fixed storage, allocate new               
+                            // Using fixed storage, allocate new
                             set_value_type* pTemp=new set_value_type[Other.m_Size];
                             DestStorage=pTemp;
                             m_Storage.m_dynSet=pTemp;
similarity index 93%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_format.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_format.hpp
index 8fb625ee982cd76249c4c292095d9a476b370191..0d8b104525e54502efab1917573a2918ffcd310d 100644 (file)
@@ -24,26 +24,7 @@ namespace boost {
 
 // find_format_copy (iterator variant) implementation -------------------------------//
 
-            template< 
-                typename OutputIteratorT,
-                typename InputT,
-                typename FormatterT,
-                typename FindResultT >
-            inline OutputIteratorT find_format_copy_impl(
-                OutputIteratorT Output,
-                const InputT& Input,
-                FormatterT Formatter,
-                const FindResultT& FindResult )
-            {       
-                return find_format_copy_impl2( 
-                    Output,
-                    Input,
-                    Formatter,
-                    FindResult,
-                    Formatter(FindResult) );
-            }
-
-            template< 
+           template< 
                 typename OutputIteratorT,
                 typename InputT,
                 typename FormatterT,
@@ -83,25 +64,29 @@ namespace boost {
                 return Output;
             }
 
-// find_format_copy implementation --------------------------------------------------//
-
             template< 
-                typename InputT, 
+                typename OutputIteratorT,
+                typename InputT,
                 typename FormatterT,
                 typename FindResultT >
-            inline InputT find_format_copy_impl(
+            inline OutputIteratorT find_format_copy_impl(
+                OutputIteratorT Output,
                 const InputT& Input,
                 FormatterT Formatter,
-                const FindResultT& FindResult)
-            {
-                return find_format_copy_impl2(
+                const FindResultT& FindResult )
+            {       
+                return ::boost::algorithm::detail::find_format_copy_impl2( 
+                    Output,
                     Input,
                     Formatter,
                     FindResult,
                     Formatter(FindResult) );
             }
 
-            template< 
+// find_format_copy implementation --------------------------------------------------//
+
+           template< 
                 typename InputT, 
                 typename FormatterT,
                 typename FindResultT,
@@ -138,24 +123,24 @@ namespace boost {
                 return Output;
             }
 
-// replace implementation ----------------------------------------------------//
-        
-            template<
-                typename InputT,
+            template< 
+                typename InputT, 
                 typename FormatterT,
                 typename FindResultT >
-            inline void find_format_impl( 
-                InputT& Input,
+            inline InputT find_format_copy_impl(
+                const InputT& Input,
                 FormatterT Formatter,
                 const FindResultT& FindResult)
             {
-                find_format_impl2(
+                return ::boost::algorithm::detail::find_format_copy_impl2(
                     Input,
                     Formatter,
                     FindResult,
                     Formatter(FindResult) );
             }
 
+ // replace implementation ----------------------------------------------------//
+        
             template<
                 typename InputT,
                 typename FormatterT,
@@ -183,7 +168,23 @@ namespace boost {
                 }
 
                 // Replace match
-                replace( Input, M.begin(), M.end(), M.format_result() );
+                ::boost::algorithm::detail::replace( Input, M.begin(), M.end(), M.format_result() );
+            }
+
+            template<
+                typename InputT,
+                typename FormatterT,
+                typename FindResultT >
+            inline void find_format_impl( 
+                InputT& Input,
+                FormatterT Formatter,
+                const FindResultT& FindResult)
+            {
+                ::boost::algorithm::detail::find_format_impl2(
+                    Input,
+                    Formatter,
+                    FindResult,
+                    Formatter(FindResult) );
             }
 
         } // namespace detail
similarity index 90%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/find_format_all.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/find_format_all.hpp
index 9533be60947019ba50f997ee7d7b498661b0e244..36edf56c31223e33642adaabe10e9f6b770ebb19 100644 (file)
@@ -24,29 +24,7 @@ namespace boost {
 
 // find_format_all_copy (iterator variant) implementation ---------------------------//
 
-            template< 
-                typename OutputIteratorT,
-                typename InputT,
-                typename FinderT,
-                typename FormatterT,
-                typename FindResultT >
-            inline OutputIteratorT find_format_all_copy_impl(
-                OutputIteratorT Output,
-                const InputT& Input,
-                FinderT Finder,
-                FormatterT Formatter,
-                const FindResultT& FindResult )
-            {       
-                return find_format_all_copy_impl2( 
-                    Output,
-                    Input,
-                    Finder,
-                    Formatter,
-                    FindResult,
-                    Formatter(FindResult) );
-            }
-
-            template< 
+           template< 
                 typename OutputIteratorT,
                 typename InputT,
                 typename FinderT,
@@ -94,20 +72,21 @@ namespace boost {
                 return Output;
             }
 
-// find_format_all_copy implementation ----------------------------------------------//
-
             template< 
-                typename InputT, 
+                typename OutputIteratorT,
+                typename InputT,
                 typename FinderT,
                 typename FormatterT,
                 typename FindResultT >
-            inline InputT find_format_all_copy_impl(
+            inline OutputIteratorT find_format_all_copy_impl(
+                OutputIteratorT Output,
                 const InputT& Input,
                 FinderT Finder,
                 FormatterT Formatter,
-                const FindResultT& FindResult)
-            {
-                return find_format_all_copy_impl2(
+                const FindResultT& FindResult )
+            {       
+                return ::boost::algorithm::detail::find_format_all_copy_impl2( 
+                    Output,
                     Input,
                     Finder,
                     Formatter,
@@ -115,7 +94,9 @@ namespace boost {
                     Formatter(FindResult) );
             }
 
-            template< 
+ // find_format_all_copy implementation ----------------------------------------------//
+
+           template< 
                 typename InputT, 
                 typename FinderT,
                 typename FormatterT,
@@ -159,25 +140,23 @@ namespace boost {
                 }
 
                 // Copy the rest of the sequence
-                insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) );
+                ::boost::algorithm::detail::insert( Output, ::boost::end(Output), LastMatch, ::boost::end(Input) );
 
                 return Output;
             }
 
-// find_format_all implementation ------------------------------------------------//
-        
-            template<
-                typename InputT,
+            template< 
+                typename InputT, 
                 typename FinderT,
                 typename FormatterT,
                 typename FindResultT >
-            inline void find_format_all_impl( 
-                InputT& Input,
+            inline InputT find_format_all_copy_impl(
+                const InputT& Input,
                 FinderT Finder,
                 FormatterT Formatter,
-                FindResultT FindResult)
+                const FindResultT& FindResult)
             {
-                find_format_all_impl2(
+                return ::boost::algorithm::detail::find_format_all_copy_impl2(
                     Input,
                     Finder,
                     Formatter,
@@ -185,6 +164,8 @@ namespace boost {
                     Formatter(FindResult) );
             }
 
+ // find_format_all implementation ------------------------------------------------//
+        
             template<
                 typename InputT,
                 typename FinderT,
@@ -230,14 +211,14 @@ namespace boost {
                     SearchIt=M.end();
 
                     // Copy formated replace to the storage
-                    copy_to_storage( Storage, M.format_result() );
+                    ::boost::algorithm::detail::copy_to_storage( Storage, M.format_result() );
 
                     // Find range for a next match
                     M=Finder( SearchIt, ::boost::end(Input) );
                 }
 
                 // process the last segment
-                InsertIt=process_segment( 
+                InsertIt=::boost::algorithm::detail::process_segment( 
                     Storage,
                     Input,
                     InsertIt,
@@ -247,15 +228,34 @@ namespace boost {
                 if ( Storage.empty() )
                 {
                     // Truncate input
-                    erase( Input, InsertIt, ::boost::end(Input) );
+                    ::boost::algorithm::detail::erase( Input, InsertIt, ::boost::end(Input) );
                 }
                 else
                 {
                     // Copy remaining data to the end of input
-                    insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() );
+                    ::boost::algorithm::detail::insert( Input, ::boost::end(Input), Storage.begin(), Storage.end() );
                 }
             }
 
+            template<
+                typename InputT,
+                typename FinderT,
+                typename FormatterT,
+                typename FindResultT >
+            inline void find_format_all_impl( 
+                InputT& Input,
+                FinderT Finder,
+                FormatterT Formatter,
+                FindResultT FindResult)
+            {
+                ::boost::algorithm::detail::find_format_all_impl2(
+                    Input,
+                    Finder,
+                    Formatter,
+                    FindResult,
+                    Formatter(FindResult) );
+            }
+
         } // namespace detail
     } // namespace algorithm
 } // namespace boost
similarity index 96%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/finder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/finder.hpp
index c6d0752bb18c426f26998e948c6dc9d205171609..45bcb7d3d6ea0ca9dca013889730ef2e89dd5117 100644 (file)
@@ -382,7 +382,7 @@ namespace boost {
                 typedef BOOST_STRING_TYPENAME boost::detail::
                     iterator_traits<ForwardIteratorT>::iterator_category category;
 
-                return find_head_impl( Begin, End, N, category() );
+                return ::boost::algorithm::detail::find_head_impl( Begin, End, N, category() );
             }
 
             template< typename ForwardIteratorT >
@@ -456,7 +456,7 @@ namespace boost {
                 typedef BOOST_STRING_TYPENAME boost::detail::
                     iterator_traits<ForwardIteratorT>::iterator_category category;
 
-                return find_tail_impl( Begin, End, N, category() );
+                return ::boost::algorithm::detail::find_tail_impl( Begin, End, N, category() );
             }
 
 
@@ -484,14 +484,14 @@ namespace boost {
                 {
                     if(m_N>=0)
                     {
-                        return find_head_impl( Begin, End, m_N );
+                        return ::boost::algorithm::detail::find_head_impl( Begin, End, m_N );
                     }
                     else
                     {
                         iterator_range<ForwardIteratorT> Res=
-                            find_tail_impl( Begin, End, -m_N );
+                            ::boost::algorithm::detail::find_tail_impl( Begin, End, -m_N );
 
-                        return make_iterator_range(Begin, Res.begin());
+                        return ::boost::make_iterator_range(Begin, Res.begin());
                     }
                 }
 
@@ -522,14 +522,14 @@ namespace boost {
                 {
                     if(m_N>=0)
                     {
-                        return find_tail_impl( Begin, End, m_N );
+                        return ::boost::algorithm::detail::find_tail_impl( Begin, End, m_N );
                     }
                     else
                     {
                         iterator_range<ForwardIteratorT> Res=
-                            find_head_impl( Begin, End, -m_N );
+                            ::boost::algorithm::detail::find_head_impl( Begin, End, -m_N );
 
-                        return make_iterator_range(Res.end(), End);
+                        return ::boost::make_iterator_range(Res.end(), End);
                     }
                 }
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/finder_regex.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/finder_regex.hpp
index 1eeda011e29bcda3285a7350b2aca0720448ac27..673d93a5380968776515783f2733f6c8c475e57f 100644 (file)
@@ -98,7 +98,7 @@ namespace boost {
                     // instantiate match result
                     match_results<input_iterator_type> result;
                     // search for a match
-                    if ( regex_search( Begin, End, result, m_Rx, m_MatchFlags ) )
+                    if ( ::boost::regex_search( Begin, End, result, m_Rx, m_MatchFlags ) )
                     {
                         // construct a result
                         return result_type( result );
similarity index 97%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/predicate.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/predicate.hpp
index a04b5b1ea08d2a8477434e32f8221e04fa9cceee..5acf3cc6633015b207fb499943fccc06b79145b9 100644 (file)
@@ -63,7 +63,7 @@ namespace boost {
 
                 iterator_range<ForwardIterator1T> Result
                     =last_finder( 
-                        make_iterator_range(SubBegin, SubEnd),
+                        ::boost::make_iterator_range(SubBegin, SubEnd),
                         Comp)(Begin, End);
 
                 return !Result.empty() && Result.end()==End;
similarity index 96%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/replace_storage.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/replace_storage.hpp
index 7aff247a9fb19fad4db48a227b8a133cb05cc5e6..db35e4c53be8518a683a1f8c637b1ba2154c7436 100644 (file)
@@ -68,7 +68,7 @@ namespace boost {
                     ForwardIteratorT SegmentEnd )
                 {
                     // Copy data from the storage until the beginning of the segment
-                    ForwardIteratorT It=move_from_storage( Storage, InsertIt, SegmentBegin );
+                    ForwardIteratorT It=::boost::algorithm::detail::move_from_storage( Storage, InsertIt, SegmentBegin );
 
                     // 3 cases are possible :
                     //   a) Storage is empty, It==SegmentBegin
@@ -125,7 +125,7 @@ namespace boost {
 
                 {
                     // Call replace to do the job
-                    replace( Input, InsertIt, SegmentBegin, Storage );
+                    ::boost::algorithm::detail::replace( Input, InsertIt, SegmentBegin, Storage );
                     // Empty the storage
                     Storage.clear();
                     // Iterators were not changed, simply return the end of segment
similarity index 95%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/sequence.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/sequence.hpp
index de01350cb4310f075a571cbc7652f687db2511c4..dc47409115f65dd292cb051f3fcfd31a1b446d7f 100644 (file)
@@ -41,7 +41,7 @@ namespace boost {
                 BOOST_STRING_TYPENAME InputT::iterator At,
                 const InsertT& Insert )
             {
-                insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) );
+                ::boost::algorithm::detail::insert( Input, At, ::boost::begin(Insert), ::boost::end(Insert) );
             }
            
 //  erase helper  ---------------------------------------------------//
@@ -184,11 +184,11 @@ namespace boost {
             {
                 if(From!=To)
                 {
-                    replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) );
+                    ::boost::algorithm::detail::replace( Input, From, To, ::boost::begin(Insert), ::boost::end(Insert) );
                 }
                 else
                 {
-                    insert( Input, From, ::boost::begin(Insert), ::boost::end(Insert) );
+                    ::boost::algorithm::detail::insert( Input, From, ::boost::begin(Insert), ::boost::end(Insert) );
                 }
             }
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/algorithm/string/detail/trim.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/detail/trim.hpp
index 8e5c0fb438da27f00f133686e265b0e8fe4a533e..1233e49d3010894bd6252a09cfbaf0ee4380c12e 100644 (file)
@@ -20,36 +20,6 @@ namespace boost {
 
 //  trim iterator helper -----------------------------------------------//
 
-            // Search for first non matching character from the beginning of the sequence
-            template< typename ForwardIteratorT, typename PredicateT >
-            inline ForwardIteratorT trim_begin( 
-                ForwardIteratorT InBegin, 
-                ForwardIteratorT InEnd, 
-                PredicateT IsSpace )
-            {
-                ForwardIteratorT It=InBegin;
-                for(; It!=InEnd; ++It )
-                {
-                    if (!IsSpace(*It))
-                        return It;
-                }
-
-                return It;
-            }
-
-            // Search for first non matching character from the end of the sequence
-            template< typename ForwardIteratorT, typename PredicateT >
-            inline ForwardIteratorT trim_end( 
-                ForwardIteratorT InBegin, 
-                ForwardIteratorT InEnd, 
-                PredicateT IsSpace )
-            {
-                typedef BOOST_STRING_TYPENAME boost::detail::
-                    iterator_traits<ForwardIteratorT>::iterator_category category;
-
-                return trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
-            }
-
             template< typename ForwardIteratorT, typename PredicateT >
             inline ForwardIteratorT trim_end_iter_select( 
                 ForwardIteratorT InBegin, 
@@ -86,6 +56,36 @@ namespace boost {
 
                 return InBegin;
             }
+   // Search for first non matching character from the beginning of the sequence
+            template< typename ForwardIteratorT, typename PredicateT >
+            inline ForwardIteratorT trim_begin( 
+                ForwardIteratorT InBegin, 
+                ForwardIteratorT InEnd, 
+                PredicateT IsSpace )
+            {
+                ForwardIteratorT It=InBegin;
+                for(; It!=InEnd; ++It )
+                {
+                    if (!IsSpace(*It))
+                        return It;
+                }
+
+                return It;
+            }
+
+            // Search for first non matching character from the end of the sequence
+            template< typename ForwardIteratorT, typename PredicateT >
+            inline ForwardIteratorT trim_end( 
+                ForwardIteratorT InBegin, 
+                ForwardIteratorT InEnd, 
+                PredicateT IsSpace )
+            {
+                typedef BOOST_STRING_TYPENAME boost::detail::
+                    iterator_traits<ForwardIteratorT>::iterator_category category;
+
+                return ::boost::algorithm::detail::trim_end_iter_select( InBegin, InEnd, IsSpace, category() );
+            }
+
 
         } // namespace detail
     } // namespace algorithm
similarity index 81%
rename from deal.II/contrib/boost/include/boost/algorithm/string/erase.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/erase.hpp
index b50323b43375be8529f5afc3e907d7d89fcfd6fd..0951b8ae3e9aef7d75245038eae65fd0a7e8dd51 100644 (file)
@@ -54,11 +54,11 @@ namespace boost {
                 BOOST_STRING_TYPENAME 
                     range_const_iterator<RangeT>::type>& SearchRange )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                range_finder(SearchRange),
-                empty_formatter(Input) );
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase range algorithm
@@ -72,10 +72,10 @@ namespace boost {
                 BOOST_STRING_TYPENAME 
                     range_const_iterator<SequenceT>::type>& SearchRange )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                range_finder(SearchRange),
-                empty_formatter(Input) );
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase range algorithm
@@ -93,10 +93,10 @@ namespace boost {
                 BOOST_STRING_TYPENAME 
                     range_iterator<SequenceT>::type>& SearchRange )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                range_finder(SearchRange),
-                empty_formatter(Input) );
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_first  --------------------------------------------------------//
@@ -124,11 +124,11 @@ namespace boost {
             const Range1T& Input,
             const Range2T& Search )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase first algorithm
@@ -140,10 +140,10 @@ namespace boost {
             const SequenceT& Input,
             const RangeT& Search )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase first algorithm
@@ -159,10 +159,10 @@ namespace boost {
             SequenceT& Input,
             const RangeT& Search )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_first ( case insensitive ) ------------------------------------//
@@ -193,11 +193,11 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase first algorithm ( case insensitive )
@@ -210,10 +210,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase first algorithm ( case insensitive )
@@ -231,10 +231,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_last  --------------------------------------------------------//
@@ -262,11 +262,11 @@ namespace boost {
             const Range1T& Input,
             const Range2T& Search )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                last_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase last algorithm
@@ -278,10 +278,10 @@ namespace boost {
             const SequenceT& Input,
             const RangeT& Search )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                last_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase last algorithm
@@ -297,10 +297,10 @@ namespace boost {
             SequenceT& Input,
             const RangeT& Search )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                last_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_last ( case insensitive ) ------------------------------------//
@@ -331,11 +331,11 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                last_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase last algorithm ( case insensitive )
@@ -348,10 +348,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                last_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase last algorithm ( case insensitive )
@@ -369,10 +369,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                last_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_nth --------------------------------------------------------------------//
@@ -404,11 +404,11 @@ namespace boost {
             const Range2T& Search,
             int Nth )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                nth_finder(Search, Nth),
-                empty_formatter(Input) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase nth algorithm
@@ -421,10 +421,10 @@ namespace boost {
             const RangeT& Search,
             int Nth )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                nth_finder(Search, Nth),
-                empty_formatter(Input) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase nth algorithm
@@ -443,10 +443,10 @@ namespace boost {
             const RangeT& Search,
             int Nth )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                nth_finder(Search, Nth),
-                empty_formatter(Input) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_nth ( case insensitive ) ---------------------------------------------//
@@ -480,11 +480,11 @@ namespace boost {
             int Nth,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                nth_finder(Search, Nth, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase nth algorithm
@@ -498,9 +498,9 @@ namespace boost {
             int Nth,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                nth_finder(Search, Nth, is_iequal(Loc)),
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
                 empty_formatter(Input) );
         }
 
@@ -522,10 +522,10 @@ namespace boost {
             int Nth,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                nth_finder(Search, Nth, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 
@@ -555,11 +555,11 @@ namespace boost {
             const Range1T& Input,
             const Range2T& Search )
         {
-            return find_format_all_copy(
+            return ::boost::algorithm::find_format_all_copy(
                 Output,
                 Input,
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase all algorithm
@@ -571,10 +571,10 @@ namespace boost {
             const SequenceT& Input,
             const RangeT& Search )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input, 
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase all algorithm
@@ -590,10 +590,10 @@ namespace boost {
             SequenceT& Input,
             const RangeT& Search )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input, 
-                first_finder(Search),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_all ( case insensitive ) ------------------------------------//
@@ -624,11 +624,11 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_all_copy(
+            return ::boost::algorithm::find_format_all_copy(
                 Output,
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase all algorithm ( case insensitive )
@@ -641,10 +641,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
         //! Erase all algorithm ( case insensitive )
@@ -662,10 +662,10 @@ namespace boost {
             const RangeT& Search,
             const std::locale& Loc=std::locale() )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                empty_formatter(Input) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::empty_formatter(Input) );
         }
 
 //  erase_head --------------------------------------------------------------------//
@@ -696,11 +696,11 @@ namespace boost {
             const RangeT& Input,
             int N )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                head_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase head algorithm
@@ -712,10 +712,10 @@ namespace boost {
             const SequenceT& Input,
             int N )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                head_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase head algorithm
@@ -734,10 +734,10 @@ namespace boost {
             SequenceT& Input,
             int N )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                head_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
 //  erase_tail --------------------------------------------------------------------//
@@ -768,11 +768,11 @@ namespace boost {
             const RangeT& Input,
             int N )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                tail_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase tail algorithm
@@ -784,10 +784,10 @@ namespace boost {
             const SequenceT& Input,
             int N )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                tail_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase tail algorithm
@@ -806,10 +806,10 @@ namespace boost {
             SequenceT& Input,
             int N )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                tail_finder(N),
-                empty_formatter( Input ) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
     } // namespace algorithm
similarity index 92%
rename from deal.II/contrib/boost/include/boost/algorithm/string/find.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find.hpp
index 4196585be05ecf63c893e03c6f8b7cc7253f96f0..b282d1a59f472c7bbb7338eff301bb848d566b87 100644 (file)
@@ -53,7 +53,7 @@ namespace boost {
             RangeT& Input, 
             const FinderT& Finder)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             return Finder(::boost::begin(lit_input),::boost::end(lit_input));
         }
@@ -81,7 +81,7 @@ namespace boost {
             Range1T& Input, 
             const Range2T& Search)
         {
-            return find(Input, first_finder(Search));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search));
         }
 
         //! Find first algorithm ( case insensitive )
@@ -108,7 +108,7 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale())
         {
-            return find(Input, first_finder(Search,is_iequal(Loc)));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::first_finder(Search,is_iequal(Loc)));
         }
 
 //  find_last  -----------------------------------------------//
@@ -134,7 +134,7 @@ namespace boost {
             Range1T& Input, 
             const Range2T& Search)
         {
-            return find(Input, last_finder(Search));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search));
         }
 
         //! Find last algorithm ( case insensitive )
@@ -161,7 +161,7 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale())
         {
-            return find(Input, last_finder(Search, is_iequal(Loc)));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::last_finder(Search, is_iequal(Loc)));
         }
 
 //  find_nth ----------------------------------------------------------------------//
@@ -189,7 +189,7 @@ namespace boost {
             const Range2T& Search,
             int Nth)
         {
-            return find(Input, nth_finder(Search,Nth));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth));
         }
 
         //! Find n-th algorithm ( case insensitive ).
@@ -220,7 +220,7 @@ namespace boost {
             int Nth,
             const std::locale& Loc=std::locale())
         {
-            return find(Input, nth_finder(Search,Nth,is_iequal(Loc)));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::nth_finder(Search,Nth,is_iequal(Loc)));
         }
 
 //  find_head ----------------------------------------------------------------------//
@@ -250,7 +250,7 @@ namespace boost {
             RangeT& Input, 
             int N)
         {
-            return find(Input, head_finder(N));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::head_finder(N));
         }
 
 //  find_tail ----------------------------------------------------------------------//
@@ -281,7 +281,7 @@ namespace boost {
             RangeT& Input, 
             int N)
         {
-            return find(Input, tail_finder(N));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::tail_finder(N));
         }
 
 //  find_token --------------------------------------------------------------------//
@@ -311,7 +311,7 @@ namespace boost {
             PredicateT Pred,
             token_compress_mode_type eCompress=token_compress_off)
         {
-            return find(Input, token_finder(Pred, eCompress));
+            return ::boost::algorithm::find(Input, ::boost::algorithm::token_finder(Pred, eCompress));
         }
 
     } // namespace algorithm
similarity index 82%
rename from deal.II/contrib/boost/include/boost/algorithm/string/find_format.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find_format.hpp
index 7cbaf34fbd865cb4ba59e6f24447b870784b5405..ef0373912a47417cf13fa5eab3c1c39e5981904b 100644 (file)
@@ -62,15 +62,18 @@ namespace boost {
             FormatterT Formatter )
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT((
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
+                ));
 
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             return detail::find_format_copy_impl(
                 Output,
@@ -93,13 +96,16 @@ namespace boost {
             FormatterT Formatter )
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT((
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
 
             return detail::find_format_copy_impl(
                 Input,
@@ -126,13 +132,16 @@ namespace boost {
             FormatterT Formatter)
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT(( 
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
 
             detail::find_format_impl(
                 Input,
@@ -172,15 +181,18 @@ namespace boost {
             FormatterT Formatter)
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT(( 
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT(( 
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type>
+                ));
 
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             return detail::find_format_all_copy_impl(
                 Output,
@@ -204,13 +216,16 @@ namespace boost {
             FormatterT Formatter )
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT((
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
 
             return detail::find_format_all_copy_impl(
                 Input,
@@ -239,13 +254,16 @@ namespace boost {
             FormatterT Formatter )
         {
             // Concept check
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
+            BOOST_CONCEPT_ASSERT((
                 FormatterConcept<
                     FormatterT,
-                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type> >();
+                    FinderT,BOOST_STRING_TYPENAME range_const_iterator<SequenceT>::type>
+                ));
 
             detail::find_format_all_impl(
                 Input,
similarity index 98%
rename from deal.II/contrib/boost/include/boost/algorithm/string/find_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/find_iterator.hpp
index 211b87c1381848d09314f2ecb856895763ba1457..4224a196bd58744577e1b300f54fc51e234a3947 100644 (file)
@@ -113,8 +113,8 @@ namespace boost {
                     FinderT Finder ) :
                 detail::find_iterator_base<IteratorT>(Finder,0)
             {
-                iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
-                m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
+                iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(::boost::as_literal(Col));
+                m_Match=::boost::make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
                 m_End=::boost::end(lit_col);
 
                 increment();
@@ -273,7 +273,7 @@ namespace boost {
                 detail::find_iterator_base<IteratorT>(Finder,0),
                 m_bEof(false)
             {
-                iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(as_literal(Col));
+                iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_col(::boost::as_literal(Col));
                 m_Match=make_iterator_range(::boost::begin(lit_col), ::boost::begin(lit_col));
                 m_Next=::boost::begin(lit_col);
                 m_End=::boost::end(lit_col);
similarity index 95%
rename from deal.II/contrib/boost/include/boost/algorithm/string/finder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/finder.hpp
index c936ddb29e75ea977eec18675e79357d3770e8ac..4c7ac38b04d1fb0b638cea53d513de881061ca58 100644 (file)
@@ -56,7 +56,7 @@ namespace boost {
                 detail::first_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    is_equal>( as_literal(Search), is_equal() ) ;
+                        is_equal>( ::boost::as_literal(Search), is_equal() ) ;
         }
 
         //! "First" finder
@@ -74,7 +74,7 @@ namespace boost {
                 detail::first_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    PredicateT>( as_literal(Search), Comp );
+                    PredicateT>( ::boost::as_literal(Search), Comp );
         }
 
         //! "Last" finder
@@ -97,7 +97,7 @@ namespace boost {
                 detail::last_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    is_equal>( as_literal(Search), is_equal() );
+                    is_equal>( ::boost::as_literal(Search), is_equal() );
         }
         //! "Last" finder
         /*!
@@ -113,7 +113,7 @@ namespace boost {
                 detail::last_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    PredicateT>( as_literal(Search), Comp ) ;
+                    PredicateT>( ::boost::as_literal(Search), Comp ) ;
         }
 
         //! "Nth" finder
@@ -139,7 +139,7 @@ namespace boost {
                 detail::nth_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    is_equal>( as_literal(Search), Nth, is_equal() ) ;
+                    is_equal>( ::boost::as_literal(Search), Nth, is_equal() ) ;
         }
         //! "Nth" finder
         /*!
@@ -158,7 +158,7 @@ namespace boost {
                 detail::nth_finderF<
                     BOOST_STRING_TYPENAME 
                         range_const_iterator<RangeT>::type,
-                    PredicateT>( as_literal(Search), Nth, Comp );
+                    PredicateT>( ::boost::as_literal(Search), Nth, Comp );
         }
 
         //! "Head" finder
similarity index 98%
rename from deal.II/contrib/boost/include/boost/algorithm/string/formatter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/formatter.hpp
index e04a50f42ce809635d048d858abf1cb6beddb8cd..50006df102b928337476daf3930f082117dd6f1e 100644 (file)
@@ -50,7 +50,7 @@ namespace boost {
         {
             return detail::const_formatF<
                 iterator_range<
-                    BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(as_literal(Format));
+                    BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> >(::boost::as_literal(Format));
         }
 
         //! Identity formatter
similarity index 92%
rename from deal.II/contrib/boost/include/boost/algorithm/string/iter_find.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/iter_find.hpp
index 525109b9fe48d9e46c4f1010af4a9f89775dd976..9e0245f1a7b638c61ada689078cbe5a73a78bb0c 100644 (file)
@@ -74,11 +74,13 @@ namespace boost {
             RangeT& Input,
             FinderT Finder )
         {
-            function_requires< 
-                FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_iterator<RangeT>::type> >();
+            BOOST_CONCEPT_ASSERT((
+                FinderConcept<
+                    FinderT,
+                    BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
+                ));
 
-            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             typedef BOOST_STRING_TYPENAME 
                 range_iterator<RangeT>::type input_iterator_type;
@@ -94,12 +96,12 @@ namespace boost {
                 transform_iter_type;
     
             transform_iter_type itBegin=
-                make_transform_iterator( 
+                ::boost::make_transform_iterator( 
                     find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ),
                     copy_range_type());
             
             transform_iter_type itEnd=
-                make_transform_iterator( 
+                ::boost::make_transform_iterator( 
                     find_iterator_type(),
                     copy_range_type());
 
@@ -143,11 +145,12 @@ namespace boost {
             RangeT& Input,
             FinderT Finder )
         {
-            function_requires< 
+            BOOST_CONCEPT_ASSERT((
                 FinderConcept<FinderT,
-                BOOST_STRING_TYPENAME range_iterator<RangeT>::type> >();
+                BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
+                ));
 
-            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             typedef BOOST_STRING_TYPENAME 
                 range_iterator<RangeT>::type input_iterator_type;
@@ -163,12 +166,12 @@ namespace boost {
                 transform_iter_type;
     
             transform_iter_type itBegin=
-                make_transform_iterator( 
+                ::boost::make_transform_iterator( 
                     find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ),
                     copy_range_type() );
 
             transform_iter_type itEnd=
-                make_transform_iterator( 
+                ::boost::make_transform_iterator( 
                     find_iterator_type(),
                     copy_range_type() );
             
similarity index 97%
rename from deal.II/contrib/boost/include/boost/algorithm/string/join.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/join.hpp
index b215598913e111f7185c1e7f7eac0c36a6efdec2..b871eb44f6941c25b6f00e70b3d26ec2d28bd3f1 100644 (file)
@@ -68,7 +68,7 @@ namespace boost {
             for(;itBegin!=itEnd; ++itBegin)
             {
                 // Add separator
-                detail::insert(Result, ::boost::end(Result), as_literal(Separator));
+                detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
                 // Add element
                 detail::insert(Result, ::boost::end(Result), *itBegin);
             }
@@ -123,7 +123,7 @@ namespace boost {
                 if(Pred(*itBegin))
                 {
                     // Add separator
-                    detail::insert(Result, ::boost::end(Result), as_literal(Separator));
+                    detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
                     // Add element
                     detail::insert(Result, ::boost::end(Result), *itBegin);
                 }
similarity index 90%
rename from deal.II/contrib/boost/include/boost/algorithm/string/predicate.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/predicate.hpp
index 8b620864416c137d11b2ddf29c29c0b3087eaa6e..6642f427d1bdee6ef9b9423b653e28ddb1d317cd 100644 (file)
@@ -59,8 +59,8 @@ namespace boost {
             const Range2T& Test,
             PredicateT Comp)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
 
             typedef BOOST_STRING_TYPENAME 
                 range_const_iterator<Range1T>::type Iterator1T;
@@ -92,7 +92,7 @@ namespace boost {
             const Range1T& Input, 
             const Range2T& Test)
         {
-            return starts_with(Input, Test, is_equal());
+            return ::boost::algorithm::starts_with(Input, Test, is_equal());
         }
 
         //! 'Starts with' predicate ( case insensitive )
@@ -114,7 +114,7 @@ namespace boost {
             const Range2T& Test,
             const std::locale& Loc=std::locale())
         {
-            return starts_with(Input, Test, is_iequal(Loc));
+            return ::boost::algorithm::starts_with(Input, Test, is_iequal(Loc));
         }
 
 
@@ -141,8 +141,8 @@ namespace boost {
             const Range2T& Test,
             PredicateT Comp)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
 
             typedef BOOST_STRING_TYPENAME 
                 range_const_iterator<Range1T>::type Iterator1T;
@@ -169,7 +169,7 @@ namespace boost {
             const Range1T& Input, 
             const Range2T& Test)
         {
-            return ends_with(Input, Test, is_equal());
+            return ::boost::algorithm::ends_with(Input, Test, is_equal());
         }
 
         //! 'Ends with' predicate ( case insensitive )
@@ -191,7 +191,7 @@ namespace boost {
             const Range2T& Test,
             const std::locale& Loc=std::locale())
         {
-            return ends_with(Input, Test, is_iequal(Loc));
+            return ::boost::algorithm::ends_with(Input, Test, is_iequal(Loc));
         }
 
 //  contains predicate  -----------------------------------------------//
@@ -215,17 +215,17 @@ namespace boost {
             const Range2T& Test,
             PredicateT Comp)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
 
-            if (empty(lit_test))
+            if (::boost::empty(lit_test))
             {
                 // Empty range is contained always
                 return true;
             }
             
             // Use the temporary variable to make VACPP happy
-            bool bResult=(first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input)));
+            bool bResult=(::boost::algorithm::first_finder(lit_test,Comp)(::boost::begin(lit_input), ::boost::end(lit_input)));
             return bResult;
         }
 
@@ -238,7 +238,7 @@ namespace boost {
             const Range1T& Input, 
             const Range2T& Test)
         {
-            return contains(Input, Test, is_equal());
+            return ::boost::algorithm::contains(Input, Test, is_equal());
         }
 
         //! 'Contains' predicate ( case insensitive )
@@ -259,7 +259,7 @@ namespace boost {
             const Range2T& Test, 
             const std::locale& Loc=std::locale())
         {
-            return contains(Input, Test, is_iequal(Loc));
+            return ::boost::algorithm::contains(Input, Test, is_iequal(Loc));
         }
 
 //  equals predicate  -----------------------------------------------//
@@ -286,8 +286,8 @@ namespace boost {
             const Range2T& Test,
             PredicateT Comp)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(as_literal(Input));
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(as_literal(Test));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_input(::boost::as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_test(::boost::as_literal(Test));
 
             typedef BOOST_STRING_TYPENAME 
                 range_const_iterator<Range1T>::type Iterator1T;
@@ -319,7 +319,7 @@ namespace boost {
             const Range1T& Input, 
             const Range2T& Test)
         {
-            return equals(Input, Test, is_equal());
+            return ::boost::algorithm::equals(Input, Test, is_equal());
         }
 
         //! 'Equals' predicate ( case insensitive )
@@ -343,7 +343,7 @@ namespace boost {
             const Range2T& Test,
             const std::locale& Loc=std::locale())
         {
-            return equals(Input, Test, is_iequal(Loc));
+            return ::boost::algorithm::equals(Input, Test, is_iequal(Loc));
         }
 
 // lexicographical_compare predicate -----------------------------//
@@ -372,8 +372,8 @@ namespace boost {
             const Range2T& Arg2,
             PredicateT Pred)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(as_literal(Arg1));
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(as_literal(Arg2));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range1T>::type> lit_arg1(::boost::as_literal(Arg1));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<Range2T>::type> lit_arg2(::boost::as_literal(Arg2));
 
             return std::lexicographical_compare(
                 ::boost::begin(lit_arg1),
@@ -392,7 +392,7 @@ namespace boost {
             const Range1T& Arg1,
             const Range2T& Arg2)
         {
-            return lexicographical_compare(Arg1, Arg2, is_less());
+            return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_less());
         }
 
         //! Lexicographical compare predicate (case-insensitive)
@@ -417,7 +417,7 @@ namespace boost {
             const Range2T& Arg2,
             const std::locale& Loc=std::locale())
         {
-            return lexicographical_compare(Arg1, Arg2, is_iless(Loc));
+            return ::boost::algorithm::lexicographical_compare(Arg1, Arg2, is_iless(Loc));
         }
         
 
@@ -439,7 +439,7 @@ namespace boost {
             const RangeT& Input, 
             PredicateT Pred)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
             typedef BOOST_STRING_TYPENAME 
                 range_const_iterator<RangeT>::type Iterator1T;
similarity index 87%
rename from deal.II/contrib/boost/include/boost/algorithm/string/regex.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/regex.hpp
index b723204effde422aa238d21a6a99826900b73a35..0a4c38bd77b9deb30d966543db2d201fc3441402 100644 (file)
@@ -60,9 +60,9 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
-            return regex_finder(Rx,Flags)(
+            return ::boost::algorithm::regex_finder(Rx,Flags)(
                 ::boost::begin(lit_input), ::boost::end(lit_input) );
         }
 
@@ -98,11 +98,11 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Output,
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
         //! Replace regex algorithm
@@ -120,10 +120,10 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
         //! Replace regex algorithm
@@ -147,10 +147,10 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
 //  replace_all_regex --------------------------------------------------------------------//
@@ -184,11 +184,11 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Output,
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
         //! Replace all regex algorithm
@@ -206,10 +206,10 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
         //! Replace all regex algorithm
@@ -233,10 +233,10 @@ namespace boost {
             const std::basic_string<CharT, FormatStringTraitsT, FormatStringAllocatorT>& Format,
             match_flag_type Flags=match_default | format_default )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input,
-                regex_finder( Rx, Flags ),
-                regex_formatter( Format, Flags ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::regex_formatter( Format, Flags ) );
         }
 
 //  erase_regex --------------------------------------------------------------------//
@@ -267,11 +267,11 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase regex algorithm
@@ -287,10 +287,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input, 
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase regex algorithm
@@ -311,10 +311,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
 //  erase_all_regex --------------------------------------------------------------------//
@@ -346,11 +346,11 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return find_format_all_copy(
+            return ::boost::algorithm::find_format_all_copy(
                 Output,
                 Input,
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase all regex algorithm
@@ -366,10 +366,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input, 
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
         //! Erase all regex algorithm
@@ -390,10 +390,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input, 
-                regex_finder( Rx, Flags ),
-                empty_formatter( Input ) );
+                ::boost::algorithm::regex_finder( Rx, Flags ),
+                ::boost::algorithm::empty_formatter( Input ) );
         }
 
 //  find_all_regex ------------------------------------------------------------------//
@@ -431,10 +431,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return iter_find(
+            return ::boost::algorithm::iter_find(
                 Result,
                 Input,
-                regex_finder(Rx,Flags) );         
+                ::boost::algorithm::regex_finder(Rx,Flags) );         
         }
 
 //  split_regex ------------------------------------------------------------------//
@@ -472,10 +472,10 @@ namespace boost {
             const basic_regex<CharT, RegexTraitsT>& Rx,
             match_flag_type Flags=match_default )
         {
-            return iter_split(
+            return ::boost::algorithm::iter_split(
                 Result,
                 Input,
-                regex_finder(Rx,Flags) );         
+                ::boost::algorithm::regex_finder(Rx,Flags) );         
         }
 
 //  join_if ------------------------------------------------------------------//
@@ -525,7 +525,7 @@ namespace boost {
             // Roll to the first element that will be added
             while(
                 itBegin!=itEnd && 
-                !regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
+                !::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
 
             // Add this element
             if(itBegin!=itEnd)
@@ -536,10 +536,10 @@ namespace boost {
 
             for(;itBegin!=itEnd; ++itBegin)
             {
-                if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
+                if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
                 {
                     // Add separator
-                    detail::insert(Result, ::boost::end(Result), as_literal(Separator));
+                    detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
                     // Add element
                     detail::insert(Result, ::boost::end(Result), *itBegin);
                 }
@@ -593,7 +593,7 @@ namespace boost {
             // Roll to the first element that will be added
             while(
                 itBegin!=itEnd && 
-                !regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
+                !::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags)) ++itBegin;
 
             // Add this element
             if(itBegin!=itEnd)
@@ -604,10 +604,10 @@ namespace boost {
 
             for(;itBegin!=itEnd; ++itBegin)
             {
-                if(regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
+                if(::boost::regex_match(::boost::begin(*itBegin), ::boost::end(*itBegin), Rx, Flags))
                 {
                     // Add separator
-                    detail::insert(Result, ::boost::end(Result), as_literal(Separator));
+                    detail::insert(Result, ::boost::end(Result), ::boost::as_literal(Separator));
                     // Add element
                     detail::insert(Result, ::boost::end(Result), *itBegin);
                 }
similarity index 83%
rename from deal.II/contrib/boost/include/boost/algorithm/string/replace.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/replace.hpp
index 1c59ec77079300b51fce2322b96bb601615694e1..f2d201f97f56e9fccc2608470bfb7badbf3a2189 100644 (file)
@@ -61,11 +61,11 @@ namespace boost {
                     range_const_iterator<Range1T>::type>& SearchRange,
             const Range2T& Format)
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                range_finder(SearchRange),
-                const_formatter(Format));
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::const_formatter(Format));
         }
 
         //! Replace range algorithm
@@ -80,10 +80,10 @@ namespace boost {
                     range_const_iterator<SequenceT>::type>& SearchRange,
             const RangeT& Format)
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Input,
-                range_finder(SearchRange),
-                const_formatter(Format));
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::const_formatter(Format));
         }
 
         //! Replace range algorithm
@@ -103,10 +103,10 @@ namespace boost {
                     range_iterator<SequenceT>::type>& SearchRange,
             const RangeT& Format)
         {
-            find_format(
+            ::boost::algorithm::find_format(
                 Input,
-                range_finder(SearchRange),
-                const_formatter(Format));
+                ::boost::algorithm::range_finder(SearchRange),
+                ::boost::algorithm::const_formatter(Format));
         }
 
 //  replace_first --------------------------------------------------------------------//
@@ -138,11 +138,11 @@ namespace boost {
             const Range2T& Search,
             const Range3T& Format)
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace first algorithm
@@ -155,10 +155,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace first algorithm
@@ -176,10 +176,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_first ( case insensitive ) ---------------------------------------------//
@@ -214,11 +214,11 @@ namespace boost {
             const Range3T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace first algorithm ( case insensitive )
@@ -232,10 +232,10 @@ namespace boost {
             const Range1T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace first algorithm ( case insensitive )
@@ -256,10 +256,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_last --------------------------------------------------------------------//
@@ -291,11 +291,11 @@ namespace boost {
             const Range2T& Search,
             const Range3T& Format )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                last_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace last algorithm
@@ -308,10 +308,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                last_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace last algorithm
@@ -329,10 +329,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                last_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_last ( case insensitive ) -----------------------------------------------//
@@ -367,11 +367,11 @@ namespace boost {
             const Range3T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                last_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace last algorithm ( case insensitive )
@@ -385,10 +385,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                last_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace last algorithm ( case insensitive )
@@ -410,10 +410,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                last_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::last_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_nth --------------------------------------------------------------------//
@@ -448,11 +448,11 @@ namespace boost {
             int Nth,
             const Range3T& Format )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                nth_finder(Search, Nth),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace nth algorithm
@@ -466,10 +466,10 @@ namespace boost {
             int Nth,
             const Range2T& Format )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                nth_finder(Search, Nth),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace nth algorithm
@@ -490,10 +490,10 @@ namespace boost {
             int Nth,
             const Range2T& Format )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                nth_finder(Search, Nth),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_nth ( case insensitive ) -----------------------------------------------//
@@ -531,11 +531,11 @@ namespace boost {
             const Range3T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                nth_finder(Search, Nth, is_iequal(Loc) ),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc) ),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace nth algorithm ( case insensitive )
@@ -550,10 +550,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                nth_finder(Search, Nth, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace nth algorithm ( case insensitive )
@@ -577,10 +577,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                nth_finder(Search, Nth, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::nth_finder(Search, Nth, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_all --------------------------------------------------------------------//
@@ -612,11 +612,11 @@ namespace boost {
             const Range2T& Search,
             const Range3T& Format )
         {
-            return find_format_all_copy(
+            return ::boost::algorithm::find_format_all_copy(
                 Output,
                 Input,
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace all algorithm
@@ -629,10 +629,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input,
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace all algorithm
@@ -651,10 +651,10 @@ namespace boost {
             const Range1T& Search,
             const Range2T& Format )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input, 
-                first_finder(Search),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search),
+                ::boost::algorithm::const_formatter(Format) );
         }
         
 //  replace_all ( case insensitive ) -----------------------------------------------//
@@ -689,11 +689,11 @@ namespace boost {
             const Range3T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_all_copy(
+            return ::boost::algorithm::find_format_all_copy(
                 Output,
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace all algorithm ( case insensitive )
@@ -707,10 +707,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            return find_format_all_copy( 
+            return ::boost::algorithm::find_format_all_copy( 
                 Input,
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace all algorithm ( case insensitive )
@@ -731,10 +731,10 @@ namespace boost {
             const Range2T& Format,
             const std::locale& Loc=std::locale() )
         {
-            find_format_all( 
+            ::boost::algorithm::find_format_all( 
                 Input, 
-                first_finder(Search, is_iequal(Loc)),
-                const_formatter(Format) );
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc)),
+                ::boost::algorithm::const_formatter(Format) );
         }
         
 //  replace_head --------------------------------------------------------------------//
@@ -769,11 +769,11 @@ namespace boost {
             int N,
             const Range2T& Format )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                head_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace head algorithm
@@ -786,10 +786,10 @@ namespace boost {
             int N,
             const RangeT& Format )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                head_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace head algorithm
@@ -811,10 +811,10 @@ namespace boost {
             int N,
             const RangeT& Format )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                head_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::head_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
 //  replace_tail --------------------------------------------------------------------//
@@ -849,11 +849,11 @@ namespace boost {
             int N,
             const Range2T& Format )
         {
-            return find_format_copy(
+            return ::boost::algorithm::find_format_copy(
                 Output,
                 Input,
-                tail_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace tail algorithm
@@ -866,10 +866,10 @@ namespace boost {
             int N,
             const RangeT& Format )
         {
-            return find_format_copy( 
+            return ::boost::algorithm::find_format_copy( 
                 Input,
-                tail_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
         //! Replace tail algorithm
@@ -891,10 +891,10 @@ namespace boost {
             int N,
             const RangeT& Format )
         {
-            find_format( 
+            ::boost::algorithm::find_format( 
                 Input, 
-                tail_finder(N),
-                const_formatter(Format) );
+                ::boost::algorithm::tail_finder(N),
+                ::boost::algorithm::const_formatter(Format) );
         }
 
     } // namespace algorithm
similarity index 94%
rename from deal.II/contrib/boost/include/boost/algorithm/string/split.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/split.hpp
index f5c323cb9d2681122a4cc5a3c8fa73c5f235ba3a..cae712c07fa59d27da566a1df148f0808799e2ce 100644 (file)
@@ -64,10 +64,10 @@ namespace boost {
             Range1T& Input,
             const Range2T& Search)
         {
-            return iter_find(
+            return ::boost::algorithm::iter_find(
                 Result,
                 Input,
-                first_finder(Search) );        
+                ::boost::algorithm::first_finder(Search) );        
         }
 
         //! Find all algorithm ( case insensitive ) 
@@ -100,10 +100,10 @@ namespace boost {
             const Range2T& Search,
             const std::locale& Loc=std::locale() )
         {
-            return iter_find(
+            return ::boost::algorithm::iter_find(
                 Result,
                 Input,
-                first_finder(Search, is_iequal(Loc) ) );        
+                ::boost::algorithm::first_finder(Search, is_iequal(Loc) ) );        
         }
 
 
@@ -143,10 +143,10 @@ namespace boost {
             PredicateT Pred,
             token_compress_mode_type eCompress=token_compress_off )
         {
-            return iter_split(
+            return ::boost::algorithm::iter_split(
                 Result,
                 Input,
-                token_finder( Pred, eCompress ) );         
+                ::boost::algorithm::token_finder( Pred, eCompress ) );         
         }
 
     } // namespace algorithm
similarity index 95%
rename from deal.II/contrib/boost/include/boost/algorithm/string/trim.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/algorithm/string/trim.hpp
index 177ed1b51eaf109450c02e1d728a7c24938063db..eb408a35e651fde4c05a8bfaa3e0c4c2088e9247 100644 (file)
@@ -63,7 +63,7 @@ namespace boost {
             const RangeT& Input,
             PredicateT IsSpace)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
 
             std::copy( 
                 ::boost::algorithm::detail::trim_begin( 
@@ -106,7 +106,7 @@ namespace boost {
         inline SequenceT trim_left_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
         {
             return            
-                trim_left_copy_if(
+                ::boost::algorithm::trim_left_copy_if(
                     Input, 
                     is_space(Loc));
         }
@@ -142,7 +142,7 @@ namespace boost {
         template<typename SequenceT>
         inline void trim_left(SequenceT& Input, const std::locale& Loc=std::locale())
         {
-            trim_left_if( 
+            ::boost::algorithm::trim_left_if( 
                 Input, 
                 is_space(Loc));
         }
@@ -171,7 +171,7 @@ namespace boost {
             const RangeT& Input,
             PredicateT IsSpace )
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
          
             std::copy( 
                 ::boost::begin(lit_range),
@@ -215,7 +215,7 @@ namespace boost {
         inline SequenceT trim_right_copy(const SequenceT& Input, const std::locale& Loc=std::locale())
         {
             return 
-                trim_right_copy_if( 
+                ::boost::algorithm::trim_right_copy_if( 
                     Input, 
                     is_space(Loc));
         }
@@ -254,7 +254,7 @@ namespace boost {
         template<typename SequenceT>
         inline void trim_right(SequenceT& Input, const std::locale& Loc=std::locale())
         {
-            trim_right_if(
+            ::boost::algorithm::trim_right_if(
                 Input, 
                 is_space(Loc) );
         }
@@ -283,7 +283,7 @@ namespace boost {
             const RangeT& Input,
             PredicateT IsSpace)
         {
-            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(as_literal(Input));
+            iterator_range<BOOST_STRING_TYPENAME range_const_iterator<RangeT>::type> lit_range(::boost::as_literal(Input));
 
             BOOST_STRING_TYPENAME 
                 range_const_iterator<RangeT>::type TrimEnd=
@@ -340,7 +340,7 @@ namespace boost {
         inline SequenceT trim_copy( const SequenceT& Input, const std::locale& Loc=std::locale() )
         {
             return
-                trim_copy_if(
+                ::boost::algorithm::trim_copy_if(
                     Input, 
                     is_space(Loc) );
         }
@@ -357,8 +357,8 @@ namespace boost {
         template<typename SequenceT, typename PredicateT>
         inline void trim_if(SequenceT& Input, PredicateT IsSpace)
         {
-            trim_right_if( Input, IsSpace );
-            trim_left_if( Input, IsSpace );
+            ::boost::algorithm::trim_right_if( Input, IsSpace );
+            ::boost::algorithm::trim_left_if( Input, IsSpace );
         }
 
         //! Trim
@@ -372,7 +372,7 @@ namespace boost {
         template<typename SequenceT>
         inline void trim(SequenceT& Input, const std::locale& Loc=std::locale())
         {
-            trim_if(
+            ::boost::algorithm::trim_if(
                 Input, 
                 is_space( Loc ) );
         }
similarity index 90%
rename from deal.II/contrib/boost/include/boost/aligned_storage.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/aligned_storage.hpp
index cfaf7877a1551cbf1b804935c123bfc3538bf3ba..ce277ab702ad4db26644b86bebce1b74eab59dec 100644 (file)
@@ -54,6 +54,14 @@ struct aligned_storage_imp
             , type_with_alignment<alignment_>
             >::type align_;
     } data_;
+    void* address() const { return const_cast<aligned_storage_imp*>(this); }
+};
+
+template< std::size_t alignment_ >
+struct aligned_storage_imp<0u,alignment_>
+{
+    /* intentionally empty */
+    void* address() const { return 0; }
 };
 
 }} // namespace detail::aligned_storage
@@ -62,12 +70,15 @@ template <
       std::size_t size_
     , std::size_t alignment_ = std::size_t(-1)
 >
-class aligned_storage
+class aligned_storage : 
+#ifndef __BORLANDC__
+   private 
+#else
+   public
+#endif
+   detail::aligned_storage::aligned_storage_imp<size_, alignment_> 
 {
-private: // representation
-
-   detail::aligned_storage::aligned_storage_imp<size_, alignment_> data_;
-
 public: // constants
 
     typedef detail::aligned_storage::aligned_storage_imp<size_, alignment_> type;
@@ -118,14 +129,14 @@ public: // accessors
 
     void* address()
     {
-        return this;
+        return static_cast<type*>(this)->address();
     }
 
 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
 
     const void* address() const
     {
-        return this;
+        return static_cast<const type*>(this)->address();
     }
 
 #else // MSVC6
similarity index 88%
rename from deal.II/contrib/boost/include/boost/any.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/any.hpp
index 483daca32e62e306ba8e9512178a3e1efec49f08..a8c654c373bc34d34fa024cc02d91bb62b85a4d4 100644 (file)
 #include <boost/throw_exception.hpp>
 #include <boost/static_assert.hpp>
 
+// See boost/python/type_id.hpp
+// TODO: add BOOST_TYPEID_COMPARE_BY_NAME to config.hpp
+# if (defined(__GNUC__) && __GNUC__ >= 3) \
+ || defined(_AIX) \
+ || (   defined(__sgi) && defined(__host_mips)) \
+ || (defined(__hpux) && defined(__HP_aCC)) \
+ || (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC))
+#  define BOOST_AUX_ANY_TYPE_ID_NAME
+#include <cstring>
+# endif 
+
 namespace boost
 {
     class any
@@ -61,9 +72,9 @@ namespace boost
             return *this;
         }
 
-        any & operator=(const any & rhs)
+        any & operator=(any rhs)
         {
-            any(rhs).swap(*this);
+            rhs.swap(*this);
             return *this;
         }
 
@@ -164,9 +175,14 @@ namespace boost
     template<typename ValueType>
     ValueType * any_cast(any * operand)
     {
-        return operand && operand->type() == typeid(ValueType)
-                    ? &static_cast<any::holder<ValueType> *>(operand->content)->held
-                    : 0;
+        return operand && 
+#ifdef BOOST_AUX_ANY_TYPE_ID_NAME
+            std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0
+#else
+            operand->type() == typeid(ValueType)
+#endif
+            ? &static_cast<any::holder<ValueType> *>(operand->content)->held
+            : 0;
     }
 
     template<typename ValueType>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/add_facet.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/add_facet.hpp
new file mode 100644 (file)
index 0000000..6bafe9b
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef BOOST_ARCHIVE_ADD_FACET_HPP
+#define BOOST_ARCHIVE_ADD_FACET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// add_facet.hpp
+
+// (C) Copyright 2003 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <locale>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+// does STLport uses native STL for locales?
+#if (defined(__SGI_STL_PORT)&& defined(_STLP_NO_OWN_IOSTREAMS))
+// and this native STL lib is old Dinkumware (has not defined _CPPLIB_VER)
+#  if (defined(_YVALS) && !defined(__IBMCPP__)) || !defined(_CPPLIB_VER)
+#    define BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT
+#  endif
+#endif
+
+namespace boost { 
+namespace archive {
+
+template<class Facet>
+inline std::locale * 
+add_facet(const std::locale &l, Facet * f){
+    return
+        #if defined BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT 
+            // std namespace used for native locale
+            new std::locale(std::_Addfac(l, f));
+        #elif BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) // old Dinkumwar
+            // std namespace used for native locale
+            new std::locale(std::_Addfac(l, f));
+        #else
+            // standard compatible
+            new std::locale(l, f);
+        #endif
+}
+
+} // namespace archive
+} // namespace boost
+
+#undef BOOST_ARCHIVE_OLD_DINKUMWARE_BENEATH_STLPORT
+
+#endif // BOOST_ARCHIVE_ADD_FACET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/archive_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/archive_exception.hpp
new file mode 100644 (file)
index 0000000..920fb53
--- /dev/null
@@ -0,0 +1,96 @@
+#ifndef BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
+#define BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// archive/archive_exception.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <exception>
+#include <cassert>
+#include <string>
+
+#include <boost/config.hpp> 
+#include <boost/preprocessor/empty.hpp>
+#include <boost/archive/detail/decl.hpp>
+
+// note: the only reason this is in here is that windows header
+// includes #define exception_code _exception_code (arrrgghhhh!).
+// the most expedient way to address this is be sure that this
+// header is always included whenever this header file is included.
+#if defined(BOOST_WINDOWS) 
+#include <excpt.h> 
+#endif 
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// exceptions thrown by archives
+//
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_exception : 
+    public virtual std::exception
+{
+public:
+    typedef enum {
+        no_exception,       // initialized without code
+        other_exception,    // any excepton not listed below
+        unregistered_class, // attempt to serialize a pointer of an
+                            // an unregistered class
+        invalid_signature,  // first line of archive does not contain
+                            // expected string
+        unsupported_version,// archive created with library version
+                            // subsequent to this one
+        pointer_conflict,   // an attempt has been made to directly
+                            // serialize an object which has
+                            // already been serialzed through a pointer.  
+                            // Were this permited, the archive load would result 
+                            // in the creation of an extra copy of the obect.
+        incompatible_native_format, // attempt to read native binary format
+                            // on incompatible platform
+        array_size_too_short,// array being loaded doesn't fit in array allocated
+        stream_error,       // i/o error on stream
+        invalid_class_name, // class name greater than the maximum permitted.
+                            // most likely a corrupted archive or an attempt
+                            // to insert virus via buffer overrun method.
+        unregistered_cast,   // base - derived relationship not registered with 
+                            // void_cast_register
+        unsupported_class_version, // type saved with a version # greater than the 
+                            // one used by the program.  This indicates that the proggram
+                            // needs to be rebuilt.
+        multiple_code_instantiation // code for implementing serialization for some
+                            // type has been instantiated in more than one module.
+    } exception_code;
+protected:
+    std::string m_msg;
+public:
+    exception_code code;
+    archive_exception(
+        exception_code c, 
+        const char * e1 = NULL,
+        const char * e2 = NULL
+    );
+    ~archive_exception() throw ();
+    virtual const char *what( ) const throw();
+protected:
+    archive_exception();
+};
+
+}// namespace archive
+}// namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif //BOOST_ARCHIVE_ARCHIVE_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_archive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_archive.hpp
new file mode 100644 (file)
index 0000000..668bd67
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_archive.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/serialization/strong_typedef.hpp>
+#include <boost/noncopyable.hpp>
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+BOOST_STRONG_TYPEDEF(unsigned int, version_type)
+BOOST_STRONG_TYPEDEF(int, class_id_type)
+BOOST_STRONG_TYPEDEF(int, class_id_optional_type)
+BOOST_STRONG_TYPEDEF(int, class_id_reference_type)
+BOOST_STRONG_TYPEDEF(unsigned int, object_id_type)
+BOOST_STRONG_TYPEDEF(unsigned int, object_reference_type)
+
+struct tracking_type {
+//    typedef bool value_type;
+    bool t;
+    explicit tracking_type(const bool t_ = false)
+        : t(t_)
+    {};
+    tracking_type(const tracking_type & t_)
+        : t(t_.t)
+    {}
+    operator bool () const {
+        return t;
+    };
+    operator bool & () {
+        return t;
+    };
+    tracking_type & operator=(const bool t_){
+        t = t_;
+        return *this;
+    }
+    bool operator==(const tracking_type & rhs) const {
+        return t == rhs.t;
+    }
+    bool operator==(const bool & rhs) const {
+        return t == rhs;
+    }
+    tracking_type & operator=(const tracking_type & rhs){
+        t = rhs.t;
+        return *this;
+    }
+};
+
+struct class_name_type : private boost::noncopyable {
+    char *t;
+    operator const char * & () const {
+        return const_cast<const char * &>(t);
+    }
+    operator char * () {
+        return t;
+    }
+    explicit class_name_type(const char *key_) 
+    : t(const_cast<char *>(key_)){}
+    explicit class_name_type(char *key_) 
+    : t(key_){}
+    class_name_type & operator=(const class_name_type & rhs){
+        t = rhs.t;
+        return *this;
+    }
+};
+
+enum archive_flags {
+    no_header = 1,  // suppress archive header info
+    no_codecvt = 2,  // suppress alteration of codecvt facet
+    no_xml_tag_checking = 4,   // suppress checking of xml tags
+    no_tracking = 8,           // suppress ALL tracking
+    flags_last = 8
+};
+
+#define NULL_POINTER_TAG class_id_type(-1)
+
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_SIGNATURE();
+
+BOOST_ARCHIVE_DECL(unsigned char)
+BOOST_ARCHIVE_VERSION();
+
+}// namespace archive
+}// namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#include <boost/serialization/level.hpp>
+
+// set implementation level to primitive for all types
+// used internally by the serialization library
+
+BOOST_CLASS_IMPLEMENTATION(boost::archive::version_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_reference_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::class_id_optional_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::class_name_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::object_id_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::object_reference_type, primitive_type)
+BOOST_CLASS_IMPLEMENTATION(boost::archive::tracking_type, primitive_type)
+
+#endif //BOOST_ARCHIVE_BASIC_ARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iarchive.hpp
new file mode 100644 (file)
index 0000000..2448c5f
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_iarchive.hpp
+//
+// archives stored as native binary - this should be the fastest way
+// to archive the state of a group of obects.  It makes no attempt to
+// convert to any canonical form.
+
+// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
+// ON PLATFORM APART FROM THE ONE THEY ARE CREATED ON
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/detail/common_iarchive.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/string.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_binary_iarchive - read serialized objects from a input binary stream
+template<class Archive>
+class basic_binary_iarchive : 
+    public detail::common_iarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_iarchive<Archive>;
+#else
+    friend class detail::interface_iarchive<Archive>;
+#endif
+    // intermediate level to support override of operators
+    // fot templates in the absence of partial function 
+    // template ordering. If we get here pass to base class
+    // note extra nonsense to sneak it pass the borland compiers
+    typedef detail::common_iarchive<Archive> detail_common_iarchive;
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int version){
+      this->detail_common_iarchive::load_override(t, static_cast<int>(version));
+    }
+    // binary files don't include the optional information 
+    void load_override(class_id_optional_type & /* t */, int){}
+
+    // the following have been overridden to provide specific sizes
+    // for these pseudo prmitive types.
+    void load_override(version_type & t, int){ 
+        // upto 255 versions
+        unsigned char x=0;
+        * this->This() >> x;
+        t = version_type(x);
+    }
+    void load_override(class_id_type & t, int){
+        // upto 32K classes
+        int_least16_t x=0;
+        * this->This() >> x;
+        t = class_id_type(x);
+    }
+    void load_override(class_id_reference_type & t, int){
+        // upto 32K classes
+        int_least16_t x=0;
+        * this->This() >> x;
+        t = class_id_reference_type(x);
+    }
+    void load_override(object_id_type & t, int){
+        // upto 2G objects
+        uint_least32_t x=0;
+        * this->This() >> x;
+        t = object_id_type(x);
+    }
+    void load_override(object_reference_type & t, int){
+        // upto 2G objects
+        uint_least32_t x=0;
+        * this->This() >> x;
+        t = object_reference_type(x);
+    }
+    void load_override(tracking_type & t, int){
+        char x=0;
+        * this->This() >> x;
+        t = (0 != x);
+    }
+    void load_override(serialization::collection_size_type & t, int){
+      if (this->get_library_version() < 6) {
+        unsigned int x=0;
+        * this->This() >> x;
+        t = serialization::collection_size_type(x);
+      } 
+      else {
+        std::size_t x=0;
+        * this->This() >> x;
+        t = serialization::collection_size_type(x);
+      }
+    }
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(class_name_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+   
+    basic_binary_iarchive(unsigned int flags) :
+        detail::common_iarchive<Archive>(flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_BINARY_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iprimitive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_iprimitive.hpp
new file mode 100644 (file)
index 0000000..11f5b38
--- /dev/null
@@ -0,0 +1,185 @@
+#ifndef BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP
+#define BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER)
+#pragma warning( disable : 4800 )
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_iprimitive.hpp
+//
+// archives stored as native binary - this should be the fastest way
+// to archive the state of a group of obects.  It makes no attempt to
+// convert to any canonical form.
+
+// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
+// ON PLATFORM APART FROM THE ONE THEY ARE CREATED ON
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <iosfwd>
+#include <cassert>
+#include <locale>
+#include <cstring> // std::memcpy
+#include <cstddef> // std::size_t
+#include <streambuf> // basic_streambuf
+#include <string>
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+    using ::size_t;
+} // namespace std
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/serialization/throw_exception.hpp>
+//#include <boost/limits.hpp>
+//#include <boost/io/ios_state.hpp>
+
+#include <boost/archive/basic_streambuf_locale_saver.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////////
+// class binary_iarchive - read serialized objects from a input binary stream
+template<class Archive, class Elem, class Tr>
+class basic_binary_iprimitive
+{
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+    friend class load_access;
+protected:
+#else
+public:
+#endif
+    std::basic_streambuf<Elem, Tr> & m_sb;
+    // return a pointer to the most derived class
+    Archive * This(){
+        return static_cast<Archive *>(this);
+    }
+
+    #ifndef BOOST_NO_STD_LOCALE
+    boost::scoped_ptr<std::locale> archive_locale;
+    basic_streambuf_locale_saver<Elem, Tr> locale_saver;
+    #endif
+
+    // main template for serilization of primitive types
+    template<class T>
+    void load(T & t){
+        load_binary(& t, sizeof(T));
+    }
+
+    /////////////////////////////////////////////////////////
+    // fundamental types that need special treatment
+    
+    // trap usage of invalid uninitialized boolean 
+    void load(bool & t){
+        load_binary(& t, sizeof(t));
+        int i = t;
+        assert(0 == i || 1 == i);
+        (void)i; // warning suppression for release builds.
+    }
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load(std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load(std::wstring &ws);
+    #endif
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load(char * t);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load(wchar_t * t);
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    basic_binary_iprimitive(
+        std::basic_streambuf<Elem, Tr> & sb, 
+        bool no_codecvt
+    );
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~basic_binary_iprimitive();
+public:
+    // we provide an optimized load for all fundamental types
+    // typedef serialization::is_bitwise_serializable<mpl::_1> 
+    // use_array_optimization;
+    struct use_array_optimization {  
+        template <class T>  
+        #if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)  
+            struct apply {  
+                typedef BOOST_DEDUCED_TYPENAME boost::serialization::is_bitwise_serializable<T>::type type;  
+            };
+        #else
+            struct apply : public boost::serialization::is_bitwise_serializable<T> {};  
+        #endif
+    };
+
+    // the optimized load_array dispatches to load_binary 
+    template <class ValueType>
+    void load_array(serialization::array<ValueType>& a, unsigned int)
+    {
+      load_binary(a.address(),a.count()*sizeof(ValueType));
+    }
+
+    void
+    load_binary(void *address, std::size_t count);
+};
+
+template<class Archive, class Elem, class Tr>
+inline void
+basic_binary_iprimitive<Archive, Elem, Tr>::load_binary(
+    void *address, 
+    std::size_t count
+){
+    // note: an optimizer should eliminate the following for char files
+    std::streamsize s = count / sizeof(Elem);
+    std::streamsize scount = m_sb.sgetn(
+        static_cast<Elem *>(address), 
+        s
+    );
+    if(scount != s)
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+    // note: an optimizer should eliminate the following for char files
+    s = count % sizeof(Elem);
+    if(0 < s){
+//        if(is.fail())
+//            boost::serialization::throw_exception(
+//                archive_exception(archive_exception::stream_error)
+//        );
+        Elem t;
+        scount = m_sb.sgetn(& t, 1);
+        if(scount != 1)
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        std::memcpy(static_cast<char*>(address) + (count - s), &t, s);
+    }
+}
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas
+
+#endif // BOOST_ARCHIVE_BINARY_IPRIMITIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oarchive.hpp
new file mode 100644 (file)
index 0000000..d39d187
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as native binary - this should be the fastest way
+// to archive the state of a group of obects.  It makes no attempt to
+// convert to any canonical form.
+
+// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
+// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON
+
+#include <cassert>
+#include <boost/integer.hpp>
+#include <boost/integer_traits.hpp>
+
+#include <boost/config.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/detail/workaround.hpp>
+#include <boost/archive/detail/common_oarchive.hpp>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// class basic_binary_oarchive - write serialized objects to a binary output stream
+// note: this archive has no pretensions to portability.  Archive format
+// may vary across machine architectures and compilers.  About the only
+// guarentee is that an archive created with this code will be readable
+// by a program built with the same tools for the same machne.  This class
+// does have the virtue of buiding the smalles archive in the minimum amount
+// of time.  So under some circumstances it may be he right choice.
+template<class Archive>
+class basic_binary_oarchive : 
+    public archive::detail::common_oarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_oarchive<Archive>;
+#else
+    friend class detail::interface_oarchive<Archive>;
+#endif
+    // any datatype not specifed below will be handled by base class
+    typedef detail::common_oarchive<Archive> detail_common_oarchive;
+    template<class T>
+    void save_override(const T & t, BOOST_PFTO int version){
+      this->detail_common_oarchive::save_override(t, static_cast<int>(version));
+    }
+
+    // binary files don't include the optional information 
+    void save_override(const class_id_optional_type & /* t */, int){}
+
+    void save_override(const version_type & t, int){
+        // upto 255 versions
+        // note:t.t resolves borland ambguity
+        assert(t.t <= boost::integer_traits<unsigned char>::const_max);
+        const unsigned char x = static_cast<const unsigned char>(t.t);
+        * this->This() << x;
+    }
+    void save_override(const class_id_type & t, int){
+        // upto 32K classes
+        assert(t.t <= boost::integer_traits<boost::int_least16_t>::const_max);
+        const boost::int_least16_t x = static_cast<const boost::int_least16_t>(t.t); 
+        * this->This() << x;
+    }
+    void save_override(const class_id_reference_type & t, int){
+        // upto 32K classes
+        assert(t.t <= boost::integer_traits<boost::int_least16_t>::const_max);
+        const boost::uint_least16_t x = t.t;
+        * this->This() << x;
+    }
+    void save_override(const object_id_type & t, int){
+        // upto 2G objects
+        assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
+        const boost::uint_least32_t x = t.t;
+        * this->This() << x;
+    }
+    void save_override(const object_reference_type & t, int){
+        // upto 2G objects
+        assert(t.t <= boost::integer_traits<boost::uint_least32_t>::const_max);
+        const boost::uint_least32_t x = t.t;
+        * this->This() << x;
+    }
+    void save_override(const tracking_type & t, int){
+        const char x = t.t;
+        * this->This() << x;
+    }
+
+    // explicitly convert to char * to avoid compile ambiguities
+    void save_override(const class_name_type & t, int){
+        const std::string s(t);
+        * this->This() << s;
+    }
+
+    void save_override(const serialization::collection_size_type & t, int){
+    // for backward compatibility, 64 bit integer or variable length integer would be preferred
+        std::size_t x = t.t;
+        * this->This() << x;
+   }
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+
+    basic_binary_oarchive(unsigned int flags) :
+        detail::common_oarchive<Archive>(flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_BASIC_BINARY_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oprimitive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_binary_oprimitive.hpp
new file mode 100644 (file)
index 0000000..c22c87c
--- /dev/null
@@ -0,0 +1,183 @@
+#ifndef BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP
+#define BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_oprimitive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as native binary - this should be the fastest way
+// to archive the state of a group of obects.  It makes no attempt to
+// convert to any canonical form.
+
+// IN GENERAL, ARCHIVES CREATED WITH THIS CLASS WILL NOT BE READABLE
+// ON PLATFORM APART FROM THE ONE THEY ARE CREATE ON
+
+#include <iosfwd>
+#include <cassert>
+#include <locale>
+#include <streambuf> // basic_streambuf
+#include <string>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/cstdint.hpp>
+//#include <boost/limits.hpp>
+//#include <boost/io/ios_state.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/serialization/throw_exception.hpp>
+
+#include <boost/archive/basic_streambuf_locale_saver.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_binary_oprimitive - binary output of prmitives
+
+template<class Archive, class Elem, class Tr>
+class basic_binary_oprimitive
+{
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+    friend class save_access;
+protected:
+#else
+public:
+#endif
+    std::basic_streambuf<Elem, Tr> & m_sb;
+    // return a pointer to the most derived class
+    Archive * This(){
+        return static_cast<Archive *>(this);
+    }
+    #ifndef BOOST_NO_STD_LOCALE
+    boost::scoped_ptr<std::locale> archive_locale;
+    basic_streambuf_locale_saver<Elem, Tr> locale_saver;
+    #endif
+    // default saving of primitives.
+    template<class T>
+    void save(const T & t)
+    {
+        save_binary(& t, sizeof(T));
+    }
+
+    /////////////////////////////////////////////////////////
+    // fundamental types that need special treatment
+    
+    // trap usage of invalid uninitialized boolean which would
+    // otherwise crash on load.
+    void save(const bool t){
+        assert(0 == static_cast<int>(t) || 1 == static_cast<int>(t));
+        save_binary(& t, sizeof(t));
+    }
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save(const std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save(const std::wstring &ws);
+    #endif
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save(const char * t);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save(const wchar_t * t);
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+    
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    basic_binary_oprimitive(
+        std::basic_streambuf<Elem, Tr> & sb, 
+        bool no_codecvt
+    );
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~basic_binary_oprimitive();
+public:
+
+    // we provide an optimized save for all fundamental types
+    // typedef serialization::is_bitwise_serializable<mpl::_1> 
+    // use_array_optimization;
+    // workaround without using mpl lambdas
+    struct use_array_optimization {
+        template <class T>  
+        #if defined(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS)  
+            struct apply {  
+                typedef BOOST_DEDUCED_TYPENAME boost::serialization::is_bitwise_serializable<T>::type type;  
+            };
+        #else
+            struct apply : public boost::serialization::is_bitwise_serializable<T> {};  
+        #endif
+    };
+    
+
+    // the optimized save_array dispatches to save_binary 
+    template <class ValueType>
+    void save_array(boost::serialization::array<ValueType> const& a, unsigned int)
+    {
+      save_binary(a.address(),a.count()*sizeof(ValueType));
+    }
+
+    void save_binary(const void *address, std::size_t count);
+};
+
+template<class Archive, class Elem, class Tr>
+inline void 
+basic_binary_oprimitive<Archive, Elem, Tr>::save_binary(
+    const void *address, 
+    std::size_t count
+){
+    //assert(
+    //    static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)()) >= count
+    //);
+    // note: if the following assertions fail
+    // a likely cause is that the output stream is set to "text"
+    // mode where by cr characters recieve special treatment.
+    // be sure that the output stream is opened with ios::binary
+    //if(os.fail())
+    //    boost::serialization::throw_exception(
+    //        archive_exception(archive_exception::stream_error)
+    //    );
+    // figure number of elements to output - round up
+    count = ( count + sizeof(Elem) - 1) 
+        / sizeof(Elem);
+    std::streamsize scount = m_sb.sputn(
+        static_cast<const Elem *>(address), 
+        count
+    );
+    if(count != static_cast<std::size_t>(scount))
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+    //os.write(
+    //    static_cast<const BOOST_DEDUCED_TYPENAME OStream::char_type *>(address), 
+    //    count
+    //);
+    //assert(os.good());
+}
+
+} //namespace boost 
+} //namespace archive 
+
+#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_BINARY_OPRIMITIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_streambuf_locale_saver.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_streambuf_locale_saver.hpp
new file mode 100644 (file)
index 0000000..3f587de
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP
+#define BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_streambuf_local_saver.hpp
+
+// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com
+
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// note derived from boost/io/ios_state.hpp
+// Copyright 2002, 2005 Daryle Walker.  Use, modification, and distribution
+// are subject to the Boost Software License, Version 1.0.  (See accompanying
+// file LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
+
+//  See <http://www.boost.org/libs/io/> for the library's home page.
+
+#ifndef BOOST_NO_STD_LOCALE
+
+#include <locale>     // for std::locale
+#include <streambuf>  // for std::basic_streambuf
+
+namespace boost{
+namespace archive{
+
+template < typename Ch, class Tr >
+class basic_streambuf_locale_saver
+{
+public:
+    typedef ::std::basic_streambuf<Ch, Tr> state_type;
+    typedef ::std::locale aspect_type;
+    explicit basic_streambuf_locale_saver( state_type &s )
+        : s_save_( s ), a_save_( s.getloc() )
+        {}
+    basic_streambuf_locale_saver( state_type &s, aspect_type const &a )
+        : s_save_( s ), a_save_( s.pubimbue(a) )
+        {}
+    ~basic_streambuf_locale_saver()
+        { this->restore(); }
+    void  restore()
+        { s_save_.pubimbue( a_save_ ); }
+private:
+    state_type &       s_save_;
+    aspect_type const  a_save_;
+};
+
+} // archive
+} // boost
+
+#endif // BOOST_NO_STD_LOCALE
+#endif // BOOST_ARCHIVE_BASIC_STREAMBUF_LOCALE_SAVER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iarchive.hpp
new file mode 100644 (file)
index 0000000..8080564
--- /dev/null
@@ -0,0 +1,84 @@
+#ifndef BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as text - note these ar templated on the basic
+// stream templates to accommodate wide (and other?) kind of characters
+//
+// note the fact that on libraries without wide characters, ostream is
+// is not a specialization of basic_ostream which in fact is not defined
+// in such cases.   So we can't use basic_ostream<IStream::char_type> but rather
+// use two template parameters
+
+#include <boost/config.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/detail/common_iarchive.hpp>
+#include <boost/serialization/string.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_text_iarchive - read serialized objects from a input text stream
+template<class Archive>
+class basic_text_iarchive : 
+    public detail::common_iarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_iarchive<Archive>;
+#else
+    friend class detail::interface_iarchive<Archive>;
+#endif
+    // intermediate level to support override of operators
+    // fot templates in the absence of partial function 
+    // template ordering
+    typedef detail::common_iarchive<Archive> detail_common_iarchive;
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int)
+    {
+        this->detail_common_iarchive::load_override(t, 0);
+    }
+    // text file don't include the optional information 
+    void load_override(class_id_optional_type & /*t*/, int){}
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(class_name_type & t, int);
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init(void);
+
+    basic_text_iarchive(unsigned int flags) : 
+        detail::common_iarchive<Archive>(flags)
+    {}
+    ~basic_text_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_TEXT_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iprimitive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_iprimitive.hpp
new file mode 100644 (file)
index 0000000..da3234c
--- /dev/null
@@ -0,0 +1,143 @@
+#ifndef BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
+#define BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_iprimitive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as text - note these are templated on the basic
+// stream templates to accommodate wide (and other?) kind of characters
+//
+// Note the fact that on libraries without wide characters, ostream is
+// not a specialization of basic_ostream which in fact is not defined
+// in such cases.   So we can't use basic_ostream<IStream::char_type> but rather
+// use two template parameters
+
+#include <cassert>
+#include <locale>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+    #if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT)
+        using ::locale;
+    #endif
+} // namespace std
+#endif
+
+#include <boost/detail/workaround.hpp>
+#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+#include <boost/archive/dinkumware.hpp>
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/io/ios_state.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_text_iarchive - load serialized objects from a input text stream
+template<class IStream>
+class basic_text_iprimitive
+{
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+protected:
+#else
+public:
+#endif
+    IStream &is;
+    io::ios_flags_saver flags_saver;
+    io::ios_precision_saver precision_saver;
+
+    #ifndef BOOST_NO_STD_LOCALE
+    boost::scoped_ptr<std::locale> archive_locale;
+    io::basic_ios_locale_saver<
+        BOOST_DEDUCED_TYPENAME IStream::char_type, BOOST_DEDUCED_TYPENAME IStream::traits_type
+    > locale_saver;
+    #endif
+
+    template<class T>
+    void load(T & t)
+    {
+        if(is.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        is >> t;
+    }
+    void load(unsigned char & t)
+    {
+        if(is.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        unsigned short int i;
+        is >> i;
+        t = static_cast<unsigned char>(i);
+    }
+    void load(signed char & t)
+    {
+        if(is.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        signed short int i;
+        is >> i;
+        t = static_cast<signed char>(i);
+    }
+    void load(char & t)
+    {
+        if(is.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        short int i;
+        is >> i;
+        t = static_cast<char>(i);
+    }
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    void load(wchar_t & t)
+    {
+        if(is.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        unsigned i;
+        is >> i;
+        t = static_cast<wchar_t>(i);
+    }
+    #endif
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    basic_text_iprimitive(IStream  &is, bool no_codecvt);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~basic_text_iprimitive();
+public:
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_binary(void *address, std::size_t count);
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_TEXT_IPRIMITIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oarchive.hpp
new file mode 100644 (file)
index 0000000..4fd55f0
--- /dev/null
@@ -0,0 +1,134 @@
+#ifndef BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as text - note these ar templated on the basic
+// stream templates to accommodate wide (and other?) kind of characters
+//
+// note the fact that on libraries without wide characters, ostream is
+// is not a specialization of basic_ostream which in fact is not defined
+// in such cases.   So we can't use basic_ostream<OStream::char_type> but rather
+// use two template parameters
+
+#include <cassert>
+#include <boost/config.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/detail/common_oarchive.hpp>
+#include <boost/serialization/string.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_text_oarchive 
+template<class Archive>
+class basic_text_oarchive : 
+    public detail::common_oarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+|| BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x560))
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_oarchive<Archive>;
+#else
+    friend class detail::interface_oarchive<Archive>;
+#endif
+    enum {
+        none,
+        eol,
+        space
+    } delimiter;
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    newtoken();
+
+    void newline(){
+        delimiter = eol;
+    }
+
+    // default processing - kick back to base class.  Note the
+    // extra stuff to get it passed borland compilers
+    typedef detail::common_oarchive<Archive> detail_common_oarchive;
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int){
+        this->detail_common_oarchive::save_override(t, 0);
+    }
+
+    // start new objects on a new line
+    void save_override(const object_id_type & t, int){
+        this->This()->newline();
+        // note extra .t to funciton with Borland 5.51 compiler
+        // and invoke prmitive to underlying value
+        this->This()->save(t.t);
+    }
+
+    void save_override(const object_reference_type & t, int){
+        this->This()->newline();
+        // note extra .t to funciton with Borland 5.51 compiler
+        // and invoke prmitive to underlying value
+        this->This()->save(t.t);
+    }
+
+    // note the following four overrides are necessary for some borland
+    // compilers(5.51) which don't handle BOOST_STRONG_TYPE properly.
+    void save_override(const version_type & t, int){
+        // note:t.t resolves borland ambguity
+        const unsigned int x = t.t;
+        * this->This() << x;
+    }
+    void save_override(const class_id_type & t, int){
+        // note:t.t resolves borland ambguity
+        const int x = t.t;
+        * this->This() << x;
+    }
+    void save_override(const class_id_reference_type & t, int){
+        // note:t.t resolves borland ambguity
+        const int x = t.t;
+        * this->This() << x;
+    }
+
+    // text file don't include the optional information 
+    void save_override(const class_id_optional_type & /* t */, int){}
+
+    void save_override(const class_name_type & t, int){
+        const std::string s(t);
+        * this->This() << s;
+    }
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+
+    basic_text_oarchive(unsigned int flags) :
+        detail::common_oarchive<Archive>(flags),
+        delimiter(none)
+    {}
+    ~basic_text_oarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_TEXT_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oprimitive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_text_oprimitive.hpp
new file mode 100644 (file)
index 0000000..ba87709
--- /dev/null
@@ -0,0 +1,190 @@
+#ifndef BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP
+#define BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_oprimitive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// archives stored as text - note these ar templated on the basic
+// stream templates to accommodate wide (and other?) kind of characters
+//
+// note the fact that on libraries without wide characters, ostream is
+// is not a specialization of basic_ostream which in fact is not defined
+// in such cases.   So we can't use basic_ostream<OStream::char_type> but rather
+// use two template parameters
+
+#include <iomanip>
+#include <locale>
+#include <boost/config/no_tr1/cmath.hpp> // isnan
+#include <cassert>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+#include <boost/archive/dinkumware.hpp>
+#endif
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t;
+    #if ! defined(BOOST_DINKUMWARE_STDLIB) && ! defined(__SGI_STL_PORT)
+        using ::locale;
+    #endif
+} // namespace std
+#endif
+
+#include <boost/limits.hpp>
+#include <boost/io/ios_state.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/serialization/throw_exception.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+class save_access;
+
+/////////////////////////////////////////////////////////////////////////
+// class basic_text_oprimitive - output of prmitives to stream
+template<class OStream>
+class basic_text_oprimitive
+{
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+protected:
+#else
+public:
+#endif
+    OStream &os;
+    io::ios_flags_saver flags_saver;
+    io::ios_precision_saver precision_saver;
+
+    #ifndef BOOST_NO_STD_LOCALE
+    boost::scoped_ptr<std::locale> archive_locale;
+    io::basic_ios_locale_saver<
+        BOOST_DEDUCED_TYPENAME OStream::char_type, BOOST_DEDUCED_TYPENAME OStream::traits_type
+    > locale_saver;
+    #endif
+
+    // default saving of primitives.
+    template<class T>
+    void save(const T &t){
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << t;
+    }
+
+    /////////////////////////////////////////////////////////
+    // fundamental types that need special treatment
+    void save(const bool t){
+        // trap usage of invalid uninitialized boolean which would
+        // otherwise crash on load.
+        assert(0 == static_cast<int>(t) || 1 == static_cast<int>(t));
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << t;
+    }
+    void save(const signed char t)
+    {
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << static_cast<short int>(t);
+    }
+    void save(const unsigned char t)
+    {
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << static_cast<short unsigned int>(t);
+    }
+    void save(const char t)
+    {
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << static_cast<short int>(t);
+    }
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    void save(const wchar_t t)
+    {
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << static_cast<int>(t);
+    }
+    #endif
+    void save(const float t)
+    {
+        // must be a user mistake - can't serialize un-initialized data
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << std::setprecision(std::numeric_limits<float>::digits10 + 2);
+        os << t;
+    }
+    void save(const double t)
+    {
+        // must be a user mistake - can't serialize un-initialized data
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+        os << t;
+    }
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+    basic_text_oprimitive(OStream & os, bool no_codecvt);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~basic_text_oprimitive();
+public:
+    // unformatted append of one character
+    void put(int c){
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        os.put(c);
+    }
+    // unformatted append of null terminated string
+    void put(const char * s){
+        if(os.fail())
+            boost::serialization::throw_exception(
+                archive_exception(archive_exception::stream_error)
+            );
+        while('\0' != *s)
+            os.put(*s++);
+    }
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void) 
+    save_binary(const void *address, std::size_t count);
+};
+
+} //namespace boost 
+} //namespace archive 
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_TEXT_OPRIMITIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_archive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_archive.hpp
new file mode 100644 (file)
index 0000000..df99836
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_archive.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/archive_exception.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+// constant strings used in xml i/o
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_OBJECT_ID();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_OBJECT_REFERENCE();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_CLASS_ID();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_CLASS_ID_REFERENCE();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_CLASS_NAME();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_TRACKING();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_VERSION();
+
+extern 
+BOOST_ARCHIVE_DECL(const char *)
+BOOST_ARCHIVE_XML_SIGNATURE();
+
+}// namespace archive
+}// namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_XML_TEXT_ARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_iarchive.hpp
new file mode 100644 (file)
index 0000000..fd3ae75
--- /dev/null
@@ -0,0 +1,118 @@
+#ifndef BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/detail/common_iarchive.hpp>
+
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/string.hpp>
+
+#include <boost/mpl/assert.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+/////////////////////////////////////////////////////////////////////////
+// class xml_iarchive - read serialized objects from a input text stream
+template<class Archive>
+class basic_xml_iarchive :
+    public detail::common_iarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_oarchive<Archive>;
+#else
+    friend class detail::interface_oarchive<Archive>;
+#endif
+    unsigned int depth;
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_start(const char *name);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_end(const char *name);
+
+    // Anything not an attribute and not a name-value pair is an
+    // should be trapped here.
+    template<class T>
+    void load_override(T & t,  BOOST_PFTO int)
+    {
+        // If your program fails to compile here, its most likely due to
+        // not specifying an nvp wrapper around the variable to
+        // be serialized.
+        BOOST_MPL_ASSERT((serialization::is_wrapper<T>));
+        this->detail_common_iarchive::load_override(t, 0);
+    }
+
+    // Anything not an attribute - see below - should be a name value
+    // pair and be processed here
+    typedef detail::common_iarchive<Archive> detail_common_iarchive;
+    template<class T>
+    void load_override(
+        #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+        const
+        #endif
+        boost::serialization::nvp<T> & t,
+        int
+    ){
+        this->This()->load_start(t.name());
+        this->detail_common_iarchive::load_override(t.value(), 0);
+        this->This()->load_end(t.name());
+    }
+
+    // specific overrides for attributes - handle as
+    // primitives. These are not name-value pairs
+    // so they have to be intercepted here and passed on to load.
+    // although the class_id is included in the xml text file in order
+    // to make the file self describing, it isn't used when loading
+    // an xml archive.  So we can skip it here.  Note: we MUST override
+    // it otherwise it will be loaded as a normal primitive w/o tag and
+    // leaving the archive in an undetermined state
+    void load_override(class_id_optional_type & /* t */, int){}
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(object_id_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(version_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(class_id_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    load_override(tracking_type & t, int);
+    // class_name_type can't be handled here as it depends upon the
+    // char type used by the stream.  So require the derived implementation
+    // handle this.
+    // void load_override(class_name_type & t, int);
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+    basic_xml_iarchive(unsigned int flags);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+    ~basic_xml_iarchive();
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_XML_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/basic_xml_oarchive.hpp
new file mode 100644 (file)
index 0000000..0ba2589
--- /dev/null
@@ -0,0 +1,136 @@
+#ifndef BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/archive/detail/common_oarchive.hpp>
+
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/string.hpp>
+
+#include <boost/mpl/assert.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// class basic_xml_oarchive - write serialized objects to a xml output stream
+template<class Archive>
+class basic_xml_oarchive :
+    public detail::common_oarchive<Archive>
+{
+protected:
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+public:
+#elif defined(BOOST_MSVC)
+    // for some inexplicable reason insertion of "class" generates compile erro
+    // on msvc 7.1
+    friend detail::interface_oarchive<Archive>;
+    friend class save_access;
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class save_access;
+#endif
+    // special stuff for xml output
+    unsigned int depth;
+    bool indent_next;
+    bool pending_preamble;
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    indent();
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    init();
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    write_attribute(
+        const char *attribute_name,
+        int t,
+        const char *conjunction = "=\""
+    );
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    write_attribute(
+        const char *attribute_name,
+        const char *key
+    );
+    // helpers used below
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_start(const char *name);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_end(const char *name);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    end_preamble();
+
+    // Anything not an attribute and not a name-value pair is an
+    // error and should be trapped here.
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int)
+    {
+        // If your program fails to compile here, its most likely due to
+        // not specifying an nvp wrapper around the variable to
+        // be serialized.
+        BOOST_MPL_ASSERT((serialization::is_wrapper<T>));
+        this->detail_common_oarchive::save_override(t, 0);
+    }
+
+   // special treatment for name-value pairs.
+    typedef detail::common_oarchive<Archive> detail_common_oarchive;
+    template<class T>
+    void save_override(
+        #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+        const
+        #endif
+        ::boost::serialization::nvp<T> & t,
+        int
+    ){
+        this->This()->save_start(t.name());
+        this->detail_common_oarchive::save_override(t.const_value(), 0);
+        this->This()->save_end(t.name());
+    }
+
+    // specific overrides for attributes - not name value pairs so we
+    // want to trap them before the above "fall through"
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const object_id_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const object_reference_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const version_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const class_id_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const class_id_optional_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const class_id_reference_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const class_name_type & t, int);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+    save_override(const tracking_type & t, int);
+
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+    basic_xml_oarchive(unsigned int flags);
+    BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+    ~basic_xml_oarchive();
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_XML_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive.hpp
new file mode 100644 (file)
index 0000000..fdfc355
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef BOOST_ARCHIVE_BINARY_IARCHIVE_HPP
+#define BOOST_ARCHIVE_BINARY_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+#include <boost/archive/binary_iarchive_impl.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+namespace boost { 
+namespace archive {
+
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as binary_iarchive below - without the shared_ptr_helper
+class naked_binary_iarchive : 
+    public binary_iarchive_impl<
+        boost::archive::naked_binary_iarchive, 
+        std::istream::char_type, 
+        std::istream::traits_type
+    >
+{
+public:
+    naked_binary_iarchive(std::istream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(is, flags)
+    {}
+    naked_binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from binary_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class binary_iarchive : 
+    public binary_iarchive_impl<
+        boost::archive::binary_iarchive, 
+        std::istream::char_type, 
+        std::istream::traits_type
+    >,
+    public detail::shared_ptr_helper
+{
+public:
+    binary_iarchive(std::istream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(is, flags)
+    {}
+    binary_iarchive(std::streambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            binary_iarchive, std::istream::char_type, std::istream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_iarchive)
+BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(boost::archive::binary_iarchive)
+
+#endif // BOOST_ARCHIVE_BINARY_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_iarchive_impl.hpp
new file mode 100644 (file)
index 0000000..c1d04d1
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP
+#define BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_iarchive_impl.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+#include <boost/serialization/pfto.hpp>
+#include <boost/archive/basic_binary_iprimitive.hpp>
+#include <boost/archive/basic_binary_iarchive.hpp>
+
+namespace boost { 
+namespace archive {
+
+template<class Archive, class Elem, class Tr>
+class binary_iarchive_impl : 
+    public basic_binary_iprimitive<Archive, Elem, Tr>,
+    public basic_binary_iarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<Archive>;
+    friend class basic_binary_iarchive<Archive>;
+    friend class load_access;
+protected:
+#endif
+    // note: the following should not needed - but one compiler (vc 7.1)
+    // fails to compile one test (test_shared_ptr) without it !!!
+    // make this protected so it can be called from a derived archive
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        this->basic_binary_iarchive<Archive>::load_override(t, 0L);
+    }
+    void init(unsigned int flags){
+        if(0 != (flags & no_header))
+            return;
+        #if ! defined(__MWERKS__)
+            this->basic_binary_iarchive<Archive>::init();
+            this->basic_binary_iprimitive<Archive, Elem, Tr>::init();
+        #else
+            basic_binary_iarchive<Archive>::init();
+            basic_binary_iprimitive<Archive, Elem, Tr>::init();
+        #endif
+    }
+    binary_iarchive_impl(
+        std::basic_streambuf<Elem, Tr> & bsb, 
+        unsigned int flags
+    ) :
+        basic_binary_iprimitive<Archive, Elem, Tr>(
+            bsb, 
+            0 != (flags & no_codecvt)
+        ),
+        basic_binary_iarchive<Archive>(flags)
+    {
+        init(flags);
+    }
+    binary_iarchive_impl(
+        std::basic_istream<Elem, Tr> & is, 
+        unsigned int flags
+    ) :
+        basic_binary_iprimitive<Archive, Elem, Tr>(
+            * is.rdbuf(), 
+            0 != (flags & no_codecvt)
+        ),
+        basic_binary_iarchive<Archive>(flags)
+    {
+        init(flags);
+    }
+};
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_BINARY_IARCHIVE_IMPL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive.hpp
new file mode 100644 (file)
index 0000000..ee5e7d8
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef BOOST_ARCHIVE_BINARY_OARCHIVE_HPP
+#define BOOST_ARCHIVE_BINARY_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <boost/archive/binary_oarchive_impl.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+namespace boost { 
+namespace archive {
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from binary_oarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class binary_oarchive : 
+    public binary_oarchive_impl<
+        binary_oarchive, std::ostream::char_type, std::ostream::traits_type
+    >
+{
+public:
+    binary_oarchive(std::ostream & os, unsigned int flags = 0) :
+        binary_oarchive_impl<
+            binary_oarchive, std::ostream::char_type, std::ostream::traits_type
+        >(os, flags)
+    {}
+    binary_oarchive(std::streambuf & bsb, unsigned int flags = 0) :
+        binary_oarchive_impl<
+            binary_oarchive, std::ostream::char_type, std::ostream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+typedef binary_oarchive naked_binary_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_oarchive)
+BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(boost::archive::binary_oarchive)
+
+#endif // BOOST_ARCHIVE_BINARY_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_oarchive_impl.hpp
new file mode 100644 (file)
index 0000000..331a874
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
+#define BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_oarchive_impl.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <boost/serialization/pfto.hpp>
+#include <boost/archive/basic_binary_oprimitive.hpp>
+#include <boost/archive/basic_binary_oarchive.hpp>
+
+namespace boost { 
+namespace archive {
+
+template<class Archive, class Elem, class Tr>
+class binary_oarchive_impl : 
+    public basic_binary_oprimitive<Archive, Elem, Tr>,
+    public basic_binary_oarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class basic_binary_oarchive<Archive>;
+    friend class save_access;
+protected:
+#endif
+    // note: the following should not needed - but one compiler (vc 7.1)
+    // fails to compile one test (test_shared_ptr) without it !!!
+    // make this protected so it can be called from a derived archive
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int){
+        this->basic_binary_oarchive<Archive>::save_override(t, 0L);
+    }
+    void init(unsigned int flags) {
+        if(0 != (flags & no_header))
+            return;
+        #if ! defined(__MWERKS__)
+            this->basic_binary_oarchive<Archive>::init();
+            this->basic_binary_oprimitive<Archive, Elem, Tr>::init();
+        #else
+            basic_binary_oarchive<Archive>::init();
+            basic_binary_oprimitive<Archive, Elem, Tr>::init();
+        #endif
+    }
+    binary_oarchive_impl(
+        std::basic_streambuf<Elem, Tr> & bsb, 
+        unsigned int flags
+    ) :
+        basic_binary_oprimitive<Archive, Elem, Tr>(
+            bsb, 
+            0 != (flags & no_codecvt)
+        ),
+        basic_binary_oarchive<Archive>(flags)
+    {
+        init(flags);
+    }
+    binary_oarchive_impl(
+        std::basic_ostream<Elem, Tr> & os, 
+        unsigned int flags
+    ) :
+        basic_binary_oprimitive<Archive, Elem, Tr>(
+            * os.rdbuf(), 
+            0 != (flags & no_codecvt)
+        ),
+        basic_binary_oarchive<Archive>(flags)
+    {
+        init(flags);
+    }
+};
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_BINARY_OARCHIVE_IMPL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_wiarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_wiarchive.hpp
new file mode 100644 (file)
index 0000000..b5f6a71
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP
+#define BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_wiarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <istream> // wistream
+#include <boost/archive/binary_iarchive_impl.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+namespace boost { 
+namespace archive {
+
+// same as binary_wiarchive below - without the shared_ptr_helper
+class naked_binary_wiarchive : 
+    public binary_iarchive_impl<
+        boost::archive::naked_binary_wiarchive, 
+        std::wistream::char_type, 
+        std::wistream::traits_type
+    >
+{
+public:
+    naked_binary_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_wiarchive, 
+            std::wistream::char_type, 
+            std::wistream::traits_type
+        >(is, flags)
+    {}
+    naked_binary_wiarchive(std::wstreambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            naked_binary_wiarchive, 
+            std::wistream::char_type, 
+            std::wistream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class binary_wiarchive : 
+    public binary_iarchive_impl<
+        binary_wiarchive, std::wistream::char_type, std::wistream::traits_type
+    >
+{
+public:
+    binary_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            binary_wiarchive, std::wistream::char_type, std::wistream::traits_type
+        >(is, flags)
+    {}
+    binary_wiarchive(std::wstreambuf & bsb, unsigned int flags = 0) :
+        binary_iarchive_impl<
+            binary_wiarchive, std::wistream::char_type, std::wistream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_wiarchive)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_BINARY_WIARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_woarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/binary_woarchive.hpp
new file mode 100644 (file)
index 0000000..2075dac
--- /dev/null
@@ -0,0 +1,61 @@
+#ifndef BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP
+#define BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_woarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <ostream>
+#include <boost/archive/binary_oarchive_impl.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+namespace boost { 
+namespace archive {
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from binary_oarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class binary_woarchive : 
+    public binary_oarchive_impl<
+            binary_woarchive, std::wostream::char_type, std::wostream::traits_type
+        >
+{
+public:
+    binary_woarchive(std::wostream & os, unsigned int flags = 0) :
+        binary_oarchive_impl<
+            binary_woarchive, std::wostream::char_type, std::wostream::traits_type
+        >(os, flags)
+    {}
+    binary_woarchive(std::wstreambuf & bsb, unsigned int flags = 0) :
+        binary_oarchive_impl<
+            binary_woarchive, std::wostream::char_type, std::wostream::traits_type
+        >(bsb, flags)
+    {}
+};
+
+typedef binary_woarchive naked_binary_woarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::binary_woarchive)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_BINARY_WOARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/codecvt_null.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/codecvt_null.hpp
new file mode 100644 (file)
index 0000000..ba88aea
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef BOOST_ARCHIVE_CODECVT_NULL_HPP
+#define BOOST_ARCHIVE_CODECVT_NULL_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// codecvt_null.hpp:
+
+// (C) Copyright 2004 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <locale>
+#include <cstddef> // NULL, size_t
+#include <cwchar>   // for mbstate_t
+#include <boost/config.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std {
+// For STLport on WinCE, BOOST_NO_STDC_NAMESPACE can get defined if STLport is putting symbols in its own namespace.
+// In the case of codecvt, however, this does not mean that codecvt is in the global namespace (it will be in STLport's namespace)
+#  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+    using ::codecvt;
+#  endif
+    using ::mbstate_t;
+    using ::size_t;
+} // namespace
+#endif
+
+namespace boost {
+namespace archive {
+
+template<class Ch>
+class codecvt_null;
+
+template<>
+class codecvt_null<char> : public std::codecvt<char, char, std::mbstate_t>
+{
+    virtual bool do_always_noconv() const throw() {
+        return true;
+    }
+public:
+    explicit codecvt_null(std::size_t no_locale_manage = 0) :
+        std::codecvt<char, char, std::mbstate_t>(no_locale_manage)
+    {}
+};
+
+template<>
+class codecvt_null<wchar_t> : public std::codecvt<wchar_t, char, std::mbstate_t>
+{
+    virtual BOOST_WARCHIVE_DECL(std::codecvt_base::result)
+    do_out(
+        std::mbstate_t & state,
+        const wchar_t * first1,
+        const wchar_t * last1,
+        const wchar_t * & next1,
+        char * first2,
+        char * last2,
+        char * & next2
+    ) const;
+    virtual BOOST_WARCHIVE_DECL(std::codecvt_base::result)
+    do_in(
+        std::mbstate_t & state,
+        const char * first1,
+        const char * last1,
+        const char * & next1,
+        wchar_t * first2,
+        wchar_t * last2,
+        wchar_t * & next2
+    ) const;
+    virtual int do_encoding( ) const throw( ){
+        return sizeof(wchar_t) / sizeof(char);
+    }
+    virtual int do_max_length( ) const throw( ){
+        return do_encoding();
+    }
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pop pragmas
+
+#endif //BOOST_ARCHIVE_CODECVT_NULL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_prefix.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_prefix.hpp
new file mode 100644 (file)
index 0000000..e39ef11
--- /dev/null
@@ -0,0 +1,20 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// abi_prefix.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config/abi_prefix.hpp> // must be the last header
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4251 4231 4660 4275)
+#endif
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_suffix.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/abi_suffix.hpp
new file mode 100644 (file)
index 0000000..a283b36
--- /dev/null
@@ -0,0 +1,19 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// abi_suffix.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#if defined( __BORLANDC__ )
+#pragma nopushoptwarn
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/archive_serializer_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/archive_serializer_map.hpp
new file mode 100644 (file)
index 0000000..096a24b
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef BOOST_ARCHIVE_SERIALIZER_MAP_HPP
+#define BOOST_ARCHIVE_SERIALIZER_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// archive_serializer_map.hpp: extenstion of type_info required for 
+// serialization.
+
+// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// note: this is nothing more than the thinest of wrappers around
+// basic_serializer_map so we can have a one map / archive type. 
+
+#include <boost/config.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+namespace detail {
+
+class basic_serializer;
+
+template<class Archive>
+class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) archive_serializer_map 
+{
+public:
+    static bool insert(const basic_serializer * bs);
+    static void erase(const basic_serializer * bs);
+    static const basic_serializer * find(
+        const boost::serialization::extended_type_info & type_
+    );
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // must be the last header
+
+#endif //BOOST_ARCHIVE_SERIALIZER_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_archive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_archive.hpp
new file mode 100644 (file)
index 0000000..af2788b
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef BOOST_ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+//  auto_link_archive.hpp
+//
+//  (c) Copyright Robert Ramey 2004
+//  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)
+
+//  See library home page at http://www.boost.org/libs/serialization
+
+//----------------------------------------------------------------------------// 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+//  enable automatic library variant selection  ------------------------------// 
+
+#include <boost/archive/detail/decl.hpp>
+
+#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB) \
+&&  !defined(BOOST_ARCHIVE_SOURCE) && !defined(BOOST_WARCHIVE_SOURCE)  \
+&&  !defined(BOOST_SERIALIZATION_SOURCE)
+
+    // Set the name of our library, this will get undef'ed by auto_link.hpp
+    // once it's done with it:
+    //
+    #define BOOST_LIB_NAME boost_serialization
+    //
+    // If we're importing code from a dll, then tell auto_link.hpp about it:
+    //
+    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
+    #  define BOOST_DYN_LINK
+    #endif
+    //
+    // And include the header that does the work:
+    //
+    #include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_warchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/auto_link_warchive.hpp
new file mode 100644 (file)
index 0000000..4d4efcd
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef BOOST_ARCHIVE_DETAIL_AUTO_LINK_WARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_AUTO_LINK_WARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+//  auto_link_warchive.hpp
+//
+//  (c) Copyright Robert Ramey 2004
+//  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)
+
+//  See library home page at http://www.boost.org/libs/serialization
+
+//----------------------------------------------------------------------------// 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+//  enable automatic library variant selection  ------------------------------// 
+
+#include <boost/archive/detail/decl.hpp>
+
+#if !defined(BOOST_WARCHIVE_SOURCE) \
+&& !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB)
+
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_wserialization
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // ARCHIVE_DETAIL_AUTO_LINK_ARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_archive_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_archive_impl.hpp
new file mode 100644 (file)
index 0000000..589368d
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef BOOST_ARCHIVE_DETAIL_BASIC_ARCHIVE_IMPL_HPP
+#define BOOST_ARCHIVE_DETAIL_BASIC_ARCHIVE_IMPL_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_archive_impl.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// can't use this - much as I'd like to as borland doesn't support it
+// #include <boost/scoped_ptr.hpp>
+
+#include <set>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+namespace detail {
+
+//////////////////////////////////////////////////////////////////////
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_archive_impl
+{
+};
+
+} // namespace detail
+} // namespace serialization
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif //BOOST_ARCHIVE_DETAIL_BASIC_ARCHIVE_IMPL_HPP
+
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_config.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_config.hpp
new file mode 100644 (file)
index 0000000..5e37cae
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef BOOST_ARCHIVE_DETAIL_BASIC_CONFIG_HPP
+#define BOOST_ARCHIVE_DETAIL_BASIC_CONFIG_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  basic_config.hpp  ---------------------------------------------//
+
+//  (c) Copyright Robert Ramey 2004
+//  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)
+
+//  See library home page at http://www.boost.org/libs/serialization
+
+//----------------------------------------------------------------------------// 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_HAS_DECLSPEC // defined in config system
+// we need to import/export our code only if the user has specifically
+// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+// libraries to be dynamically linked, or BOOST_ARCHIVE_DYN_LINK
+// if they want just this one to be dynamically linked:
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_ARCHIVE_DYN_LINK)
+// export if this is our own source, otherwise import:
+#ifdef BOOST_ARCHIVE_SOURCE
+# define BOOST_ARCHIVE_DECL __declspec(dllexport)
+#else
+# define BOOST_ARCHIVE_DECL __declspec(dllimport)
+#endif  // BOOST_ARCHIVE_SOURCE
+#endif  // DYN_LINK
+#endif  // BOOST_HAS_DECLSPEC
+//
+// if BOOST_ARCHIVE_DECL isn't defined yet define it now:
+#ifndef BOOST_ARCHIVE_DECL
+#define BOOST_ARCHIVE_DECL
+#endif
+
+#endif // BOOST_ARCHIVE_DETAIL_BASIC_CONFIG_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iarchive.hpp
new file mode 100644 (file)
index 0000000..4c9707c
--- /dev/null
@@ -0,0 +1,106 @@
+#ifndef BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_iarchive.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// can't use this - much as I'd like to as borland doesn't support it
+// #include <boost/scoped_ptr.hpp>
+
+#include <boost/config.hpp>
+#include <boost/type_traits/broken_compiler_spec.hpp>
+#include <boost/serialization/tracking_enum.hpp>
+#include <boost/archive/basic_archive.hpp>
+#include <boost/archive/detail/decl.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+namespace detail {
+
+class basic_iarchive_impl;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iserializer;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_iserializer;
+//////////////////////////////////////////////////////////////////////
+// class basic_iarchive - read serialized objects from a input stream
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive 
+{
+    friend class basic_iarchive_impl;
+    // hide implementation of this class to minimize header conclusion
+    // in client code. I couldn't used scoped pointer with borland
+    // boost::scoped_ptr<basic_iarchive_impl> pimpl;
+    basic_iarchive_impl * pimpl;
+
+    virtual void vload(version_type &t) =  0;
+    virtual void vload(object_id_type &t) =  0;
+    virtual void vload(class_id_type &t) =  0;
+    virtual void vload(class_id_optional_type &t) = 0;
+    virtual void vload(class_name_type &t) = 0;
+    virtual void vload(tracking_type &t) = 0;
+
+    virtual const basic_pointer_iserializer * 
+    find(const boost::serialization::extended_type_info & eti) const = 0;
+protected:
+    basic_iarchive(unsigned int flags);
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_iarchive();
+public:
+    // note: NOT part of the public API.
+    void next_object_pointer(void *t);
+    void register_basic_serializer(
+        const basic_iserializer & bis
+    );
+    void load_object(
+        void *t, 
+        const basic_iserializer & bis
+    );
+    const basic_pointer_iserializer * 
+    load_pointer(
+        void * & t, 
+        const basic_pointer_iserializer * bpis_ptr
+    );
+    // real public API starts here
+    void 
+    set_library_version(unsigned int archive_library_version);
+    unsigned int 
+    get_library_version() const;
+    unsigned int
+    get_flags() const;
+    void 
+    reset_object_address(const void * new_address, const void * old_address);
+    void 
+    delete_created_pointers();
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+// required by smart_cast for compilers not implementing 
+// partial template specialization
+BOOST_TT_BROKEN_COMPILER_SPEC(
+    boost::archive::detail::basic_iarchive  
+) 
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif //BOOST_ARCHIVE_DETAIL_BASIC_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_iserializer.hpp
new file mode 100644 (file)
index 0000000..de9654f
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP
+#define BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_iserializer.hpp: extenstion of type_info required for serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstdlib> // NULL
+#include <boost/config.hpp>
+
+#include <boost/archive/detail/decl.hpp>
+#include <boost/archive/detail/basic_serializer.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+// forward declarations
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_iserializer;
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iserializer : 
+    public basic_serializer
+{
+private:
+    basic_pointer_iserializer *m_bpis;
+protected:
+    explicit basic_iserializer(
+        const boost::serialization::extended_type_info & type
+    );
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_iserializer();
+public:
+    bool serialized_as_pointer() const {
+        return m_bpis != NULL;
+    }
+    void set_bpis(basic_pointer_iserializer *bpis){
+        m_bpis = bpis;
+    }
+    const basic_pointer_iserializer * get_bpis_ptr() const {
+        return m_bpis;
+    }
+    virtual void load_object_data(
+        basic_iarchive & ar, 
+        void *x,
+        const unsigned int file_version
+    ) const = 0;
+    // returns true if class_info should be saved
+    virtual bool class_info() const = 0 ;
+    // returns true if objects should be tracked
+    virtual bool tracking(const unsigned int) const = 0 ;
+    // returns class version
+    virtual unsigned int version() const = 0 ;
+    // returns true if this class is polymorphic
+    virtual bool is_polymorphic() const = 0;
+    virtual void destroy(/*const*/ void *address) const = 0 ;
+};
+
+} // namespae detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_DETAIL_BASIC_ISERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oarchive.hpp
new file mode 100644 (file)
index 0000000..0a1b404
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef BOOST_ARCHIVE_BASIC_OARCHIVE_HPP
+#define BOOST_ARCHIVE_BASIC_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_oarchive.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <cstddef> // NULL
+#include <boost/type_traits/broken_compiler_spec.hpp>
+
+// can't use this - much as I'd like to as borland doesn't support it
+// #include <boost/scoped_ptr.hpp>
+
+#include <boost/archive/basic_archive.hpp>
+#include <boost/serialization/tracking_enum.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+namespace detail {
+
+class basic_oarchive_impl;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_oserializer;
+//////////////////////////////////////////////////////////////////////
+// class basic_oarchive - write serialized objects to an output stream
+class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive
+{
+    friend class basic_oarchive_impl;
+    // hide implementation of this class to minimize header conclusion
+    // in client code. note: borland can't use scoped_ptr
+    //boost::scoped_ptr<basic_oarchive_impl> pimpl;
+    basic_oarchive_impl * pimpl;
+
+    // overload these to bracket object attributes. Used to implement
+    // xml archives
+    virtual void vsave(const version_type t) =  0;
+    virtual void vsave(const object_id_type t) =  0;
+    virtual void vsave(const object_reference_type t) =  0;
+    virtual void vsave(const class_id_type t) =  0;
+    virtual void vsave(const class_id_optional_type t) = 0;
+    virtual void vsave(const class_id_reference_type t) =  0;
+    virtual void vsave(const class_name_type & t) = 0;
+    virtual void vsave(const tracking_type t) = 0;
+protected:
+    basic_oarchive(unsigned int flags = 0);
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_oarchive();
+public:
+    // note: NOT part of the public interface
+    void register_basic_serializer(
+        const basic_oserializer & bos
+    );
+    void save_object(
+        const void *x, 
+        const basic_oserializer & bos
+    );
+    void save_pointer(
+        const void * t, 
+        const basic_pointer_oserializer * bpos_ptr
+    );
+    void save_null_pointer(){
+        vsave(NULL_POINTER_TAG);
+    }
+    // real public interface starts here
+    void end_preamble(); // default implementation does nothing
+    unsigned int get_library_version() const;
+    unsigned int get_flags() const;
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+// required by smart_cast for compilers not implementing 
+// partial template specialization
+BOOST_TT_BROKEN_COMPILER_SPEC(
+    boost::archive::detail::basic_oarchive
+)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif //BOOST_ARCHIVE_BASIC_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_oserializer.hpp
new file mode 100644 (file)
index 0000000..69a06cb
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP
+#define BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_oserializer.hpp: extenstion of type_info required for serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // NULL
+#include <boost/config.hpp>
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/basic_serializer.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+// forward declarations
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_oserializer;
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer : 
+    public basic_serializer
+{
+private:
+    basic_pointer_oserializer *m_bpos;
+protected:
+    explicit basic_oserializer(
+        const boost::serialization::extended_type_info & type_
+    );
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_oserializer();
+public:
+    bool serialized_as_pointer() const {
+        return m_bpos != NULL;
+    }
+    void set_bpos(basic_pointer_oserializer *bpos){
+        m_bpos = bpos;
+    }
+    const basic_pointer_oserializer * get_bpos() const {
+        return m_bpos;
+    }
+    virtual void save_object_data(
+        basic_oarchive & ar, const void * x
+    ) const = 0;
+    // returns true if class_info should be saved
+    virtual bool class_info() const = 0;
+    // returns true if objects should be tracked
+    virtual bool tracking(const unsigned int flags) const = 0;
+    // returns class version
+    virtual unsigned int version() const = 0;
+    // returns true if this class is polymorphic
+    virtual bool is_polymorphic() const = 0;
+};
+
+} // namespace detail
+} // namespace serialization
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_BASIC_OSERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_iserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_iserializer.hpp
new file mode 100644 (file)
index 0000000..1a46938
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP
+#define BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_pointer_oserializer.hpp: extenstion of type_info required for 
+// serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <boost/config.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/basic_serializer.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+// forward declarations
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iserializer;
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_iserializer 
+    : public basic_serializer {
+protected:
+    explicit basic_pointer_iserializer(
+        const boost::serialization::extended_type_info & type_
+    );
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_pointer_iserializer();
+public:
+    virtual const basic_iserializer & get_basic_serializer() const = 0;
+    virtual void load_object_ptr(
+        basic_iarchive & ar, 
+        void * & x,
+        const unsigned int file_version
+    ) const = 0;
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_POINTER_ISERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_oserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_pointer_oserializer.hpp
new file mode 100644 (file)
index 0000000..9c8d717
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP
+#define BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_pointer_oserializer.hpp: extenstion of type_info required for 
+// serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <boost/config.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/basic_serializer.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer;
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_oserializer : 
+    public basic_serializer {
+protected:
+    explicit basic_pointer_oserializer(
+        const boost::serialization::extended_type_info & type_
+    );
+public:
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~basic_pointer_oserializer();
+    virtual const basic_oserializer & get_basic_serializer() const = 0;
+    virtual void save_object_ptr(
+        basic_oarchive & ar,
+        const void * x
+    ) const = 0;
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_BASIC_POINTER_OSERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer.hpp
new file mode 100644 (file)
index 0000000..b6beeea
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef  BOOST_ARCHIVE_BASIC_SERIALIZER_HPP
+#define BOOST_ARCHIVE_BASIC_SERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_serializer.hpp: extenstion of type_info required for serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // NULL
+
+#include <boost/noncopyable.hpp>
+#include <boost/config.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+class basic_serializer : 
+    private boost::noncopyable
+{
+    const boost::serialization::extended_type_info * m_eti;
+protected:
+    explicit basic_serializer(
+        const boost::serialization::extended_type_info & eti
+    ) : 
+        m_eti(& eti)
+    {
+        assert(NULL != & eti);
+    }
+public:
+    inline bool 
+    operator<(const basic_serializer & rhs) const {
+        // can't compare address since there can be multiple eti records
+        // for the same type in different execution modules (that is, DLLS)
+        // leave this here as a reminder not to do this!
+        // return & lhs.get_eti() < & rhs.get_eti();
+        return get_eti() < rhs.get_eti();
+    }
+    const char * get_debug_info() const {
+        return m_eti->get_debug_info();
+    }
+    const boost::serialization::extended_type_info & get_eti() const {
+        return * m_eti;
+    }
+};
+
+class basic_serializer_arg : public basic_serializer {
+public:
+    basic_serializer_arg(const serialization::extended_type_info & eti) :
+        basic_serializer(eti)
+    {}
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_BASIC_SERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/basic_serializer_map.hpp
new file mode 100644 (file)
index 0000000..d17c5c3
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef  BOOST_SERIALIZER_MAP_HPP
+#define BOOST_SERIALIZER_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_serializer_map.hpp: extenstion of type_info required for serialization.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <set>
+
+#include <boost/config.hpp>
+#include <boost/utility.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace serialization {
+    class extended_type_info;
+}
+
+namespace archive {
+namespace detail {
+
+class basic_serializer;
+
+class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_serializer_map : public
+    boost::noncopyable
+{
+    struct type_info_pointer_compare
+    {
+        bool operator()(
+            const basic_serializer * lhs, const basic_serializer * rhs
+        ) const ;
+    };
+    typedef std::set<const basic_serializer *, type_info_pointer_compare> map_type;
+    map_type m_map;
+public:
+    bool insert(const basic_serializer * bs);
+    void erase(const basic_serializer * bs);
+    const basic_serializer * find(
+        const boost::serialization::extended_type_info & type_
+    ) const;
+private:
+    // cw 8.3 requires this
+    basic_serializer_map& operator=(basic_serializer_map const&);
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // must be the last header
+
+#endif // BOOST_SERIALIZER_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/check.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/check.hpp
new file mode 100644 (file)
index 0000000..5a92e59
--- /dev/null
@@ -0,0 +1,169 @@
+#ifndef BOOST_ARCHIVE_DETAIL_CHECK_HPP
+#define BOOST_ARCHIVE_DETAIL_CHECK_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#pragma inline_depth(511)
+#pragma inline_recursion(on)
+#endif
+
+#if defined(__MWERKS__)
+#pragma inline_depth(511)
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// check.hpp: interface for serialization system.
+
+// (C) Copyright 2009 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_const.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/assert.hpp>
+
+#include <boost/serialization/static_warning.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/wrapper.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+// checks for objects
+
+template<class T>
+void inline check_object_level(){
+    typedef 
+        BOOST_DEDUCED_TYPENAME mpl::greater_equal<
+            serialization::implementation_level<T>,
+            mpl::int_<serialization::primitive_type>
+        >::type typex;
+
+    // trap attempts to serialize objects marked
+    // not_serializable
+    BOOST_STATIC_ASSERT(typex::value);
+};
+
+template<class T>
+void inline check_object_versioning(){
+    typedef 
+        BOOST_DEDUCED_TYPENAME mpl::or_<
+            BOOST_DEDUCED_TYPENAME mpl::greater<
+                serialization::implementation_level<T>,
+                mpl::int_<serialization::object_serializable>
+            >,
+            BOOST_DEDUCED_TYPENAME mpl::equal_to<
+                serialization::version<T>,
+                mpl::int_<0>
+            >
+        > typex;
+    // trap attempts to serialize with objects that don't
+    // save class information in the archive with versioning.
+    BOOST_STATIC_ASSERT(typex::value);
+};
+
+template<class T>
+void inline check_object_tracking(){
+    // presume it has already been determined that
+    // T is not a const
+    BOOST_STATIC_ASSERT(! boost::is_const<T>::value);
+    typedef BOOST_DEDUCED_TYPENAME mpl::equal_to<
+        serialization::tracking_level<T>,
+        mpl::int_<serialization::track_never>
+    >::type typex;
+    // saving an non-const object of a type not marked "track_never)
+
+    // may be an indicator of an error usage of the
+    // serialization library and should be double checked.  
+    // See documentation on object tracking.  Also, see the 
+    // "rationale" section of the documenation
+    // for motivation for this checking.
+
+    BOOST_STATIC_WARNING(typex::value);
+};
+
+// checks for pointers
+
+template<class T>
+void inline check_pointer_level(){
+    // we should only invoke this once we KNOW that T
+    // has been used as a pointer!!
+    typedef 
+        BOOST_DEDUCED_TYPENAME mpl::or_<
+            BOOST_DEDUCED_TYPENAME mpl::greater<
+                serialization::implementation_level<T>,
+                mpl::int_<serialization::object_serializable>
+            >,
+            BOOST_DEDUCED_TYPENAME mpl::not_<
+                BOOST_DEDUCED_TYPENAME mpl::equal_to<
+                    serialization::tracking_level<T>,
+                    mpl::int_<serialization::track_selectively>
+                >
+            >
+        > typex;
+    // Address the following when serializing to a pointer:
+
+    // a) This type doesn't save class information in the
+    // archive. That is, the serialization trait implementation
+    // level <= object_serializable.
+    // b) Tracking for this type is set to "track selectively"
+
+    // in this case, indication that an object is tracked is
+    // not stored in the archive itself - see level == object_serializable
+    // but rather the existence of the operation ar >> T * is used to 
+    // infer that an object of this type should be tracked.  So, if
+    // you save via a pointer but don't load via a pointer the operation
+    // will fail on load without given any valid reason for the failure.
+
+    // So if your program traps here, consider changing the 
+    // tracking or implementation level traits - or not
+    // serializing via a pointer.
+    BOOST_STATIC_WARNING(typex::value);
+}
+
+template<class T>
+void inline check_pointer_tracking(){
+    typedef BOOST_DEDUCED_TYPENAME mpl::greater<
+        serialization::tracking_level<T>,
+        mpl::int_<serialization::track_never>
+    >::type typex;
+    // serializing an object of a type marked "track_never" through a pointer
+    // could result in creating more objects than were saved!
+    BOOST_STATIC_WARNING(typex::value);
+};
+
+template<class T>
+void inline check_const_loading(){
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::or_<
+            BOOST_DEDUCED_TYPENAME boost::serialization::is_wrapper<T>,
+            BOOST_DEDUCED_TYPENAME mpl::not_<
+                BOOST_DEDUCED_TYPENAME boost::is_const<T>
+            >
+        >::type typex;
+    // cannot load data into a "const" object unless it's a
+    // wrapper around some other non-const object.
+    BOOST_STATIC_ASSERT(typex::value);
+};
+
+} // detail
+} // archive
+} // boost
+
+#endif // BOOST_ARCHIVE_DETAIL_CHECK_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_iarchive.hpp
new file mode 100644 (file)
index 0000000..2713c2f
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// common_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/archive/detail/basic_iarchive.hpp>
+#include <boost/archive/detail/basic_pointer_iserializer.hpp>
+#include <boost/archive/detail/interface_iarchive.hpp>
+#include <boost/archive/detail/archive_serializer_map.hpp>
+#include <boost/serialization/singleton.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+class extended_type_info;
+
+// note: referred to as Curiously Recurring Template Patter (CRTP)
+template<class Archive>
+class common_iarchive : 
+    public basic_iarchive,
+    public interface_iarchive<Archive>
+{
+    friend class interface_iarchive<Archive>;
+private:
+    virtual void vload(version_type & t){
+        * this->This() >> t; 
+    }
+    virtual void vload(object_id_type & t){
+        * this->This() >> t;
+    }
+    virtual void vload(class_id_type & t){
+        * this->This() >> t;
+    }
+    virtual void vload(class_id_optional_type & t){
+        * this->This() >> t;
+    }
+    virtual void vload(tracking_type & t){
+        * this->This() >> t;
+    }
+    virtual void vload(class_name_type &s){
+        * this->This() >> s;
+    }
+protected:
+    // default processing - invoke serialization library
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        archive::load(* this->This(), t);
+    }
+    // default implementations of functions which emit start/end tags for
+    // archive types that require them.
+    void load_start(const char * /*name*/){}
+    void load_end(const char * /*name*/){}
+    // default archive initialization
+    common_iarchive(unsigned int flags = 0) : 
+        basic_iarchive(flags),
+        interface_iarchive<Archive>()
+    {}
+public:
+    virtual const basic_pointer_iserializer * 
+    find(const boost::serialization::extended_type_info & eti) const {
+       return static_cast<const basic_pointer_iserializer *>(
+            archive_serializer_map<Archive>::find(eti)
+        );
+    }
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_DETAIL_COMMON_IARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/common_oarchive.hpp
new file mode 100644 (file)
index 0000000..db072c3
--- /dev/null
@@ -0,0 +1,76 @@
+#ifndef BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// common_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/archive/detail/basic_oarchive.hpp>
+#include <boost/archive/detail/interface_oarchive.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+// note: referred to as Curiously Recurring Template Patter (CRTP)
+template<class Archive>
+class common_oarchive : 
+    public basic_oarchive,
+    public interface_oarchive<Archive>
+{
+    friend class interface_oarchive<Archive>;
+private:
+    virtual void vsave(const version_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const object_id_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const object_reference_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const class_id_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const class_id_reference_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const class_id_optional_type t){
+        * this->This() << t;
+    }
+    virtual void vsave(const class_name_type & t){
+        * this->This() << t;
+    }
+    virtual void vsave(const tracking_type t){
+        * this->This() << t;
+    }
+protected:
+    // default processing - invoke serialization library
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int){
+        archive::save(* this->This(), t);
+    }
+    void save_start(const char * /*name*/){}
+    void save_end(const char * /*name*/){}
+    common_oarchive(unsigned int flags = 0) : 
+        basic_oarchive(flags),
+        interface_oarchive<Archive>()
+    {}
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_DETAIL_COMMON_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/decl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/decl.hpp
new file mode 100644 (file)
index 0000000..9695001
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef BOOST_ARCHIVE_DETAIL_DECL_HPP
+#define BOOST_ARCHIVE_DETAIL_DECL_HPP 
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif 
+
+/////////1/////////2///////// 3/////////4/////////5/////////6/////////7/////////8
+//  decl.hpp
+//
+//  (c) Copyright Robert Ramey 2004
+//  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)
+
+//  See library home page at http://www.boost.org/libs/serialization
+
+//----------------------------------------------------------------------------// 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+#include <boost/config.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+
+#if defined(BOOST_HAS_DECLSPEC)
+    #if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK))
+        #if defined(BOOST_ARCHIVE_SOURCE)
+            #if defined(__BORLANDC__)
+            #define BOOST_ARCHIVE_DECL(T) T __export
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T)  T __export
+            #else
+            #define BOOST_ARCHIVE_DECL(T) __declspec(dllexport) T
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T)  __declspec(dllexport) T
+            #endif
+        #else
+            #if defined(__BORLANDC__)
+            #define BOOST_ARCHIVE_DECL(T) T __import
+            #else
+            #define BOOST_ARCHIVE_DECL(T) __declspec(dllimport) T
+            #endif
+        #endif
+        #if defined(BOOST_WARCHIVE_SOURCE)
+            #if defined(__BORLANDC__)
+            #define BOOST_WARCHIVE_DECL(T) T __export
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T) T __export
+            #else
+            #define BOOST_WARCHIVE_DECL(T) __declspec(dllexport) T
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T) __declspec(dllexport) T
+            #endif
+        #else
+            #if defined(__BORLANDC__)
+            #define BOOST_WARCHIVE_DECL(T) T __import
+            #else
+            #define BOOST_WARCHIVE_DECL(T) __declspec(dllimport) T
+            #endif
+        #endif
+        #if !defined(BOOST_WARCHIVE_SOURCE) && !defined(BOOST_ARCHIVE_SOURCE)
+            #if defined(__BORLANDC__)
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T) T __import
+            #else
+            #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T) __declspec(dllimport) T
+            #endif
+        #endif
+    #endif
+#endif // BOOST_HAS_DECLSPEC
+
+#if ! defined(BOOST_ARCHIVE_DECL)
+    #define BOOST_ARCHIVE_DECL(T) T
+#endif
+#if ! defined(BOOST_WARCHIVE_DECL)
+    #define BOOST_WARCHIVE_DECL(T) T
+#endif
+#if ! defined(BOOST_ARCHIVE_OR_WARCHIVE_DECL)
+    #define BOOST_ARCHIVE_OR_WARCHIVE_DECL(T) T
+#endif
+
+#endif // BOOST_ARCHIVE_DETAIL_DECL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_iarchive.hpp
new file mode 100644 (file)
index 0000000..7fd363d
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// interface_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <cstddef> // NULL
+#include <boost/cstdint.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/iserializer.hpp>
+#include <boost/serialization/singleton.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_iserializer;
+
+template<class Archive>
+class interface_iarchive 
+{
+protected:
+    interface_iarchive(){};
+public:
+    /////////////////////////////////////////////////////////
+    // archive public interface
+    typedef mpl::bool_<true> is_loading;
+    typedef mpl::bool_<false> is_saving;
+
+    // return a pointer to the most derived class
+    Archive * This(){
+        return static_cast<Archive *>(this);
+    }
+
+    template<class T>
+    const basic_pointer_iserializer * 
+    register_type(T * = NULL){
+        const basic_pointer_iserializer & bpis =
+            boost::serialization::singleton<
+                pointer_iserializer<Archive, T> 
+            >::get_const_instance();
+        this->This()->register_basic_serializer(bpis.get_basic_serializer());
+        return & bpis;
+    }
+    template<class T>
+    Archive & operator>>(T & t){
+        this->This()->load_override(t, 0);
+        return * this->This();
+    }
+
+    // the & operator 
+    template<class T>
+    Archive & operator&(T & t){
+        return *(this->This()) >> t;
+    }
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/interface_oarchive.hpp
new file mode 100644 (file)
index 0000000..6331e0e
--- /dev/null
@@ -0,0 +1,85 @@
+#ifndef BOOST_ARCHIVE_DETAIL_INTERFACE_OARCHIVE_HPP
+#define BOOST_ARCHIVE_DETAIL_INTERFACE_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// interface_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <cstddef> // NULL
+#include <boost/cstdint.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/detail/oserializer.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+#include <boost/serialization/singleton.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+class BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_oserializer;
+
+template<class Archive>
+class interface_oarchive 
+{
+protected:
+    interface_oarchive(){};
+public:
+    /////////////////////////////////////////////////////////
+    // archive public interface
+    typedef mpl::bool_<false> is_loading;
+    typedef mpl::bool_<true> is_saving;
+
+    // return a pointer to the most derived class
+    Archive * This(){
+        return static_cast<Archive *>(this);
+    }
+
+    template<class T>
+    const basic_pointer_oserializer * 
+    register_type(const T * = NULL){
+        const basic_pointer_oserializer & bpos =
+            boost::serialization::singleton<
+                pointer_oserializer<Archive, T>
+            >::get_const_instance();
+        this->This()->register_basic_serializer(bpos.get_basic_serializer());
+        return & bpos;
+    }
+
+    template<class T>
+    Archive & operator<<(T & t){
+        this->This()->save_override(t, 0);
+        return * this->This();
+    }
+    
+    // the & operator 
+    template<class T>
+    Archive & operator&(T & t){
+        #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+            return * this->This() << const_cast<const T &>(t);
+        #else
+            return * this->This() << t;
+        #endif
+    }
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_DETAIL_INTERFACE_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/iserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/iserializer.hpp
new file mode 100644 (file)
index 0000000..f712e63
--- /dev/null
@@ -0,0 +1,594 @@
+#ifndef BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP
+#define BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#pragma inline_depth(511)
+#pragma inline_recursion(on)
+#endif
+
+#if defined(__MWERKS__)
+#pragma inline_depth(511)
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// iserializer.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <new>     // for placement new
+#include <memory>  // for auto_ptr
+#include <cstddef> // size_t, NULL
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/static_assert.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/greater_equal.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+
+#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO   
+    #include <boost/serialization/extended_type_info_typeid.hpp>   
+#endif
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/smart_cast.hpp>
+#include <boost/serialization/static_warning.hpp>
+
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_extent.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+
+#include <boost/serialization/assume_abstract.hpp>
+
+#define DONT_USE_HAS_NEW_OPERATOR (                    \
+    defined(__BORLANDC__)                              \
+    || defined(__IBMCPP__)                             \
+    || defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)     \
+    || defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590)   \
+)
+
+#if ! DONT_USE_HAS_NEW_OPERATOR
+#include <boost/type_traits/has_new_operator.hpp>
+#endif
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/void_cast.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/wrapper.hpp>
+
+// the following is need only for dynamic cast of polymorphic pointers
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/basic_iarchive.hpp>
+#include <boost/archive/detail/basic_iserializer.hpp>
+#include <boost/archive/detail/basic_pointer_iserializer.hpp>
+#include <boost/archive/detail/archive_serializer_map.hpp>
+#include <boost/archive/detail/check.hpp>
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+
+// an accessor to permit friend access to archives.  Needed because
+// some compilers don't handle friend templates completely
+class load_access {
+public:
+    template<class Archive, class T>
+    static void load_primitive(Archive &ar, T &t){
+        ar.load(t);
+    }
+};
+
+namespace detail {
+
+template<class Archive, class T>
+class iserializer : public basic_iserializer
+{
+private:
+    virtual void destroy(/*const*/ void *address) const {
+        boost::serialization::access::destroy(static_cast<T *>(address));
+    }
+protected:
+    // protected constructor since it's always created by singleton
+    explicit iserializer() :
+        basic_iserializer(
+            boost::serialization::singleton<
+                BOOST_DEDUCED_TYPENAME 
+                boost::serialization::type_info_implementation<T>::type
+            >::get_const_instance()
+        )
+    {}
+public:
+    virtual BOOST_DLLEXPORT void load_object_data(
+        basic_iarchive & ar,
+        void *x, 
+        const unsigned int file_version
+    ) const BOOST_USED;
+    virtual bool class_info() const {
+        return boost::serialization::implementation_level<T>::value 
+            >= boost::serialization::object_class_info;
+    }
+    virtual bool tracking(const unsigned int /* flags */) const {
+        return boost::serialization::tracking_level<T>::value 
+                == boost::serialization::track_always
+            || ( boost::serialization::tracking_level<T>::value 
+                == boost::serialization::track_selectively
+                && serialized_as_pointer());
+    }
+    virtual unsigned int version() const {
+        return ::boost::serialization::version<T>::value;
+    }
+    virtual bool is_polymorphic() const {
+        return boost::is_polymorphic<T>::value;
+    }
+    virtual ~iserializer(){};
+};
+
+template<class Archive, class T>
+BOOST_DLLEXPORT void iserializer<Archive, T>::load_object_data(
+    basic_iarchive & ar,
+    void *x, 
+    const unsigned int file_version
+) const {
+    // trap case where the program cannot handle the current version
+    if(file_version > version())
+        boost::serialization::throw_exception(
+            archive::archive_exception(
+                boost::archive::archive_exception::unsupported_class_version,
+                get_debug_info()
+            )
+        );
+
+    // make sure call is routed through the higest interface that might
+    // be specialized by the user.
+    boost::serialization::serialize_adl(
+        boost::serialization::smart_cast_reference<Archive &>(ar),
+        * static_cast<T *>(x), 
+        file_version
+    );
+}
+
+template<class Archive, class T>
+class pointer_iserializer :
+    public basic_pointer_iserializer
+{
+private:
+    virtual const basic_iserializer & get_basic_serializer() const {
+        return boost::serialization::singleton<
+            iserializer<Archive, T>
+        >::get_const_instance();
+    }
+    BOOST_DLLEXPORT virtual void load_object_ptr(
+        basic_iarchive & ar, 
+        void * & x,
+        const unsigned int file_version
+    ) const BOOST_USED;
+protected:
+    // this should alway be a singleton so make the constructor protected
+    pointer_iserializer();
+    ~pointer_iserializer();
+};
+
+// note trick to be sure that operator new is using class specific
+// version if such exists. Due to Peter Dimov.
+// note: the following fails if T has no default constructor.
+// otherwise it would have been ideal
+//struct heap_allocator : public T 
+//{
+//    T * invoke(){
+//        return ::new(sizeof(T));
+//    }
+//}
+
+template<class T>
+struct heap_allocator
+{
+    // boost::has_new_operator<T> doesn't work on these compilers
+    #if DONT_USE_HAS_NEW_OPERATOR
+        // This doesn't handle operator new overload for class T
+        static T * invoke(){
+            return static_cast<T *>(operator new(sizeof(T)));
+        }
+    #else
+        struct has_new_operator {
+            static T* invoke() {
+                return static_cast<T *>((T::operator new)(sizeof(T)));
+            }
+        };
+        struct doesnt_have_new_operator {
+            static T* invoke() {
+                return static_cast<T *>(operator new(sizeof(T)));
+            }
+        };
+        static T * invoke() {
+            typedef BOOST_DEDUCED_TYPENAME
+                mpl::eval_if<
+                    boost::has_new_operator<T>,
+                    mpl::identity<has_new_operator >,
+                    mpl::identity<doesnt_have_new_operator >    
+                >::type typex;
+            return typex::invoke();
+        }
+    #endif
+};
+
+// due to Martin Ecker
+template <typename T>
+class auto_ptr_with_deleter
+{
+public:
+    explicit auto_ptr_with_deleter(T* p) :
+        m_p(p)
+    {}
+    ~auto_ptr_with_deleter(){
+        if (m_p)
+            boost::serialization::access::destroy(m_p);
+    }
+    T* get() const {
+        return m_p;
+    }
+
+    T* release() {
+        T* p = m_p;
+        m_p = NULL;
+        return p;
+    }
+private:
+    T* m_p;
+};
+
+// note: BOOST_DLLEXPORT is so that code for polymorphic class
+// serialized only through base class won't get optimized out
+template<class Archive, class T>
+BOOST_DLLEXPORT void pointer_iserializer<Archive, T>::load_object_ptr(
+    basic_iarchive & ar, 
+    void * & x,
+    const unsigned int file_version
+) const
+{
+    Archive & ar_impl = 
+        boost::serialization::smart_cast_reference<Archive &>(ar);
+
+    auto_ptr_with_deleter<T> ap(heap_allocator<T>::invoke());
+    if(NULL == ap.get())
+        boost::serialization::throw_exception(std::bad_alloc()) ;
+
+    T * t = ap.get();
+    x = t;
+
+    // catch exception during load_construct_data so that we don't
+    // automatically delete the t which is most likely not fully
+    // constructed
+    BOOST_TRY {
+        // this addresses an obscure situtation that occurs when 
+        // load_constructor de-serializes something through a pointer.
+        ar.next_object_pointer(t);
+        boost::serialization::load_construct_data_adl<Archive, T>(
+            ar_impl,
+            t, 
+            file_version
+        );
+    }
+    BOOST_CATCH(...){
+        ap.release();
+        BOOST_RETHROW;
+    }
+    BOOST_CATCH_END
+
+    ar_impl >> boost::serialization::make_nvp(NULL, * t);
+    ap.release();
+}
+
+template<class Archive, class T>
+pointer_iserializer<Archive, T>::pointer_iserializer() :
+    basic_pointer_iserializer(
+        boost::serialization::singleton<
+            BOOST_DEDUCED_TYPENAME 
+            boost::serialization::type_info_implementation<T>::type
+        >::get_const_instance()
+    )
+{
+    boost::serialization::singleton<
+        iserializer<Archive, T>
+    >::get_mutable_instance().set_bpis(this);
+    archive_serializer_map<Archive>::insert(this);
+}
+
+template<class Archive, class T>
+pointer_iserializer<Archive, T>::~pointer_iserializer(){
+    archive_serializer_map<Archive>::erase(this);
+}
+
+template<class Archive>
+struct load_non_pointer_type {
+    // note this bounces the call right back to the archive
+    // with no runtime overhead
+    struct load_primitive {
+        template<class T>
+        static void invoke(Archive & ar, T & t){
+            load_access::load_primitive(ar, t);
+        }
+    };
+    // note this bounces the call right back to the archive
+    // with no runtime overhead
+    struct load_only {
+        template<class T>
+        static void invoke(Archive & ar, const T & t){
+            // short cut to user's serializer
+            // make sure call is routed through the higest interface that might
+            // be specialized by the user.
+            boost::serialization::serialize_adl(
+                ar, 
+                const_cast<T &>(t), 
+                boost::serialization::version<T>::value
+            );
+        }
+    };
+
+    // note this save class information including version
+    // and serialization level to the archive
+    struct load_standard {
+        template<class T>
+        static void invoke(Archive &ar, const T & t){
+            void * x = & const_cast<T &>(t);
+            ar.load_object(
+                x, 
+                boost::serialization::singleton<
+                    iserializer<Archive, T>
+                >::get_const_instance()
+            );
+        }
+    };
+
+    struct load_conditional {
+        template<class T>
+        static void invoke(Archive &ar, T &t){
+            //if(0 == (ar.get_flags() & no_tracking))
+                load_standard::invoke(ar, t);
+            //else
+            //    load_only::invoke(ar, t);
+        }
+    };
+
+    template<class T>
+    static void invoke(Archive & ar, T &t){
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                // if its primitive
+                mpl::equal_to<
+                    boost::serialization::implementation_level<T>,
+                    mpl::int_<boost::serialization::primitive_type>
+                >,
+                mpl::identity<load_primitive>,
+            // else
+            BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            // class info / version
+            mpl::greater_equal<
+                        boost::serialization::implementation_level<T>,
+                        mpl::int_<boost::serialization::object_class_info>
+                    >,
+            // do standard load
+            mpl::identity<load_standard>,
+        // else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            // no tracking
+                    mpl::equal_to<
+                        boost::serialization::tracking_level<T>,
+                        mpl::int_<boost::serialization::track_never>
+                >,
+                // do a fast load
+                mpl::identity<load_only>,
+            // else
+            // do a fast load only tracking is turned off
+            mpl::identity<load_conditional>
+        > > >::type typex;
+        check_object_versioning<T>();
+        check_object_level<T>();
+        typex::invoke(ar, t);
+    }
+};
+
+template<class Archive>
+struct load_pointer_type {
+    struct abstract
+    {
+        template<class T>
+        static const basic_pointer_iserializer * register_type(Archive & /* ar */){
+            // it has? to be polymorphic
+            BOOST_STATIC_ASSERT(boost::is_polymorphic<T>::value);
+            return static_cast<basic_pointer_iserializer *>(NULL);
+         }
+    };
+
+    struct non_abstract
+    {
+        template<class T>
+        static const basic_pointer_iserializer * register_type(Archive & ar){
+            return ar.register_type(static_cast<T *>(NULL));
+        }
+    };
+
+    template<class T>
+    static const basic_pointer_iserializer * register_type(Archive &ar, T & /*t*/){
+        // there should never be any need to load an abstract polymorphic 
+        // class pointer.  Inhibiting code generation for this
+        // permits abstract base classes to be used - note: exception
+        // virtual serialize functions used for plug-ins
+        typedef BOOST_DEDUCED_TYPENAME
+            mpl::eval_if<
+                boost::serialization::is_abstract<const T>,
+                boost::mpl::identity<abstract>,
+                boost::mpl::identity<non_abstract>  
+            >::type typex;
+        return typex::template register_type<T>(ar);
+    }
+
+    template<class T>
+    static T * pointer_tweak(
+        const boost::serialization::extended_type_info & eti,
+        void * t,
+        T &
+    ) {
+        // tweak the pointer back to the base class
+        return static_cast<T *>(
+            boost::serialization::void_upcast(
+                eti,
+                boost::serialization::singleton<
+                    BOOST_DEDUCED_TYPENAME 
+                    boost::serialization::type_info_implementation<T>::type
+                >::get_const_instance(),
+                t
+            )
+        );
+    }
+
+    template<class T>
+    static void load(Archive &ar, T & t){
+        check_pointer_level<T>();
+        check_pointer_tracking<T>();
+    }
+
+    template<class Tptr>
+    static void invoke(Archive & ar, Tptr & t){
+        load(ar, *t);
+        const basic_pointer_iserializer * bpis_ptr = register_type(ar, *t);
+        const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer(
+            * reinterpret_cast<void **>(&t),
+            bpis_ptr
+        );
+        // if the pointer isn't that of the base class
+        if(newbpis_ptr != bpis_ptr){
+            t = pointer_tweak(newbpis_ptr->get_eti(), t, *t);
+        }
+    }
+};
+
+template<class Archive>
+struct load_enum_type {
+    template<class T>
+    static void invoke(Archive &ar, T &t){
+        // convert integers to correct enum to load
+        int i;
+        ar >> boost::serialization::make_nvp(NULL, i);
+        t = static_cast<T>(i);
+    }
+};
+
+template<class Archive>
+struct load_array_type {
+    template<class T>
+    static void invoke(Archive &ar, T &t){
+        typedef BOOST_DEDUCED_TYPENAME remove_extent<T>::type value_type;
+        
+        // convert integers to correct enum to load
+        // determine number of elements in the array. Consider the
+        // fact that some machines will align elements on boundries
+        // other than characters.
+        std::size_t current_count = sizeof(t) / (
+            static_cast<char *>(static_cast<void *>(&t[1])) 
+            - static_cast<char *>(static_cast<void *>(&t[0]))
+        );
+        boost::serialization::collection_size_type count;
+        ar >> BOOST_SERIALIZATION_NVP(count);
+        if(static_cast<std::size_t>(count) > current_count)
+            boost::serialization::throw_exception(
+                archive::archive_exception(
+                    boost::archive::archive_exception::array_size_too_short
+                )
+            );
+        ar >> serialization::make_array(static_cast<value_type*>(&t[0]),count);
+    }
+};
+
+} // detail
+
+template<class Archive, class T>
+inline void load(Archive & ar, T &t){
+    // if this assertion trips. It means we're trying to load a
+    // const object with a compiler that doesn't have correct
+    // funtion template ordering.  On other compilers, this is
+    // handled below.
+    detail::check_const_loading<T>();
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_pointer<T>,
+            mpl::identity<detail::load_pointer_type<Archive> >
+        ,//else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_array<T>,
+            mpl::identity<detail::load_array_type<Archive> >
+        ,//else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_enum<T>,
+            mpl::identity<detail::load_enum_type<Archive> >
+        ,//else
+            mpl::identity<detail::load_non_pointer_type<Archive> >
+        >
+        >
+        >::type typex;
+    typex::invoke(ar, t);
+}
+
+#if 0
+
+// BORLAND
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+// borland has a couple of problems
+// a) if function is partially specialized - see below
+// const paramters are transformed to non-const ones
+// b) implementation of base_object can't be made to work
+// correctly which results in all base_object s being const.
+// So, strip off the const for borland.  This breaks the trap
+// for loading const objects - but I see no alternative
+template<class Archive, class T>
+inline void load(Archive &ar, const T & t){
+    load(ar, const_cast<T &>(t));
+}
+#endif
+
+// let wrappers through.
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template<class Archive, class T>
+inline void load_wrapper(Archive &ar, const T&t, mpl::true_){
+    boost::archive::load(ar, const_cast<T&>(t));
+}
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+template<class Archive, class T>
+inline void load(Archive &ar, const T&t){
+  load_wrapper(ar,t,serialization::is_wrapper<T>());
+}
+#endif 
+#endif
+
+#endif
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_DETAIL_ISERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/oserializer.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/oserializer.hpp
new file mode 100644 (file)
index 0000000..cc5159e
--- /dev/null
@@ -0,0 +1,513 @@
+#ifndef BOOST_ARCHIVE_OSERIALIZER_HPP
+#define BOOST_ARCHIVE_OSERIALIZER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#pragma inline_depth(511)
+#pragma inline_recursion(on)
+#endif
+
+#if defined(__MWERKS__)
+#pragma inline_depth(511)
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// oserializer.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/greater_equal.hpp>
+#include <boost/mpl/identity.hpp>
+
+#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO   
+    #include <boost/serialization/extended_type_info_typeid.hpp>   
+#endif
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/smart_cast.hpp>
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/static_warning.hpp>
+
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/type_traits/remove_extent.hpp>
+
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/void_cast.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/singleton.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/basic_oarchive.hpp>
+#include <boost/archive/detail/basic_oserializer.hpp>
+#include <boost/archive/detail/basic_pointer_oserializer.hpp>
+#include <boost/archive/detail/archive_serializer_map.hpp>
+#include <boost/archive/detail/check.hpp>
+
+namespace boost {
+
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+
+namespace archive {
+
+// an accessor to permit friend access to archives.  Needed because
+// some compilers don't handle friend templates completely
+class save_access {
+public:
+    template<class Archive>
+    static void end_preamble(Archive & ar){
+        ar.end_preamble();
+    }
+    template<class Archive, class T>
+    static void save_primitive(Archive & ar, const  T & t){
+        ar.end_preamble();
+        ar.save(t);
+    }
+};
+
+namespace detail {
+
+template<class Archive, class T>
+class oserializer : public basic_oserializer
+{
+private:
+    // private constructor to inhibit any existence other than the 
+    // static one
+public:
+    explicit BOOST_DLLEXPORT oserializer() :
+        basic_oserializer(
+            boost::serialization::singleton<
+                BOOST_DEDUCED_TYPENAME 
+                boost::serialization::type_info_implementation<T>::type
+            >::get_const_instance()
+        )
+    {}
+    virtual BOOST_DLLEXPORT void save_object_data(
+        basic_oarchive & ar,    
+        const void *x
+    ) const BOOST_USED;
+    virtual bool class_info() const {
+        return boost::serialization::implementation_level<T>::value 
+            >= boost::serialization::object_class_info;
+    }
+    virtual bool tracking(const unsigned int /* flags */) const {
+        return boost::serialization::tracking_level<T>::value == boost::serialization::track_always
+            || (boost::serialization::tracking_level<T>::value == boost::serialization::track_selectively
+                && serialized_as_pointer());
+    }
+    virtual unsigned int version() const {
+        return ::boost::serialization::version<T>::value;
+    }
+    virtual bool is_polymorphic() const {
+        return boost::is_polymorphic<T>::value;
+    }
+    virtual ~oserializer(){}
+};
+
+template<class Archive, class T>
+BOOST_DLLEXPORT void oserializer<Archive, T>::save_object_data(
+    basic_oarchive & ar,    
+    const void *x
+) const {
+    // make sure call is routed through the highest interface that might
+    // be specialized by the user.
+    BOOST_STATIC_ASSERT(boost::is_const<T>::value == false);
+    boost::serialization::serialize_adl(
+        boost::serialization::smart_cast_reference<Archive &>(ar),
+        * static_cast<T *>(const_cast<void *>(x)),
+        version()
+    );
+}
+
+template<class Archive, class T>
+class pointer_oserializer :
+    public basic_pointer_oserializer
+{
+private:
+    const basic_oserializer & 
+    get_basic_serializer() const {
+        return boost::serialization::singleton<
+            oserializer<Archive, T>
+        >::get_const_instance();
+    }
+    virtual BOOST_DLLEXPORT void save_object_ptr(
+        basic_oarchive & ar,
+        const void * x
+    ) const BOOST_USED;
+public:
+    pointer_oserializer();
+    ~pointer_oserializer();
+};
+
+template<class Archive, class T>
+BOOST_DLLEXPORT void pointer_oserializer<Archive, T>::save_object_ptr(
+    basic_oarchive & ar,
+    const void * x
+) const {
+    assert(NULL != x);
+    // make sure call is routed through the highest interface that might
+    // be specialized by the user.
+    T * t = static_cast<T *>(const_cast<void *>(x));
+    const unsigned int file_version = boost::serialization::version<T>::value;
+    Archive & ar_impl 
+        = boost::serialization::smart_cast_reference<Archive &>(ar);
+    boost::serialization::save_construct_data_adl<Archive, T>(
+        ar_impl, 
+        t, 
+        file_version
+    );
+    ar_impl << boost::serialization::make_nvp(NULL, * t);
+}
+
+template<class Archive, class T>
+pointer_oserializer<Archive, T>::pointer_oserializer() :
+    basic_pointer_oserializer(
+        boost::serialization::singleton<
+            BOOST_DEDUCED_TYPENAME 
+            boost::serialization::type_info_implementation<T>::type
+        >::get_const_instance()
+    )
+{
+    // make sure appropriate member function is instantiated
+    boost::serialization::singleton<
+        oserializer<Archive, T> 
+    >::get_mutable_instance().set_bpos(this);
+    archive_serializer_map<Archive>::insert(this);
+}
+
+template<class Archive, class T>
+pointer_oserializer<Archive, T>::~pointer_oserializer(){
+    archive_serializer_map<Archive>::erase(this);
+}
+
+template<class Archive>
+struct save_non_pointer_type {
+    // note this bounces the call right back to the archive
+    // with no runtime overhead
+    struct save_primitive {
+        template<class T>
+        static void invoke(Archive & ar, const T & t){
+            save_access::save_primitive(ar, t);
+        }
+    };
+    // same as above but passes through serialization
+    struct save_only {
+        template<class T>
+        static void invoke(Archive & ar, const T & t){
+            // make sure call is routed through the highest interface that might
+            // be specialized by the user.
+            boost::serialization::serialize_adl(
+                ar, 
+                const_cast<T &>(t), 
+                ::boost::serialization::version<T>::value
+            );
+        }
+    };
+    // adds class information to the archive. This includes
+    // serialization level and class version
+    struct save_standard {
+        template<class T>
+        static void invoke(Archive &ar, const T & t){
+            ar.save_object(
+                & t, 
+                boost::serialization::singleton<
+                    oserializer<Archive, T>
+                >::get_const_instance()
+            );
+        }
+    };
+
+    // adds class information to the archive. This includes
+    // serialization level and class version
+    struct save_conditional {
+        template<class T>
+        static void invoke(Archive &ar, const T &t){
+            //if(0 == (ar.get_flags() & no_tracking))
+                save_standard::invoke(ar, t);
+            //else
+            //   save_only::invoke(ar, t);
+        }
+    };
+
+
+    template<class T>
+    static void invoke(Archive & ar, const T & t){
+        typedef 
+            BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            // if its primitive
+                mpl::equal_to<
+                    boost::serialization::implementation_level<T>,
+                    mpl::int_<boost::serialization::primitive_type>
+                >,
+                mpl::identity<save_primitive>,
+            // else
+            BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                // class info / version
+                mpl::greater_equal<
+                    boost::serialization::implementation_level<T>,
+                    mpl::int_<boost::serialization::object_class_info>
+                >,
+                // do standard save
+                mpl::identity<save_standard>,
+            // else
+            BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                    // no tracking
+                mpl::equal_to<
+                    boost::serialization::tracking_level<T>,
+                    mpl::int_<boost::serialization::track_never>
+                >,
+                // do a fast save
+                mpl::identity<save_only>,
+            // else
+                // do a fast save only tracking is turned off
+                mpl::identity<save_conditional>
+            > > >::type typex; 
+        check_object_versioning<T>();
+        typex::invoke(ar, t);
+    };
+    template<class T>
+    static void invoke(Archive & ar, T & t){
+        check_object_level<T>();
+        check_object_tracking<T>();
+        invoke(ar, const_cast<const T &>(t));
+    };
+};
+
+template<class Archive>
+struct save_pointer_type {
+    struct abstract
+    {
+        template<class T>
+        static const basic_pointer_oserializer * register_type(Archive & /* ar */){
+            // it has? to be polymorphic
+            BOOST_STATIC_ASSERT(boost::is_polymorphic<T>::value);
+            return NULL;
+        }
+    };
+
+    struct non_abstract
+    {
+        template<class T>
+        static const basic_pointer_oserializer * register_type(Archive & ar){
+            return ar.register_type(static_cast<T *>(NULL));
+        }
+    };
+
+    template<class T>
+    static const basic_pointer_oserializer * register_type(Archive &ar, T & /*t*/){
+        // there should never be any need to save an abstract polymorphic 
+        // class pointer.  Inhibiting code generation for this
+        // permits abstract base classes to be used - note: exception
+        // virtual serialize functions used for plug-ins
+        typedef 
+            BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                boost::serialization::is_abstract<T>,
+                mpl::identity<abstract>,
+                mpl::identity<non_abstract>       
+            >::type typex;
+        return typex::template register_type<T>(ar);
+    }
+
+    struct non_polymorphic
+    {
+        template<class T>
+        static void save(
+            Archive &ar, 
+            T & t
+        ){
+            const basic_pointer_oserializer & bpos = 
+                boost::serialization::singleton<
+                    pointer_oserializer<Archive, T>
+                >::get_const_instance();
+            // save the requested pointer type
+            ar.save_pointer(& t, & bpos);
+        }
+    };
+
+    struct polymorphic
+    {
+        template<class T>
+        static void save(
+            Archive &ar, 
+            T & t
+        ){
+            BOOST_DEDUCED_TYPENAME 
+            boost::serialization::type_info_implementation<T>::type const
+            & i = boost::serialization::singleton<
+                BOOST_DEDUCED_TYPENAME 
+                boost::serialization::type_info_implementation<T>::type
+            >::get_const_instance();
+
+            boost::serialization::extended_type_info const * const this_type = & i;
+
+            // retrieve the true type of the object pointed to
+            // if this assertion fails its an error in this library
+            assert(NULL != this_type);
+
+            const boost::serialization::extended_type_info * true_type =
+                i.get_derived_extended_type_info(t);
+
+            // note:if this exception is thrown, be sure that derived pointer
+            // is either registered or exported.
+            if(NULL == true_type){
+                boost::serialization::throw_exception(
+                    archive_exception(
+                        archive_exception::unregistered_class,
+                        true_type->get_debug_info()
+                    )
+                );
+            }
+
+            // if its not a pointer to a more derived type
+            const void *vp = static_cast<const void *>(&t);
+            if(*this_type == *true_type){
+                const basic_pointer_oserializer * bpos = register_type(ar, t);
+                ar.save_pointer(vp, bpos);
+                return;
+            }
+            // convert pointer to more derived type. if this is thrown
+            // it means that the base/derived relationship hasn't be registered
+            vp = serialization::void_downcast(
+                *true_type, 
+                *this_type, 
+                static_cast<const void *>(&t)
+            );
+            if(NULL == vp){
+                boost::serialization::throw_exception(
+                    archive_exception(
+                        archive_exception::unregistered_cast,
+                        true_type->get_debug_info(),
+                        this_type->get_debug_info()
+                    )
+                );
+            }
+
+            // since true_type is valid, and this only gets made if the 
+            // pointer oserializer object has been created, this should never
+            // fail
+            const basic_pointer_oserializer * bpos
+                = static_cast<const basic_pointer_oserializer *>(
+                    boost::serialization::singleton<
+                        archive_serializer_map<Archive>
+                    >::get_const_instance().find(*true_type)
+                );
+            assert(NULL != bpos);
+            if(NULL == bpos)
+                boost::serialization::throw_exception(
+                    archive_exception(
+                        archive_exception::unregistered_class,
+                        bpos->get_debug_info()
+                    )
+                );
+            ar.save_pointer(vp, bpos);
+        }
+    };
+
+    template<class T>
+    static void save(
+        Archive & ar, 
+        const T & t
+    ){
+        check_pointer_level<T>();
+        check_pointer_tracking<T>();
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_polymorphic<T>,
+            mpl::identity<polymorphic>,
+            mpl::identity<non_polymorphic>
+        >::type type;
+        type::save(ar, const_cast<T &>(t));
+    }
+
+    template<class TPtr>
+    static void invoke(Archive &ar, const TPtr t){
+        register_type(ar, * t);
+        if(NULL == t){
+            basic_oarchive & boa 
+                = boost::serialization::smart_cast_reference<basic_oarchive &>(ar);
+            boa.save_null_pointer();
+            save_access::end_preamble(ar);
+            return;
+        }
+        save(ar, * t);
+    };
+};
+
+template<class Archive>
+struct save_enum_type
+{
+    template<class T>
+    static void invoke(Archive &ar, const T &t){
+        // convert enum to integers on save
+        const int i = static_cast<int>(t);
+        ar << boost::serialization::make_nvp(NULL, i);
+    }
+};
+
+template<class Archive>
+struct save_array_type
+{
+    template<class T>
+    static void invoke(Archive &ar, const T &t){
+        typedef BOOST_DEDUCED_TYPENAME boost::remove_extent<T>::type value_type;
+        
+        save_access::end_preamble(ar);
+        // consider alignment
+        std::size_t c = sizeof(t) / (
+            static_cast<const char *>(static_cast<const void *>(&t[1])) 
+            - static_cast<const char *>(static_cast<const void *>(&t[0]))
+        );
+        boost::serialization::collection_size_type count(c);
+        ar << BOOST_SERIALIZATION_NVP(count);
+        ar << serialization::make_array(static_cast<value_type const*>(&t[0]),count);
+    }
+};
+
+} // detail
+
+template<class Archive, class T>
+inline void save(Archive & ar, /*const*/ T &t){
+    typedef 
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_pointer<T>,
+            mpl::identity<detail::save_pointer_type<Archive> >,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_enum<T>,
+            mpl::identity<detail::save_enum_type<Archive> >,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<is_array<T>,
+            mpl::identity<detail::save_array_type<Archive> >,
+        //else
+            mpl::identity<detail::save_non_pointer_type<Archive> >
+        >
+        >
+        >::type typex;
+    typex::invoke(ar, t);
+}
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_OSERIALIZER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_iarchive_route.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_iarchive_route.hpp
new file mode 100644 (file)
index 0000000..e8f6240
--- /dev/null
@@ -0,0 +1,193 @@
+#ifndef BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_ROUTE_HPP
+#define BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_ROUTE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_iarchive_route.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <string>
+#include <ostream>
+#include <cstddef>
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+    using ::size_t;
+} // namespace std
+#endif
+
+#include <boost/noncopyable.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/archive/polymorphic_iarchive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+namespace archive {
+namespace detail{
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iserializer;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_iserializer;
+
+template<class ArchiveImplementation>
+class polymorphic_iarchive_route :
+    public polymorphic_iarchive,
+    // note: gcc dynamic cross cast fails if the the derivation below is
+    // not public.  I think this is a mistake.
+    public /*protected*/ ArchiveImplementation,
+    private boost::noncopyable
+{
+private:
+    // these are used by the serialization library.
+    virtual void load_object(
+        void *t,
+        const basic_iserializer & bis
+    ){
+        ArchiveImplementation::load_object(t, bis);
+    }
+    virtual const basic_pointer_iserializer * load_pointer(
+        void * & t,
+        const basic_pointer_iserializer * bpis_ptr
+    ){
+        return ArchiveImplementation::load_pointer(t, bpis_ptr);
+    }
+    virtual void set_library_version(unsigned int archive_library_version){
+        ArchiveImplementation::set_library_version(archive_library_version);
+    }
+    virtual unsigned int get_library_version() const{
+        return ArchiveImplementation::get_library_version();
+    }
+    virtual unsigned int get_flags() const {
+        return ArchiveImplementation::get_flags();
+    }
+    virtual void delete_created_pointers(){
+        ArchiveImplementation::delete_created_pointers();
+    }
+    virtual void reset_object_address(
+        const void * new_address,
+        const void * old_address
+    ){
+        ArchiveImplementation::reset_object_address(new_address, old_address);
+    }
+    virtual void load_binary(void * t, std::size_t size){
+        ArchiveImplementation::load_binary(t, size);
+    }
+    // primitive types the only ones permitted by polymorphic archives
+    virtual void load(bool & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(char & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(signed char & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(unsigned char & t){
+        ArchiveImplementation::load(t);
+    }
+    #ifndef BOOST_NO_CWCHAR
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    virtual void load(wchar_t & t){
+        ArchiveImplementation::load(t);
+    }
+    #endif
+    #endif
+    virtual void load(short & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(unsigned short & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(int & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(unsigned int & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(long & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(unsigned long & t){
+        ArchiveImplementation::load(t);
+    }
+    #if !defined(BOOST_NO_INTRINSIC_INT64_T)
+    virtual void load(boost::int64_t & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(boost::uint64_t & t){
+        ArchiveImplementation::load(t);
+    }
+    #endif
+    virtual void load(float & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(double & t){
+        ArchiveImplementation::load(t);
+    }
+    virtual void load(std::string & t){
+        ArchiveImplementation::load(t);
+    }
+    #ifndef BOOST_NO_STD_WSTRING
+    virtual void load(std::wstring & t){
+        ArchiveImplementation::load(t);
+    }
+    #endif
+    // used for xml and other tagged formats default does nothing
+    virtual void load_start(const char * name){
+        ArchiveImplementation::load_start(name);
+    }
+    virtual void load_end(const char * name){
+        ArchiveImplementation::load_end(name);
+    }
+
+    virtual void register_basic_serializer(const basic_iserializer & bis){
+        ArchiveImplementation::register_basic_serializer(bis);
+    }
+public:
+    // this can't be inheriteded because they appear in mulitple
+    // parents
+    typedef mpl::bool_<true> is_loading;
+    typedef mpl::bool_<false> is_saving;
+    // the >> operator
+    template<class T>
+    polymorphic_iarchive & operator>>(T & t){
+        return polymorphic_iarchive::operator>>(t);
+    }
+
+    // the & operator
+    template<class T>
+    polymorphic_iarchive & operator&(T & t){
+        return polymorphic_iarchive::operator&(t);
+    }
+
+    // all current archives take a stream as constructor argument
+    template <class _Elem, class _Tr>
+    polymorphic_iarchive_route(
+        std::basic_istream<_Elem, _Tr> & is,
+        unsigned int flags = 0
+    ) :
+        ArchiveImplementation(is, flags)
+    {}
+    virtual ~polymorphic_iarchive_route(){};
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_DETAIL_POLYMORPHIC_IARCHIVE_DISPATCH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_oarchive_route.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/polymorphic_oarchive_route.hpp
new file mode 100644 (file)
index 0000000..e043bb5
--- /dev/null
@@ -0,0 +1,184 @@
+#ifndef BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_ROUTE_HPP
+#define BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_ROUTE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_oarchive_route.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <string>
+#include <ostream>
+#include <boost/noncopyable.hpp>
+#include <boost/cstdint.hpp>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+    using ::size_t;
+} // namespace std
+#endif
+
+#include <boost/archive/polymorphic_oarchive.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+namespace archive {
+namespace detail{
+
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer;
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_pointer_oserializer;
+
+template<class ArchiveImplementation>
+class polymorphic_oarchive_route :
+    public polymorphic_oarchive,
+    // note: gcc dynamic cross cast fails if the the derivation below is
+    // not public.  I think this is a mistake.
+    public /*protected*/ ArchiveImplementation,
+    private boost::noncopyable
+{
+private:
+    // these are used by the serialization library.
+    virtual void save_object(
+        const void *x,
+        const detail::basic_oserializer & bos
+    ){
+        ArchiveImplementation::save_object(x, bos);
+    }
+    virtual void save_pointer(
+        const void * t,
+        const detail::basic_pointer_oserializer * bpos_ptr
+    ){
+        ArchiveImplementation::save_pointer(t, bpos_ptr);
+    }
+    virtual void save_null_pointer(){
+        ArchiveImplementation::save_null_pointer();
+    }
+    // primitive types the only ones permitted by polymorphic archives
+    virtual void save(const bool t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const char t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const signed char t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const unsigned char t){
+        ArchiveImplementation::save(t);
+    }
+    #ifndef BOOST_NO_CWCHAR
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    virtual void save(const wchar_t t){
+        ArchiveImplementation::save(t);
+    }
+    #endif
+    #endif
+    virtual void save(const short t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const unsigned short t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const int t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const unsigned int t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const long t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const unsigned long t){
+        ArchiveImplementation::save(t);
+    }
+    #if !defined(BOOST_NO_INTRINSIC_INT64_T)
+    virtual void save(const boost::int64_t t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const boost::uint64_t t){
+        ArchiveImplementation::save(t);
+    }
+    #endif
+    virtual void save(const float t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const double t){
+        ArchiveImplementation::save(t);
+    }
+    virtual void save(const std::string & t){
+        ArchiveImplementation::save(t);
+    }
+    #ifndef BOOST_NO_STD_WSTRING
+    virtual void save(const std::wstring & t){
+        ArchiveImplementation::save(t);
+    }
+    #endif
+    virtual unsigned int get_library_version() const{
+        return ArchiveImplementation::get_library_version();
+    }
+    virtual unsigned int get_flags() const {
+        return ArchiveImplementation::get_flags();
+    }
+    virtual void save_binary(const void * t, std::size_t size){
+        ArchiveImplementation::save_binary(t, size);
+    }
+    // used for xml and other tagged formats default does nothing
+    virtual void save_start(const char * name){
+        ArchiveImplementation::save_start(name);
+    }
+    virtual void save_end(const char * name){
+        ArchiveImplementation::save_end(name);
+    }
+    virtual void end_preamble(){
+        ArchiveImplementation::end_preamble();
+    }
+    virtual void register_basic_serializer(const detail::basic_oserializer & bos){
+        ArchiveImplementation::register_basic_serializer(bos);
+    }
+public:
+    // this can't be inheriteded because they appear in mulitple
+    // parents
+    typedef mpl::bool_<false> is_loading;
+    typedef mpl::bool_<true> is_saving;
+    // the << operator
+    template<class T>
+    polymorphic_oarchive & operator<<(T & t){
+        return polymorphic_oarchive::operator<<(t);
+    }
+    // the & operator
+    template<class T>
+    polymorphic_oarchive & operator&(T & t){
+        return polymorphic_oarchive::operator&(t);
+    }
+    // all current archives take a stream as constructor argument
+    template <class _Elem, class _Tr>
+    polymorphic_oarchive_route(
+        std::basic_ostream<_Elem, _Tr> & os,
+        unsigned int flags = 0
+    ) :
+        ArchiveImplementation(os, flags)
+    {}
+    virtual ~polymorphic_oarchive_route(){};
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_DETAIL_POLYMORPHIC_OARCHIVE_DISPATCH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/register_archive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/register_archive.hpp
new file mode 100644 (file)
index 0000000..87fedcb
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright David Abrahams 2006. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP
+# define BOOST_ARCHIVE_DETAIL_REGISTER_ARCHIVE_DWA2006521_HPP
+
+namespace boost { namespace archive { namespace detail { 
+
+// No instantiate_ptr_serialization overloads generated by
+// BOOST_SERIALIZATION_REGISTER_ARCHIVE that lexically follow the call
+// will be seen *unless* they are in an associated namespace of one of
+// the arguments, so we pass one of these along to make sure this
+// namespace is considered.  See temp.dep.candidate (14.6.4.2) in the
+// standard.
+struct adl_tag {};
+
+template <class Archive, class Serializable>
+struct ptr_serialization_support;
+
+// We could've just used ptr_serialization_support, above, but using
+// it with only a forward declaration causes vc6/7 to complain about a
+// missing instantiate member, even if it has one.  This is just a
+// friendly layer of indirection.
+template <class Archive, class Serializable>
+struct _ptr_serialization_support
+  : ptr_serialization_support<Archive,Serializable>
+{
+    typedef int type;
+};
+
+#ifdef __SUNPRO_CC
+
+template<int N>
+struct counter : counter<N-1> {};
+template<>
+struct counter<0> {};
+
+template<class Serializable>
+void instantiate_ptr_serialization(Serializable* s, int, adl_tag) {
+    instantiate_ptr_serialization(s, counter<20>());
+}
+
+template<class Archive>
+struct get_counter {
+    static const int value = sizeof(adjust_counter(counter<20>()));
+    typedef counter<value> type;
+    typedef counter<value - 1> prior;
+    typedef char (&next)[value+1];
+};
+
+char adjust_counter(counter<0>);
+template<class Serializable>
+void instantiate_ptr_serialization(Serializable*, counter<0>) {}
+
+#define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                     \
+namespace boost { namespace archive { namespace detail {                  \
+    get_counter<Archive>::next adjust_counter(get_counter<Archive>::type);\
+    template<class Serializable>                                          \
+    void instantiate_ptr_serialization(Serializable* s,                   \
+        get_counter<Archive>::type) {                                     \
+        ptr_serialization_support<Archive, Serializable> x;               \
+        instantiate_ptr_serialization(s, get_counter<Archive>::prior());  \
+    }\
+}}}
+
+
+#else
+
+// This function gets called, but its only purpose is to participate
+// in overload resolution with the functions declared by
+// BOOST_SERIALIZATION_REGISTER_ARCHIVE, below.
+template <class Serializable>
+void instantiate_ptr_serialization(Serializable*, int, adl_tag ) {}
+
+// The function declaration generated by this macro never actually
+// gets called, but its return type gets instantiated, and that's
+// enough to cause registration of serialization functions between
+// Archive and any exported Serializable type.  See also:
+// boost/serialization/export.hpp
+# define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)                  \
+namespace boost { namespace archive { namespace detail {                \
+                                                                        \
+template <class Serializable>                                           \
+BOOST_DEDUCED_TYPENAME _ptr_serialization_support<Archive, Serializable>::type  \
+instantiate_ptr_serialization( Serializable*, Archive*, adl_tag );              \
+                                                                        \
+}}}
+#endif
+}}} // namespace boost::archive::detail
+
+#endif // BOOST_ARCHIVE_DETAIL_INSTANTIATE_SERIALIZE_DWA2006521_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/utf8_codecvt_facet.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/detail/utf8_codecvt_facet.hpp
new file mode 100644 (file)
index 0000000..bd859ff
--- /dev/null
@@ -0,0 +1,21 @@
+// Copyright (c) 2001 Ronald Garcia, Indiana University (garcia@osl.iu.edu)
+// Andrew Lumsdaine, Indiana University (lums@osl.iu.edu).
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP
+#define BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP
+
+#define BOOST_UTF8_BEGIN_NAMESPACE \
+     namespace boost { namespace archive { namespace detail {
+#define BOOST_UTF8_DECL
+#define BOOST_UTF8_END_NAMESPACE }}}
+
+#include <boost/detail/utf8_codecvt_facet.hpp>
+
+#undef BOOST_UTF8_END_NAMESPACE
+#undef BOOST_UTF8_DECL
+#undef BOOST_UTF8_BEGIN_NAMESPACE
+
+#endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/dinkumware.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/dinkumware.hpp
new file mode 100644 (file)
index 0000000..bfa828d
--- /dev/null
@@ -0,0 +1,224 @@
+#ifndef BOOST_ARCHIVE_DINKUMWARE_HPP
+#define BOOST_ARCHIVE_DINKUMWARE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// dinkumware.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// this file adds a couple of things that are missing from the dinkumware
+// implementation of the standard library.
+
+#include <iterator>
+#include <string>
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+namespace std {
+
+// define i/o operators for 64 bit integers
+template<class CharType>
+basic_ostream<CharType> & 
+operator<<(basic_ostream<CharType> & os, boost::uint64_t t){
+    // octal rendering of 64 bit number would be 22 octets + eos
+    CharType d[23];
+    unsigned int radix;
+
+    if(os.flags() & (int)std::ios_base::hex)
+        radix = 16;
+    else
+    if(os.flags() & (int)std::ios_base::oct)
+        radix = 8;
+    else
+    //if(s.flags() & (int)std::ios_base::dec)
+        radix =  10;
+    unsigned int i = 0;
+    do{
+        unsigned int j = t % radix;
+        d[i++] = j + ((j < 10) ? '0' : ('a' - 10));
+        t /= radix;
+    }
+    while(t > 0);
+    d[i--] = '\0';
+
+    // reverse digits
+    unsigned int j = 0;
+    while(j < i){
+        CharType k = d[i];
+        d[i] = d[j];
+        d[j] = k;
+        --i;++j;
+    }
+    os << d;
+    return os;
+
+}
+
+template<class CharType>
+basic_ostream<CharType> & 
+operator<<(basic_ostream<CharType> &os, boost::int64_t t){
+    if(0 <= t){
+        os << static_cast<boost::uint64_t>(t);
+    }
+    else{
+        os.put('-');
+        os << -t;
+    }
+    return os;
+}
+
+template<class CharType>
+basic_istream<CharType> & 
+operator>>(basic_istream<CharType> &is, boost::int64_t & t){
+    CharType d;
+    do{
+        d = is.get();
+    }
+    while(::isspace(d));
+    bool negative = (d == '-');
+    if(negative)
+        d = is.get();
+    unsigned int radix;
+    if(is.flags() & (int)std::ios_base::hex)
+        radix = 16;
+    else
+    if(is.flags() & (int)std::ios_base::oct)
+        radix = 8;
+    else
+    //if(s.flags() & (int)std::ios_base::dec)
+        radix =  10;
+    t = 0;
+    do{
+        if('0' <= d && d <= '9')
+            t = t * radix + (d - '0');
+        else
+        if('a' <= d && d <= 'f')
+            t = t * radix + (d - 'a' + 10);
+        else
+            break;
+        d = is.get();
+    }
+    while(!is.fail());
+    // restore the delimiter
+    is.putback(d);
+    is.clear();
+    if(negative)
+        t = -t;
+    return is;
+}
+
+template<class CharType>
+basic_istream<CharType> & 
+operator>>(basic_istream<CharType> &is, boost::uint64_t & t){
+    boost::int64_t it;
+    is >> it;
+    t = it;
+    return is;
+}
+
+//#endif
+
+template<>
+class back_insert_iterator<basic_string<char> > : public 
+    iterator<output_iterator_tag, char>
+{
+public:
+    typedef basic_string<char> container_type;
+    typedef container_type::reference reference;
+
+    explicit back_insert_iterator(container_type & s)
+        : container(& s)
+    {}    // construct with container
+    
+    back_insert_iterator<container_type> & operator=(
+        container_type::const_reference Val_
+    ){    // push value into container
+        //container->push_back(Val_);
+        *container += Val_;
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> & operator*(){
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> & operator++(){
+        // pretend to preincrement
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> operator++(int){
+        // pretend to postincrement
+        return (*this);
+    }
+
+protected:
+    container_type *container;    // pointer to container
+};
+
+template<char> 
+inline back_insert_iterator<basic_string<char> > back_inserter(
+    basic_string<char> & s
+){
+    return (std::back_insert_iterator<basic_string<char> >(s));
+}
+
+template<>
+class back_insert_iterator<basic_string<wchar_t> > : public 
+    iterator<output_iterator_tag, wchar_t>
+{
+public:
+    typedef basic_string<wchar_t> container_type;
+    typedef container_type::reference reference;
+
+    explicit back_insert_iterator(container_type & s)
+        : container(& s)
+    {}    // construct with container
+    
+    back_insert_iterator<container_type> & operator=(
+        container_type::const_reference Val_
+    ){    // push value into container
+        //container->push_back(Val_);
+        *container += Val_;
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> & operator*(){
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> & operator++(){
+        // pretend to preincrement
+        return (*this);
+    }
+
+    back_insert_iterator<container_type> operator++(int){
+        // pretend to postincrement
+        return (*this);
+    }
+
+protected:
+    container_type *container;    // pointer to container
+};
+
+template<wchar_t> 
+inline back_insert_iterator<basic_string<wchar_t> > back_inserter(
+    basic_string<wchar_t> & s
+){
+    return (std::back_insert_iterator<basic_string<wchar_t> >(s));
+}
+
+} // namespace std
+
+#endif //BOOST_ARCHIVE_DINKUMWARE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/archive_serializer_map.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/archive_serializer_map.ipp
new file mode 100644 (file)
index 0000000..ec580b5
--- /dev/null
@@ -0,0 +1,62 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// archive_serializer_map.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+//////////////////////////////////////////////////////////////////////
+// implementation of basic_text_iprimitive overrides for the combination
+// of template parameters used to implement a text_iprimitive
+
+#include <boost/config.hpp>
+#include <boost/archive/detail/archive_serializer_map.hpp>
+#include <boost/archive/detail/basic_serializer_map.hpp>
+#include <boost/serialization/singleton.hpp>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+namespace { // anon
+    template<class Archive>
+    class map : public basic_serializer_map 
+    {};
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(bool)
+archive_serializer_map<Archive>::insert(const basic_serializer * bs){
+    return boost::serialization::singleton<
+        map<Archive>
+    >::get_mutable_instance().insert(bs);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+archive_serializer_map<Archive>::erase(const basic_serializer * bs){
+    if(boost::serialization::singleton<
+        map<Archive>
+    >::is_destroyed())
+        return;
+    boost::serialization::singleton<
+        map<Archive>
+    >::get_mutable_instance().erase(bs);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(const basic_serializer *) 
+archive_serializer_map<Archive>::find(
+    const boost::serialization::extended_type_info & eti
+) {
+    return boost::serialization::singleton<
+        map<Archive>
+    >::get_const_instance().find(eti);
+}
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iarchive.ipp
new file mode 100644 (file)
index 0000000..230fb92
--- /dev/null
@@ -0,0 +1,79 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_iarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <cassert>
+#include <algorithm>
+#include <cstring>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+}
+#endif
+
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/basic_binary_iarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation of binary_binary_archive
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iarchive<Archive>::load_override(class_name_type & t, int){
+    std::string cn;
+    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
+    load_override(cn, 0);
+    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_class_name)
+        );
+    std::memcpy(t, cn.data(), cn.size());
+    // borland tweak
+    t.t[cn.size()] = '\0';
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iarchive<Archive>::init(){
+    // read signature in an archive version independent manner
+    std::string file_signature;
+    * this->This() >> file_signature;
+    if(file_signature != BOOST_ARCHIVE_SIGNATURE())
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_signature)
+        );
+
+    // make sure the version of the reading archive library can
+    // support the format of the archive being read
+    version_type input_library_version;
+    * this->This() >> input_library_version;
+    
+    #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+    this->set_library_version(input_library_version);
+    #else
+    #if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+    detail::
+    #endif
+    basic_iarchive::set_library_version(input_library_version);
+    #endif
+    
+    // extra little .t is to get around borland quirk
+    if(BOOST_ARCHIVE_VERSION() < input_library_version.t)
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::unsupported_version)
+        );
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iprimitive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_iprimitive.ipp
new file mode 100644 (file)
index 0000000..f609571
--- /dev/null
@@ -0,0 +1,209 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_iprimitive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // size_t, NULL
+#include <cstring> // memcpy
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t;
+    using ::memcpy;
+} // namespace std
+#endif
+
+#include <boost/detail/workaround.hpp> // fixup for RogueWave
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/codecvt_null.hpp>
+#include <boost/archive/add_facet.hpp>
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of basic_binary_iprimitive
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iprimitive<Archive, Elem, Tr>::init()
+{
+    // Detect  attempts to pass native binary archives across
+    // incompatible platforms. This is not fool proof but its
+    // better than nothing.
+    unsigned char size;
+    this->This()->load(size);
+    if(sizeof(int) != size)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::incompatible_native_format,
+                "size of int"
+            )
+        );
+    this->This()->load(size);
+    if(sizeof(long) != size)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::incompatible_native_format,
+                "size of long"
+            )
+        );
+    this->This()->load(size);
+    if(sizeof(float) != size)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::incompatible_native_format,
+                "size of float"
+            )
+        );
+    this->This()->load(size);
+    if(sizeof(double) != size)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::incompatible_native_format,
+                "size of double"
+            )
+        );
+
+    // for checking endian
+    int i;
+    this->This()->load(i);
+    if(1 != i)
+        boost::serialization::throw_exception(
+            archive_exception(
+                archive_exception::incompatible_native_format,
+                "endian setting"
+            )
+        );
+}
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iprimitive<Archive, Elem, Tr>::load(wchar_t * ws)
+{
+    std::size_t l; // number of wchar_t !!!
+    this->This()->load(l);
+    load_binary(ws, l * sizeof(wchar_t) / sizeof(char));
+    ws[l] = L'\0';
+}
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iprimitive<Archive, Elem, Tr>::load(std::string & s)
+{
+    std::size_t l;
+    this->This()->load(l);
+    // borland de-allocator fixup
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != s.data())
+    #endif
+        s.resize(l);
+    // note breaking a rule here - could be a problem on some platform
+    if(0 < l)
+        load_binary(&(*s.begin()), l);
+}
+
+#ifndef BOOST_NO_CWCHAR
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iprimitive<Archive, Elem, Tr>::load(char * s)
+{
+    std::size_t l;
+    this->This()->load(l);
+    load_binary(s, l);
+    s[l] = '\0';
+}
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_iprimitive<Archive, Elem, Tr>::load(std::wstring & ws)
+{
+    std::size_t l;
+    this->This()->load(l);
+    // borland de-allocator fixup
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != ws.data())
+    #endif
+        ws.resize(l);
+    // note breaking a rule here - is could be a problem on some platform
+    load_binary(const_cast<wchar_t *>(ws.data()), l * sizeof(wchar_t) / sizeof(char));
+}
+#endif
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_binary_iprimitive<Archive, Elem, Tr>::basic_binary_iprimitive(
+    std::basic_streambuf<Elem, Tr> & sb, 
+    bool no_codecvt
+) :
+#ifndef BOOST_NO_STD_LOCALE
+    m_sb(sb),
+    archive_locale(NULL),
+    locale_saver(m_sb)
+{
+    if(! no_codecvt){
+        archive_locale.reset(
+            boost::archive::add_facet(
+                std::locale::classic(),
+                new codecvt_null<Elem>
+            )
+        );
+        m_sb.pubimbue(* archive_locale);
+    }
+}
+#else
+    m_sb(sb)
+{}
+#endif
+
+// some libraries including stl and libcomo fail if the
+// buffer isn't flushed before the code_cvt facet is changed.
+// I think this is a bug.  We explicity invoke sync to when
+// we're done with the streambuf to work around this problem.
+// Note that sync is a protected member of stream buff so we
+// have to invoke it through a contrived derived class.
+namespace detail {
+// note: use "using" to get past msvc bug
+using namespace std;
+template<class Elem, class Tr>
+class input_streambuf_access : public std::basic_streambuf<Elem, Tr> {
+    public:
+        virtual int sync(){
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
+            return this->basic_streambuf::sync();
+#else
+            return this->basic_streambuf<Elem, Tr>::sync();
+#endif
+        }
+};
+} // detail
+
+// scoped_ptr requires that archive_locale be a complete type at time of
+// destruction so define destructor here rather than in the header
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_binary_iprimitive<Archive, Elem, Tr>::~basic_binary_iprimitive(){
+    // push back unread characters
+    //destructor can't throw !
+    try{
+        static_cast<detail::input_streambuf_access<Elem, Tr> &>(m_sb).sync();
+    }
+    catch(...){
+    }
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oarchive.ipp
new file mode 100644 (file)
index 0000000..4a8301e
--- /dev/null
@@ -0,0 +1,46 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_oarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <cassert>
+#include <algorithm>
+#include <cstring>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+}
+#endif
+
+#include <boost/archive/basic_binary_oarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation of binary_binary_oarchive
+
+template<class Archive>
+#if !defined(__BORLANDC__)
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+#else
+void
+#endif
+basic_binary_oarchive<Archive>::init(){
+    // write signature in an archive version independent manner
+    const std::string file_signature(BOOST_ARCHIVE_SIGNATURE());
+    * this->This() << file_signature;
+    // write library version
+    const version_type v(BOOST_ARCHIVE_VERSION());
+    * this->This() << v;
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oprimitive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_binary_oprimitive.ipp
new file mode 100644 (file)
index 0000000..1b25c22
--- /dev/null
@@ -0,0 +1,164 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_binary_oprimitive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <cstddef> // NULL
+#include <cstring>
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)
+namespace std{ 
+    using ::strlen; 
+} // namespace std
+#endif
+
+
+#ifndef BOOST_NO_CWCHAR
+#include <cwchar>
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::wcslen; }
+#endif
+#endif
+
+#include <boost/detail/workaround.hpp>
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/add_facet.hpp>
+#include <boost/archive/codecvt_null.hpp>
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of basic_binary_oprimitive
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_oprimitive<Archive, Elem, Tr>::init()
+{
+    // record native sizes of fundamental types
+    // this is to permit detection of attempts to pass
+    // native binary archives accross incompatible machines.
+    // This is not foolproof but its better than nothing.
+    this->This()->save(static_cast<unsigned char>(sizeof(int)));
+    this->This()->save(static_cast<unsigned char>(sizeof(long)));
+    this->This()->save(static_cast<unsigned char>(sizeof(float)));
+    this->This()->save(static_cast<unsigned char>(sizeof(double)));
+    // for checking endianness
+    this->This()->save(int(1));
+}
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_oprimitive<Archive, Elem, Tr>::save(const char * s)
+{
+    std::size_t l = std::strlen(s);
+    this->This()->save(l);
+    save_binary(s, l);
+}
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_oprimitive<Archive, Elem, Tr>::save(const std::string &s)
+{
+    std::size_t l = static_cast<std::size_t>(s.size());
+    this->This()->save(l);
+    save_binary(s.data(), l);
+}
+
+#ifndef BOOST_NO_CWCHAR
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_oprimitive<Archive, Elem, Tr>::save(const wchar_t * ws)
+{
+    std::size_t l = std::wcslen(ws);
+    this->This()->save(l);
+    save_binary(ws, l * sizeof(wchar_t) / sizeof(char));
+}
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_binary_oprimitive<Archive, Elem, Tr>::save(const std::wstring &ws)
+{
+    std::size_t l = ws.size();
+    this->This()->save(l);
+    save_binary(ws.data(), l * sizeof(wchar_t) / sizeof(char));
+}
+#endif
+#endif
+
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_binary_oprimitive<Archive, Elem, Tr>::basic_binary_oprimitive(
+    std::basic_streambuf<Elem, Tr> & sb, 
+    bool no_codecvt
+) : 
+#ifndef BOOST_NO_STD_LOCALE
+    m_sb(sb),
+    archive_locale(NULL),
+    locale_saver(m_sb)
+{
+    if(! no_codecvt){
+        archive_locale.reset(
+            add_facet(
+                std::locale::classic(), 
+                new codecvt_null<Elem>
+            )
+        );
+        m_sb.pubimbue(* archive_locale);
+    }
+}
+#else
+    m_sb(sb)
+{}
+#endif
+
+// some libraries including stl and libcomo fail if the
+// buffer isn't flushed before the code_cvt facet is changed.
+// I think this is a bug.  We explicity invoke sync to when
+// we're done with the streambuf to work around this problem.
+// Note that sync is a protected member of stream buff so we
+// have to invoke it through a contrived derived class.
+namespace detail {
+// note: use "using" to get past msvc bug
+using namespace std;
+template<class Elem, class Tr>
+class output_streambuf_access : public std::basic_streambuf<Elem, Tr> {
+    public:
+        virtual int sync(){
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
+            return this->basic_streambuf::sync();
+#else
+            return this->basic_streambuf<Elem, Tr>::sync();
+#endif
+        }
+};
+} // detail
+
+// scoped_ptr requires that g be a complete type at time of
+// destruction so define destructor here rather than in the header
+template<class Archive, class Elem, class Tr>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_binary_oprimitive<Archive, Elem, Tr>::~basic_binary_oprimitive(){
+    // flush buffer
+    //destructor can't throw
+    try{
+        static_cast<detail::output_streambuf_access<Elem, Tr> &>(m_sb).sync();
+    }
+    catch(...){
+    }
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iarchive.ipp
new file mode 100644 (file)
index 0000000..6d9b8c7
--- /dev/null
@@ -0,0 +1,78 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_iarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <algorithm>
+#include <cstring>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+}
+#endif
+
+#include <boost/detail/workaround.hpp>
+
+#include <boost/archive/basic_text_iarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation of text_text_archive
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_iarchive<Archive>::load_override(class_name_type & t, int){
+    std::string cn;
+    cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
+    load_override(cn, 0);
+    if(cn.size() > (BOOST_SERIALIZATION_MAX_KEY_SIZE - 1))
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_class_name)
+        );
+    std::memcpy(t, cn.data(), cn.size());
+    // borland tweak
+    t.t[cn.size()] = '\0';
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_iarchive<Archive>::init(void){
+    // read signature in an archive version independent manner
+    std::string file_signature;
+    * this->This() >> file_signature;
+    if(file_signature != BOOST_ARCHIVE_SIGNATURE())
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_signature)
+        );
+
+    // make sure the version of the reading archive library can
+    // support the format of the archive being read
+    version_type input_library_version;
+    * this->This() >> input_library_version;
+
+    #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+    this->set_library_version(input_library_version);
+    #else
+    #if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+    detail::
+    #endif
+    basic_iarchive::set_library_version(input_library_version.t);
+    #endif
+
+    // extra little .t is to get around borland quirk
+    if(BOOST_ARCHIVE_VERSION() < input_library_version.t)
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::unsupported_version)
+        );
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iprimitive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_iprimitive.ipp
new file mode 100644 (file)
index 0000000..c64502d
--- /dev/null
@@ -0,0 +1,154 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_iprimitive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/basic_text_iprimitive.hpp>
+#include <boost/archive/codecvt_null.hpp>
+#include <boost/archive/add_facet.hpp>
+
+#include <boost/archive/iterators/remove_whitespace.hpp>
+#include <boost/archive/iterators/istream_iterator.hpp>
+#include <boost/archive/iterators/binary_from_base64.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+
+namespace boost { 
+namespace archive {
+
+namespace {
+    template<class CharType>
+    bool is_whitespace(CharType c);
+
+    template<>
+    bool is_whitespace(char t){
+        return std::isspace(t);
+    }
+
+    #ifndef BOOST_NO_CWCHAR
+    template<>
+    bool is_whitespace(wchar_t t){
+        return std::iswspace(t);
+    }
+    #endif
+}
+
+// translate base64 text into binary and copy into buffer
+// until buffer is full.
+template<class IStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_iprimitive<IStream>::load_binary(
+    void *address, 
+    std::size_t count
+){
+    typedef BOOST_DEDUCED_TYPENAME IStream::char_type CharType;
+    
+    if(0 == count)
+        return;
+        
+    assert(
+        static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)())
+        > (count + sizeof(CharType) - 1)/sizeof(CharType)
+    );
+        
+    if(is.fail())
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+    // convert from base64 to binary
+    typedef BOOST_DEDUCED_TYPENAME
+        iterators::transform_width<
+            iterators::binary_from_base64<
+                iterators::remove_whitespace<
+                    iterators::istream_iterator<CharType>
+                >
+                ,CharType
+            >
+            ,8
+            ,6
+            ,CharType
+        > 
+        binary;
+
+    binary ti_begin = binary(
+        BOOST_MAKE_PFTO_WRAPPER(
+            iterators::istream_iterator<CharType>(is)
+        )
+    );
+                
+    char * caddr = static_cast<char *>(address);
+    
+    // take care that we don't increment anymore than necessary
+    while(--count > 0){
+        *caddr++ = static_cast<char>(*ti_begin);
+        ++ti_begin;
+    }
+    *caddr++ = static_cast<char>(*ti_begin);
+    
+    iterators::istream_iterator<CharType> i;
+    for(;;){
+        CharType c;
+        c = is.get();
+        if(is.eof())
+            break;
+        if(is_whitespace(c))
+            break;
+    }
+}
+
+template<class IStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_text_iprimitive<IStream>::basic_text_iprimitive(
+    IStream  &is_,
+    bool no_codecvt
+) :
+#ifndef BOOST_NO_STD_LOCALE
+    is(is_),
+    flags_saver(is_),
+    precision_saver(is_),
+    archive_locale(NULL),
+    locale_saver(is_)
+{
+    if(! no_codecvt){
+        archive_locale.reset(
+            add_facet(
+                std::locale::classic(), 
+                new codecvt_null<BOOST_DEDUCED_TYPENAME IStream::char_type>
+            )
+        );
+        is.imbue(* archive_locale);
+    }
+    is >> std::noboolalpha;
+}
+#else
+    is(is_),
+    flags_saver(is_),
+    precision_saver(is_)
+{}
+#endif
+
+template<class IStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_text_iprimitive<IStream>::~basic_text_iprimitive(){
+    is.sync();
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oarchive.ipp
new file mode 100644 (file)
index 0000000..3b7c7b0
--- /dev/null
@@ -0,0 +1,62 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_oarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <string>
+#include <cassert>
+#include <cstring>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+}
+#endif
+
+#include <boost/archive/basic_text_oarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation of basic_text_oarchive
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_oarchive<Archive>::newtoken()
+{
+    switch(delimiter){
+    default:
+        assert(false);
+        break;
+    case eol:
+        this->This()->put('\n');
+        delimiter = space;
+        break;
+    case space:
+        this->This()->put(' ');
+        break;
+    case none:
+        delimiter = space;
+        break;
+    }
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_oarchive<Archive>::init(){
+    // write signature in an archive version independent manner
+    const std::string file_signature(BOOST_ARCHIVE_SIGNATURE());
+    * this->This() << file_signature;
+    // write library version
+    const version_type v(BOOST_ARCHIVE_VERSION());
+    * this->This() << v;
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oprimitive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_text_oprimitive.ipp
new file mode 100644 (file)
index 0000000..702663a
--- /dev/null
@@ -0,0 +1,114 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_text_oprimitive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // NULL
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/basic_text_oprimitive.hpp>
+#include <boost/archive/codecvt_null.hpp>
+#include <boost/archive/add_facet.hpp>
+
+#include <boost/archive/iterators/base64_from_binary.hpp>
+#include <boost/archive/iterators/insert_linebreaks.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+
+namespace boost {
+namespace archive {
+
+// translate to base64 and copy in to buffer.
+template<class OStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_text_oprimitive<OStream>::save_binary(
+    const void *address, 
+    std::size_t count
+){
+    typedef BOOST_DEDUCED_TYPENAME OStream::char_type CharType;
+    
+    if(0 == count)
+        return;
+    
+    if(os.fail())
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+        
+    os.put('\n');
+    
+    typedef 
+        boost::archive::iterators::insert_linebreaks<
+            boost::archive::iterators::base64_from_binary<
+                boost::archive::iterators::transform_width<
+                    const char *,
+                    6,
+                    8
+                >
+            > 
+            ,72
+            ,const char // cwpro8 needs this
+        > 
+        base64_text;
+
+    boost::archive::iterators::ostream_iterator<CharType> oi(os);
+    std::copy(
+        base64_text(BOOST_MAKE_PFTO_WRAPPER(static_cast<const char *>(address))),
+        base64_text(
+            BOOST_MAKE_PFTO_WRAPPER(static_cast<const char *>(address) + count)
+        ),
+        oi
+    );
+    
+    std::size_t tail = count % 3;
+    if(tail > 0){
+        *oi++ = '=';
+        if(tail < 2)
+            *oi = '=';
+    }
+}
+
+template<class OStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_text_oprimitive<OStream>::basic_text_oprimitive(
+    OStream & os_,
+    bool no_codecvt
+) : 
+#ifndef BOOST_NO_STD_LOCALE
+    os(os_),
+    flags_saver(os_),
+    precision_saver(os_),
+    archive_locale(NULL),
+    locale_saver(os_)
+{
+    if(! no_codecvt){
+        archive_locale.reset(
+            add_facet(
+                std::locale::classic(), 
+                new codecvt_null<BOOST_DEDUCED_TYPENAME OStream::char_type>
+            )
+        );
+        os.imbue(* archive_locale);
+    }
+    os << std::noboolalpha;
+}
+#else
+    os(os_),
+    flags_saver(os_),
+    precision_saver(os_)
+{}
+#endif
+
+template<class OStream>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_text_oprimitive<OStream>::~basic_text_oprimitive(){
+    os << std::endl;
+}
+
+} //namespace boost 
+} //namespace archive 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_grammar.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_grammar.hpp
new file mode 100644 (file)
index 0000000..768009c
--- /dev/null
@@ -0,0 +1,193 @@
+#ifndef BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP
+#define BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_grammar.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// this module is derived from simplexml.cpp - an example shipped as part of
+// the spirit parser.  This example contains the following notice:
+/*=============================================================================
+    simplexml.cpp
+
+    Spirit V1.3
+    URL: http://spirit.sourceforge.net/
+
+    Copyright (c) 2001, Daniel C. Nuffer
+
+    This software is provided 'as-is', without any express or implied
+    warranty. In no event will the copyright holder be held liable for
+    any damages arising from the use of this software.
+
+    Permission is granted to anyone to use this software for any purpose,
+    including commercial applications, and to alter it and redistribute
+    it freely, subject to the following restrictions:
+
+    1.  The origin of this software must not be misrepresented; you must
+        not claim that you wrote the original software. If you use this
+        software in a product, an acknowledgment in the product documentation
+        would be appreciated but is not required.
+
+    2.  Altered source versions must be plainly marked as such, and must
+        not be misrepresented as being the original software.
+
+    3.  This notice may not be removed or altered from any source
+        distribution.
+=============================================================================*/
+#include <string>
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+// supress noise
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+//#define BOOST_SPIRIT_DEBUG
+#include <boost/spirit/core/non_terminal/rule.hpp>
+
+// the following hack is to evade a bogus error generated by using the
+// word "arg" when bind.hpp has been included
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+#define arg xarg
+#endif
+
+// spirit stuff
+#if (defined __BORLANDC__) && (__BORLANDC__ < 0x593) \
+    || (defined _MSC_VER) && (_MSC_VER <= 1300) 
+#include <boost/spirit/utility/chset.hpp>
+#else
+#include <boost/spirit/include/classic_chset.hpp>
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+#undef arg
+#endif
+
+#include <boost/archive/basic_archive.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/version.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// XML grammar parsing
+
+template<class CharType>
+class basic_xml_grammar {
+public:
+    // The following is not necessary according to DR45, but at least
+    // one compiler (Compaq C++ 6.5 in strict_ansi mode) chokes otherwise.
+    struct return_values;
+    friend struct return_values;
+    
+private:
+    typedef BOOST_DEDUCED_TYPENAME std::basic_istream<CharType> IStream;
+    typedef BOOST_DEDUCED_TYPENAME std::basic_string<CharType> StringType;
+    typedef BOOST_DEDUCED_TYPENAME boost::spirit::chset<CharType> chset_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::spirit::chlit<CharType> chlit_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::spirit::scanner<
+        BOOST_DEDUCED_TYPENAME  std::basic_string<CharType>::iterator
+    > scanner_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::spirit::rule<scanner_t> rule_t;
+    // Start grammar definition
+    rule_t    
+        Reference,
+        Eq, 
+        STag,
+        ETag,
+        LetterOrUnderscoreOrColon,
+        AttValue, 
+        CharRef1, 
+        CharRef2, 
+        CharRef, 
+        AmpRef,
+        LTRef,
+        GTRef,
+        AposRef,
+        QuoteRef,
+        CharData,
+        CharDataChars,
+        content,
+        AmpName,
+        LTName,
+        GTName,
+        ClassNameChar,
+        ClassName,
+        Name,
+        XMLDecl,
+        XMLDeclChars,
+        DocTypeDecl,
+        DocTypeDeclChars,
+        ClassIDAttribute,
+        ObjectIDAttribute,
+        ClassNameAttribute,
+        TrackingAttribute,
+        VersionAttribute,
+        UnusedAttribute,
+        Attribute,
+        SignatureAttribute,
+        SerializationWrapper,
+        NameHead,
+        NameTail,
+        AttributeList,
+        S;
+
+    // XML Character classes
+    chset_t
+        BaseChar,
+        Ideographic,
+        Char, 
+        Letter, 
+        Digit,
+        CombiningChar,
+        Extender, 
+        Sch,
+        NameChar;
+
+    void init_chset();
+
+    bool my_parse(
+        IStream & is,
+        const rule_t &rule_, 
+        const CharType delimiter = L'>'
+    ) const ;
+public:
+    struct return_values {
+        StringType object_name;
+        StringType contents;
+        class_id_type class_id;
+        object_id_type object_id;
+        version_type version;
+        tracking_type tracking_level;
+        StringType class_name;
+        return_values() :
+            version(0),
+            tracking_level(false)
+        {}
+    } rv;
+    bool parse_start_tag(IStream & is) /*const*/;
+    bool parse_end_tag(IStream & is) const;
+    bool parse_string(IStream & is, StringType & s) /*const*/;
+    void init(IStream & is);
+    void windup(IStream & is);
+    basic_xml_grammar();
+};
+
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_iarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_iarchive.ipp
new file mode 100644 (file)
index 0000000..a74844d
--- /dev/null
@@ -0,0 +1,114 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_iarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // NULL
+#include <algorithm>
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/archive/xml_archive_exception.hpp>
+#include <boost/archive/basic_xml_iarchive.hpp>
+#include <boost/serialization/tracking.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implementation of xml_text_archive
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_start(const char *name){
+    // if there's no name
+    if(NULL == name)
+        return;
+    bool result = this->This()->gimpl->parse_start_tag(this->This()->get_is());
+    if(true != result){
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+    }
+    // don't check start tag at highest level
+    ++depth;
+    return;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_end(const char *name){
+    // if there's no name
+    if(NULL == name)
+        return;
+    bool result = this->This()->gimpl->parse_end_tag(this->This()->get_is());
+    if(true != result){
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::stream_error)
+        );
+    }
+    
+    // don't check start tag at highest level
+    if(0 == --depth)
+        return;
+        
+    if(0 == (this->get_flags() & no_xml_tag_checking)){
+        // double check that the tag matches what is expected - useful for debug
+        if(0 != name[this->This()->gimpl->rv.object_name.size()]
+        || ! std::equal(
+                this->This()->gimpl->rv.object_name.begin(),
+                this->This()->gimpl->rv.object_name.end(),
+                name
+            )
+        ){
+            boost::serialization::throw_exception(
+                xml_archive_exception(
+                    xml_archive_exception::xml_archive_tag_mismatch,
+                    name
+                )
+            );
+        }
+    }
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_override(object_id_type & t, int){
+    t = this->This()->gimpl->rv.object_id;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_override(version_type & t, int){
+    t = this->This()->gimpl->rv.version;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_override(class_id_type & t, int){
+    t = this->This()->gimpl->rv.class_id;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_iarchive<Archive>::load_override(tracking_type & t, int){
+    t = this->This()->gimpl->rv.tracking_level;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_xml_iarchive<Archive>::basic_xml_iarchive(unsigned int flags) :
+    detail::common_iarchive<Archive>(flags),
+    depth(0)
+{}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_xml_iarchive<Archive>::~basic_xml_iarchive(){}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_oarchive.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/basic_xml_oarchive.ipp
new file mode 100644 (file)
index 0000000..518d8a7
--- /dev/null
@@ -0,0 +1,275 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// basic_xml_oarchive.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <algorithm>
+#include <cstddef> // NULL
+#include <cstring>
+#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)
+namespace std{
+    using ::strlen;
+} // namespace std
+#endif
+
+#include <boost/archive/basic_xml_archive.hpp>
+#include <boost/archive/basic_xml_oarchive.hpp>
+#include <boost/archive/xml_archive_exception.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+
+namespace boost {
+namespace archive {
+
+namespace detail {
+template<class CharType>
+struct XML_name {
+    void operator()(CharType t) const{
+        const unsigned char lookup_table[] = {
+            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+            0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, // -.
+            1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, // 0-9
+            0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // A-
+            1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1, // -Z _
+            0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // a-
+            1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, // -z
+            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+        };
+        if((unsigned)t > 127)
+            return;
+        if(0 == lookup_table[(unsigned)t])
+            boost::serialization::throw_exception(
+                xml_archive_exception(
+                    xml_archive_exception::xml_archive_tag_name_error
+                )
+            );
+    }
+};
+
+} // namespace detail
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implemenations of functions common to both types of xml output
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::write_attribute(
+    const char *attribute_name,
+    int t,
+    const char *conjunction
+){
+    this->This()->put(' ');
+    this->This()->put(attribute_name);
+    this->This()->put(conjunction);
+    this->This()->save(t);
+    this->This()->put('"');
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::write_attribute(
+    const char *attribute_name,
+    const char *key
+){
+    this->This()->put(' ');
+    this->This()->put(attribute_name);
+    this->This()->put("=\"");
+    this->This()->save(key);
+    this->This()->put('"');
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::indent(){
+    int i;
+    for(i = depth; i-- > 0;)
+        this->This()->put('\t');
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_start(const char *name)
+{
+    if(NULL == name)
+        return;
+
+    // be sure name has no invalid characters
+    std::for_each(name, name + std::strlen(name), detail::XML_name<const char>());
+
+    end_preamble();
+    if(depth > 0){
+        this->This()->put('\n');
+        indent();
+    }
+    ++depth;
+    this->This()->put('<');
+    this->This()->save(name);
+    pending_preamble = true;
+    indent_next = false;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_end(const char *name)
+{
+    if(NULL == name)
+        return;
+
+    // be sure name has no invalid characters
+    std::for_each(name, name + std::strlen(name), detail::XML_name<const char>());
+
+    end_preamble();
+    --depth;
+    if(indent_next){
+        this->This()->put('\n');
+        indent();
+    }
+    indent_next = true;
+    this->This()->put("</");
+    this->This()->save(name);
+    this->This()->put('>');
+    if(0 == depth)
+        this->This()->put('\n');
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::end_preamble(){
+    if(pending_preamble){
+        this->This()->put('>');
+        pending_preamble = false;
+    }
+}
+#if 0
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const object_id_type & t, int)
+{
+    int i = t.t; // extra .t is for borland
+    write_attribute(BOOST_ARCHIVE_XML_OBJECT_ID(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(
+    const object_reference_type & t,
+    int
+){
+    int i = t.t; // extra .t is for borland
+    write_attribute(BOOST_ARCHIVE_XML_OBJECT_REFERENCE(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const version_type & t, int)
+{
+    int i = t.t; // extra .t is for borland
+    write_attribute(VBOOST_ARCHIVE_XML_ERSION(), i);
+}
+#endif
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const object_id_type & t, int)
+{
+    // borland doesn't do conversion of STRONG_TYPEDEFs very well
+    const unsigned int i = t;
+    write_attribute(BOOST_ARCHIVE_XML_OBJECT_ID(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(
+    const object_reference_type & t,
+    int
+){
+    const unsigned int i = t;
+    write_attribute(BOOST_ARCHIVE_XML_OBJECT_REFERENCE(), i, "=\"_");
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const version_type & t, int)
+{
+    const unsigned int i = t;
+    write_attribute(BOOST_ARCHIVE_XML_VERSION(), i);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const class_id_type & t, int)
+{
+    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID(), t);
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(
+    const class_id_reference_type & t,
+    int
+){
+    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID_REFERENCE(), t);
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(
+    const class_id_optional_type & t,
+    int
+){
+    write_attribute(BOOST_ARCHIVE_XML_CLASS_ID(), t);
+}
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const class_name_type & t, int)
+{
+    const char * key = t;
+    if(NULL == key)
+        return;
+    write_attribute(BOOST_ARCHIVE_XML_CLASS_NAME(), key);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::save_override(const tracking_type & t, int)
+{
+    write_attribute(BOOST_ARCHIVE_XML_TRACKING(), t.t);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
+basic_xml_oarchive<Archive>::init(){
+    // xml header
+    this->This()->put("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>\n");
+    this->This()->put("<!DOCTYPE boost_serialization>\n");
+    // xml document wrapper - outer root
+    this->This()->put("<boost_serialization");
+    write_attribute("signature", BOOST_ARCHIVE_SIGNATURE());
+    write_attribute("version", BOOST_ARCHIVE_VERSION());
+    this->This()->put(">\n");
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_xml_oarchive<Archive>::basic_xml_oarchive(unsigned int flags) :
+    detail::common_oarchive<Archive>(flags),
+    depth(0),
+    indent_next(false),
+    pending_preamble(false)
+{
+}
+
+template<class Archive>
+BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
+basic_xml_oarchive<Archive>::~basic_xml_oarchive(){
+    if(0 == (this->get_flags() & no_header)){
+        BOOST_TRY{
+                this->This()->put("</boost_serialization>\n");
+        }
+        BOOST_CATCH(...){}
+        BOOST_CATCH_END
+    }
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_iarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_iarchive_impl.ipp
new file mode 100644 (file)
index 0000000..f14c0d8
--- /dev/null
@@ -0,0 +1,128 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_iarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+//////////////////////////////////////////////////////////////////////
+// implementation of basic_text_iprimitive overrides for the combination
+// of template parameters used to implement a text_iprimitive
+
+#include <cstddef> // size_t, NULL
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/detail/workaround.hpp> // RogueWave
+
+#include <boost/archive/text_iarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::load(char *s)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    // Works on all tested platforms
+    is.read(s, size);
+    s[size] = '\0';
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::load(std::string &s)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    // borland de-allocator fixup
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != s.data())
+    #endif
+        s.resize(size);
+    if(0 < size)
+        is.read(&(*s.begin()), size);
+}
+
+#ifndef BOOST_NO_CWCHAR
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::load(wchar_t *ws)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    is.read((char *)ws, size * sizeof(wchar_t)/sizeof(char));
+    ws[size] = L'\0';
+}
+#endif // BOOST_NO_INTRINSIC_WCHAR_T
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::load(std::wstring &ws)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // borland de-allocator fixup
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != ws.data())
+    #endif
+        ws.resize(size);
+    // skip separating space
+    is.get();
+    is.read((char *)ws.data(), size * sizeof(wchar_t)/sizeof(char));
+}
+
+#endif // BOOST_NO_STD_WSTRING
+#endif // BOOST_NO_CWCHAR
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::load_override(class_name_type & t, int){
+    basic_text_iarchive<Archive>::load_override(t, 0);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_iarchive_impl<Archive>::init(){
+    basic_text_iarchive<Archive>::init();
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+text_iarchive_impl<Archive>::text_iarchive_impl(
+    std::istream & is, 
+    unsigned int flags
+) :
+    basic_text_iprimitive<std::istream>(
+        is, 
+        0 != (flags & no_codecvt)
+    ),
+    basic_text_iarchive<Archive>(flags)
+{
+    if(0 == (flags & no_header))
+        #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+        this->init();
+        #else
+        this->basic_text_iarchive<Archive>::init();
+        #endif
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_oarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_oarchive_impl.ipp
new file mode 100644 (file)
index 0000000..2df0b46
--- /dev/null
@@ -0,0 +1,124 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_oarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <string>
+#include <boost/config.hpp>
+#include <locale>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#ifndef BOOST_NO_CWCHAR
+#include <cwchar>
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::wcslen; }
+#endif
+#endif
+
+#include <boost/archive/add_facet.hpp>
+#include <boost/archive/text_oarchive.hpp>
+
+namespace boost { 
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of basic_text_oprimitive overrides for the combination
+// of template parameters used to create a text_oprimitive
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_oarchive_impl<Archive>::save(const char * s)
+{
+    const std::size_t len = std::ostream::traits_type::length(s);
+    *this->This() << len;
+    this->This()->newtoken();
+    os << s;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_oarchive_impl<Archive>::save(const std::string &s)
+{
+    const std::size_t size = s.size();
+    *this->This() << size;
+    this->This()->newtoken();
+    os << s;
+}
+
+#ifndef BOOST_NO_CWCHAR
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_oarchive_impl<Archive>::save(const wchar_t * ws)
+{
+    const std::size_t l = std::wcslen(ws);
+    * this->This() << l;
+    this->This()->newtoken();
+    os.write((const char *)ws, l * sizeof(wchar_t)/sizeof(char));
+}
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_oarchive_impl<Archive>::save(const std::wstring &ws)
+{
+    const std::size_t l = ws.size();
+    * this->This() << l;
+    this->This()->newtoken();
+    os.write((const char *)(ws.data()), l * sizeof(wchar_t)/sizeof(char));
+}
+#endif
+#endif // BOOST_NO_CWCHAR
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+text_oarchive_impl<Archive>::text_oarchive_impl(
+    std::ostream & os, 
+    unsigned int flags
+) :
+    basic_text_oprimitive<std::ostream>(
+        os, 
+        0 != (flags & no_codecvt)
+    ),
+    basic_text_oarchive<Archive>(flags)
+{
+    if(0 == (flags & no_header))
+        #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+        this->init();
+        #else
+        this->basic_text_oarchive<Archive>::init();
+        #endif
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+text_oarchive_impl<Archive>::save_binary(const void *address, std::size_t count){
+    put('\n');
+    this->end_preamble();
+    #if ! defined(__MWERKS__)
+    this->basic_text_oprimitive<std::ostream>::save_binary(
+    #else
+    this->basic_text_oprimitive::save_binary(
+    #endif
+        address, 
+        count
+    );
+    this->delimiter = this->eol;
+}
+
+} // namespace archive
+} // namespace boost
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_wiarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_wiarchive_impl.ipp
new file mode 100644 (file)
index 0000000..6938c22
--- /dev/null
@@ -0,0 +1,118 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_text_wiarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t, NULL
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/detail/workaround.hpp>  // fixup for RogueWave
+
+#ifndef BOOST_NO_STD_WSTREAMBUF
+#include <boost/archive/basic_text_iprimitive.hpp>
+
+namespace boost { 
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of wiprimtives functions
+//
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_wiarchive_impl<Archive>::load(char *s)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    while(size-- > 0){
+        *s++ = is.narrow(is.get(), '\0');
+    }
+    *s = '\0';
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_wiarchive_impl<Archive>::load(std::string &s)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != s.data())
+    #endif
+        s.resize(0);
+    s.reserve(size);
+    while(size-- > 0){
+        int x = is.narrow(is.get(), '\0');
+        s += x;
+    }
+}
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_wiarchive_impl<Archive>::load(wchar_t *s)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    // Works on all tested platforms
+    is.read(s, size);
+    s[size] = L'\0';
+}
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_wiarchive_impl<Archive>::load(std::wstring &ws)
+{
+    std::size_t size;
+    * this->This() >> size;
+    // skip separating space
+    is.get();
+    // borland complains about resize
+    // borland de-allocator fixup
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != ws.data())
+    #endif
+        ws.resize(size);
+    // note breaking a rule here - is this a problem on some platform
+    is.read(const_cast<wchar_t *>(ws.data()), size);
+}
+#endif
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+text_wiarchive_impl<Archive>::text_wiarchive_impl(
+    std::wistream & is, 
+    unsigned int flags
+) :
+    basic_text_iprimitive<std::wistream>(
+        is, 
+        0 != (flags & no_codecvt)
+    ),
+    basic_text_iarchive<Archive>(flags)
+{
+    if(0 == (flags & no_header))
+        basic_text_iarchive<Archive>::init();
+}
+
+} // archive
+} // boost
+
+#endif // BOOST_NO_STD_WSTREAMBUF
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_woarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/text_woarchive_impl.ipp
new file mode 100644 (file)
index 0000000..6683f52
--- /dev/null
@@ -0,0 +1,85 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_woarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_STD_WSTREAMBUF
+
+#include <cstring>
+#include <cstddef> // size_t
+#if defined(BOOST_NO_STDC_NAMESPACE) && ! defined(__LIBCOMO__)
+namespace std{ 
+    using ::strlen;
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <ostream>
+
+#include <boost/archive/text_woarchive.hpp>
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of woarchive functions
+//
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_woarchive_impl<Archive>::save(const char *s)
+{
+    // note: superfluous local variable fixes borland warning
+    const std::size_t size = std::strlen(s);
+    * this->This() << size;
+    this->This()->newtoken();
+    while(*s != '\0')
+        os.put(os.widen(*s++));
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_woarchive_impl<Archive>::save(const std::string &s)
+{
+    const std::size_t size = s.size();
+    * this->This() << size;
+    this->This()->newtoken();
+    const char * cptr = s.data();
+    for(std::size_t i = size; i-- > 0;)
+        os.put(os.widen(*cptr++));
+}
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_woarchive_impl<Archive>::save(const wchar_t *ws)
+{
+    const std::size_t size = std::wostream::traits_type::length(ws);
+    * this->This() << size;
+    this->This()->newtoken();
+    os.write(ws, size);
+}
+#endif
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+text_woarchive_impl<Archive>::save(const std::wstring &ws)
+{
+    const std::size_t size = ws.length();
+    * this->This() << size;
+    this->This()->newtoken();
+    os.write(ws.data(), size);
+}
+#endif
+
+} // namespace archive
+} // namespace boost
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_iarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_iarchive_impl.ipp
new file mode 100644 (file)
index 0000000..21d006e
--- /dev/null
@@ -0,0 +1,202 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_iarchive_impl.cpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <cstring> // memcpy
+#include <cstddef> // NULL
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy;
+} // namespace std
+#endif
+
+#ifndef BOOST_NO_CWCHAR
+#include <cstdlib> // mbtowc
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::mbtowc;
+ } // namespace std
+#endif
+#endif // BOOST_NO_CWCHAR
+
+#include <boost/detail/workaround.hpp> // RogueWave and Dinkumware
+#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+#include <boost/archive/dinkumware.hpp>
+#endif
+
+#include <boost/detail/no_exceptions_support.hpp>
+
+#include <boost/archive/xml_archive_exception.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+#include <boost/archive/basic_xml_archive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+
+#include "basic_xml_grammar.hpp"
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implemenations of functions specific to char archives
+
+// wide char stuff used by char archives
+
+#ifndef BOOST_NO_CWCHAR
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::load(std::wstring &ws){
+    std::string s;
+    bool result = gimpl->parse_string(is, s);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+    
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != ws.data())
+    #endif
+        ws.resize(0);
+    const char * start = s.data();
+    const char * end = start + s.size();
+    while(start < end){
+        wchar_t wc;
+        int resultx = std::mbtowc(&wc, start, end - start);
+        if(0 < resultx){
+            start += resultx;
+            ws += wc;
+            continue;
+        }
+        boost::serialization::throw_exception(
+            iterators::dataflow_exception(
+                iterators::dataflow_exception::invalid_conversion
+            )
+        );
+    }
+}
+#endif // BOOST_NO_STD_WSTRING
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::load(wchar_t * ws){
+    std::string s;
+    bool result = gimpl->parse_string(is, s);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+        
+    const char * start = s.data();
+    const char * end = start + s.size();
+    while(start < end){
+        wchar_t wc;
+        int result = std::mbtowc(&wc, start, end - start);
+        if(0 < result){
+            start += result;
+            *ws++ = wc;
+            continue;
+        }
+        boost::serialization::throw_exception(
+            iterators::dataflow_exception(
+                iterators::dataflow_exception::invalid_conversion
+            )
+        );
+    }
+    *ws = L'\0';
+}
+#endif
+
+#endif // BOOST_NO_CWCHAR
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::load(std::string &s){
+    bool result = gimpl->parse_string(is, s);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::load(char * s){
+    std::string tstring;
+    bool result = gimpl->parse_string(is, tstring);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+    std::memcpy(s, tstring.data(), tstring.size());
+    s[tstring.size()] = 0;
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::load_override(class_name_type & t, int){
+    const std::string & s = gimpl->rv.class_name;
+    if(s.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1)
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_class_name)
+       );
+    char * tptr = t;
+    std::memcpy(tptr, s.data(), s.size());
+    tptr[s.size()] = '\0';
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_iarchive_impl<Archive>::init(){
+    gimpl->init(is);
+    this->set_library_version(gimpl->rv.version);
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_iarchive_impl<Archive>::xml_iarchive_impl(
+    std::istream &is_,
+    unsigned int flags
+) :
+    basic_text_iprimitive<std::istream>(
+        is_, 
+        0 != (flags & no_codecvt)
+    ),
+    basic_xml_iarchive<Archive>(flags),
+    gimpl(new xml_grammar())
+{
+    if(0 == (flags & no_header)){
+        BOOST_TRY{
+            init();
+        }
+        BOOST_CATCH(...){
+            delete gimpl;
+            #ifndef BOOST_NO_EXCEPTIONS
+                throw; // re-throw
+            #endif
+        }
+        BOOST_CATCH_END
+    }
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_iarchive_impl<Archive>::~xml_iarchive_impl(){
+    if(0 == (this->get_flags() & no_header)){
+        BOOST_TRY{
+            gimpl->windup(is);
+        }
+        BOOST_CATCH(...){}
+        BOOST_CATCH_END
+    }
+    delete gimpl;
+}
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_oarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_oarchive_impl.ipp
new file mode 100644 (file)
index 0000000..8ab954f
--- /dev/null
@@ -0,0 +1,117 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_oarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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 <ostream>
+#include <iomanip>
+#include <algorithm>
+#include <string>
+
+#include <cstring> // strlen
+#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::strlen; 
+} // namespace std
+#endif
+
+#include <boost/archive/iterators/xml_escape.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+
+#ifndef BOOST_NO_CWCHAR
+#include <boost/archive/wcslen.hpp>
+#include <boost/archive/iterators/mb_from_wchar.hpp>
+#endif
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implemenations of functions specific to char archives
+
+// wide char stuff used by char archives
+#ifndef BOOST_NO_CWCHAR
+// copy chars to output escaping to xml and translating wide chars to mb chars
+template<class InputIterator>
+void save_iterator(std::ostream &os, InputIterator begin, InputIterator end){
+    typedef boost::archive::iterators::mb_from_wchar<
+        boost::archive::iterators::xml_escape<InputIterator>
+    > translator;
+    std::copy(
+        translator(BOOST_MAKE_PFTO_WRAPPER(begin)), 
+        translator(BOOST_MAKE_PFTO_WRAPPER(end)), 
+        boost::archive::iterators::ostream_iterator<char>(os)
+    );
+}
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_oarchive_impl<Archive>::save(const std::wstring & ws){
+//  at least one library doesn't typedef value_type for strings
+//  so rather than using string directly make a pointer iterator out of it
+//    save_iterator(os, ws.data(), ws.data() + std::wcslen(ws.data()));
+    save_iterator(os, ws.data(), ws.data() + ws.size());
+}
+#endif
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_oarchive_impl<Archive>::save(const wchar_t * ws){
+    save_iterator(os, ws, ws + std::wcslen(ws));
+}
+#endif
+
+#endif // BOOST_NO_CWCHAR
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_oarchive_impl<Archive>::save(const std::string & s){
+//  at least one library doesn't typedef value_type for strings
+//  so rather than using string directly make a pointer iterator out of it
+    typedef boost::archive::iterators::xml_escape<
+        const char * 
+    > xml_escape_translator;
+    std::copy(
+        xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data())),
+        xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s.data()+ s.size())), 
+        boost::archive::iterators::ostream_iterator<char>(os)
+    );
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(void)
+xml_oarchive_impl<Archive>::save(const char * s){
+    typedef boost::archive::iterators::xml_escape<
+        const char * 
+    > xml_escape_translator;
+    std::copy(
+        xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s)),
+        xml_escape_translator(BOOST_MAKE_PFTO_WRAPPER(s + std::strlen(s))), 
+        boost::archive::iterators::ostream_iterator<char>(os)
+    );
+}
+
+template<class Archive>
+BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_oarchive_impl<Archive>::xml_oarchive_impl(
+    std::ostream & os_, 
+    unsigned int flags
+) : 
+    basic_text_oprimitive<std::ostream>(
+        os_,
+        0 != (flags & no_codecvt)
+    ),
+    basic_xml_oarchive<Archive>(flags)
+{
+    if(0 == (flags & no_header))
+        this->init();
+}
+
+} // namespace archive
+} // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_wiarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_wiarchive_impl.ipp
new file mode 100644 (file)
index 0000000..3df68d9
--- /dev/null
@@ -0,0 +1,204 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_wiprimitive.cpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+
+#include <cstring>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::memcpy; 
+} //std
+#endif
+
+#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings
+#ifndef BOOST_NO_STD_WSTREAMBUF
+
+#include <cassert>
+#include <algorithm>
+
+#include <boost/detail/workaround.hpp> // Dinkumware and RogueWave
+#if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
+#include <boost/archive/dinkumware.hpp>
+#endif
+
+#include <boost/io/ios_state.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/serialization/string.hpp>
+#include <boost/archive/add_facet.hpp>
+#include <boost/archive/xml_archive_exception.hpp>
+#include <boost/archive/detail/utf8_codecvt_facet.hpp>
+
+#include <boost/archive/iterators/mb_from_wchar.hpp>
+
+#include <boost/archive/basic_xml_archive.hpp>
+#include <boost/archive/xml_wiarchive.hpp>
+
+#include "basic_xml_grammar.hpp"
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implemenations of functions specific to wide char archives
+
+namespace { // anonymous
+
+void copy_to_ptr(char * s, const std::wstring & ws){
+    std::copy(
+        iterators::mb_from_wchar<std::wstring::const_iterator>(
+            BOOST_MAKE_PFTO_WRAPPER(ws.begin())
+        ), 
+        iterators::mb_from_wchar<std::wstring::const_iterator>(
+            BOOST_MAKE_PFTO_WRAPPER(ws.end())
+        ), 
+        s
+    );
+    s[ws.size()] = 0;
+}
+
+} // anonymous
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::load(std::string & s){
+    std::wstring ws;
+    bool result = gimpl->parse_string(is, ws);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+    #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101))
+    if(NULL != s.data())
+    #endif
+        s.resize(0);
+    s.reserve(ws.size());
+    std::copy(
+        iterators::mb_from_wchar<std::wstring::iterator>(
+            BOOST_MAKE_PFTO_WRAPPER(ws.begin())
+        ), 
+        iterators::mb_from_wchar<std::wstring::iterator>(
+            BOOST_MAKE_PFTO_WRAPPER(ws.end())
+        ), 
+        std::back_inserter(s)
+    );
+}
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::load(std::wstring & ws){
+    bool result = gimpl->parse_string(is, ws);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+}
+#endif
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::load(char * s){
+    std::wstring ws;
+    bool result = gimpl->parse_string(is, ws);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+    copy_to_ptr(s, ws);
+}
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::load(wchar_t * ws){
+    std::wstring twstring;
+    bool result = gimpl->parse_string(is, twstring);
+    if(! result)
+        boost::serialization::throw_exception(
+            xml_archive_exception(xml_archive_exception::xml_archive_parsing_error)
+        );
+    std::memcpy(ws, twstring.c_str(), twstring.size());
+    ws[twstring.size()] = L'\0';
+}
+#endif
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::load_override(class_name_type & t, int){
+    const std::wstring & ws = gimpl->rv.class_name;
+    if(ws.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1)
+        boost::serialization::throw_exception(
+            archive_exception(archive_exception::invalid_class_name)
+        );
+    copy_to_ptr(t, ws);
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_wiarchive_impl<Archive>::init(){
+    gimpl->init(is);
+    this->set_library_version(gimpl->rv.version);
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_wiarchive_impl<Archive>::xml_wiarchive_impl(
+    std::wistream &is_,
+    unsigned int flags
+) :
+    basic_text_iprimitive<std::wistream>(
+        is_, 
+        true // don't change the codecvt - use the one below
+    ),
+    basic_xml_iarchive<Archive>(flags),
+    gimpl(new xml_wgrammar())
+{
+    if(0 == (flags & no_codecvt)){
+        archive_locale.reset(
+            add_facet(
+                std::locale::classic(),
+                new boost::archive::detail::utf8_codecvt_facet
+            )
+        );
+        is.imbue(* archive_locale);
+    }
+    if(0 == (flags & no_header)){
+        BOOST_TRY{
+            this->init();
+        }
+        BOOST_CATCH(...){
+            delete gimpl;
+            #ifndef BOOST_NO_EXCEPTIONS
+                throw; // re-throw
+            #endif
+        }
+        BOOST_CATCH_END
+    }
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_wiarchive_impl<Archive>::~xml_wiarchive_impl(){
+    if(0 == (this->get_flags() & no_header)){
+        BOOST_TRY{
+            gimpl->windup(is);
+        }
+        BOOST_CATCH(...){}
+        BOOST_CATCH_END
+    }
+    delete gimpl;
+}
+
+} // namespace archive
+} // namespace boost
+
+#endif  // BOOST_NO_STD_WSTREAMBUF
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_woarchive_impl.ipp b/deal.II/contrib/boost-1.41.0/include/boost/archive/impl/xml_woarchive_impl.ipp
new file mode 100644 (file)
index 0000000..3bf42bd
--- /dev/null
@@ -0,0 +1,160 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_woarchive_impl.ipp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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>
+#ifndef BOOST_NO_STD_WSTREAMBUF
+
+#include <ostream>
+#include <string>
+#include <algorithm>
+#include <locale>
+
+#include <boost/config.hpp> // msvc 6.0 needs this to suppress warnings 
+                            // for BOOST_DEDUCED_TYPENAME
+#include <cstring> // strlen
+#include <cstdlib> // mbtowc
+#include <cwchar>  // wcslen
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::strlen; 
+    #if ! defined(BOOST_NO_INTRINSIC_WCHAR_T)
+        using ::mbtowc; 
+        using ::wcslen;
+    #endif
+} // namespace std
+#endif
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/iterators/xml_escape.hpp>
+#include <boost/archive/iterators/wchar_from_mb.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+
+#include <boost/archive/add_facet.hpp>
+#include <boost/archive/detail/utf8_codecvt_facet.hpp>
+
+namespace boost {
+namespace archive {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implemenations of functions specific to wide char archives
+
+// copy chars to output escaping to xml and widening characters as we go
+template<class InputIterator>
+void save_iterator(std::wostream &os, InputIterator begin, InputIterator end){
+    typedef iterators::wchar_from_mb<
+        iterators::xml_escape<InputIterator>
+    > xmbtows;
+    std::copy(
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(begin)),
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(end)),
+        boost::archive::iterators::ostream_iterator<wchar_t>(os)
+    );
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_woarchive_impl<Archive>::save(const std::string & s){
+    // note: we don't use s.begin() and s.end() because dinkumware
+    // doesn't have string::value_type defined. So use a wrapper
+    // around these values to implement the definitions.
+    const char * begin = s.data();
+    const char * end = begin + s.size();
+    save_iterator(os, begin, end);
+}
+
+#ifndef BOOST_NO_STD_WSTRING
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_woarchive_impl<Archive>::save(const std::wstring & ws){
+#if 0
+    typedef iterators::xml_escape<std::wstring::const_iterator> xmbtows;
+    std::copy(
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.begin())),
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.end())),
+        boost::archive::iterators::ostream_iterator<wchar_t>(os)
+    );
+#endif
+    typedef iterators::xml_escape<const wchar_t *> xmbtows;
+    std::copy(
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.data())),
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws.data() + ws.size())),
+        boost::archive::iterators::ostream_iterator<wchar_t>(os)
+    );
+}
+#endif //BOOST_NO_STD_WSTRING
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_woarchive_impl<Archive>::save(const char * s){
+   save_iterator(os, s, s + std::strlen(s));
+}
+
+#ifndef BOOST_NO_INTRINSIC_WCHAR_T
+template<class Archive>
+BOOST_WARCHIVE_DECL(void)
+xml_woarchive_impl<Archive>::save(const wchar_t * ws){
+    os << ws;
+    typedef iterators::xml_escape<const wchar_t *> xmbtows;
+    std::copy(
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws)),
+        xmbtows(BOOST_MAKE_PFTO_WRAPPER(ws + std::wcslen(ws))),
+        boost::archive::iterators::ostream_iterator<wchar_t>(os)
+    );
+}
+#endif
+
+template<class Archive>
+BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY())
+xml_woarchive_impl<Archive>::xml_woarchive_impl(
+    std::wostream & os_,
+    unsigned int flags
+) :
+    basic_text_oprimitive<std::wostream>(
+        os_,
+        true // don't change the codecvt - use the one below
+    ),
+    basic_xml_oarchive<Archive>(flags)
+{
+    // Standard behavior is that imbue can be called
+    // a) before output is invoked or
+    // b) after flush has been called.  This prevents one-to-many
+    // transforms (such as one to many transforms from getting
+    // mixed up.  Unfortunately, STLPort doesn't respect b) above
+    // so the restoration of the original archive locale done by
+    // the locale_saver doesn't get processed,
+    // before the current one is destroyed.
+    // so the codecvt doesn't get replaced with the orginal
+    // so closing the stream invokes codecvt::do_unshift
+    // so it crashes because the corresponding locale that contained
+    // the codecvt isn't around any more.
+    // we can hack around this by using a static codecvt that never
+    // gets destroyed.
+    if(0 == (flags & no_codecvt)){
+        boost::archive::detail::utf8_codecvt_facet *pfacet;
+        #if defined(__SGI_STL_PORT)
+            static boost::archive::detail::utf8_codecvt_facet 
+                facet(static_cast<size_t>(1));
+            pfacet = & facet;
+        #else
+            pfacet = new boost::archive::detail::utf8_codecvt_facet;
+        #endif
+        archive_locale.reset(add_facet(std::locale::classic(), pfacet));
+        os.imbue(* archive_locale);
+    }
+    if(0 == (flags & no_header))
+        this->init();
+}
+
+} // namespace archive
+} // namespace boost
+
+#endif //BOOST_NO_STD_WSTREAMBUF
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_exception.hpp
new file mode 100644 (file)
index 0000000..eb2d2e1
--- /dev/null
@@ -0,0 +1,68 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_BASE64_EXCEPTION_HPP
+#define BOOST_ARCHIVE_ITERATORS_BASE64_EXCEPTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// base64_exception.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_EXCEPTIONS
+#include <exception>
+
+#include <cassert>
+
+namespace boost {
+namespace archive {
+namespace iterators {
+
+//////////////////////////////////////////////////////////////////////
+// exceptions thrown by base64s
+//
+class base64_exception : public std::exception
+{
+public:
+    typedef enum {
+        invalid_code,       // attempt to encode a value > 6 bits
+        invalid_character,  // decode a value not in base64 char set
+        other_exception
+    } exception_code;
+    exception_code code;
+
+    base64_exception(exception_code c = other_exception) : code(c)
+    {}
+
+    virtual const char *what( ) const throw( )
+    {
+        const char *msg = "unknown exception code";
+        switch(code){
+        case invalid_code:
+            msg = "attempt to encode a value > 6 bits";
+            break;
+        case invalid_character:
+            msg = "attempt to decode a value not in base64 char set";
+            break;
+        default:
+            assert(false);
+            break;
+        }
+        return msg;
+    }
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif //BOOST_NO_EXCEPTIONS
+#endif //BOOST_ARCHIVE_ITERATORS_ARCHIVE_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_from_binary.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/base64_from_binary.hpp
new file mode 100644 (file)
index 0000000..a46137d
--- /dev/null
@@ -0,0 +1,112 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP
+#define BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// base64_from_binary.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <cstddef> // size_t
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// convert binary integers to base64 characters
+
+namespace detail {
+
+template<class CharType>
+struct from_6_bit {
+    typedef CharType result_type;
+    CharType operator()(CharType t) const{
+        const char * lookup_table = 
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+            "abcdefghijklmnopqrstuvwxyz"
+            "0123456789"
+            "+/";
+        assert(t < 64);
+        return lookup_table[static_cast<size_t>(t)];
+    }
+};
+
+} // namespace detail
+
+// note: what we would like to do is
+// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type>
+//  typedef transform_iterator<
+//      from_6_bit<CharType>,
+//      transform_width<Base, 6, sizeof(Base::value_type) * 8, CharType>
+//  > base64_from_binary;
+// but C++ won't accept this.  Rather than using a "type generator" and
+// using a different syntax, make a derivation which should be equivalent.
+//
+// Another issue addressed here is that the transform_iterator doesn't have
+// a templated constructor.  This makes it incompatible with the dataflow
+// ideal.  This is also addressed here.
+
+//template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type>
+template<
+    class Base, 
+    class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type
+>
+class base64_from_binary : 
+    public transform_iterator<
+        detail::from_6_bit<CharType>,
+        Base
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef transform_iterator<
+        BOOST_DEDUCED_TYPENAME detail::from_6_bit<CharType>,
+        Base
+    > super_t;
+
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    base64_from_binary(BOOST_PFTO_WRAPPER(T) start) :
+        super_t(
+            Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start))),
+            detail::from_6_bit<CharType>()
+        )
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    base64_from_binary(const base64_from_binary & rhs) : 
+        super_t(
+            Base(rhs.base_reference()),
+            detail::from_6_bit<CharType>()
+        )
+    {}
+//    base64_from_binary(){};
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_BASE64_FROM_BINARY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/binary_from_base64.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/binary_from_base64.hpp
new file mode 100644 (file)
index 0000000..b75e0b1
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP
+#define BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// binary_from_base64.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// convert base64 characters to binary data
+
+namespace detail {
+
+template<class CharType>
+struct to_6_bit {
+    typedef CharType result_type;
+    CharType operator()(CharType t) const{
+        const char lookup_table[] = {
+            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+            -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
+            52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
+            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
+            15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
+            -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
+            41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1
+        };
+        // metrowerks trips this assertion - how come?
+        #if ! defined(__MWERKS__)
+        BOOST_STATIC_ASSERT(128 == sizeof(lookup_table));
+        #endif
+        signed char value = -1;
+        if((unsigned)t <= 127)
+            value = lookup_table[(unsigned)t];
+        if(-1 == value)
+            boost::serialization::throw_exception(
+                dataflow_exception(dataflow_exception::invalid_base64_character)
+            );
+        return value;
+    }
+};
+
+} // namespace detail
+
+// note: what we would like to do is
+// template<class Base, class CharType = BOOST_DEDUCED_TYPENAME Base::value_type>
+//  typedef transform_iterator<
+//      from_6_bit<CharType>,
+//      transform_width<Base, 6, sizeof(Base::value_type) * 8, CharType>
+//  > base64_from_binary;
+// but C++ won't accept this.  Rather than using a "type generator" and
+// using a different syntax, make a derivation which should be equivalent.
+//
+// Another issue addressed here is that the transform_iterator doesn't have
+// a templated constructor.  This makes it incompatible with the dataflow
+// ideal.  This is also addressed here.
+
+template<
+    class Base, 
+    class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type
+>
+class binary_from_base64 : public
+    transform_iterator<
+        detail::to_6_bit<CharType>,
+        Base
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef transform_iterator<
+        detail::to_6_bit<CharType>,
+        Base
+    > super_t;
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    binary_from_base64(BOOST_PFTO_WRAPPER(T)  start) :
+        super_t(
+            Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start))), 
+            detail::to_6_bit<CharType>()
+        )
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    binary_from_base64(const binary_from_base64 & rhs) : 
+        super_t(
+            Base(rhs.base_reference()),
+            detail::to_6_bit<CharType>()
+        )
+    {}
+//    binary_from_base64(){};
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_BINARY_FROM_BASE64_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow.hpp
new file mode 100644 (file)
index 0000000..7958482
--- /dev/null
@@ -0,0 +1,105 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP
+#define BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// dataflow.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/int.hpp>
+
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+#include <boost/static_assert.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+// poor man's tri-state
+struct tri_state {
+    enum state_enum {
+        is_false = false,
+        is_true = true,
+        is_indeterminant
+    } m_state;
+    // convert to bool
+    operator bool (){
+        assert(is_indeterminant != m_state);
+        return is_true == m_state ? true : false;
+    }
+    // assign from bool
+    tri_state & operator=(bool rhs) {
+        m_state = rhs ? is_true : is_false;
+        return *this;
+    }
+    tri_state(bool rhs) :
+        m_state(rhs ? is_true : is_false)
+    {}
+    tri_state(state_enum state) :
+        m_state(state)
+    {}
+    bool operator==(const tri_state & rhs) const {
+        return m_state == rhs.m_state;
+    }
+    bool operator!=(const tri_state & rhs) const {
+        return m_state != rhs.m_state;
+    }
+};
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// implement functions common to dataflow iterators
+template<class Derived>
+class dataflow {
+    bool m_eoi;
+protected:
+    // test for iterator equality
+    tri_state equal(const Derived & rhs) const {
+        if(m_eoi && rhs.m_eoi)
+            return true;
+        if(m_eoi || rhs.m_eoi)
+            return false;
+        return tri_state(tri_state::is_indeterminant);
+    }
+    void eoi(bool tf){
+        m_eoi = tf;
+    }
+    bool eoi() const {
+        return m_eoi;
+    }
+public:
+    dataflow(bool tf) :
+        m_eoi(tf)
+    {}
+    dataflow() : // used for iterator end
+        m_eoi(true)
+    {}
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_DATAFLOW_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/dataflow_exception.hpp
new file mode 100644 (file)
index 0000000..765661e
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP
+#define BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// dataflow_exception.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_EXCEPTIONS
+#include <exception>
+#endif //BOOST_NO_EXCEPTIONS
+
+#include <cassert>
+
+namespace boost {
+namespace archive {
+namespace iterators {
+
+//////////////////////////////////////////////////////////////////////
+// exceptions thrown by dataflows
+//
+class dataflow_exception : public std::exception
+{
+public:
+    typedef enum {
+        invalid_6_bitcode,
+        invalid_base64_character,
+        invalid_xml_escape_sequence,
+        comparison_not_permitted,
+        invalid_conversion,
+        other_exception
+    } exception_code;
+    exception_code code;
+
+    dataflow_exception(exception_code c = other_exception) : code(c)
+    {}
+
+    virtual const char *what( ) const throw( )
+    {
+        const char *msg = "unknown exception code";
+        switch(code){
+        case invalid_6_bitcode:
+            msg = "attempt to encode a value > 6 bits";
+            break;
+        case invalid_base64_character:
+            msg = "attempt to decode a value not in base64 char set";
+            break;
+        case invalid_xml_escape_sequence:
+            msg = "invalid xml escape_sequence";
+            break;
+        case comparison_not_permitted:
+            msg = "cannot invoke iterator comparison now";
+            break;
+        case invalid_conversion:
+            msg = "invalid multbyte/wide char conversion";
+            break;
+        default:
+            assert(false);
+            break;
+        }
+        return msg;
+    }
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif //BOOST_ARCHIVE_ITERATORS_DATAFLOW_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/escape.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/escape.hpp
new file mode 100644 (file)
index 0000000..3fe64fa
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP
+#define BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// escape.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// insert escapes into text
+
+template<class Derived, class Base>
+class escape : 
+    public boost::iterator_adaptor<
+        Derived, 
+        Base, 
+        BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type,
+        single_pass_traversal_tag,
+        BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type
+    >
+{
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type base_value_type;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_reference<Base>::type reference_type;
+    friend class boost::iterator_core_access;
+
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        Derived, 
+        Base, 
+        base_value_type,
+        single_pass_traversal_tag,
+        base_value_type
+    > super_t;
+
+    typedef escape<Derived, Base> this_t;
+
+    void dereference_impl() {
+        m_current_value = static_cast<Derived *>(this)->fill(m_bnext, m_bend);
+        m_full = true;
+    }
+
+    //Access the value referred to 
+    reference_type dereference() const {
+        if(!m_full)
+            const_cast<this_t *>(this)->dereference_impl();
+        return m_current_value;
+    }
+
+    bool equal(const this_t & rhs) const {
+        if(m_full){
+            if(! rhs.m_full)
+                const_cast<this_t *>(& rhs)->dereference_impl();
+        }
+        else{
+            if(rhs.m_full)
+                const_cast<this_t *>(this)->dereference_impl();
+        }
+        if(m_bnext != rhs.m_bnext)
+            return false;
+        if(this->base_reference() != rhs.base_reference())
+            return false;
+        return true;
+    }
+
+   void increment(){
+        if(++m_bnext < m_bend){
+            m_current_value = *m_bnext;
+            return;
+        }
+        ++(this->base_reference());
+        m_bnext = NULL;
+        m_bend = NULL;
+        m_full = false;
+    }
+
+    // buffer to handle pending characters
+    const base_value_type *m_bnext;
+    const base_value_type *m_bend;
+    bool m_full;
+    BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type m_current_value;
+public:
+    escape(Base base) : 
+        super_t(base),
+        m_bnext(NULL),
+        m_bend(NULL),
+        m_full(false)
+    {
+    }
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_ESCAPE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/head_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/head_iterator.hpp
new file mode 100644 (file)
index 0000000..279b202
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
+#define BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// head_iterator.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost {
+namespace archive {
+namespace iterators {
+
+template<class Predicate, class Base>
+class head_iterator
+    : public boost::iterator_adaptor<
+        head_iterator<Predicate, Base>,
+        Base,
+        use_default,
+        single_pass_traversal_tag
+    >
+{
+private:
+    friend class iterator_core_access;
+    typedef boost::iterator_adaptor<
+        head_iterator<Predicate, Base>,
+        Base,
+        use_default,
+        single_pass_traversal_tag
+    > super_t;
+
+    typedef head_iterator<Predicate, Base> this_t;
+    typedef BOOST_DEDUCED_TYPENAME super_t::value_type value_type;
+    typedef BOOST_DEDUCED_TYPENAME super_t::reference reference_type;
+
+    reference_type dereference_impl(){
+        if(! m_end){
+            while(! m_predicate(* this->base_reference()))
+                ++ this->base_reference();
+            m_end = true;
+        }
+        return * this->base_reference();
+    }
+
+    reference_type dereference() const {
+        return const_cast<this_t *>(this)->dereference_impl();
+    }
+
+    void increment(){
+        ++base_reference();
+    }
+    Predicate m_predicate;
+    bool m_end;
+public:
+    template<class T>
+    head_iterator(Predicate f, T start) : 
+        super_t(Base(start)), 
+        m_predicate(f),
+        m_end(false)
+    {}
+
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_HEAD_ITERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/insert_linebreaks.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/insert_linebreaks.hpp
new file mode 100644 (file)
index 0000000..feb8c5b
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP
+#define BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// insert_linebreaks.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ using ::memcpy; }
+#endif
+
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// insert line break every N characters
+template<
+    class Base, 
+    int N, 
+    class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type
+>
+class insert_linebreaks : 
+    public iterator_adaptor<
+        insert_linebreaks<Base, N, CharType>,
+        Base,
+        CharType,
+        single_pass_traversal_tag,
+        CharType
+    >
+{
+private:
+    friend class boost::iterator_core_access;
+    typedef iterator_adaptor<
+        insert_linebreaks<Base, N, CharType>,
+        Base,
+        CharType,
+        single_pass_traversal_tag,
+        CharType
+    > super_t;
+
+    bool equal(const insert_linebreaks<Base, N, CharType> & rhs) const {
+        return
+//            m_count == rhs.m_count
+//            && base_reference() == rhs.base_reference()
+            this->base_reference() == rhs.base_reference()
+        ;
+    }
+
+    void increment() {
+        if(m_count == N){
+            m_count = 0;
+            return;
+        }
+        ++m_count;
+        ++(this->base_reference());
+    }
+    CharType dereference() const {
+        if(m_count == N)
+            return '\n';
+        return * (this->base_reference());
+    }
+    unsigned int m_count;
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    insert_linebreaks(BOOST_PFTO_WRAPPER(T)  start) :
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start)))),
+        m_count(0)
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    insert_linebreaks(const insert_linebreaks & rhs) : 
+        super_t(rhs.base_reference()),
+        m_count(rhs.m_count)
+    {}
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_INSERT_LINEBREAKS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/istream_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/istream_iterator.hpp
new file mode 100644 (file)
index 0000000..ac3568a
--- /dev/null
@@ -0,0 +1,95 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP
+#define BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// istream_iterator.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// note: this is a custom version of the standard istream_iterator.
+// This is necessary as the standard version doesn't work as expected
+// for wchar_t based streams on systems for which wchar_t not a true
+// type but rather a synonym for some integer type.
+
+#include <cstddef> // NULL
+#include <istream>
+#include <boost/iterator/iterator_facade.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+// given a type, make an input iterator based on a pointer to that type
+template<class Elem = char>
+class istream_iterator :  
+    public boost::iterator_facade<
+        istream_iterator<Elem>,
+        Elem,
+        std::input_iterator_tag,
+        Elem
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef istream_iterator this_t ;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_facade<
+        istream_iterator<Elem>,
+        Elem,
+        std::input_iterator_tag,
+        Elem
+    > super_t;
+    typedef BOOST_DEDUCED_TYPENAME std::basic_istream<Elem> istream_type;
+    //Access the value referred to 
+    Elem dereference() const {
+        return m_current_value;
+    }
+
+    bool equal(const this_t & rhs) const {
+        // note: only  works for comparison against end of stream
+        return m_istream == rhs.m_istream;
+    }
+
+    void increment(){
+        if(NULL != m_istream){
+            m_current_value = m_istream->get();
+            if(! m_istream->good()){
+                const_cast<this_t *>(this)->m_istream = NULL;
+            }
+        }
+    }
+
+    istream_type *m_istream;
+    Elem m_current_value;
+public:
+    istream_iterator(istream_type & is) :
+        m_istream(& is)
+    {
+        increment();
+    }
+
+    istream_iterator() :
+        m_istream(NULL)
+    {}
+
+    istream_iterator(const istream_iterator<Elem> & rhs) :
+        m_istream(rhs.m_istream),
+        m_current_value(rhs.m_current_value)
+    {}
+
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_ISTREAM_ITERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/mb_from_wchar.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/mb_from_wchar.hpp
new file mode 100644 (file)
index 0000000..22ee950
--- /dev/null
@@ -0,0 +1,136 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP
+#define BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// mb_from_wchar.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cstddef> // size_t
+#include <cstdlib> // for wctomb()
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+    using ::wctomb;
+} // namespace std
+#endif
+
+#include <boost/serialization/pfto.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// class used by text archives to translate wide strings and to char
+// strings of the currently selected locale
+template<class Base>    // the input iterator
+class mb_from_wchar
+    : public boost::iterator_adaptor<
+        mb_from_wchar<Base>, 
+        Base, 
+        wchar_t,
+        single_pass_traversal_tag,
+        char
+    >
+{
+    friend class boost::iterator_core_access;
+
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        mb_from_wchar<Base>, 
+        Base, 
+        wchar_t,
+        single_pass_traversal_tag,
+        char
+    > super_t;
+
+    typedef mb_from_wchar<Base> this_t;
+
+    char dereference_impl() {
+        if(! m_full){
+            fill();
+            m_full = true;
+        }
+        return m_buffer[m_bnext];
+    }
+    char dereference() const {
+        return (const_cast<this_t *>(this))->dereference_impl();
+    }
+
+    // test for iterator equality
+    bool equal(const mb_from_wchar<Base> & rhs) const {
+        // once the value is filled, the base_reference has been incremented
+        // so don't permit comparison anymore.
+        return 
+            0 == m_bend
+            && 0 == m_bnext
+            && this->base_reference() == rhs.base_reference()
+        ;
+    }
+
+    void fill(){
+        wchar_t value = * this->base_reference();
+        #if (defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 3) \
+        || ((__MINGW32_MAJOR_VERSION == 3) && (__MINGW32_MINOR_VERSION >= 8))))
+        m_bend = std::wcrtomb(m_buffer, value, 0);
+        #else
+        m_bend = std::wctomb(m_buffer, value);
+        #endif
+        assert(-1 != m_bend);
+        assert((std::size_t)m_bend <= sizeof(m_buffer));
+        assert(m_bend > 0);
+        m_bnext = 0;
+    }
+
+    void increment(){
+        if(++m_bnext < m_bend)
+            return;
+        m_bend = 
+        m_bnext = 0;
+        ++(this->base_reference());
+        m_full = false;
+    }
+
+    // buffer to handle pending characters
+    int m_bend;
+    int m_bnext;
+    char m_buffer[9];
+    bool m_full;
+
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    mb_from_wchar(BOOST_PFTO_WRAPPER(T) start) :
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start)))),
+        m_bend(0),
+        m_bnext(0),
+        m_full(false)
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    mb_from_wchar(const mb_from_wchar & rhs) : 
+        super_t(rhs.base_reference()),
+        m_bend(rhs.m_bend),
+        m_bnext(rhs.m_bnext),
+        m_full(rhs.m_full)
+    {}
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_MB_FROM_WCHAR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/ostream_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/ostream_iterator.hpp
new file mode 100644 (file)
index 0000000..7c3203f
--- /dev/null
@@ -0,0 +1,83 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP
+#define BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// ostream_iterator.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// note: this is a custom version of the standard ostream_iterator.
+// This is necessary as the standard version doesn't work as expected
+// for wchar_t based streams on systems for which wchar_t not a true
+// type but rather a synonym for some integer type.
+
+#include <ostream>
+#include <boost/iterator/iterator_facade.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+// given a type, make an input iterator based on a pointer to that type
+template<class Elem>
+class ostream_iterator :  
+    public boost::iterator_facade<
+        ostream_iterator<Elem>,
+        Elem,
+        std::output_iterator_tag,
+        ostream_iterator<Elem> &
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef ostream_iterator this_t ;
+    typedef Elem char_type;
+    typedef std::basic_ostream<char_type> ostream_type;
+
+    //emulate the behavior of std::ostream 
+    ostream_iterator & dereference() const {
+        return const_cast<ostream_iterator &>(*this);
+    }
+    bool equal(const this_t & rhs) const {
+        return m_ostream == rhs.m_ostream;
+    }
+    void increment(){}
+protected:
+    ostream_type *m_ostream;
+    void put_val(char_type e){
+        if(NULL != m_ostream){
+            m_ostream->put(e);
+            if(! m_ostream->good())
+                m_ostream = NULL;
+        }
+    }
+public:
+    this_t & operator=(char_type c){
+        put_val(c);
+        return *this;
+    }
+    ostream_iterator(ostream_type & os) :
+        m_ostream (& os)
+    {}
+    ostream_iterator() :
+        m_ostream (NULL)
+    {}
+    ostream_iterator(const ostream_iterator & rhs) :
+        m_ostream (rhs.m_ostream)
+    {}
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_OSTREAM_ITERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/remove_whitespace.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/remove_whitespace.hpp
new file mode 100644 (file)
index 0000000..c5e581d
--- /dev/null
@@ -0,0 +1,169 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP
+#define BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// remove_whitespace.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/filter_iterator.hpp>
+
+//#include <boost/detail/workaround.hpp>
+//#if ! BOOST_WORKAROUND(BOOST_MSVC, <=1300)
+
+// here is the default standard implementation of the functor used
+// by the filter iterator to remove spaces.  Unfortunately usage
+// of this implementation in combination with spirit trips a bug
+// VC 6.5.  The only way I can find to work around it is to 
+// implement a special non-standard version for this platform
+
+#ifndef BOOST_NO_CWCTYPE
+#include <cwctype> // iswspace
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ using ::iswspace; }
+#endif
+#endif
+
+#include <cctype> // isspace
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ using ::isspace; }
+#endif
+
+#if defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+// this is required for the RW STL on Linux and Tru64.
+#undef isspace
+#undef iswspace
+#endif
+
+//#endif // BOOST_WORKAROUND
+
+namespace { // anonymous
+
+template<class CharType>
+struct remove_whitespace_predicate;
+
+template<>
+struct remove_whitespace_predicate<char>
+{
+    bool operator()(unsigned char t){
+        return ! std::isspace(t);
+    }
+};
+
+#ifndef BOOST_NO_CWCHAR
+template<>
+struct remove_whitespace_predicate<wchar_t>
+{
+    bool operator()(wchar_t t){
+        return ! std::iswspace(t);
+    }
+};
+#endif
+
+} // namespace anonymous
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// convert base64 file data (including whitespace and padding) to binary
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+// custom version of filter iterator which doesn't look ahead further than
+// necessary
+
+template<class Predicate, class Base>
+class filter_iterator
+    : public boost::iterator_adaptor<
+        filter_iterator<Predicate, Base>,
+        Base,
+        use_default,
+        single_pass_traversal_tag
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        filter_iterator<Predicate, Base>,
+        Base,
+        use_default,
+        single_pass_traversal_tag
+    > super_t;
+    typedef filter_iterator<Predicate, Base> this_t;
+    typedef BOOST_DEDUCED_TYPENAME super_t::reference reference_type;
+
+    reference_type dereference_impl(){
+        if(! m_full){
+            while(! m_predicate(* this->base_reference()))
+                ++(this->base_reference());
+            m_full = true;
+        }
+        return * this->base_reference();
+    }
+
+    reference_type dereference() const {
+        return const_cast<this_t *>(this)->dereference_impl();
+    }
+
+    Predicate m_predicate;
+    bool m_full;
+public:
+    // note: this function is public only because comeau compiler complained
+    // I don't know if this is because the compiler is wrong or what
+    void increment(){
+        m_full = false;
+        ++(this->base_reference());
+    }
+    filter_iterator(Base start) : 
+        super_t(start), 
+        m_full(false)
+    {}
+    filter_iterator(){}
+};
+
+template<class Base>
+class remove_whitespace : 
+    public filter_iterator<
+        remove_whitespace_predicate<BOOST_DEDUCED_TYPENAME Base::value_type>,
+        Base
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef filter_iterator<
+        remove_whitespace_predicate<BOOST_DEDUCED_TYPENAME Base::value_type>,
+        Base
+    > super_t;
+public:
+//    remove_whitespace(){} // why is this needed?
+    // make composible buy using templated constructor
+    template<class T>
+    remove_whitespace(BOOST_PFTO_WRAPPER(T) start) :
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start))))
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    remove_whitespace(const remove_whitespace & rhs) : 
+        super_t(rhs.base_reference())
+    {}
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_REMOVE_WHITESPACE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/transform_width.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/transform_width.hpp
new file mode 100644 (file)
index 0000000..c2e9bee
--- /dev/null
@@ -0,0 +1,168 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP
+#define BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// transform_width.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// iterator which takes elements of x bits and returns elements of y bits.
+// used to change streams of 8 bit characters into streams of 6 bit characters.
+// and vice-versa for implementing base64 encodeing/decoding. Be very careful
+// when using and end iterator.  end is only reliable detected when the input
+// stream length is some common multiple of x and y.  E.G. Base64 6 bit
+// character and 8 bit bytes. Lowest common multiple is 24 => 4 6 bit characters
+// or 3 8 bit characters
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME & PTFO
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/iterator/iterator_traits.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// class used by text archives to translate char strings to wchar_t
+// strings of the currently selected locale
+template<
+    class Base, 
+    int BitsOut, 
+    int BitsIn, 
+    class CharType = BOOST_DEDUCED_TYPENAME boost::iterator_value<Base>::type // output character
+>
+class transform_width : 
+    public boost::iterator_adaptor<
+        transform_width<Base, BitsOut, BitsIn, CharType>,
+        Base,
+        CharType,
+        single_pass_traversal_tag,
+        CharType
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        transform_width<Base, BitsOut, BitsIn, CharType>,
+        Base,
+        CharType,
+        single_pass_traversal_tag,
+        CharType
+    > super_t;
+
+    typedef transform_width<Base, BitsOut, BitsIn, CharType> this_t;
+    typedef BOOST_DEDUCED_TYPENAME iterator_value<Base>::type base_value_type;
+
+    CharType fill();
+
+    CharType dereference_impl(){
+        if(! m_full){
+            m_current_value = fill();
+            m_full = true;
+        }
+        return m_current_value;
+    }
+
+    CharType dereference() const {
+        return const_cast<this_t *>(this)->dereference_impl();
+    }
+
+    // test for iterator equality
+    bool equal(const this_t & rhs) const {
+        return
+            this->base_reference() == rhs.base_reference();
+        ;
+    }
+
+    void increment(){
+        m_displacement += BitsOut;
+
+        while(m_displacement >= BitsIn){
+            m_displacement -= BitsIn;
+            if(0 == m_displacement)
+                m_bufferfull = false;
+            if(! m_bufferfull){
+                // note: suspect that this is not invoked for borland
+                ++(this->base_reference());
+            }
+        }
+        m_full = false;
+    }
+
+    CharType m_current_value;
+    // number of bits left in current input character buffer
+    unsigned int m_displacement;
+    base_value_type m_buffer;
+    // flag to current output character is ready - just used to save time
+    bool m_full;
+    // flag to indicate that m_buffer has data
+    bool m_bufferfull;
+
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    transform_width(BOOST_PFTO_WRAPPER(T) start) : 
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start)))),
+        m_displacement(0),
+        m_full(false),
+        m_bufferfull(false)
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    transform_width(const transform_width & rhs) : 
+        super_t(rhs.base_reference()),
+        m_current_value(rhs.m_current_value),
+        m_displacement(rhs.m_displacement),
+        m_buffer(rhs.m_buffer),
+        m_full(rhs.m_full),
+        m_bufferfull(rhs.m_bufferfull)
+    {}
+};
+
+template<class Base, int BitsOut, int BitsIn, class CharType>
+CharType transform_width<Base, BitsOut, BitsIn, CharType>::fill(){
+    CharType retval = 0;
+    unsigned int missing_bits = BitsOut;
+    for(;;){
+        unsigned int bcount;
+        if(! m_bufferfull){
+            m_buffer = * this->base_reference();
+            m_bufferfull = true;
+            bcount = BitsIn;
+        }
+        else
+            bcount = BitsIn - m_displacement;
+        unsigned int i = (std::min)(bcount, missing_bits);
+        // shift interesting bits to least significant position
+        unsigned int j = m_buffer >> (bcount - i);
+        // strip off uninteresting bits
+        // (note presumption of two's complement arithmetic)
+        j &= ~(-(1 << i));
+        // append then interesting bits to the output value
+        retval <<= i;
+        retval |= j;
+        missing_bits -= i;
+        if(0 == missing_bits)
+            break;
+        // note: suspect that this is not invoked for borland 5.51
+        ++(this->base_reference());
+        m_bufferfull = false;
+    }
+    return retval;
+}
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_TRANSFORM_WIDTH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/unescape.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/unescape.hpp
new file mode 100644 (file)
index 0000000..e709138
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP
+#define BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// unescape.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#include <boost/iterator/iterator_adaptor.hpp>
+//#include <boost/iterator/iterator_traits.hpp>
+#include <boost/pointee.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// class used by text archives to translate char strings to wchar_t
+// strings of the currently selected locale
+template<class Derived, class Base>
+class unescape 
+    : public boost::iterator_adaptor<
+        unescape<Derived, Base>,
+        Base, 
+        BOOST_DEDUCED_TYPENAME pointee<Base>::type,
+        single_pass_traversal_tag,
+        BOOST_DEDUCED_TYPENAME pointee<Base>::type
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        unescape<Derived, Base>, 
+        Base, 
+        BOOST_DEDUCED_TYPENAME pointee<Base>::type,
+        single_pass_traversal_tag,
+        BOOST_DEDUCED_TYPENAME pointee<Base>::type
+    > super_t;
+
+    typedef unescape<Derived, Base> this_t;
+    typedef BOOST_DEDUCED_TYPENAME super_t::reference reference_type;
+public:
+    // gcc 3.4.1 - linux required that this be public
+    typedef BOOST_DEDUCED_TYPENAME super_t::value_type value_type;
+private:
+
+    reference_type dereference_impl() {
+        if(! m_full){
+            m_current_value = static_cast<Derived *>(this)->drain();
+            m_full = true;
+        }
+        return m_current_value;
+    }
+
+    reference_type dereference() const {
+        return const_cast<this_t *>(this)->dereference_impl();
+    }
+
+    // value_type is const char - can't be const fix later
+    value_type m_current_value;
+    bool m_full;
+
+    void increment(){
+        ++(this->base_reference());
+        dereference_impl();
+        m_full = false;
+    };
+
+public:
+
+    unescape(Base base) : 
+        super_t(base),
+        m_full(false)
+    {}
+
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_UNESCAPE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/wchar_from_mb.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/wchar_from_mb.hpp
new file mode 100644 (file)
index 0000000..18f0622
--- /dev/null
@@ -0,0 +1,129 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP
+#define BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// wchar_from_mb.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+#include <cctype>
+#include <cstddef> // size_t
+#include <cstdlib> // mblen
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::mblen; 
+    using ::mbtowc; 
+} // namespace std
+#endif
+
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// class used by text archives to translate char strings to wchar_t
+// strings of the currently selected locale
+template<class Base>
+class wchar_from_mb 
+    : public boost::iterator_adaptor<
+        wchar_from_mb<Base>, 
+        Base, 
+        wchar_t,
+        single_pass_traversal_tag,
+        wchar_t
+    >
+{
+    friend class boost::iterator_core_access;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_adaptor<
+        wchar_from_mb<Base>, 
+        Base, 
+        wchar_t,
+        single_pass_traversal_tag,
+        wchar_t
+    > super_t;
+
+    typedef wchar_from_mb<Base> this_t;
+
+    wchar_t drain();
+
+    wchar_t dereference_impl() {
+        if(! m_full){
+            m_current_value = drain();
+            m_full = true;
+        }
+        return m_current_value;
+    }
+
+    wchar_t dereference() const {
+        return const_cast<this_t *>(this)->dereference_impl();
+    }
+
+    void increment(){
+        dereference_impl();
+        m_full = false;
+        ++(this->base_reference());
+    };
+
+    wchar_t m_current_value;
+    bool m_full;
+
+public:
+    // make composible buy using templated constructor
+    template<class T>
+    wchar_from_mb(BOOST_PFTO_WRAPPER(T) start) : 
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start)))),
+        m_full(false)
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    wchar_from_mb(const wchar_from_mb & rhs) : 
+        super_t(rhs.base_reference()),
+        m_full(rhs.m_full)
+    {}
+};
+
+template<class Base>
+wchar_t wchar_from_mb<Base>::drain(){
+    char buffer[9];
+    char * bptr = buffer;
+    char val;
+    for(std::size_t i = 0; i++ < (unsigned)MB_CUR_MAX;){
+        val = * this->base_reference();
+        *bptr++ = val;
+        int result = std::mblen(buffer, i);
+        if(-1 != result)
+            break;
+        ++(this->base_reference());
+    }
+    wchar_t retval;
+    int result = std::mbtowc(& retval, buffer, MB_CUR_MAX);
+    if(0 >= result)
+        boost::serialization::throw_exception(iterators::dataflow_exception(
+            iterators::dataflow_exception::invalid_conversion
+        ));
+    return retval;
+}
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_WCHAR_FROM_MB_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_escape.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_escape.hpp
new file mode 100644 (file)
index 0000000..8eb87f4
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP
+#define BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_escape.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/iterators/escape.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// insert escapes into xml text
+
+template<class Base>
+class xml_escape 
+    : public escape<xml_escape<Base>, Base>
+{
+    friend class boost::iterator_core_access;
+
+    typedef escape<xml_escape<Base>, Base> super_t;
+
+public:
+    char fill(const char * & bstart, const char * & bend);
+    wchar_t fill(const wchar_t * & bstart, const wchar_t * & bend);
+
+    template<class T>
+    xml_escape(BOOST_PFTO_WRAPPER(T) start) :
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start))))
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    xml_escape(const xml_escape & rhs) : 
+        super_t(rhs.base_reference())
+    {}
+};
+
+template<class Base>
+char xml_escape<Base>::fill(
+    const char * & bstart, 
+    const char * & bend
+){
+    char current_value = * this->base_reference();
+    switch(current_value){
+    case '<':
+        bstart = "&lt;";
+        bend = bstart + 4;
+        break;
+    case '>':
+        bstart = "&gt;";
+        bend = bstart + 4;
+        break;
+    case '&':
+        bstart = "&amp;";
+        bend = bstart + 5;
+        break;
+    case '"':
+        bstart = "&quot;";
+        bend = bstart + 6;
+        break;
+    case '\'':
+        bstart = "&apos;";
+        bend = bstart + 6;
+        break;
+    default:
+        return current_value;
+    }
+    return *bstart;
+}
+
+template<class Base>
+wchar_t xml_escape<Base>::fill(
+    const wchar_t * & bstart, 
+    const wchar_t * & bend
+){
+    wchar_t current_value = * this->base_reference();
+    switch(current_value){
+    case '<':
+        bstart = L"&lt;";
+        bend = bstart + 4;
+        break;
+    case '>':
+        bstart = L"&gt;";
+        bend = bstart + 4;
+        break;
+    case '&':
+        bstart = L"&amp;";
+        bend = bstart + 5;
+        break;
+    case '"':
+        bstart = L"&quot;";
+        bend = bstart + 6;
+        break;
+    case '\'':
+        bstart = L"&apos;";
+        bend = bstart + 6;
+        break;
+    default:
+        return current_value;
+    }
+    return *bstart;
+}
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_XML_ESCAPE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape.hpp
new file mode 100644 (file)
index 0000000..4272c97
--- /dev/null
@@ -0,0 +1,118 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP
+#define BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_unescape.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/pfto.hpp>
+
+#include <boost/archive/iterators/unescape.hpp>
+#include <boost/archive/iterators/dataflow_exception.hpp>
+
+namespace boost { 
+namespace archive {
+namespace iterators {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// replace &??? xml escape sequences with the corresponding characters
+template<class Base>
+class xml_unescape 
+    : public unescape<xml_unescape<Base>, Base>
+{
+    friend class boost::iterator_core_access;
+    typedef xml_unescape<Base> this_t;
+    typedef unescape<this_t, Base> super_t;
+    typedef BOOST_DEDUCED_TYPENAME boost::iterator_reference<this_t> reference_type;
+
+    reference_type dereference() const {
+        return unescape<xml_unescape<Base>, Base>::dereference();
+    }
+public:
+    void drain_residue(const char *literal);
+    int drain();
+
+    template<class T>
+    xml_unescape(BOOST_PFTO_WRAPPER(T) start) : 
+        super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast<T>(start))))
+    {}
+    // intel 7.1 doesn't like default copy constructor
+    xml_unescape(const xml_unescape & rhs) : 
+        super_t(rhs.base_reference())
+    {}
+};
+
+template<class Base>
+void xml_unescape<Base>::drain_residue(const char * literal){
+    do{
+        if(* literal != * ++(this->base_reference()))
+            boost::serialization::throw_exception(
+                dataflow_exception(
+                    dataflow_exception::invalid_xml_escape_sequence
+                )
+            );
+    }
+    while('\0' != * ++literal);
+}
+
+// note key constraint on this function is that can't "look ahead" any
+// more than necessary into base iterator.  Doing so would alter the base
+// iterator refenence which would make subsequent iterator comparisons
+// incorrect and thereby break the composiblity of iterators.
+template<class Base>
+int xml_unescape<Base>::drain(){
+    int retval = * this->base_reference();
+    if('&' != retval){
+        return retval;
+    }
+    retval = * ++(this->base_reference());
+    switch(retval){
+    case 'l': // &lt;
+        drain_residue("t;");
+        retval = '<';
+        break;
+    case 'g': // &gt;
+        drain_residue("t;");
+        retval = '>';
+        break;
+    case 'a':
+        retval = * ++(this->base_reference());
+        switch(retval){
+        case 'p': // &apos;
+            drain_residue("os;");
+            retval = '\'';
+            break;
+        case 'm': // &amp;
+            drain_residue("p;");
+            retval = '&';
+            break;
+        }
+        break;
+    case 'q':
+        drain_residue("uot;");
+        retval = '"';
+        break;
+    }
+    return retval;
+}
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif // BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/iterators/xml_unescape_exception.hpp
new file mode 100644 (file)
index 0000000..a141737
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP
+#define BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_unescape_exception.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifndef BOOST_NO_EXCEPTIONS
+#include <exception>
+
+#include <cassert>
+
+namespace boost {
+namespace archive {
+namespace iterators {
+
+//////////////////////////////////////////////////////////////////////
+// exceptions thrown by xml_unescapes
+//
+class xml_unescape_exception : public std::exception
+{
+public:
+    xml_unescape_exception()
+    {}
+
+    virtual const char *what( ) const throw( )
+    {
+        return "xml contained un-recognized escape code";
+    }
+};
+
+} // namespace iterators
+} // namespace archive
+} // namespace boost
+
+#endif //BOOST_NO_EXCEPTIONS
+#endif //BOOST_ARCHIVE_ITERATORS_XML_UNESCAPE_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_iarchive.hpp
new file mode 100644 (file)
index 0000000..c14ad5a
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_binary_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_binary_iarchive : 
+    public detail::polymorphic_iarchive_route<naked_binary_iarchive>
+{
+public:
+    polymorphic_binary_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_binary_iarchive>(is, flags)
+    {}
+    ~polymorphic_binary_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_binary_iarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_BINARY_IARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_binary_oarchive.hpp
new file mode 100644 (file)
index 0000000..a66ebdd
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_binary_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+typedef detail::polymorphic_oarchive_route<
+    binary_oarchive_impl<
+        naked_binary_oarchive, 
+        std::ostream::char_type, 
+        std::ostream::traits_type
+    >
+ > polymorphic_binary_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_binary_oarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_BINARY_OARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_iarchive.hpp
new file mode 100644 (file)
index 0000000..8506062
--- /dev/null
@@ -0,0 +1,194 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // std::size_t
+#include <climits> // ULONG_MAX 
+#include <string>
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+    using ::size_t;
+} // namespace std
+#endif
+
+#include <boost/cstdint.hpp>
+
+#include <boost/serialization/pfto.hpp>
+#include <boost/archive/detail/iserializer.hpp>
+#include <boost/archive/detail/interface_iarchive.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/decl.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+// determine if its necessary to handle (u)int64_t specifically
+// i.e. that its not a synonym for (unsigned) long
+// if there is no 64 bit int or if its the same as a long
+// we shouldn't define separate functions for int64 data types.
+#if defined(BOOST_NO_INT64_T)
+    #define BOOST_NO_INTRINSIC_INT64_T
+#else 
+    #if defined(ULLONG_MAX)  
+        #if(ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #elif defined(ULONG_MAX)  
+        #if(ULONG_MAX != 0xffffffff && ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #else   
+        #define BOOST_NO_INTRINSIC_INT64_T  
+    #endif  
+#endif
+
+namespace boost {
+template<class T>
+class shared_ptr;
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+namespace archive {
+namespace detail {
+    class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive;
+    class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_iarchive;
+}
+
+class polymorphic_iarchive;
+
+class polymorphic_iarchive_impl :
+    public detail::interface_iarchive<polymorphic_iarchive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<polymorphic_iarchive>;
+    friend class load_access;
+#endif
+    // primitive types the only ones permitted by polymorphic archives
+    virtual void load(bool & t) = 0;
+
+    virtual void load(char & t) = 0;
+    virtual void load(signed char & t) = 0;
+    virtual void load(unsigned char & t) = 0;
+    #ifndef BOOST_NO_CWCHAR
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    virtual void load(wchar_t & t) = 0;
+    #endif
+    #endif
+    virtual void load(short & t) = 0;
+    virtual void load(unsigned short & t) = 0;
+    virtual void load(int & t) = 0;
+    virtual void load(unsigned int & t) = 0;
+    virtual void load(long & t) = 0;
+    virtual void load(unsigned long & t) = 0;
+
+    #if !defined(BOOST_NO_INTRINSIC_INT64_T)
+    virtual void load(boost::int64_t & t) = 0;
+    virtual void load(boost::uint64_t & t) = 0;
+    #endif
+    virtual void load(float & t) = 0;
+    virtual void load(double & t) = 0;
+
+    // string types are treated as primitives
+    virtual void load(std::string & t) = 0;
+    #ifndef BOOST_NO_STD_WSTRING
+    virtual void load(std::wstring & t) = 0;
+    #endif
+
+    // used for xml and other tagged formats
+    virtual void load_start(const char * name) = 0;
+    virtual void load_end(const char * name) = 0;
+    virtual void register_basic_serializer(const detail::basic_iserializer & bis) = 0;
+
+    // msvc and borland won't automatically pass these to the base class so
+    // make it explicit here
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int)
+    {
+        archive::load(* this->This(), t);
+    }
+    // special treatment for name-value pairs.
+    template<class T>
+    void load_override(
+                #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+                const
+                #endif
+                boost::serialization::nvp<T> & t,
+                int
+        ){
+        load_start(t.name());
+        archive::load(* this->This(), t.value());
+        load_end(t.name());
+    }
+protected:
+    virtual ~polymorphic_iarchive_impl(){};
+public:
+    // utility function implemented by all legal archives
+    virtual void set_library_version(unsigned int archive_library_version) = 0;
+    virtual unsigned int get_library_version() const = 0;
+    virtual unsigned int get_flags() const = 0;
+    virtual void delete_created_pointers() = 0;
+    virtual void reset_object_address(
+        const void * new_address,
+        const void * old_address
+    ) = 0;
+
+    virtual void load_binary(void * t, std::size_t size) = 0;
+
+    // these are used by the serialization library implementation.
+    virtual void load_object(
+        void *t,
+        const detail::basic_iserializer & bis
+    ) = 0;
+    virtual const detail::basic_pointer_iserializer * load_pointer(
+        void * & t,
+        const detail::basic_pointer_iserializer * bpis_ptr
+    ) = 0;
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_iarchive : 
+    public polymorphic_iarchive_impl,
+    public detail::shared_ptr_helper
+{
+public:
+    virtual ~polymorphic_iarchive(){};
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_iarchive)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_oarchive.hpp
new file mode 100644 (file)
index 0000000..19aedf5
--- /dev/null
@@ -0,0 +1,174 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t
+#include <climits> // ULONG_MAX 
+#include <string>
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+    using ::size_t;
+} // namespace std
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/archive/detail/oserializer.hpp>
+#include <boost/archive/detail/interface_oarchive.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/decl.hpp>
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+// determine if its necessary to handle (u)int64_t specifically
+// i.e. that its not a synonym for (unsigned) long
+// if there is no 64 bit int or if its the same as a long
+// we shouldn't define separate functions for int64 data types.
+#if defined(BOOST_NO_INT64_T)
+    #define BOOST_NO_INTRINSIC_INT64_T
+#else 
+    #if defined(ULLONG_MAX)  
+        #if(ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #elif defined(ULONG_MAX)  
+        #if(ULONG_MAX != 0xffffffff && ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #else   
+        #define BOOST_NO_INTRINSIC_INT64_T  
+    #endif  
+#endif
+
+namespace boost {
+template<class T>
+class shared_ptr;
+namespace serialization {
+    class extended_type_info;
+} // namespace serialization
+namespace archive {
+namespace detail {
+    class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oarchive;
+    class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) basic_oserializer;
+}
+
+class polymorphic_oarchive;
+
+class polymorphic_oarchive_impl :
+    public detail::interface_oarchive<polymorphic_oarchive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<polymorphic_oarchive>;
+    friend class save_access;
+#endif
+    // primitive types the only ones permitted by polymorphic archives
+    virtual void save(const bool t) = 0;
+
+    virtual void save(const char t) = 0;
+    virtual void save(const signed char t) = 0;
+    virtual void save(const unsigned char t) = 0;
+    #ifndef BOOST_NO_CWCHAR
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    virtual void save(const wchar_t t) = 0;
+    #endif
+    #endif
+    virtual void save(const short t) = 0;
+    virtual void save(const unsigned short t) = 0;
+    virtual void save(const int t) = 0;
+    virtual void save(const unsigned int t) = 0;
+    virtual void save(const long t) = 0;
+    virtual void save(const unsigned long t) = 0;
+    #if !defined(BOOST_NO_INTRINSIC_INT64_T)
+    virtual void save(const boost::int64_t t) = 0;
+    virtual void save(const boost::uint64_t t) = 0;
+    #endif
+    virtual void save(const float t) = 0;
+    virtual void save(const double t) = 0;
+
+    // string types are treated as primitives
+    virtual void save(const std::string & t) = 0;
+    #ifndef BOOST_NO_STD_WSTRING
+    virtual void save(const std::wstring & t) = 0;
+    #endif
+
+    virtual void save_null_pointer() = 0;
+    // used for xml and other tagged formats
+    virtual void save_start(const char * name) = 0;
+    virtual void save_end(const char * name) = 0;
+    virtual void register_basic_serializer(const detail::basic_oserializer & bos) = 0;
+
+    virtual void end_preamble() = 0;
+
+    // msvc and borland won't automatically pass these to the base class so
+    // make it explicit here
+    template<class T>
+    void save_override(T & t, BOOST_PFTO int)
+    {
+        archive::save(* this->This(), t);
+    }
+    // special treatment for name-value pairs.
+    template<class T>
+    void save_override(
+                #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+                const
+                #endif
+                ::boost::serialization::nvp<T> & t, int
+        ){
+        save_start(t.name());
+        archive::save(* this->This(), t.const_value());
+        save_end(t.name());
+    }
+protected:
+    virtual ~polymorphic_oarchive_impl(){};
+public:
+    // utility functions implemented by all legal archives
+    virtual unsigned int get_flags() const = 0;
+    virtual unsigned int get_library_version() const = 0;
+    virtual void save_binary(const void * t, std::size_t size) = 0;
+
+    virtual void save_object(
+        const void *x,
+        const detail::basic_oserializer & bos
+    ) = 0;
+    virtual void save_pointer(
+        const void * t,
+        const detail::basic_pointer_oserializer * bpos_ptr
+    ) = 0;
+};
+
+// note: preserve naming symmetry
+class polymorphic_oarchive : 
+    public polymorphic_oarchive_impl
+{
+public:
+    virtual ~polymorphic_oarchive(){};
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::polymorphic_oarchive)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_iarchive.hpp
new file mode 100644 (file)
index 0000000..9dbc6c4
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_text_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_text_iarchive : 
+    public detail::polymorphic_iarchive_route<naked_text_iarchive>
+{
+public:
+    polymorphic_text_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_text_iarchive>(is, flags)
+    {}
+    ~polymorphic_text_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_text_iarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_IARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_oarchive.hpp
new file mode 100644 (file)
index 0000000..82b4892
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_text_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+typedef detail::polymorphic_oarchive_route<
+    text_oarchive_impl<naked_text_oarchive> 
+> polymorphic_text_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_text_oarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_OARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_wiarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_wiarchive.hpp
new file mode 100644 (file)
index 0000000..a04283a
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_text_wiarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <boost/archive/text_wiarchive.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_text_wiarchive : 
+    public detail::polymorphic_iarchive_route<naked_text_wiarchive>
+{
+public:
+    polymorphic_text_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_text_wiarchive>(is, flags)
+    {}
+    ~polymorphic_text_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_text_wiarchive
+)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_WIARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_woarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_text_woarchive.hpp
new file mode 100644 (file)
index 0000000..bc44947
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_text_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <boost/archive/text_woarchive.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+typedef detail::polymorphic_oarchive_route<
+        text_woarchive_impl<naked_text_woarchive> 
+> polymorphic_text_woarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_text_woarchive
+)
+
+#endif // BOOST_NO_STD_WSTREAMBUF 
+#endif // BOOST_ARCHIVE_POLYMORPHIC_TEXT_WOARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_iarchive.hpp
new file mode 100644 (file)
index 0000000..bcd7254
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_xml_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_xml_iarchive : 
+    public detail::polymorphic_iarchive_route<naked_xml_iarchive>
+{
+public:
+    polymorphic_xml_iarchive(std::istream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_xml_iarchive>(is, flags)
+    {}
+    ~polymorphic_xml_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_xml_iarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_IARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_oarchive.hpp
new file mode 100644 (file)
index 0000000..8576694
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_xml_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+typedef detail::polymorphic_oarchive_route<
+    xml_oarchive_impl<naked_xml_oarchive> 
+> polymorphic_xml_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_xml_oarchive
+)
+
+#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_OARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_wiarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_wiarchive.hpp
new file mode 100644 (file)
index 0000000..b3f7db2
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_xml_wiarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <boost/archive/xml_wiarchive.hpp>
+#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+class polymorphic_xml_wiarchive : 
+    public detail::polymorphic_iarchive_route<naked_xml_wiarchive>
+{
+public:
+    polymorphic_xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        detail::polymorphic_iarchive_route<naked_xml_wiarchive>(is, flags)
+    {}
+    ~polymorphic_xml_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_xml_wiarchive
+)
+
+#endif // BOOST_NO_STD_WSTREAMBUF 
+#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_WIARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_woarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/polymorphic_xml_woarchive.hpp
new file mode 100644 (file)
index 0000000..8884b43
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP
+#define BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// polymorphic_xml_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <boost/archive/xml_woarchive.hpp>
+#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
+
+namespace boost { 
+namespace archive {
+
+typedef detail::polymorphic_oarchive_route<
+        xml_woarchive_impl<naked_xml_woarchive> 
+> polymorphic_xml_woarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(
+    boost::archive::polymorphic_xml_woarchive
+)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_POLYMORPHIC_XML_WOARCHIVE_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/shared_ptr_helper.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/shared_ptr_helper.hpp
new file mode 100644 (file)
index 0000000..b54c654
--- /dev/null
@@ -0,0 +1,187 @@
+#ifndef BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
+#define BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr_helper.hpp: serialization for boost shared pointer
+
+// (C) Copyright 2004-2009 Robert Ramey, Martin Ecker and Takatoshi Kondo
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+#include <list>
+#include <utility>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/serialization/shared_ptr_132.hpp>
+#include <boost/serialization/throw_exception.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+#include <boost/archive/detail/decl.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost_132 {
+    template<class T> class shared_ptr;
+}
+namespace boost {
+    template<class T> class shared_ptr;
+    namespace serialization {
+        class extended_type_info;
+        template<class Archive, class T>
+        inline void load(
+            Archive & ar,
+            boost::shared_ptr<T> &t,
+            const unsigned int file_version
+        );
+    }
+namespace archive{
+namespace detail {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// a common class for holding various types of shared pointers
+
+class shared_ptr_helper {
+    typedef std::map<
+        void *,
+        boost::shared_ptr<const void>
+    > collection_type;
+    typedef collection_type::const_iterator iterator_type;
+    // list of shared_pointers create accessable by raw pointer. This
+    // is used to "match up" shared pointers loaded at different
+    // points in the archive. Note, we delay construction until
+    // it is actually used since this is by default included as
+    // a "mix-in" even if shared_ptr isn't used.
+    collection_type * m_pointers;
+
+    struct null_deleter {
+        void operator()(void const *) const {}
+    };
+
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    template<class Archive, class T>
+    friend inline void boost::serialization::load(
+        Archive & ar,
+        boost::shared_ptr<T> &t,
+        const unsigned int file_version
+    );
+#endif
+
+//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    // list of loaded pointers.  This is used to be sure that the pointers
+    // stay around long enough to be "matched" with other pointers loaded
+    // by the same archive.  These are created with a "null_deleter" so that
+    // when this list is destroyed - the underlaying raw pointers are not
+    // destroyed.  This has to be done because the pointers are also held by
+    // new system which is disjoint from this set.  This is implemented
+    // by a change in load_construct_data below.  It makes this file suitable
+    // only for loading pointers into a 1.33 or later boost system.
+    std::list<boost_132::shared_ptr<void> > * m_pointers_132;
+//  #endif
+
+    typedef std::pair<const iterator_type, void *> result_type;
+
+    // returns pointer to object and an indicator whether this is a
+    // new entry (true) or a previous one (false)
+    BOOST_ARCHIVE_DECL(result_type) get_od(
+            void * od,
+            const boost::serialization::extended_type_info * true_type, 
+            const boost::serialization::extended_type_info * this_type
+    );
+
+    template<class T>
+    struct non_polymorphic {
+        static const boost::serialization::extended_type_info * 
+        get_object_identifier(T & t){
+            return boost::serialization::singleton<
+                BOOST_DEDUCED_TYPENAME 
+                boost::serialization::type_info_implementation<T>::type
+            >::get_const_instance();
+        }
+    };
+    template<class T>
+    struct polymorphic {
+        static const boost::serialization::extended_type_info * 
+        get_object_identifier(T & t){
+            return boost::serialization::singleton<
+                BOOST_DEDUCED_TYPENAME 
+                boost::serialization::type_info_implementation<T>::type
+            >::get_const_instance().get_derived_extended_type_info(t);
+        }
+    };
+public:
+    template<class T>
+    void reset(shared_ptr<T> & s, T * t){
+        if(NULL == t){
+            s.reset();
+            return;
+        }
+        const boost::serialization::extended_type_info * this_type
+            = & boost::serialization::type_info_implementation<T>::type
+                    ::get_const_instance();
+
+        // get pointer to the most derived object.  This is effectively
+        // the object identifer
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_polymorphic<T>,
+            mpl::identity<polymorphic<T> >,
+            mpl::identity<non_polymorphic<T> >
+        >::type type;
+
+        const boost::serialization::extended_type_info * true_type
+            = type::get_object_identifier(*t);
+
+        // note:if this exception is thrown, be sure that derived pointer
+        // is either registered or exported.
+        if(NULL == true_type)
+            boost::serialization::throw_exception(
+                archive_exception(
+                    archive_exception::unregistered_class,
+                    this_type->get_debug_info()
+                )
+            );
+        result_type r =
+            get_od(
+                t, 
+                true_type,
+                this_type
+            );
+        s = shared_ptr<T>(
+            r.first->second,
+            static_cast<T *>(r.second)
+        );
+    }
+
+//  #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    BOOST_ARCHIVE_DECL(void)
+    append(const boost_132::shared_ptr<void> & t);
+//  #endif
+public:
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+    shared_ptr_helper();
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+    ~shared_ptr_helper();
+};
+
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_SHARED_PTR_HELPER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/text_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/text_iarchive.hpp
new file mode 100644 (file)
index 0000000..3b1a99d
--- /dev/null
@@ -0,0 +1,126 @@
+#ifndef BOOST_ARCHIVE_TEXT_IARCHIVE_HPP
+#define BOOST_ARCHIVE_TEXT_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+
+#include <boost/config.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/basic_text_iprimitive.hpp>
+#include <boost/archive/basic_text_iarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class Archive>
+class text_iarchive_impl : 
+    public basic_text_iprimitive<std::istream>,
+    public basic_text_iarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<Archive>;
+    friend class basic_text_iarchive<Archive>;
+    friend class load_access;
+protected:
+#endif
+    template<class T>
+    void load(T & t){
+        basic_text_iprimitive<std::istream>::load(t);
+    }
+    BOOST_ARCHIVE_DECL(void) 
+    load(char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_ARCHIVE_DECL(void) 
+    load(wchar_t * t);
+    #endif
+    BOOST_ARCHIVE_DECL(void) 
+    load(std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_DECL(void) 
+    load(std::wstring &ws);
+    #endif
+    // note: the following should not needed - but one compiler (vc 7.1)
+    // fails to compile one test (test_shared_ptr) without it !!!
+    // make this protected so it can be called from a derived archive
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        basic_text_iarchive<Archive>::load_override(t, 0);
+    }
+    BOOST_ARCHIVE_DECL(void)
+    load_override(class_name_type & t, int);
+    BOOST_ARCHIVE_DECL(void)
+    init();
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    text_iarchive_impl(std::istream & is, unsigned int flags);
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~text_iarchive_impl(){};
+};
+
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as text_iarchive below - without the shared_ptr_helper
+class naked_text_iarchive : 
+    public text_iarchive_impl<naked_text_iarchive>
+{
+public:
+    naked_text_iarchive(std::istream & is_, unsigned int flags = 0) :
+        // note: added _ to suppress useless gcc warning
+        text_iarchive_impl<naked_text_iarchive>(is_, flags)
+    {}
+    ~naked_text_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class text_iarchive : 
+    public text_iarchive_impl<text_iarchive>,
+    public detail::shared_ptr_helper
+{
+public:
+    text_iarchive(std::istream & is_, unsigned int flags = 0) :
+        // note: added _ to suppress useless gcc warning
+        text_iarchive_impl<text_iarchive>(is_, flags)
+    {}
+    ~text_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_iarchive)
+
+#endif // BOOST_ARCHIVE_TEXT_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/text_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/text_oarchive.hpp
new file mode 100644 (file)
index 0000000..5268752
--- /dev/null
@@ -0,0 +1,103 @@
+#ifndef BOOST_ARCHIVE_TEXT_OARCHIVE_HPP
+#define BOOST_ARCHIVE_TEXT_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+#include <cstddef> // std::size_t
+
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/basic_text_oprimitive.hpp>
+#include <boost/archive/basic_text_oarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class Archive>
+class text_oarchive_impl : 
+     /* protected ? */ public basic_text_oprimitive<std::ostream>,
+     public basic_text_oarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class basic_text_oarchive<Archive>;
+    friend class save_access;
+protected:
+#endif
+    template<class T>
+    void save(const T & t){
+        this->newtoken();
+        basic_text_oprimitive<std::ostream>::save(t);
+    }
+    BOOST_ARCHIVE_DECL(void) 
+    save(const char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_ARCHIVE_DECL(void) 
+    save(const wchar_t * t);
+    #endif
+    BOOST_ARCHIVE_DECL(void) 
+    save(const std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_DECL(void) 
+    save(const std::wstring &ws);
+    #endif
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    text_oarchive_impl(std::ostream & os, unsigned int flags);
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~text_oarchive_impl(){};
+public:
+    BOOST_ARCHIVE_DECL(void) 
+    save_binary(const void *address, std::size_t count);
+};
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from text_oarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class text_oarchive : 
+    public text_oarchive_impl<text_oarchive>
+{
+public:
+     
+    text_oarchive(std::ostream & os_, unsigned int flags = 0) :
+        // note: added _ to suppress useless gcc warning
+        text_oarchive_impl<text_oarchive>(os_, flags)
+    {}
+    ~text_oarchive(){}
+};
+
+typedef text_oarchive naked_text_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_oarchive)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_TEXT_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/text_wiarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/text_wiarchive.hpp
new file mode 100644 (file)
index 0000000..82d9a71
--- /dev/null
@@ -0,0 +1,123 @@
+#ifndef BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP
+#define BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_wiarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <istream>
+
+#include <boost/archive/detail/auto_link_warchive.hpp>
+#include <boost/archive/basic_text_iprimitive.hpp>
+#include <boost/archive/basic_text_iarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class Archive>
+class text_wiarchive_impl : 
+    public basic_text_iprimitive<std::wistream>,
+    public basic_text_iarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<Archive>;
+    friend class basic_text_iarchive<Archive>;
+    friend class load_access;
+protected:
+#endif
+    template<class T>
+    void load(T & t){
+        basic_text_iprimitive<std::wistream>::load(t);
+    }
+    BOOST_WARCHIVE_DECL(void)
+    load(char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_WARCHIVE_DECL(void)
+    load(wchar_t * t);
+    #endif
+    BOOST_WARCHIVE_DECL(void)
+    load(std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_WARCHIVE_DECL(void)
+    load(std::wstring &ws);
+    #endif
+    // note: the following should not needed - but one compiler (vc 7.1)
+    // fails to compile one test (test_shared_ptr) without it !!!
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        basic_text_iarchive<Archive>::load_override(t, 0);
+    }
+    BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    text_wiarchive_impl(std::wistream & is, unsigned int flags);
+    ~text_wiarchive_impl(){};
+};
+
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as text_wiarchive below - without the shared_ptr_helper
+class naked_text_wiarchive : 
+    public text_wiarchive_impl<naked_text_wiarchive>
+{
+public:
+    naked_text_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        text_wiarchive_impl<naked_text_wiarchive>(is, flags)
+    {}
+    ~naked_text_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class text_wiarchive : 
+    public text_wiarchive_impl<text_wiarchive>,
+    public detail::shared_ptr_helper
+{
+public:
+    text_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        text_wiarchive_impl<text_wiarchive>(is, flags)
+    {}
+    ~text_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_wiarchive)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_TEXT_WIARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/text_woarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/text_woarchive.hpp
new file mode 100644 (file)
index 0000000..79d3742
--- /dev/null
@@ -0,0 +1,129 @@
+#ifndef BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP
+#define BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// text_woarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <ostream>
+#include <cstddef> // size_t
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/archive/detail/auto_link_warchive.hpp>
+#include <boost/archive/basic_text_oprimitive.hpp>
+#include <boost/archive/basic_text_oarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class Archive>
+class text_woarchive_impl : 
+    public basic_text_oprimitive<std::wostream>,
+    public basic_text_oarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class basic_text_oarchive<Archive>;
+    friend class save_access;
+protected:
+#endif
+    template<class T>
+    void save(const T & t){
+        this->newtoken();
+        basic_text_oprimitive<std::wostream>::save(t);
+    }
+    BOOST_WARCHIVE_DECL(void)
+    save(const char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_WARCHIVE_DECL(void)
+    save(const wchar_t * t);
+    #endif
+    BOOST_WARCHIVE_DECL(void)
+    save(const std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_WARCHIVE_DECL(void)
+    save(const std::wstring &ws);
+    #endif
+    text_woarchive_impl(std::wostream & os, unsigned int flags) :
+        basic_text_oprimitive<std::wostream>(
+            os, 
+            0 != (flags & no_codecvt)
+        ),
+        basic_text_oarchive<Archive>(flags)
+    {
+        if(0 == (flags & no_header))
+            basic_text_oarchive<Archive>::init();
+    }
+public:
+    void save_binary(const void *address, std::size_t count){
+        put(L'\n');
+        this->end_preamble();
+        #if ! defined(__MWERKS__)
+        this->basic_text_oprimitive<std::wostream>::save_binary(
+        #else
+        this->basic_text_oprimitive::save_binary(
+        #endif
+            address, 
+            count
+        );
+        put(L'\n');
+        this->delimiter = this->none;
+    }
+
+};
+
+// we use the following because we can't use
+// typedef text_oarchive_impl<text_oarchive_impl<...> > text_oarchive;
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from text_oarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class text_woarchive : 
+    public text_woarchive_impl<text_woarchive>
+{
+public:
+    text_woarchive(std::wostream & os, unsigned int flags = 0) :
+        text_woarchive_impl<text_woarchive>(os, flags)
+    {}
+    ~text_woarchive(){}
+};
+
+typedef text_woarchive naked_text_woarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::text_woarchive)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_TEXT_WOARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/tmpdir.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/tmpdir.hpp
new file mode 100644 (file)
index 0000000..f962e11
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef BOOST_ARCHIVE_TMPDIR_HPP
+#define BOOST_ARCHIVE_TMPDIR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// tmpdir.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstdlib> // getenv
+#include <cstddef> // NULL
+//#include <cassert>
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std {
+    using ::getenv;
+}
+#endif
+
+namespace boost {
+namespace archive {
+
+inline const char * tmpdir(){
+    const char *dirname;
+    dirname = std::getenv("TMP");
+    if(NULL == dirname)
+        dirname = std::getenv("TMPDIR");
+    if(NULL == dirname)
+        dirname = std::getenv("TEMP");
+    if(NULL == dirname){
+        //assert(false); // no temp directory found
+        dirname = ".";
+    }
+    return dirname;
+}
+
+} // archive
+} // boost
+
+#endif // BOOST_ARCHIVE_TMPDIR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/wcslen.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/wcslen.hpp
new file mode 100644 (file)
index 0000000..5c14acf
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef BOOST_ARCHIVE_WCSLEN_HPP
+#define BOOST_ARCHIVE_WCSLEN_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// wcslen.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#ifndef BOOST_NO_CWCHAR
+
+// a couple of libraries which include wchar_t don't include
+// wcslen
+
+#if defined(BOOST_DINKUMWARE_STDLIB) && BOOST_DINKUMWARE_STDLIB < 306 \
+|| defined(__LIBCOMO__) 
+
+namespace std {
+inline std::size_t wcslen(const wchar_t * ws)
+{
+    const wchar_t * eows = ws;
+    while(* eows != 0)
+        ++eows;
+    return eows - ws;
+}
+} // namespace std
+
+#else
+
+#include <cwchar>
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{ using ::wcslen; }
+#endif
+
+#endif // wcslen
+
+#endif //BOOST_NO_CWCHAR
+
+#endif //BOOST_ARCHIVE_WCSLEN_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_archive_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_archive_exception.hpp
new file mode 100644 (file)
index 0000000..741c468
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef BOOST_ARCHIVE_XML_ARCHIVE_EXCEPTION_HPP
+#define BOOST_ARCHIVE_XML_ARCHIVE_EXCEPTION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_archive_exception.hpp:
+
+// (C) Copyright 2007 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <exception>
+#include <cassert>
+
+#include <boost/archive/archive_exception.hpp>
+#include <boost/preprocessor/empty.hpp>
+#include <boost/archive/detail/decl.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+//////////////////////////////////////////////////////////////////////
+// exceptions thrown by xml archives
+//
+class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) xml_archive_exception : 
+    public virtual archive_exception
+{
+public:
+    typedef enum {
+        xml_archive_parsing_error,    // see save_register
+        xml_archive_tag_mismatch,
+        xml_archive_tag_name_error
+    } exception_code;
+    xml_archive_exception(
+        exception_code c, 
+        const char * e1 = NULL,
+        const char * e2 = NULL
+    );
+};
+
+}// namespace archive
+}// namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif //BOOST_XML_ARCHIVE_ARCHIVE_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_iarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_iarchive.hpp
new file mode 100644 (file)
index 0000000..a3bc9f5
--- /dev/null
@@ -0,0 +1,133 @@
+#ifndef BOOST_ARCHIVE_XML_IARCHIVE_HPP
+#define BOOST_ARCHIVE_XML_IARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_iarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <istream>
+
+//#include <boost/scoped_ptr.hpp>
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/basic_text_iprimitive.hpp>
+#include <boost/archive/basic_xml_iarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class CharType>
+class basic_xml_grammar;
+typedef basic_xml_grammar<char> xml_grammar;
+
+template<class Archive>
+class xml_iarchive_impl : 
+    public basic_text_iprimitive<std::istream>,
+    public basic_xml_iarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<Archive>;
+    friend class basic_xml_iarchive<Archive>;
+    friend class load_access;
+protected:
+#endif
+    // instances of micro xml parser to parse start preambles
+    // scoped_ptr doesn't play nice with borland - so use a naked pointer
+    // scoped_ptr<xml_grammar> gimpl;
+    xml_grammar *gimpl;
+
+    std::istream & get_is(){
+        return is;
+    }
+    template<class T>
+    void load(T & t){
+        basic_text_iprimitive<std::istream>::load(t);
+    }
+    BOOST_ARCHIVE_DECL(void)
+    load(char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_ARCHIVE_DECL(void)
+    load(wchar_t * t);
+    #endif
+    BOOST_ARCHIVE_DECL(void)
+    load(std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_DECL(void)
+    load(std::wstring &ws);
+    #endif
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        basic_xml_iarchive<Archive>::load_override(t, 0);
+    }
+    BOOST_ARCHIVE_DECL(void)
+    load_override(class_name_type & t, int);
+    BOOST_ARCHIVE_DECL(void)
+    init();
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    xml_iarchive_impl(std::istream & is, unsigned int flags);
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY())
+    ~xml_iarchive_impl();
+};
+
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from text_iarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as xml_iarchive below - without the shared_ptr_helper
+class naked_xml_iarchive : 
+    public xml_iarchive_impl<naked_xml_iarchive>
+{
+public:
+    naked_xml_iarchive(std::istream & is, unsigned int flags = 0) :
+        xml_iarchive_impl<naked_xml_iarchive>(is, flags)
+    {}
+    ~naked_xml_iarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class xml_iarchive : 
+    public xml_iarchive_impl<xml_iarchive>,
+    public detail::shared_ptr_helper
+{
+public:
+    xml_iarchive(std::istream & is, unsigned int flags = 0) :
+        xml_iarchive_impl<xml_iarchive>(is, flags)
+    {}
+    ~xml_iarchive(){};
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_iarchive)
+
+#endif // BOOST_ARCHIVE_XML_IARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_oarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_oarchive.hpp
new file mode 100644 (file)
index 0000000..790b739
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef BOOST_ARCHIVE_XML_OARCHIVE_HPP
+#define BOOST_ARCHIVE_XML_OARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_oarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <ostream>
+
+#include <cstddef> // size_t
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/archive/detail/auto_link_archive.hpp>
+#include <boost/archive/basic_text_oprimitive.hpp>
+#include <boost/archive/basic_xml_oarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+template<class Archive>
+class xml_oarchive_impl : 
+    public basic_text_oprimitive<std::ostream>,
+    public basic_xml_oarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class basic_xml_oarchive<Archive>;
+    friend class save_access;
+protected:
+#endif
+    //void end_preamble(){
+    //    basic_xml_oarchive<Archive>::end_preamble();
+    //}
+    template<class T>
+    void save(const T & t){
+        basic_text_oprimitive<std::ostream>::save(t);
+    }
+    BOOST_ARCHIVE_DECL(void) 
+    save(const char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_ARCHIVE_DECL(void)
+    save(const wchar_t * t);
+    #endif
+    BOOST_ARCHIVE_DECL(void)
+    save(const std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_ARCHIVE_DECL(void)
+    save(const std::wstring &ws);
+    #endif
+    BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    xml_oarchive_impl(std::ostream & os, unsigned int flags);
+    ~xml_oarchive_impl(){}
+public:
+    void save_binary(const void *address, std::size_t count){
+        this->end_preamble();
+        #if ! defined(__MWERKS__)
+        this->basic_text_oprimitive<std::ostream>::save_binary(
+        #else
+        this->basic_text_oprimitive::save_binary(
+        #endif
+            address, 
+            count
+        );
+        this->indent_next = true;
+    }
+};
+
+// we use the following because we can't use
+// typedef xml_oarchive_impl<xml_oarchive_impl<...> > xml_oarchive;
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from xml_oarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class xml_oarchive : 
+    public xml_oarchive_impl<xml_oarchive>
+{
+public:
+    xml_oarchive(std::ostream & os, unsigned int flags = 0) :
+        xml_oarchive_impl<xml_oarchive>(os, flags)
+    {}
+    ~xml_oarchive(){}
+};
+
+typedef xml_oarchive naked_xml_oarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_oarchive)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_ARCHIVE_XML_OARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_wiarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_wiarchive.hpp
new file mode 100644 (file)
index 0000000..3675741
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef BOOST_ARCHIVE_XML_WIARCHIVE_HPP
+#define BOOST_ARCHIVE_XML_WIARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_wiarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <istream>
+
+//#include <boost/scoped_ptr.hpp>
+#include <boost/archive/detail/auto_link_warchive.hpp>
+#include <boost/archive/basic_text_iprimitive.hpp>
+#include <boost/archive/basic_xml_iarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost { 
+namespace archive {
+
+template<class CharType>
+class basic_xml_grammar;
+typedef basic_xml_grammar<wchar_t> xml_wgrammar;
+
+template<class Archive>
+class xml_wiarchive_impl : 
+    public basic_text_iprimitive<std::wistream>,
+    public basic_xml_iarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_iarchive<Archive>;
+    friend class basic_xml_iarchive<Archive>;
+    friend class load_access;
+protected:
+#endif
+    // instances of micro xml parser to parse start preambles
+    // scoped_ptr doesn't play nice with borland - so use a naked pointer
+    // scoped_ptr<xml_wgrammar> gimpl;
+    xml_wgrammar *gimpl;
+    std::wistream & get_is(){
+        return is;
+    }
+    template<class T>
+    void load(T & t){
+        basic_text_iprimitive<std::wistream>::load(t);
+    }
+    BOOST_WARCHIVE_DECL(void)
+    load(char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_WARCHIVE_DECL(void)
+    load(wchar_t * t);
+    #endif
+    BOOST_WARCHIVE_DECL(void)
+    load(std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_WARCHIVE_DECL(void)
+    load(std::wstring &ws);
+    #endif
+    template<class T>
+    void load_override(T & t, BOOST_PFTO int){
+        basic_xml_iarchive<Archive>::load_override(t, 0);
+    }
+    BOOST_WARCHIVE_DECL(void)
+    load_override(class_name_type & t, int);
+    BOOST_WARCHIVE_DECL(void) 
+    init();
+    BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    xml_wiarchive_impl(std::wistream & is, unsigned int flags) ;
+    BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    ~xml_wiarchive_impl();
+};
+
+// do not derive from the classes below.  If you want to extend this functionality
+// via inhertance, derived from xml_wiarchive_impl instead.  This will
+// preserve correct static polymorphism.
+
+// same as xml_wiarchive below - without the shared_ptr_helper
+class naked_xml_wiarchive : 
+    public xml_wiarchive_impl<naked_xml_wiarchive>
+{
+public:
+    naked_xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        xml_wiarchive_impl<naked_xml_wiarchive>(is, flags)
+    {}
+    ~naked_xml_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+// note special treatment of shared_ptr. This type needs a special
+// structure associated with every archive.  We created a "mix-in"
+// class to provide this functionality.  Since shared_ptr holds a
+// special esteem in the boost library - we included it here by default.
+#include <boost/archive/shared_ptr_helper.hpp>
+
+namespace boost { 
+namespace archive {
+
+class xml_wiarchive : 
+    public xml_wiarchive_impl<xml_wiarchive>,
+    public detail::shared_ptr_helper
+{
+public:
+    xml_wiarchive(std::wistream & is, unsigned int flags = 0) :
+        xml_wiarchive_impl<xml_wiarchive>(is, flags)
+    {}
+    ~xml_wiarchive(){}
+};
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_wiarchive)
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_XML_WIARCHIVE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_woarchive.hpp b/deal.II/contrib/boost-1.41.0/include/boost/archive/xml_woarchive.hpp
new file mode 100644 (file)
index 0000000..e396143
--- /dev/null
@@ -0,0 +1,130 @@
+#ifndef BOOST_ARCHIVE_XML_WOARCHIVE_HPP
+#define BOOST_ARCHIVE_XML_WOARCHIVE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// xml_woarchive.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_NO_STD_WSTREAMBUF
+#error "wide char i/o not supported on this platform"
+#else
+
+#include <cstddef> // size_t
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <ostream>
+
+#include <boost/archive/detail/auto_link_warchive.hpp>
+#include <boost/archive/basic_text_oprimitive.hpp>
+#include <boost/archive/basic_xml_oarchive.hpp>
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
+
+namespace boost {
+namespace archive {
+
+#if 0
+BOOST_WARCHIVE_DECL(std::wostream &)
+operator<<(std::wostream &os, const char *t);
+
+BOOST_WARCHIVE_DECL(std::wostream &)
+operator<<(std::wostream &os, const char t);
+#endif
+
+template<class Archive>
+class xml_woarchive_impl : 
+    public basic_text_oprimitive<std::wostream>,
+    public basic_xml_oarchive<Archive>
+{
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    friend class detail::interface_oarchive<Archive>;
+    friend class basic_xml_oarchive<Archive>;
+    friend class save_access;
+protected:
+#endif
+    //void end_preamble(){
+    //    basic_xml_oarchive<Archive>::end_preamble();
+    //}
+    template<class T>
+    void 
+    save(const T & t){
+        basic_text_oprimitive<std::wostream>::save(t);
+    }
+    BOOST_WARCHIVE_DECL(void)
+    save(const char * t);
+    #ifndef BOOST_NO_INTRINSIC_WCHAR_T
+    BOOST_WARCHIVE_DECL(void) 
+    save(const wchar_t * t);
+    #endif
+    BOOST_WARCHIVE_DECL(void) 
+    save(const std::string &s);
+    #ifndef BOOST_NO_STD_WSTRING
+    BOOST_WARCHIVE_DECL(void)
+    save(const std::wstring &ws);
+    #endif
+    BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) 
+    xml_woarchive_impl(std::wostream & os, unsigned int flags);
+    ~xml_woarchive_impl(){}
+public:
+    void 
+    save_binary(const void *address, std::size_t count){
+        this->end_preamble();
+        #if ! defined(__MWERKS__)
+        this->basic_text_oprimitive<std::wostream>::save_binary(
+        #else
+        this->basic_text_oprimitive::save_binary(
+        #endif
+            address, 
+            count
+        );
+        this->indent_next = true;
+    }
+};
+
+// we use the following because we can't use
+// typedef xml_woarchive_impl<xml_woarchive_impl<...> > xml_woarchive;
+
+// do not derive from this class.  If you want to extend this functionality
+// via inhertance, derived from xml_woarchive_impl instead.  This will
+// preserve correct static polymorphism.
+class xml_woarchive : 
+    public xml_woarchive_impl<xml_woarchive>
+{
+public:
+    xml_woarchive(std::wostream & os, unsigned int flags = 0) :
+        xml_woarchive_impl<xml_woarchive>(os, flags)
+    {}
+    ~xml_woarchive(){}
+};
+
+typedef xml_woarchive naked_xml_woarchive;
+
+} // namespace archive
+} // namespace boost
+
+// required by export
+BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::archive::xml_woarchive)
+
+#include <boost/archive/detail/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_NO_STD_WSTREAMBUF
+#endif // BOOST_ARCHIVE_XML_OARCHIVE_HPP
similarity index 95%
rename from deal.II/contrib/boost/include/boost/array.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/array.hpp
index 52218aac51383aed26e8ae622c2c891c79319945..8ef73c42508c1d465bf31d0e40bb6fc68dfad200 100644 (file)
@@ -27,6 +27,7 @@
 #include <cstddef>
 #include <stdexcept>
 #include <boost/assert.hpp>
+#include <boost/swap.hpp>
 
 // Handles broken standard libraries better than <iterator>
 #include <boost/detail/iterator.hpp>
@@ -131,7 +132,8 @@ namespace boost {
 
         // swap (note: linear complexity)
         void swap (array<T,N>& y) {
-            std::swap_ranges(begin(),end(),y.begin());
+            for (size_type i = 0; i < N; ++i)
+                boost::swap(elems[i],y.elems[i]);
         }
 
         // direct access to data (read-only)
@@ -209,19 +211,19 @@ namespace boost {
         }
 
         // operator[]
-        reference operator[](size_type i)
+        reference operator[](size_type /*i*/)
         {
             return failed_rangecheck();
         }
 
-        const_reference operator[](size_type i) const
+        const_reference operator[](size_type /*i*/) const
         {
             return failed_rangecheck();
         }
 
         // at() with range check
-        reference at(size_type i)               {   return failed_rangecheck(); }
-        const_reference at(size_type i) const   {   return failed_rangecheck(); }
+        reference at(size_type /*i*/)               {   return failed_rangecheck(); }
+        const_reference at(size_type /*i*/) const   {   return failed_rangecheck(); }
 
         // front() and back()
         reference front()
@@ -250,7 +252,7 @@ namespace boost {
         static size_type max_size() { return 0; }
         enum { static_size = 0 };
 
-        void swap (array<T,0>& y) {
+        void swap (array<T,0>& /*y*/) {
         }
 
         // direct access to data (read-only)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/bind.hpp b/deal.II/contrib/boost-1.41.0/include/boost/bind.hpp
new file mode 100644 (file)
index 0000000..fd3421e
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef BOOST_BIND_HPP_INCLUDED
+#define BOOST_BIND_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  bind.hpp - binds function objects to arguments
+//
+//  Copyright (c) 2009 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  See http://www.boost.org/libs/bind/bind.html for documentation.
+//
+
+#include <boost/bind/bind.hpp>
+
+#endif // #ifndef BOOST_BIND_HPP_INCLUDED
similarity index 99%
rename from deal.II/contrib/boost/include/boost/bind.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/bind/bind.hpp
index 07b84d377ae6620ccf494ed3be787b26d581b760..1e5c9e032490ed8b2ed2ff3469fcd7053e48cd10 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_BIND_HPP_INCLUDED
-#define BOOST_BIND_HPP_INCLUDED
+#ifndef BOOST_BIND_BIND_HPP_INCLUDED
+#define BOOST_BIND_BIND_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -48,6 +48,8 @@
 namespace boost
 {
 
+template<class T> class weak_ptr;
+
 namespace _bi // implementation details
 {
 
@@ -100,6 +102,11 @@ template<class T> bool ref_compare( reference_wrapper<T> const & a, reference_wr
 
 template<class R, class F, class L> class bind_t;
 
+template<class R, class F, class L> bool ref_compare( bind_t<R, F, L> const & a, bind_t<R, F, L> const & b, int )
+{
+    return a.compare( b );
+}
+
 // value
 
 template<class T> class value
@@ -121,6 +128,13 @@ private:
     T t_;
 };
 
+// ref_compare for weak_ptr
+
+template<class T> bool ref_compare( value< weak_ptr<T> > const & a, value< weak_ptr<T> > const & b, int )
+{
+    return !(a.get() < b.get()) && !(b.get() < a.get());
+}
+
 // type
 
 template<class T> class type {};
@@ -1615,7 +1629,7 @@ template<class F, class A1, class A2, class A3, class A4, class A5, class A6, cl
 // data member pointers
 
 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
-    || ( defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x600 ) )
+    || ( defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, <= 0x610 ) )
 
 template<class R, class T, class A1>
 _bi::bind_t< R, _mfi::dm<R, T>, typename _bi::list_av_1<A1>::type >
@@ -1716,4 +1730,4 @@ BOOST_BIND( M T::*f, A1 a1 )
 # pragma warning(pop)
 #endif
 
-#endif // #ifndef BOOST_BIND_HPP_INCLUDED
+#endif // #ifndef BOOST_BIND_BIND_HPP_INCLUDED
similarity index 98%
rename from deal.II/contrib/boost/include/boost/mem_fn.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/bind/mem_fn.hpp
index 9695f57e80a7c529e23110b36829bd7fa65f9a60..956e7d88853c6c30ab700086a1df487dec42e8ee 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_MEM_FN_HPP_INCLUDED
-#define BOOST_MEM_FN_HPP_INCLUDED
+#ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
+#define BOOST_BIND_MEM_FN_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -386,4 +386,4 @@ template<class R, class T> _mfi::dm<R, T> mem_fn(R T::*f)
 
 } // namespace boost
 
-#endif // #ifndef BOOST_MEM_FN_HPP_INCLUDED
+#endif // #ifndef BOOST_BIND_MEM_FN_HPP_INCLUDED
similarity index 92%
rename from deal.II/contrib/boost/include/boost/bind/placeholders.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/bind/placeholders.hpp
index 43baee6bdeb58c944eb7fc3d072bd83ee87a6653..37d01db133ae35712c41eeb748a7112c4bc0fd73 100644 (file)
@@ -25,7 +25,7 @@
 namespace
 {
 
-#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ <= 400)
+#if defined(__BORLANDC__) || defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 400)
 
 static inline boost::arg<1> _1() { return boost::arg<1>(); }
 static inline boost::arg<2> _2() { return boost::arg<2>(); }
@@ -37,7 +37,8 @@ static inline boost::arg<7> _7() { return boost::arg<7>(); }
 static inline boost::arg<8> _8() { return boost::arg<8>(); }
 static inline boost::arg<9> _9() { return boost::arg<9>(); }
 
-#elif defined(BOOST_MSVC) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) || defined(__MWERKS__)
+#elif defined(BOOST_MSVC) || (defined(__DECCXX_VER) && __DECCXX_VER <= 60590031) || defined(__MWERKS__) || \
+    defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ == 400)  
 
 static boost::arg<1> _1;
 static boost::arg<2> _2;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/bind/protect.hpp b/deal.II/contrib/boost-1.41.0/include/boost/bind/protect.hpp
new file mode 100644 (file)
index 0000000..749e158
--- /dev/null
@@ -0,0 +1,304 @@
+#ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
+#define BOOST_BIND_PROTECT_HPP_INCLUDED
+
+//
+//  protect.hpp
+//
+//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//  Copyright (c) 2009 Steven Watanabe
+//
+// 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/detail/workaround.hpp>
+
+namespace boost
+{
+
+namespace _bi
+{
+
+template<class F> class protected_bind_t
+{
+public:
+
+    typedef typename F::result_type result_type;
+
+    explicit protected_bind_t(F f): f_(f)
+    {
+    }
+
+    result_type operator()()
+    {
+        return f_();
+    }
+
+    result_type operator()() const
+    {
+        return f_();
+    }
+
+    template<class A1> result_type operator()(A1 & a1)
+    {
+        return f_(a1);
+    }
+
+    template<class A1> result_type operator()(A1 & a1) const
+    {
+        return f_(a1);
+    }
+
+
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1> result_type operator()(const A1 & a1)
+    {
+        return f_(a1);
+    }
+
+    template<class A1> result_type operator()(const A1 & a1) const
+    {
+        return f_(a1);
+    }
+
+#endif
+
+    template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
+    {
+        return f_(a1, a2);
+    }
+
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
+    {
+        return f_(a1, a2);
+    }
+
+    template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
+    {
+        return f_(a1, a2);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
+    {
+        return f_(a1, a2, a3);
+    }
+
+    template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
+    {
+        return f_(a1, a2, a3);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
+    {
+        return f_(a1, a2, a3);
+    }
+
+    template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
+    {
+        return f_(a1, a2, a3);
+    }
+    
+#endif
+
+    template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
+    {
+        return f_(a1, a2, a3, a4);
+    }
+
+    template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
+    {
+        return f_(a1, a2, a3, a4);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
+    {
+        return f_(a1, a2, a3, a4);
+    }
+
+    template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const
+    {
+        return f_(a1, a2, a3, a4);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
+    {
+        return f_(a1, a2, a3, a4, a5);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const
+    {
+        return f_(a1, a2, a3, a4, a5);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5)
+    {
+        return f_(a1, a2, a3, a4, a5);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const
+    {
+        return f_(a1, a2, a3, a4, a5);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6)
+    {
+        return f_(a1, a2, a3, a4, a5, a6);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6)
+    {
+        return f_(a1, a2, a3, a4, a5, a6);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
+    }
+
+#endif
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+    }
+    
+#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
+ && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+    }
+
+    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
+    {
+        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
+    }
+
+#endif
+
+private:
+
+    F f_;
+};
+
+} // namespace _bi
+
+template<class F> _bi::protected_bind_t<F> protect(F f)
+{
+    return _bi::protected_bind_t<F>(f);
+}
+
+} // namespace boost
+
+#endif // #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/blank.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/blank.hpp
index f84f2d9ea0b368f61f991c9107d687a1bf08dbe9..d0fe5abca56741bbe9290167eb5d684070ecd56d 100644 (file)
 
 #include "boost/blank_fwd.hpp"
 
+#if !defined(BOOST_NO_IOSTREAM)
 #include <iosfwd> // for std::basic_ostream forward declare
-
 #include "boost/detail/templated_streams.hpp"
+#endif // BOOST_NO_IOSTREAM
+
 #include "boost/mpl/bool.hpp"
 #include "boost/type_traits/is_empty.hpp"
 #include "boost/type_traits/is_pod.hpp"
@@ -85,6 +87,8 @@ inline bool operator>(const blank&, const blank&)
 
 // streaming support
 //
+#if !defined(BOOST_NO_IOSTREAM)
+
 BOOST_TEMPLATED_STREAM_TEMPLATE(E,T)
 inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
       BOOST_TEMPLATED_STREAM(ostream, E,T)& out
@@ -95,6 +99,8 @@ inline BOOST_TEMPLATED_STREAM(ostream, E,T)& operator<<(
     return out;
 }
 
+#endif // BOOST_NO_IOSTREAM
+
 } // namespace boost
 
 #endif // BOOST_BLANK_HPP
similarity index 98%
rename from deal.II/contrib/boost/include/boost/concept_check.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/concept_check.hpp
index 4e9fddfb414bec1ac1055571812eccf22ff19b7c..12ec2ad77525e1fbe0884d7ce12a275f0fafd16e 100644 (file)
@@ -144,6 +144,8 @@ namespace boost
     void const_constraints(const TT& b) {
 #if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
       a = b;              // const required for argument to assignment
+#else
+      ignore_unused_variable_warning(b);
 #endif
     }
    private:
@@ -169,6 +171,11 @@ namespace boost
     TT b;
   };
 
+#if (defined _MSC_VER)
+# pragma warning( push )
+# pragma warning( disable : 4510 ) // default constructor could not be generated
+# pragma warning( disable : 4610 ) // object 'class' can never be instantiated - user-defined constructor required
+#endif
   // The SGI STL version of Assignable requires copy constructor and operator=
   BOOST_concept(SGIAssignable,(TT))
   {
@@ -190,6 +197,9 @@ namespace boost
     }
     TT a;
   };
+#if (defined _MSC_VER)
+# pragma warning( pop )
+#endif
 
   BOOST_concept(Convertible,(X)(Y))
   {
similarity index 98%
rename from deal.II/contrib/boost/include/boost/config/auto_link.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/auto_link.hpp
index df58d4f9265634e3c3d1d4e79d0a3adbc1f3e3b7..f2eb583f0435111a2ede8d47119448ee63311c27 100644 (file)
@@ -135,11 +135,16 @@ BOOST_LIB_VERSION:    The Boost version, in the form x_y, for Boost version x.y.
    // vc80:
 #  define BOOST_LIB_TOOLSET "vc80"
 
-#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1500)
+#elif defined(BOOST_MSVC) && (BOOST_MSVC == 1500)
 
    // vc90:
 #  define BOOST_LIB_TOOLSET "vc90"
 
+#elif defined(BOOST_MSVC) && (BOOST_MSVC >= 1600)
+
+   // vc10:
+#  define BOOST_LIB_TOOLSET "vc100"
+
 #elif defined(__BORLANDC__)
 
    // CBuilder 6:
similarity index 82%
rename from deal.II/contrib/boost/include/boost/config/compiler/borland.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/borland.hpp
index d16c06d069763e62bee1c34d04ed1d4b3ffd3e7e..91f064c68e492cd531f68700b4d44330b19b5709 100644 (file)
@@ -16,9 +16,8 @@
 #  error "Compiler not supported or configured - please reconfigure"
 #endif
 
-// last known and checked version is 0x600 (Builder X preview)
-// or 0x593 (CodeGear C++ Builder 2007 December 2007 update):
-#if (__BORLANDC__ > 0x593) && (__BORLANDC__ != 0x600)
+// last known compiler version:
+#if (__BORLANDC__ > 0x613)
 //#  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 //#  else
 #  endif
 #endif
 
-// Borland C++ Builder 2007 December 2007 Update and below:
-#if (__BORLANDC__ <= 0x593)
+#if (__BORLANDC__ <= 0x613)  // Beman has asked Alisdair for more info
    // we shouldn't really need this - but too many things choke
    // without it, this needs more investigation:
 #  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
 #  define BOOST_NO_IS_ABSTRACT
 #  define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS
+#  define BOOST_NO_USING_TEMPLATE
+#  define BOOST_SP_NO_SP_CONVERTIBLE
 
 // Temporary workaround
 #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
 #endif
 
 // Borland C++ Builder 2008 and below:
-#if (__BORLANDC__ <= 0x601)
 #  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
-#  define BOOST_ILLEGAL_CV_REFERENCES
 #  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
 #  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 #  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
-#  define BOOST_NO_USING_TEMPLATE
 #  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE
+#  define BOOST_NO_NESTED_FRIENDSHIP
+#  define BOOST_NO_TYPENAME_WITH_CTOR
+#if (__BORLANDC__ < 0x600)
+#  define BOOST_ILLEGAL_CV_REFERENCES
 #endif
 
 //
 #if (__BORLANDC__ >= 0x599)
 #  pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax
 #endif
-
-#if defined( BOOST_CODEGEAR_0X_SUPPORT )
-#  #if __BORLANDC__ >= 0x610
+//
+// C++0x Macros:
+//
+#if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610)
+#  define BOOST_NO_CHAR16_T
+#  define BOOST_NO_CHAR32_T
+#  define BOOST_NO_DECLTYPE
+#  define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#  define BOOST_NO_EXTERN_TEMPLATE
+#  define BOOST_NO_RVALUE_REFERENCES 
+#  define BOOST_NO_SCOPED_ENUMS
+#  define BOOST_NO_STATIC_ASSERT
+#else
 #  define BOOST_HAS_ALIGNOF
 #  define BOOST_HAS_CHAR16_T
 #  define BOOST_HAS_CHAR32_T
 #  define BOOST_HAS_DECLTYPE
-//#  define BOOST_HAS_DEFAULTED_FN
-//#  define BOOST_HAS_DELETED_FN
 #  define BOOST_HAS_EXPLICIT_CONVERSION_OPS
-//#  define BOOST_HAS_NULLPTR
-//#  define BOOST_HAS_RAW_STRING
 #  define BOOST_HAS_REF_QUALIFIER
 #  define BOOST_HAS_RVALUE_REFS
-//#  define BOOST_HAS_SCOPED_ENUM
 #  define BOOST_HAS_STATIC_ASSERT
-//#  define BOOST_HAS_VARIADIC_TMPL
-#  #endif //__BORLANDC__ >= 0x610
 #endif
 
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS    // UTF-8 still not supported
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 #if __BORLANDC__ >= 0x590
 #  define BOOST_HAS_TR1_HASH
 
 #if __BORLANDC__ >= 0x561
 #  ifndef __NO_LONG_LONG
 #     define BOOST_HAS_LONG_LONG
+#  else
+#     define BOOST_NO_LONG_LONG
 #  endif
    // On non-Win32 platforms let the platform config figure this out:
 #  ifdef _WIN32
 //
 // ABI fixing headers:
 //
-#if __BORLANDC__ < 0x600 // not implemented for version 6 compiler yet
+#if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet
 #ifndef BOOST_ABI_PREFIX
 #  define BOOST_ABI_PREFIX "boost/config/abi/borland_prefix.hpp"
 #endif
similarity index 71%
rename from deal.II/contrib/boost/include/boost/config/compiler/codegear.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/codegear.hpp
index d27817a94e51d080339ba8af4561b7bbcf25654a..3915cd54f95a12e94519efdffd1835047eccbf73 100644 (file)
@@ -20,7 +20,7 @@
 //
 // versions check:
 // last known and checked version is 0x610
-#if (__CODEGEARC__ > 0x610)
+#if (__CODEGEARC__ > 0x613)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  else
@@ -29,7 +29,7 @@
 #endif
 
 // CodeGear C++ Builder 2009
-#if (__CODEGEARC__ <= 0x610)
+#if (__CODEGEARC__ <= 0x613)
 #  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
 #  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
 #  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
@@ -42,6 +42,7 @@
 #  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
 #  define BOOST_NO_TYPENAME_WITH_CTOR    // Cannot use typename keyword when making temporaries of a dependant type
 #  define BOOST_NO_NESTED_FRIENDSHIP     // TC1 gives nested classes access rights as any other member
+#  define BOOST_SP_NO_SP_CONVERTIBLE
 
 // Temporary hack, until specific MPL preprocessed headers are generated
 #  define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
 
 #endif
 
+//
+// C++0x macros:
+//
+#define BOOST_HAS_CHAR16_T
+#define BOOST_HAS_CHAR32_T
+#define BOOST_HAS_LONG_LONG
+// #define BOOST_HAS_ALIGNOF
+#define BOOST_HAS_DECLTYPE
+#define BOOST_HAS_EXPLICIT_CONVERSION_OPS
+// #define BOOST_HAS_RVALUE_REFS
+#define BOOST_HAS_SCOPED_ENUM
+// #define BOOST_HAS_STATIC_ASSERT
+#define BOOST_HAS_STD_TYPE_TRAITS
+
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
 
-#  define BOOST_HAS_CHAR16_T
-#  define BOOST_HAS_CHAR32_T
-#  define BOOST_HAS_LONG_LONG
-
-//#  define BOOST_HAS_ALIGNOF
-#  define BOOST_HAS_DECLTYPE
-#  define BOOST_HAS_EXPLICIT_CONVERSION_OPS
-//#  define BOOST_HAS_RVALUE_REFS
-#  define BOOST_HAS_SCOPED_ENUM
-//#  define BOOST_HAS_STATIC_ASSERT
-#  define BOOST_HAS_STD_TYPE_TRAITS
-
-#  define BOOST_HAS_TR1_HASH
-#  define BOOST_HAS_TR1_TYPE_TRAITS
-#  define BOOST_HAS_TR1_UNORDERED_MAP
-#  define BOOST_HAS_TR1_UNORDERED_SET
+//
+// TR1 macros:
+//
+#define BOOST_HAS_TR1_HASH
+#define BOOST_HAS_TR1_TYPE_TRAITS
+#define BOOST_HAS_TR1_UNORDERED_MAP
+#define BOOST_HAS_TR1_UNORDERED_SET
 
-#  define BOOST_HAS_MACRO_USE_FACET
+#define BOOST_HAS_MACRO_USE_FACET
 
+#define BOOST_NO_INITIALIZER_LISTS
 
-   // On non-Win32 platforms let the platform config figure this out:
-# ifdef _WIN32
-#    define BOOST_HAS_STDINT_H
-# endif
+// On non-Win32 platforms let the platform config figure this out:
+#ifdef _WIN32
+#  define BOOST_HAS_STDINT_H
+#endif
 
 //
 // __int64:
similarity index 64%
rename from deal.II/contrib/boost/include/boost/config/compiler/common_edg.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/common_edg.hpp
index 0443be1aea2ff9154cbf3a4473a38f679c4b6363..9dc4cef8eb5b31478cd61bde8e68be2715dc9d81 100644 (file)
 
 # if !defined(__NO_LONG_LONG)
 #     define BOOST_HAS_LONG_LONG
+# else
+#     define BOOST_NO_LONG_LONG
 # endif
 
+//
+// C++0x features
+//
+//   See above for BOOST_NO_LONG_LONG
+//
+#if (__EDG_VERSION__ <= 310) || !defined(BOOST_STRICT_CONFIG)
+// No support for initializer lists
+#  define BOOST_NO_INITIALIZER_LISTS
+#endif
+
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 #ifdef c_plusplus
 // EDG has "long long" in non-strict mode
 // However, some libraries have insufficient "long long" support
similarity index 72%
rename from deal.II/contrib/boost/include/boost/config/compiler/digitalmars.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/digitalmars.hpp
index 46848479b741a6f8c78a838a8449bee56d78f92f..a01b4c28ec48231c517a132b8a409cba77d835d6 100644 (file)
 #  define BOOST_NO_EXCEPTIONS
 #endif
 
+//
+// C++0x features
+//
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 #if __DMC__ < 0x800
 #error "Compiler not supported or configured - please reconfigure"
 #endif
similarity index 66%
rename from deal.II/contrib/boost/include/boost/config/compiler/gcc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/gcc.hpp
index 27df829b248d10ba91b83f7a7545d552ce717735..6cae94cae679ef7f8705fce838613f1946477930 100644 (file)
@@ -64,6 +64,9 @@
 // All problems to gcc-3.x and earlier here:
 //
 #define BOOST_NO_TWO_PHASE_NAME_LOOKUP
+#  ifdef __OPEN64__
+#     define BOOST_NO_IS_ABSTRACT
+#  endif
 #endif
 
 #ifndef __EXCEPTIONS
 #  endif
 #endif
 
+// C++0x features not implemented in any GCC version
 //
-// C++0x features
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+
+// C++0x features in 4.3.n and later
 //
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
+#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__)
 // C++0x features are only enabled when -std=c++0x or -std=gnu++0x are
 // passed on the command line, which in turn defines
-// __GXX_EXPERIMENTAL_CXX0X__. 
-#  if defined(__GXX_EXPERIMENTAL_CXX0X__)
-#    define BOOST_HAS_STATIC_ASSERT
+// __GXX_EXPERIMENTAL_CXX0X__.
+#  define BOOST_HAS_DECLTYPE
+#  define BOOST_HAS_RVALUE_REFS
+#  define BOOST_HAS_STATIC_ASSERT
+#  define BOOST_HAS_VARIADIC_TMPL
+#else
+#  define BOOST_NO_DECLTYPE
+#  define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#  define BOOST_NO_RVALUE_REFERENCES
+#  define BOOST_NO_STATIC_ASSERT
+
+// Variadic templates compiler: 
+//   http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html
+#  ifdef __VARIADIC_TEMPLATES
 #    define BOOST_HAS_VARIADIC_TMPL
-#    define BOOST_HAS_RVALUE_REFS
-#    define BOOST_HAS_DECLTYPE
+#  else
+#    define BOOST_NO_VARIADIC_TEMPLATES
 #  endif
 #endif
 
+// C++0x features in 4.4.n and later
+//
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_NO_AUTO_DECLARATIONS
+#  define BOOST_NO_AUTO_MULTIDECLARATIONS
+#  define BOOST_NO_CHAR16_T
+#  define BOOST_NO_CHAR32_T
+#  define BOOST_NO_DEFAULTED_FUNCTIONS
+#  define BOOST_NO_DELETED_FUNCTIONS
+#  define BOOST_NO_INITIALIZER_LISTS
+#  define BOOST_NO_SCOPED_ENUMS  
+#endif
+
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4)
+#  define BOOST_NO_SFINAE_EXPR
+#endif
+
+// C++0x features in 4.4.1 and later
 //
-// Potential C++0x features
-//
+#if (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__ < 40401) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+// scoped enums have a serious bug in 4.4.0, so define BOOST_NO_SCOPED_ENUMS before 4.4.1
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064
+#  define BOOST_NO_SCOPED_ENUMS
+#endif
 
-// Variadic templates compiler: 
-//   http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html
-#ifdef __VARIADIC_TEMPLATES
-#  define BOOST_HAS_VARIADIC_TMPL
+// C++0x features in 4.5.n and later
+//
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
 #endif
 
 // ConceptGCC compiler:
 #ifdef __GXX_CONCEPTS__
 #  define BOOST_HAS_CONCEPTS
 #  define BOOST_COMPILER "ConceptGCC version " __VERSION__
+#else
+#  define BOOST_NO_CONCEPTS
 #endif
 
 #ifndef BOOST_COMPILER
 #  error "Compiler not configured - please reconfigure"
 #endif
 //
-// last known and checked version is 4.3 (Pre-release):
-#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 3))
+// last known and checked version is 4.4 (Pre-release):
+#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 4))
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  else
similarity index 78%
rename from deal.II/contrib/boost/include/boost/config/compiler/hp_acc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/hp_acc.hpp
index 5a766c590c00d7fd4e36a1b37cf5e8bf26af1cd1..98e7772af281522d6c94898b5bf8f84dc445dd49 100644 (file)
 #  endif //PA-RISC
 #endif
 
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#if !defined(__EDG__)
+
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+#endif
+
 //
 // last known and checked version for HP-UX/ia64 is 61300
 // last known and checked version for PA-RISC is 38000
similarity index 97%
rename from deal.II/contrib/boost/include/boost/config/compiler/intel.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/intel.hpp
index bc3d4e99a325304f7aab34218584a4f63557ef11..531242e9642b28258673cb5b68e3756e21e11b14 100644 (file)
@@ -99,7 +99,7 @@
 #     define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL
 #  endif
 #endif
-#if (defined(__GNUC__) && (__GNUC__ < 4)) || defined(_WIN32)
+#if (defined(__GNUC__) && (__GNUC__ < 4)) || defined(_WIN32) || (BOOST_INTEL_CXX_VERSION <= 1110)
 // GCC or VC emulation:
 #define BOOST_NO_TWO_PHASE_NAME_LOOKUP
 #endif
@@ -159,7 +159,7 @@ template<> struct assert_intrinsic_wchar_t<unsigned short> {};
 
 //
 // last known and checked version:
-#if (BOOST_INTEL_CXX_VERSION > 1010)
+#if (BOOST_INTEL_CXX_VERSION > 1110)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  elif defined(_MSC_VER)
similarity index 93%
rename from deal.II/contrib/boost/include/boost/config/compiler/kai.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/kai.hpp
index de16f1a67583ae58c59e1114e7e99379be11583b..ea06f9f4d06741dddbd4d7e5f7e47dcd9b8267c9 100644 (file)
@@ -21,8 +21,6 @@
 #     define BOOST_NO_EXCEPTIONS
 # endif
 
-#define BOOST_COMPILER "Kai C++ version " BOOST_STRINGIZE(__KCC_VERSION)
-
 //
 // last known and checked version is 4001:
 #if (__KCC_VERSION > 4001)
similarity index 75%
rename from deal.II/contrib/boost/include/boost/config/compiler/metrowerks.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/metrowerks.hpp
index 2b60b56f7fff1b53539717259ebed3b33703c01d..aeba7f805c82fae5bd44b452ca6c75654161f75f 100644 (file)
@@ -39,7 +39,7 @@
 
 // the "|| !defined(BOOST_STRICT_CONFIG)" part should apply to the last
 // tested version *only*:
-#   if(__MWERKS__ <= 0x3206) || !defined(BOOST_STRICT_CONFIG) // 9.5
+#   if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6
 #     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 #     define BOOST_NO_IS_ABSTRACT
 #    endif
@@ -73,6 +73,8 @@
 #     define BOOST_COMPILER_VERSION 9.4
 #   elif __MWERKS__ == 0x3206
 #     define BOOST_COMPILER_VERSION 9.5
+#   elif __MWERKS__ == 0x3207
+#     define BOOST_COMPILER_VERSION 9.6
 #   else
 #     define BOOST_COMPILER_VERSION __MWERKS__
 #   endif
 //
 // C++0x features
 //
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
 #if __MWERKS__ > 0x3206 && __option(rvalue_refs)
 #  define BOOST_HAS_RVALUE_REFS
+#else
+#  define BOOST_NO_RVALUE_REFERENCES              
 #endif
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
 
 #define BOOST_COMPILER "Metrowerks CodeWarrior C++ version " BOOST_STRINGIZE(BOOST_COMPILER_VERSION)
 
similarity index 65%
rename from deal.II/contrib/boost/include/boost/config/compiler/mpw.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/mpw.hpp
index 8ab2aacb6e7eedbcb957a44ff3ca1822d985039b..4db14ddef3a22380c6f70b2c634b1a926356a614 100644 (file)
 #  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
 
 #  define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */
+
 #endif
 
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 //
 // versions check:
 // we don't support MPW prior to version 8.9:
similarity index 50%
rename from deal.II/contrib/boost/include/boost/config/compiler/pgi.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/pgi.hpp
index 41f29c75fd75c956223d1bbcb14e4100796b20ce..e40553efc04e18d3775f64cdbcbcdd9baaa82628 100644 (file)
 #  error "Pgi compiler not configured - please reconfigure"
 
 #endif
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 //
 // version check:
 // probably nothing to do here?
similarity index 99%
rename from deal.II/contrib/boost/include/boost/config/compiler/sgi_mipspro.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/sgi_mipspro.hpp
index 33e97e9af3d53c681fd53d79a375197465705db5..90688314ad5b5ccb88d3487be827730abb5ee61c 100644 (file)
@@ -21,6 +21,7 @@
 
 #undef BOOST_NO_SWPRINTF
 #undef BOOST_DEDUCED_TYPENAME
+
 //
 // version check:
 // probably nothing to do here?
similarity index 80%
rename from deal.II/contrib/boost/include/boost/config/compiler/sunpro_cc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/sunpro_cc.hpp
index f513c2dce83ebdc916cadd333d9555439f2ec11f..f5184887f11ece05b826b4b8a020384afae34019 100644 (file)
 #define BOOST_NO_TWO_PHASE_NAME_LOOKUP
 #define BOOST_NO_ADL_BARRIER
 
+//
+// C++0x features
+//
+
 #if(__SUNPRO_CC >= 0x590) 
 #  define BOOST_HAS_LONG_LONG
+#else
+#  define BOOST_NO_LONG_LONG
 #endif
 
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
+//
+// Version
+//
 
 #define BOOST_COMPILER "Sun compiler version " BOOST_STRINGIZE(__SUNPRO_CC)
 
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  endif
 #endif
-
-
-
-
-
-
similarity index 68%
rename from deal.II/contrib/boost/include/boost/config/compiler/vacpp.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/vacpp.hpp
index 826939f12078d510fb677c843b5167de11da619c..01956d3a7026142a68581747587bbc851595482b 100644 (file)
@@ -27,6 +27,7 @@
 
 #if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG)
 #  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS
+#  define BOOST_NO_INITIALIZER_LISTS
 #endif
 
 //
@@ -46,7 +47,7 @@
 #endif
 //
 // last known and checked version is 600:
-#if (__IBMCPP__ > 600)
+#if (__IBMCPP__ > 1010)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  endif
 // Some versions of the compiler have issues with default arguments on partial specializations
 #define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS
 
+//
+// C++0x features
+//
+//   See boost\config\suffix.hpp for BOOST_NO_LONG_LONG
+//
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_STATIC_ASSERT
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
 
 
 
similarity index 77%
rename from deal.II/contrib/boost/include/boost/config/compiler/visualc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/compiler/visualc.hpp
index 187591be9d783c83e08b08ef26a0afc9f17ce244..fd21f26bab05aa91c78aa3b28dad7f0e78172d5d 100644 (file)
 
 #define BOOST_MSVC _MSC_VER
 
+#if _MSC_FULL_VER > 100000000
+#  define BOOST_MSVC_FULL_VER _MSC_FULL_VER
+#else
+#  define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10)
+#endif
+
 // turn off the warnings before we #include anything
 #pragma warning( disable : 4503 ) // warning: decorated name length exceeded
 
 #  define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
 #  define BOOST_NO_VOID_RETURNS
 #  define BOOST_NO_EXCEPTION_STD_NAMESPACE
+
+#  if BOOST_MSVC == 1202
+#    define BOOST_NO_STD_TYPEINFO
+#  endif
+
    // disable min/max macro defines on vc6:
    //
 #endif
@@ -79,7 +90,7 @@
 #  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS
 #endif
 
-#if _MSC_VER <= 1500  // 1500 == VC++ 9.0
+#if _MSC_VER <= 1600  // 1600 == VC++ 10.0
 #  define BOOST_NO_TWO_PHASE_NAME_LOOKUP
 #endif
 
 #  define BOOST_NO_ADL_BARRIER
 #endif
 
+#if _MSC_VER <= 1500  || !defined(BOOST_STRICT_CONFIG) // 1500 == VC++ 9.0
+#  define BOOST_NO_INITIALIZER_LISTS
+#endif
+
 #ifndef _NATIVE_WCHAR_T_DEFINED
 #  define BOOST_NO_INTRINSIC_WCHAR_T
 #endif
 #endif
 #if (_MSC_VER >= 1310) && defined(_MSC_EXTENSIONS)
 #   define BOOST_HAS_LONG_LONG
+#else
+#   define BOOST_NO_LONG_LONG
 #endif
 #if (_MSC_VER >= 1400) && !defined(_DEBUG)
 #   define BOOST_HAS_NRVO
 // disable Win32 API's if compiler extentions are
 // turned off:
 //
-#ifndef _MSC_EXTENSIONS
+#if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32)
 #  define BOOST_DISABLE_WIN32
 #endif
-#ifndef _CPPRTTI
+#if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI)
 #  define BOOST_NO_RTTI
 #endif
 
 // all versions support __declspec:
 //
 #define BOOST_HAS_DECLSPEC
+
+//
+// C++0x features
+//
+//   See above for BOOST_NO_LONG_LONG
+
+// C++ features supported by VC++ 10 (aka 2010)
+//
+#if _MSC_VER < 1600
+#define BOOST_NO_AUTO_DECLARATIONS
+#define BOOST_NO_AUTO_MULTIDECLARATIONS
+#define BOOST_NO_DECLTYPE
+#define BOOST_NO_LAMBDAS
+#define BOOST_NO_RVALUE_REFERENCES
+#define BOOST_NO_STATIC_ASSERT
+#endif // _MSC_VER < 1600
+
+// C++0x features not supported by any versions
+#define BOOST_NO_CHAR16_T
+#define BOOST_NO_CHAR32_T
+#define BOOST_NO_CONCEPTS
+#define BOOST_NO_CONSTEXPR
+#define BOOST_NO_DEFAULTED_FUNCTIONS
+#define BOOST_NO_DELETED_FUNCTIONS
+#define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#define BOOST_NO_EXTERN_TEMPLATE
+#define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS
+#define BOOST_NO_INITIALIZER_LISTS
+#define BOOST_NO_NULLPTR
+#define BOOST_NO_RAW_LITERALS
+#define BOOST_NO_SCOPED_ENUMS
+#define BOOST_NO_SFINAE_EXPR
+#define BOOST_NO_TEMPLATE_ALIASES
+#define BOOST_NO_UNICODE_LITERALS
+#define BOOST_NO_VARIADIC_TEMPLATES
+
 //
 // prefix and suffix headers:
 //
 #     define BOOST_COMPILER_VERSION evc4.0
 #   elif _MSC_VER == 1400
 #     define BOOST_COMPILER_VERSION evc8
+#   elif _MSC_VER == 1500
+#     define BOOST_COMPILER_VERSION evc9
+#   elif _MSC_VER == 1600
+#     define BOOST_COMPILER_VERSION evc10
 #   else
 #      if defined(BOOST_ASSERT_CONFIG)
 #         error "Unknown EVC++ compiler version - please run the configure tests and report the results"
 #     define BOOST_COMPILER_VERSION 8.0
 #   elif _MSC_VER == 1500
 #     define BOOST_COMPILER_VERSION 9.0
+#   elif _MSC_VER == 1600
+#     define BOOST_COMPILER_VERSION 10.0
 #   else
 #     define BOOST_COMPILER_VERSION _MSC_VER
 #   endif
 #error "Compiler not supported or configured - please reconfigure"
 #endif
 //
-// last known and checked version is 1500 (VC9):
-#if (_MSC_VER > 1500)
+// last known and checked version is 1600 (VC10, aka 2010):
+#if (_MSC_VER > 1600)
 #  if defined(BOOST_ASSERT_CONFIG)
 #     error "Unknown compiler version - please run the configure tests and report the results"
 #  else
similarity index 91%
rename from deal.II/contrib/boost/include/boost/config/platform/bsd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/platform/bsd.hpp
index 810d3707be7a46cf5f62b6aa1344fa57fe275ddb..f02b0e2630ada627b788492f03d6c31c16a07de7 100644 (file)
@@ -36,7 +36,8 @@
 // FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in <pthread.h>
 // and not in <unistd.h>
 //
-#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3)) || defined(__OpenBSD__)
+#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\
+   || defined(__OpenBSD__) || defined(__DragonFly__) 
 #  define BOOST_HAS_PTHREADS
 #endif
 
 #endif
 
 #if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \
-      || (__NetBSD_GCC__ >= 2095003))
+      || (__NetBSD_GCC__ >= 2095003) || defined(__DragonFly__))
 #  define BOOST_NO_CWCHAR
 #endif
 //
 // The BSD <ctype.h> has macros only, no functions:
 //
-#if !defined(__OpenBSD__)
+#if !defined(__OpenBSD__) || defined(__DragonFly__)
 #  define BOOST_NO_CTYPE_FUNCTIONS
 #endif
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/config/platform/vxworks.hpp b/deal.II/contrib/boost-1.41.0/include/boost/config/platform/vxworks.hpp
new file mode 100644 (file)
index 0000000..6ec5171
--- /dev/null
@@ -0,0 +1,31 @@
+//  (C) Copyright Dustin Spicuzza 2009. 
+//  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)
+
+//  See http://www.boost.org for most recent version.
+
+//  vxWorks specific config options:
+
+#define BOOST_PLATFORM "vxWorks"
+
+#define BOOST_NO_CWCHAR
+#define BOOST_NO_INTRINSIC_WCHAR_T
+
+#if defined(__GNUC__) && defined(__STRICT_ANSI__)
+#define BOOST_NO_INT64_T
+#endif
+
+#define BOOST_HAS_UNISTD_H
+
+// these allow posix_features to work, since vxWorks doesn't
+// define them itself
+#define _POSIX_TIMERS 1
+#define _POSIX_THREADS 1
+
+// vxworks doesn't work with asio serial ports
+#define BOOST_ASIO_DISABLE_SERIAL_PORT
+
+// boilerplate code:
+#include <boost/config/posix_features.hpp>
similarity index 88%
rename from deal.II/contrib/boost/include/boost/config/select_platform_config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/select_platform_config.hpp
index a4c7ad6a87616558e654d472012026ade73b1436..615bb064ff8c3baad511f095764d85aed9d05e56 100644 (file)
@@ -13,8 +13,8 @@
 // <header_name> in order to prevent macro expansion within the header
 // name (for example "linux" is a macro on linux systems).
 
-#if defined(linux) || defined(__linux) || defined(__linux__)
-// linux:
+#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__) 
+// linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though?
 #  define BOOST_PLATFORM_CONFIG "boost/config/platform/linux.hpp"
 
 #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
 // QNX:
 #  define BOOST_PLATFORM_CONFIG "boost/config/platform/qnxnto.hpp"
 
+#elif defined(__VXWORKS__)
+// vxWorks:
+#  define BOOST_PLATFORM_CONFIG "boost/config/platform/vxworks.hpp"
+
 #else
 
 #  if defined(unix) \
similarity index 74%
rename from deal.II/contrib/boost/include/boost/config/select_stdlib_config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/select_stdlib_config.hpp
index 13e5e4cef021b7b50d06a804b0945f6df48bd346..2a1430aef4b0749c26b006110e39deee58c184df 100644 (file)
 
 // locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed:
 
-// we need to include a std lib header here in order to detect which
-// library is in use, use <utility> as it's about the smallest
-// of the std lib headers - do not rely on this header being included -
-// users can short-circuit this header if they know whose std lib
-// they are using.
-
-#include <boost/config/no_tr1/utility.hpp>
+// First include <cstddef> to determine if some version of STLport is in use as the std lib
+// (do not rely on this header being included since users can short-circuit this header 
+//  if they know whose std lib they are using.)
+#include <cstddef>
 
 #if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
 // STLPort library; this _must_ come first, otherwise since
 // can end up detecting that first rather than STLport:
 #  define BOOST_STDLIB_CONFIG "boost/config/stdlib/stlport.hpp"
 
-#elif defined(__LIBCOMO__)
+#else
+
+// If our std lib was not some version of STLport, then include <utility> as it is about 
+// the smallest of the std lib headers that includes real C++ stuff.  (Some std libs do not
+// include their C++-related macros in <cstddef> so this additional include makes sure
+// we get those definitions)
+// (again do not rely on this header being included since users can short-circuit this 
+//  header if they know whose std lib they are using.)
+#include <boost/config/no_tr1/utility.hpp>
+
+#if defined(__LIBCOMO__)
 // Comeau STL:
 #define BOOST_STDLIB_CONFIG "boost/config/stdlib/libcomo.hpp"
 
@@ -64,5 +71,7 @@
 
 #endif
 
+#endif
+
 
 
similarity index 75%
rename from deal.II/contrib/boost/include/boost/config/stdlib/dinkumware.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/dinkumware.hpp
index 01f1238d934168f5ac4fa5097cb0f4936b59a5ba..ab770599a7da27da9dab8102e49c87a3d7b07301 100644 (file)
 #  define BOOST_HAS_MACRO_USE_FACET
 #  ifndef _CPPLIB_VER
       // Updated Dinkum library defines this, and provides
-      // its own min and max definitions.
-#     define BOOST_NO_STD_MIN_MAX
+      // its own min and max definitions, as does MTA version.
+#     ifndef __MTA__ 
+#        define BOOST_NO_STD_MIN_MAX
+#     endif
 #     define BOOST_NO_MS_INT64_NUMERIC_LIMITS
 #  endif
 #endif
 #  define BOOST_NO_STD_LOCALE
 #endif
 
+//  C++0x headers implemented in 520 (as shipped by Microsoft)
+//
+#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+
 #ifdef _CPPLIB_VER
 #  define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER
 #else
similarity index 59%
rename from deal.II/contrib/boost/include/boost/config/stdlib/libcomo.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/libcomo.hpp
index 749781fecee9d8838ece0646e10e6d79b5f8d9e6..06731e32e7053dfb8910b27e5d6f2687c4fcfa35 100644 (file)
 #  define BOOST_HAS_SLIST
 #endif
 
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
 //
 // Intrinsic type_traits support.
 // The SGI STL has it's own __type_traits class, which
similarity index 60%
rename from deal.II/contrib/boost/include/boost/config/stdlib/libstdcpp3.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/libstdcpp3.hpp
index a619e3ebaacdec77bef1fa44363745ee0db646e9..6a57319ffd267a15ac5f4b4c9814e251aa24937d 100644 (file)
 #   define BOOST_HASH_MAP_HEADER <backward/hash_map>
 # endif
 #endif
+
+//  stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly
+//  __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++
+//  developers. He also commented:
+//
+//       "I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in
+//       GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305.
+//       Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support
+//       than any release in the 4.2 series."
+//
+//  Another resource for understanding stdlibc++ features is:
+//  http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x
+
+//  C++0x headers in GCC 4.3.0 and later
+//
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED  // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+#endif
+
+//  C++0x headers in GCC 4.4.0 and later
+//
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4) || !defined(__GXX_EXPERIMENTAL_CXX0X__)
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+
+//  --- end ---
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/modena.hpp b/deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/modena.hpp
new file mode 100644 (file)
index 0000000..7bd50ce
--- /dev/null
@@ -0,0 +1,55 @@
+//  (C) Copyright Jens Maurer 2001. 
+//  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)
+
+//  See http://www.boost.org for most recent version.
+
+//  Modena C++ standard library (comes with KAI C++)
+
+#if !defined(MSIPL_COMPILE_H)
+#  include <boost/config/no_tr1/utility.hpp>
+#  if !defined(__MSIPL_COMPILE_H)
+#      error "This is not the Modena C++ library!"
+#  endif
+#endif
+
+#ifndef MSIPL_NL_TYPES
+#define BOOST_NO_STD_MESSAGES
+#endif
+
+#ifndef MSIPL_WCHART
+#define BOOST_NO_STD_WSTRING
+#endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
+#define BOOST_STDLIB "Modena C++ standard library"
+
+
+
+
+
similarity index 59%
rename from deal.II/contrib/boost/include/boost/config/stdlib/msl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/msl.hpp
index f8d8752bf77f947dd78ba3e671e6938cc2e01cc7..6bcd232a57350e13a802774c3816d675e5d7cd76 100644 (file)
 #  define BOOST_HAS_TWO_ARG_USE_FACET
 #endif
 
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
 
 #define BOOST_STDLIB "Metrowerks Standard Library version " BOOST_STRINGIZE(__MSL_CPP__)
 
similarity index 83%
rename from deal.II/contrib/boost/include/boost/config/stdlib/roguewave.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/roguewave.hpp
index ebf4c1f8f47774053bed79d95f672a8e39708d09..cba2f54a1a0a2d02f942f460e68ad6da0c3b9027 100644 (file)
 #    define _HP_INSTANTIATE_STD2_VL
 #  endif
 #endif
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
similarity index 78%
rename from deal.II/contrib/boost/include/boost/config/stdlib/sgi.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/sgi.hpp
index f3fa05b260363fa489b23886138d0dba65514991..c505008b7d77d5e6603011184db0361506a629b3 100644 (file)
 //
 #define BOOST_HAS_SGI_TYPE_TRAITS
 
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
 #define BOOST_STDLIB "SGI standard library"
 
 
similarity index 84%
rename from deal.II/contrib/boost/include/boost/config/stdlib/stlport.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/stlport.hpp
index b1dabf23f65a9997e0536cd146d015aa2a836d6d..3dfd529effb940a797959b23cc5a5c035fd87c7b 100644 (file)
@@ -10,7 +10,7 @@
 //  STLPort standard library config:
 
 #if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
-#  include <boost/config/no_tr1/utility.hpp>
+#  include <cstddef>
 #  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
 #      error "This is not STLPort!"
 #  endif
 #  endif
 #endif
 
+#if defined(_STLPORT_VERSION) && ((_STLPORT_VERSION < 0x500) || (_STLPORT_VERSION >= 0x520))
+#  define BOOST_NO_STD_UNORDERED
+#endif
+
+#if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520)
+#  define BOOST_HAS_TR1_UNORDERED_SET
+#  define BOOST_HAS_TR1_UNORDERED_MAP
+#endif
 //
 // Without member template support enabled, their are no template
 // iterate constructors, and no std::allocator:
@@ -192,6 +200,31 @@ namespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy;
 namespace boost { using std::min; using std::max; }
 #endif
 
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
 #define BOOST_STDLIB "STLPort standard library version " BOOST_STRINGIZE(__SGI_STL_PORT)
 
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/vacpp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/config/stdlib/vacpp.hpp
new file mode 100644 (file)
index 0000000..c8d6d5a
--- /dev/null
@@ -0,0 +1,43 @@
+//  (C) Copyright John Maddock 2001 - 2002. 
+//  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)
+
+//  See http://www.boost.org for most recent version.
+
+#if __IBMCPP__ <= 501
+#  define BOOST_NO_STD_ALLOCATOR
+#endif
+
+#define BOOST_HAS_MACRO_USE_FACET
+#define BOOST_NO_STD_MESSAGES
+
+//  C++0x headers not yet implemented
+//
+#  define BOOST_NO_0X_HDR_ARRAY
+#  define BOOST_NO_0X_HDR_CHRONO
+#  define BOOST_NO_0X_HDR_CODECVT
+#  define BOOST_NO_0X_HDR_CONCEPTS
+#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE
+#  define BOOST_NO_0X_HDR_CONTAINER_CONCEPTS
+#  define BOOST_NO_0X_HDR_FORWARD_LIST
+#  define BOOST_NO_0X_HDR_FUTURE
+#  define BOOST_NO_0X_HDR_INITIALIZER_LIST
+#  define BOOST_NO_0X_HDR_ITERATOR_CONCEPTS
+#  define BOOST_NO_0X_HDR_MEMORY_CONCEPTS
+#  define BOOST_NO_0X_HDR_MUTEX
+#  define BOOST_NO_0X_HDR_RANDOM
+#  define BOOST_NO_0X_HDR_RATIO
+#  define BOOST_NO_0X_HDR_REGEX
+#  define BOOST_NO_0X_HDR_SYSTEM_ERROR
+#  define BOOST_NO_0X_HDR_THREAD
+#  define BOOST_NO_0X_HDR_TUPLE
+#  define BOOST_NO_0X_HDR_TYPE_TRAITS
+#  define BOOST_NO_STD_UNORDERED        // deprecated; see following
+#  define BOOST_NO_0X_HDR_UNORDERED_MAP
+#  define BOOST_NO_0X_HDR_UNORDERED_SET
+
+#define BOOST_STDLIB "Visual Age default standard library"
+
+
+
similarity index 97%
rename from deal.II/contrib/boost/include/boost/config/suffix.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/config/suffix.hpp
index f71c644f7924ff3cb4bfa93bb1bec7f447591241..fa44986946cb70aa3fc589ea6d829da072ad8a9b 100644 (file)
 // remember that since these just declare a bunch of macros, there should be
 // no namespace issues from this.
 //
-#if !defined(BOOST_HAS_LONG_LONG)                                               \
+#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG)                                              \
    && !defined(BOOST_MSVC) && !defined(__BORLANDC__)
 # include <limits.h>
 # if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))
 #   define BOOST_HAS_LONG_LONG
+# else
+#   define BOOST_NO_LONG_LONG
 # endif
 #endif
 
 // from here then add to the appropriate compiler section):
 //
 #if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \
-    || defined(_PTHREADS)) && !defined(BOOST_HAS_THREADS)
+    || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \
+    && !defined(BOOST_HAS_THREADS)
 #  define BOOST_HAS_THREADS
 #endif
 
 #  define BOOST_HASH_MAP_HEADER <hash_map>
 #endif
 
+//
+// Set BOOST_NO_INITIALIZER_LISTS if there is no library support.
+//
+
+#if defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)
+#  define BOOST_NO_INITIALIZER_LISTS
+#endif
+
 //  BOOST_HAS_ABI_HEADERS
 //  This macro gets set if we have headers that fix the ABI,
 //  and prevent ODR violations when linking to external libraries:
similarity index 99%
rename from deal.II/contrib/boost/include/boost/crc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/crc.hpp
index e70c8340337ba4d7fa67b3229c3553d514989284..6be5aa1d8b1bef83fd99fe63b0553d1c96189d81 100644 (file)
@@ -464,6 +464,10 @@ namespace detail
         // for some reason Borland's command line compiler (version 0x560)
         // chokes over this unless we do the calculation for it:
         typedef value_type                   table_type[ 0x100 ];
+#elif defined(__GNUC__)
+        // old versions of GCC (before 4.0.2) choke on using byte_combos
+        // as a constant expression when compiling with -pedantic.
+        typedef value_type                   table_type[1ul << CHAR_BIT];
 #else
         typedef value_type                   table_type[ byte_combos ];
 #endif
similarity index 99%
rename from deal.II/contrib/boost/include/boost/cstdint.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/cstdint.hpp
index 31a432a886a1b685c4047b786deb9bb5b268ed24..d55a4840b955ff7e3b4a3d13fe4765bbdd7ff2a3 100644 (file)
@@ -36,7 +36,7 @@
       // this is triggered with GCC, because it defines __cplusplus < 199707L
 #     define BOOST_NO_INT64_T
 #   endif 
-# elif defined(__FreeBSD__) || defined(__IBMCPP__)
+# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)
 #   include <inttypes.h>
 # else
 #   include <stdint.h>
similarity index 84%
rename from deal.II/contrib/boost/include/boost/date_time/c_local_time_adjustor.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/c_local_time_adjustor.hpp
index 7c03dc982589c68677e5304817da6f434ba6e670..f8025828f778004dff0b6e6f836326ef4ef76c6a 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 /*! @file c_local_time_adjustor.hpp
@@ -14,7 +14,9 @@
 */
 
 #include <stdexcept>
-#include "boost/date_time/c_time.hpp"
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/c_time.hpp>
 
 namespace boost {
 namespace date_time {
@@ -35,14 +37,14 @@ namespace date_time {
       date_type time_t_start_day(1970,1,1);
       time_type time_t_start_time(time_t_start_day,time_duration_type(0,0,0));
       if (t < time_t_start_time) {
-        throw std::out_of_range("Cannot convert dates prior to Jan 1, 1970");
+        boost::throw_exception(std::out_of_range("Cannot convert dates prior to Jan 1, 1970"));
+        BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return time_t_start_time); // should never reach
       }
       date_duration_type dd = t.date() - time_t_start_day;
       time_duration_type td = t.time_of_day();
       std::time_t t2 = dd.days()*86400 + td.hours()*3600 + td.minutes()*60 + td.seconds();
       std::tm tms, *tms_ptr;
       tms_ptr = c_time::localtime(&t2, &tms);
-      //tms_ptr = std::localtime(&t2);
       date_type d(static_cast<unsigned short>(tms_ptr->tm_year + 1900),
                   static_cast<unsigned short>(tms_ptr->tm_mon + 1),
                   static_cast<unsigned short>(tms_ptr->tm_mday));
similarity index 72%
rename from deal.II/contrib/boost/include/boost/date_time/c_time.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/c_time.hpp
index 6ce5340a495699c217cb84c522fe9c81ab77c5f9..048a66563cdc33047f28ece3bf6f629de3637b92 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-10-03 06:22:58 -0400 (Sat, 03 Oct 2009) $
  */
 
 
   Provide workarounds related to the ctime header
 */
 
-#include "boost/date_time/compiler_config.hpp"
 #include <ctime>
-//Work around libraries that don't put time_t and time in namespace std
+#include <string> // to be able to convert from string literals to exceptions
+#include <stdexcept>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/compiler_config.hpp>
 
+//Work around libraries that don't put time_t and time in namespace std
 #ifdef BOOST_NO_STDC_NAMESPACE
 namespace std { using ::time_t; using ::time; using ::localtime;
                 using ::tm;  using ::gmtime; }
@@ -40,7 +43,12 @@ namespace date_time {
    * user created std::tm struct whereas the regular functions use a 
    * staticly created struct and return a pointer to that. These wrapper 
    * functions require the user to create a std::tm struct and send in a 
-   * pointer to it. A pointer to the user created struct will be returned. */
+   * pointer to it. This struct may be used to store the resulting time.
+   * The returned pointer may or may not point to this struct, however,
+   * it will point to the result of the corresponding function.
+   * All functions do proper checking of the C function results and throw
+   * exceptions on error. Therefore the functions will never return NULL.
+   */
   struct c_time {
     public:
 #if defined(BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS)
@@ -50,6 +58,8 @@ namespace date_time {
       {
         // localtime_r() not in namespace std???
         result = localtime_r(t, result);
+        if (!result)
+          boost::throw_exception(std::runtime_error("could not convert calendar time to local time"));
         return result;
       }
       //! requires a pointer to a user created std::tm struct
@@ -58,6 +68,8 @@ namespace date_time {
       {
         // gmtime_r() not in namespace std???
         result = gmtime_r(t, result);
+        if (!result)
+          boost::throw_exception(std::runtime_error("could not convert calendar time to UTC time"));
         return result;
       }
 #else // BOOST_HAS_THREADS
@@ -71,6 +83,8 @@ namespace date_time {
       static std::tm* localtime(const std::time_t* t, std::tm* result)
       {
         result = std::localtime(t);
+        if (!result)
+          boost::throw_exception(std::runtime_error("could not convert calendar time to local time"));
         return result;
       }
       //! requires a pointer to a user created std::tm struct
@@ -78,6 +92,8 @@ namespace date_time {
       static std::tm* gmtime(const std::time_t* t, std::tm* result)
       {
         result = std::gmtime(t);
+        if (!result)
+          boost::throw_exception(std::runtime_error("could not convert calendar time to UTC time"));
         return result;
       }
 #if (defined(_MSC_VER) && (_MSC_VER >= 1400))
similarity index 80%
rename from deal.II/contrib/boost/include/boost/date_time/compiler_config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/compiler_config.hpp
index 137888e6490cee663fe5828afa2aed448543eb01..0dc893f9fb53493e48dca4b619b431199d7cd076 100644 (file)
@@ -5,10 +5,12 @@
  * Subject to the Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
- #include "boost/detail/workaround.hpp"
+#include <cstdlib>
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
 
 // With boost release 1.33, date_time will be using a different,
 // more flexible, IO system. This new system is not compatible with
@@ -26,7 +28,7 @@
 
 // This file performs some local compiler configurations
 
-#include "boost/date_time/locale_config.hpp" //set up locale configurations
+#include <boost/date_time/locale_config.hpp> //set up locale configurations
 
 //Set up a configuration parameter for platforms that have 
 //GetTimeOfDay
@@ -49,7 +51,7 @@
 #endif
 
 // include these types before we try to re-define them
-#include "boost/cstdint.hpp"
+#include <boost/cstdint.hpp>
 
 //Define INT64_C for compilers that don't have it
 #if (!defined(INT64_C))
@@ -85,12 +87,32 @@ namespace std {
 #define BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
 #endif
 
+// The macro marks up places where compiler complains for missing return statement or
+// uninitialized variables after calling to boost::throw_exception.
+// BOOST_UNREACHABLE_RETURN doesn't work since even compilers that support
+// unreachable statements detection emit such warnings.
+#if defined(_MSC_VER)
+// Use special MSVC extension to markup unreachable code
+#  define BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(x) __assume(false)
+#elif !defined(BOOST_NO_UNREACHABLE_RETURN_DETECTION)
+// Call to a non-returning function should suppress the warning
+#  if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std {
+    using ::abort;
+}
+#  endif // defined(BOOST_NO_STDC_NAMESPACE)
+#  define BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(x) std::abort()
+#else
+// For other poor compilers the specified expression is compiled. Usually, this would be a return statement.
+#  define BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(x) x
+#endif
+
 /* The following handles the definition of the necessary macros
  * for dll building on Win32 platforms.
  * 
  * For code that will be placed in the date_time .dll, 
  * it must be properly prefixed with BOOST_DATE_TIME_DECL.
- * The corresponding .cpp file must have BOOST_DATE_TIME_SOURCES
+ * The corresponding .cpp file must have BOOST_DATE_TIME_SOURCE
  * defined before including its header. For examples see:
  * greg_month.hpp & greg_month.cpp
  * 
similarity index 67%
rename from deal.II/contrib/boost/include/boost/date_time/constrained_value.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/constrained_value.hpp
index c010b40dcfd1cf5d2028c3f58fd134432e1b7b34..b273dd5aa80f67a7f67248c424ce4e80ae532fef 100644 (file)
@@ -6,10 +6,15 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
+#include <exception>
+#include <stdexcept>
 #include <boost/config.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_base_of.hpp>
 
 namespace boost {
 
@@ -38,21 +43,21 @@ namespace CV {
   public:
     typedef typename value_policies::value_type value_type;
     //    typedef except_type exception_type;
-    constrained_value(value_type value) 
+    constrained_value(value_type value) : value_((min)())
     {
       assign(value);
-    };
-    constrained_value& operator=(value_type v) 
-    { 
+    }
+    constrained_value& operator=(value_type v)
+    {
       assign(v); 
       return *this;
-    }   
+    }
     //! Return the max allowed value (traits method)
-    static value_type max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::max)();};
+    static value_type max BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::max)();}
     //! Return the min allowed value (traits method)
-    static value_type min BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::min)();};
+    static value_type min BOOST_PREVENT_MACRO_SUBSTITUTION () {return (value_policies::min)();}
     //! Coerce into the representation type
-    operator value_type() const {return value_;};
+    operator value_type() const {return value_;}
   protected:
     value_type value_;
   private:
@@ -69,7 +74,6 @@ namespace CV {
         return;
       }
       value_ = value;
-
     }
 };
 
@@ -78,13 +82,32 @@ namespace CV {
            rep_type max_value, class exception_type>
   class simple_exception_policy
   {
+    struct exception_wrapper : public exception_type
+    {
+      // In order to support throw_exception mechanism in the BOOST_NO_EXCEPTIONS mode,
+      // we'll have to provide a way to acquire std::exception from the exception being thrown.
+      // However, we cannot derive from it, since it would make it interceptable by this class,
+      // which might not be what the user wanted.
+      operator std::out_of_range () const
+      {
+        // TODO: Make the message more descriptive by using arguments to on_error
+        return std::out_of_range("constrained value boundary has been violated");
+      }
+    };
+
+    typedef typename mpl::if_<
+      is_base_of< std::exception, exception_type >,
+      exception_type,
+      exception_wrapper
+    >::type actual_exception_type;
+
   public:
     typedef rep_type value_type;
-    static rep_type min BOOST_PREVENT_MACRO_SUBSTITUTION () { return min_value; };
-    static rep_type max BOOST_PREVENT_MACRO_SUBSTITUTION () { return max_value;};
+    static rep_type min BOOST_PREVENT_MACRO_SUBSTITUTION () { return min_value; }
+    static rep_type max BOOST_PREVENT_MACRO_SUBSTITUTION () { return max_value; }
     static void on_error(rep_type, rep_type, violation_enum)
     {
-      throw exception_type();
+      boost::throw_exception(actual_exception_type());
     }
   };
 
similarity index 87%
rename from deal.II/contrib/boost/include/boost/date_time/date.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date.hpp
index beab04770026e914b86d816f2ebb5a8e8db5b24e..677f6286ad85d2a71aafbca97550056b1db15f9e 100644 (file)
@@ -6,12 +6,12 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/year_month_day.hpp"
-#include "boost/date_time/special_defs.hpp"
-#include "boost/operators.hpp"
+#include <boost/operators.hpp>
+#include <boost/date_time/year_month_day.hpp>
+#include <boost/date_time/special_defs.hpp>
 
 namespace boost {
 namespace date_time {
@@ -138,8 +138,19 @@ namespace date_time {
     }
     duration_type operator-(const date_type& d) const
     {
-      date_rep_type val = date_rep_type(days_) - date_rep_type(d.days_);
-      return duration_type(val.as_number());
+      if (!this->is_special() && !d.is_special())
+      {
+        // The duration underlying type may be wider than the date underlying type.
+        // Thus we calculate the difference in terms of two durations from some common fixed base date.
+        typedef typename duration_type::duration_rep_type duration_rep_type;
+        return duration_type(static_cast< duration_rep_type >(days_) - static_cast< duration_rep_type >(d.days_));
+      }
+      else
+      {
+        // In this case the difference will be a special value, too
+        date_rep_type val = date_rep_type(days_) - date_rep_type(d.days_);
+        return duration_type(val.as_special());
+      }
     }
     
     date_type operator-(const duration_type& dd) const
@@ -158,7 +169,7 @@ namespace date_time {
     date_rep_type day_count() const 
     {
       return days_;
-    };
+    }
     //allow internal access from operators
     date_type operator+(const duration_type& dd) const
     {
similarity index 83%
rename from deal.II/contrib/boost/include/boost/date_time/date_duration.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_duration.hpp
index 366fb9c6c55305d34e5781046a923d88d9151569..3871aac0ce5c70b990e8bd4b880e02c523ebb17e 100644 (file)
@@ -6,11 +6,12 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
 #include <boost/operators.hpp>
+#include <boost/date_time/special_defs.hpp>
 
 namespace boost {
 namespace date_time {
@@ -19,11 +20,12 @@ namespace date_time {
   //! Duration type with date level resolution
   template<class duration_rep_traits>
   class date_duration : private
-              boost::less_than_comparable<date_duration< duration_rep_traits>
-            , boost::equality_comparable< date_duration< duration_rep_traits>
-            , boost::addable< date_duration< duration_rep_traits>
-            , boost::subtractable< date_duration< duration_rep_traits>
-            > > > >
+              boost::less_than_comparable1< date_duration< duration_rep_traits >
+            , boost::equality_comparable1< date_duration< duration_rep_traits >
+            , boost::addable1< date_duration< duration_rep_traits >
+            , boost::subtractable1< date_duration< duration_rep_traits >
+            , boost::dividable2< date_duration< duration_rep_traits >, int
+            > > > > >
   { 
   public:
     typedef typename duration_rep_traits::int_type duration_rep_type;
@@ -80,40 +82,37 @@ namespace date_time {
      * so this will not compile */
 
     //! Subtract another duration -- result is signed
-    date_duration operator-=(const date_duration& rhs)
+    date_duration& operator-=(const date_duration& rhs)
     {
         //days_ -= rhs.days_;
         days_ = days_ - rhs.days_;
         return *this;
     }
     //! Add a duration -- result is signed
-    date_duration operator+=(const date_duration& rhs)
+    date_duration& operator+=(const date_duration& rhs)
     {
         days_ = days_ + rhs.days_;
         return *this;
     }
 
     //! unary- Allows for dd = -date_duration(2); -> dd == -2
-    date_duration operator-()const
+    date_duration operator-() const
     {
         return date_duration<duration_rep_traits>(get_rep() * (-1));
     }
     //! Division operations on a duration with an integer.
-    date_duration<duration_rep_traits> operator/=(int divisor)
+    date_duration& operator/=(int divisor)
     {
         days_ = days_ / divisor;
         return *this;
     }
-    date_duration<duration_rep_traits> operator/(int divisor)
-    {
-        return date_duration<duration_rep_traits>(days_ / divisor);
-    }
 
     //! return sign information
     bool is_negative() const
     {
         return days_ < 0;
     }
+
   private:
     duration_rep days_;
   };
similarity index 73%
rename from deal.II/contrib/boost/include/boost/date_time/date_facet.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_facet.hpp
index bd616959351704dfc4a19d234ff6f8f9aa630a32..3eda4c7d09d59a7bd470db8da3a1c425b94688ab 100644 (file)
@@ -2,28 +2,32 @@
 #define _DATE_TIME_DATE_FACET__HPP___
 
 /* Copyright (c) 2004-2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
+ * Use, modification and distribution is subject to the
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author:  Martin Andrian, Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-04 07:40:18 -0400 (Thu, 04 Jun 2009) $
  */
 
-
-#include "boost/algorithm/string/replace.hpp"
-#include "boost/date_time/period.hpp"
-#include "boost/date_time/special_values_formatter.hpp"
-#include "boost/date_time/period_formatter.hpp"
-#include "boost/date_time/period_parser.hpp"
-#include "boost/date_time/date_generator_formatter.hpp"
-#include "boost/date_time/date_generator_parser.hpp"
-#include "boost/date_time/format_date_parser.hpp"
+#include <locale>
 #include <string>
 #include <vector>
+#include <iterator> // ostreambuf_iterator
+#include <boost/throw_exception.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/period.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/special_values_formatter.hpp>
+#include <boost/date_time/period_formatter.hpp>
+#include <boost/date_time/period_parser.hpp>
+#include <boost/date_time/date_generator_formatter.hpp>
+#include <boost/date_time/date_generator_parser.hpp>
+#include <boost/date_time/format_date_parser.hpp>
 
 namespace boost { namespace date_time {
 
-  
+
   /*! Class that provides format based I/O facet for date types.
    *
    * This class allows the formatting of dates by using format string.
@@ -40,7 +44,7 @@ namespace boost { namespace date_time {
    * Default weekday format == %a
    */
   template <class date_type,
-            class CharT, 
+            class CharT,
             class OutItrT = std::ostreambuf_iterator<CharT, std::char_traits<CharT> > >
   class date_facet : public std::locale::facet {
   public:
@@ -77,9 +81,9 @@ namespace boost { namespace date_time {
 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
       std::locale::id& __get_id (void) const { return id; }
 #endif
-    
-    explicit date_facet(::size_t a_ref = 0) 
-      : std::locale::facet(a_ref), 
+
+    explicit date_facet(::size_t a_ref = 0)
+      : std::locale::facet(a_ref),
         //m_format(standard_format_specifier)
         m_format(default_date_format),
         m_month_format(short_month_format),
@@ -88,22 +92,22 @@ namespace boost { namespace date_time {
 
     explicit date_facet(const char_type* format_str,
                         const input_collection_type& short_names,
-                        ::size_t ref_count = 0) 
-      : std::locale::facet(ref_count), 
+                        ::size_t ref_count = 0)
+      : std::locale::facet(ref_count),
         m_format(format_str),
         m_month_format(short_month_format),
         m_weekday_format(short_weekday_format),
-        m_month_short_names(short_names) 
+        m_month_short_names(short_names)
     {}
 
-     
-    explicit date_facet(const char_type* format_str, 
-                        period_formatter_type per_formatter = period_formatter_type(), 
+
+    explicit date_facet(const char_type* format_str,
+                        period_formatter_type per_formatter = period_formatter_type(),
                         special_values_formatter_type sv_formatter = special_values_formatter_type(),
                         date_gen_formatter_type dg_formatter = date_gen_formatter_type(),
                         ::size_t ref_count = 0)
-      : std::locale::facet(ref_count), 
-        m_format(format_str), 
+      : std::locale::facet(ref_count),
+        m_format(format_str),
         m_month_format(short_month_format),
         m_weekday_format(short_weekday_format),
         m_period_formatter(per_formatter),
@@ -127,11 +131,11 @@ namespace boost { namespace date_time {
     void weekday_format(const char_type* const format_str) {
       m_weekday_format = format_str;
     }
-    
+
     void period_formatter(period_formatter_type per_formatter) {
       m_period_formatter= per_formatter;
     }
-    void special_values_formatter(const special_values_formatter_type& svf) 
+    void special_values_formatter(const special_values_formatter_type& svf)
     {
       m_special_values_formatter = svf;
     }
@@ -160,24 +164,24 @@ namespace boost { namespace date_time {
       m_date_gen_formatter.elements(new_strings, beg_pos);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const date_type& d) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const date_type& d) const
     {
-      if (d.is_special()) { 
+      if (d.is_special()) {
         return do_put_special(next, a_ios, fill_char, d.as_special());
       }
       //The following line of code required the date to support a to_tm function
       return do_put_tm(next, a_ios, fill_char, to_tm(d), m_format);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const duration_type& dd) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const duration_type& dd) const
     {
-      if (dd.is_special()) { 
+      if (dd.is_special()) {
         return do_put_special(next, a_ios, fill_char, dd.get_rep().as_special());
       }
 
@@ -195,164 +199,148 @@ namespace boost { namespace date_time {
     }
 
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const month_type& m) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const month_type& m) const
     {
-      //if (d.is_special()) { 
+      //if (d.is_special()) {
       //  return do_put_special(next, a_ios, fill_char, d.as_special());
       //}
       //The following line of code required the date to support a to_tm function
-      tm dtm;
-      init_tm(dtm);
-      dtm.tm_mon = m -1;
+      std::tm dtm = {};
+      dtm.tm_mon = m - 1;
       return do_put_tm(next, a_ios, fill_char, dtm, m_month_format);
     }
 
     //! puts the day of month
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const day_type& day) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const day_type& day) const
     {
-      tm dtm;
-      init_tm(dtm);
+      std::tm dtm = {};
       dtm.tm_mday = day.as_number();
       char_type tmp[3] = {'%','d'};
       string_type temp_format(tmp);
       return do_put_tm(next, a_ios, fill_char, dtm, temp_format);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const day_of_week_type& dow) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const day_of_week_type& dow) const
     {
-      //if (d.is_special()) { 
+      //if (d.is_special()) {
       //  return do_put_special(next, a_ios, fill_char, d.as_special());
       //}
       //The following line of code required the date to support a to_tm function
-      tm dtm;
-      init_tm(dtm);
+      std::tm dtm = {};
       dtm.tm_wday = dow;
       return do_put_tm(next, a_ios, fill_char, dtm, m_weekday_format);
     }
 
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const period_type& p) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const period_type& p) const
     {
       return m_period_formatter.put_period(next, a_ios, fill_char, p, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const partial_date_type& pd) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const partial_date_type& pd) const
     {
       return m_date_gen_formatter.put_partial_date(next, a_ios, fill_char, pd, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const nth_kday_type& nkd) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const nth_kday_type& nkd) const
     {
       return m_date_gen_formatter.put_nth_kday(next, a_ios, fill_char, nkd, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const first_kday_type& fkd) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const first_kday_type& fkd) const
     {
       return m_date_gen_formatter.put_first_kday(next, a_ios, fill_char, fkd, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const last_kday_type& lkd) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const last_kday_type& lkd) const
     {
       return m_date_gen_formatter.put_last_kday(next, a_ios, fill_char, lkd, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const kday_before_type& fkb) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const kday_before_type& fkb) const
     {
       return m_date_gen_formatter.put_kday_before(next, a_ios, fill_char, fkb, *this);
     }
 
-    OutItrT put(OutItrT next, 
-                std::ios_base& a_ios, 
-                char_type fill_char, 
-                const kday_after_type& fka) const 
+    OutItrT put(OutItrT next,
+                std::ios_base& a_ios,
+                char_type fill_char,
+                const kday_after_type& fka) const
     {
       return m_date_gen_formatter.put_kday_after(next, a_ios, fill_char, fka, *this);
     }
-    
+
   protected:
-    //! Helper function to initialize all fields in a tm struct
-    tm init_tm(tm& tm_value) const
-    {
-      tm_value.tm_sec = 0;         /* seconds */
-      tm_value.tm_min = 0;         /* minutes */
-      tm_value.tm_hour = 0;        /* hours */
-      tm_value.tm_mday = 0;        /* day of the month */
-      tm_value.tm_mon = 0;         /* month */
-      tm_value.tm_year = 0;        /* year */
-      tm_value.tm_wday = 0;        /* day of the week */
-      tm_value.tm_yday = 0;        /* day in the year */
-      tm_value.tm_isdst = 0;       /* daylight saving time */
-      return tm_value;
-    }
-    virtual OutItrT do_put_special(OutItrT next, 
-                                   std::ios_base& /*a_ios*/, 
-                                   char_type /*fill_char*/, 
-                                   const boost::date_time::special_values sv) const 
+    virtual OutItrT do_put_special(OutItrT next,
+                                   std::ios_base& /*a_ios*/,
+                                   char_type /*fill_char*/,
+                                   const boost::date_time::special_values sv) const
     {
       m_special_values_formatter.put_special(next, sv);
       return next;
     }
-    virtual OutItrT do_put_tm(OutItrT next, 
-                              std::ios_base& a_ios, 
-                              char_type fill_char, 
+    virtual OutItrT do_put_tm(OutItrT next,
+                              std::ios_base& a_ios,
+                              char_type fill_char,
                               const tm& tm_value,
-                              string_type a_format) const 
+                              string_type a_format) const
     {
       // update format string with custom names
       if (m_weekday_long_names.size()) {
-        boost::algorithm::replace_all(a_format, 
-                                      long_weekday_format, 
+        boost::algorithm::replace_all(a_format,
+                                      long_weekday_format,
                                       m_weekday_long_names[tm_value.tm_wday]);
       }
       if (m_weekday_short_names.size()) {
-        boost::algorithm::replace_all(a_format, 
-                                      short_weekday_format, 
+        boost::algorithm::replace_all(a_format,
+                                      short_weekday_format,
                                       m_weekday_short_names[tm_value.tm_wday]);
 
       }
       if (m_month_long_names.size()) {
-        boost::algorithm::replace_all(a_format, 
-                                      long_month_format, 
+        boost::algorithm::replace_all(a_format,
+                                      long_month_format,
                                       m_month_long_names[tm_value.tm_mon]);
       }
       if (m_month_short_names.size()) {
-        boost::algorithm::replace_all(a_format, 
-                                      short_month_format, 
+        boost::algorithm::replace_all(a_format,
+                                      short_month_format,
                                       m_month_short_names[tm_value.tm_mon]);
       }
       // use time_put facet to create final string
-      return std::use_facet<std::time_put<CharT> >(a_ios.getloc()).put(next, a_ios, 
-                                                                       fill_char, 
+      const char_type* p_format = a_format.c_str();
+      return std::use_facet<std::time_put<CharT> >(a_ios.getloc()).put(next, a_ios,
+                                                                       fill_char,
                                                                        &tm_value,
-                                                                       &*a_format.begin(), 
-                                                                       &*a_format.begin()+a_format.size());
+                                                                       p_format,
+                                                                       p_format + a_format.size());
     }
   protected:
     string_type                   m_format;
@@ -371,51 +359,51 @@ namespace boost { namespace date_time {
   template <class date_type, class CharT, class OutItrT>
   std::locale::id date_facet<date_type, CharT, OutItrT>::id;
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
   date_facet<date_type, CharT, OutItrT>::long_weekday_format[3] = {'%','A'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
   date_facet<date_type, CharT, OutItrT>::short_weekday_format[3] = {'%','a'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
   date_facet<date_type, CharT, OutItrT>::long_month_format[3] = {'%','B'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
   date_facet<date_type, CharT, OutItrT>::short_month_format[3] = {'%','b'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
   date_facet<date_type, CharT, OutItrT>::default_period_separator[4] = { ' ', '/', ' '};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
-  date_facet<date_type, CharT, OutItrT>::standard_format_specifier[3] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
+  date_facet<date_type, CharT, OutItrT>::standard_format_specifier[3] =
     {'%', 'x' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
-  date_facet<date_type, CharT, OutItrT>::iso_format_specifier[7] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
+  date_facet<date_type, CharT, OutItrT>::iso_format_specifier[7] =
     {'%', 'Y', '%', 'm', '%', 'd' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
-  date_facet<date_type, CharT, OutItrT>::iso_format_extended_specifier[9] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
+  date_facet<date_type, CharT, OutItrT>::iso_format_extended_specifier[9] =
     {'%', 'Y', '-', '%', 'm', '-', '%', 'd' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_facet<date_type, CharT, OutItrT>::char_type 
-  date_facet<date_type, CharT, OutItrT>::default_date_format[9] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_facet<date_type, CharT, OutItrT>::char_type
+  date_facet<date_type, CharT, OutItrT>::default_date_format[9] =
     {'%','Y','-','%','b','-','%','d'};
 
 
 
   //! Input facet
   template <class date_type,
-            class CharT, 
+            class CharT,
             class InItrT = std::istreambuf_iterator<CharT, std::char_traits<CharT> > >
   class date_input_facet : public std::locale::facet {
   public:
@@ -429,7 +417,7 @@ namespace boost { namespace date_time {
     typedef std::basic_string<CharT> string_type;
     typedef CharT                    char_type;
     typedef boost::date_time::period_parser<date_type, CharT>  period_parser_type;
-    typedef boost::date_time::special_values_parser<date_type,CharT> special_values_parser_type; 
+    typedef boost::date_time::special_values_parser<date_type,CharT> special_values_parser_type;
     typedef std::vector<std::basic_string<CharT> > input_collection_type;
     typedef format_date_parser<date_type, CharT> format_date_parser_type;
     // date_generators stuff goes here
@@ -453,9 +441,9 @@ namespace boost { namespace date_time {
     static const char_type iso_format_extended_specifier[9];
     static const char_type default_date_format[9]; // YYYY-Mon-DD
     static std::locale::id id;
-    
-    explicit date_input_facet(::size_t a_ref = 0) 
-      : std::locale::facet(a_ref), 
+
+    explicit date_input_facet(::size_t a_ref = 0)
+      : std::locale::facet(a_ref),
         m_format(default_date_format),
         m_month_format(short_month_format),
         m_weekday_format(short_weekday_format),
@@ -465,8 +453,8 @@ namespace boost { namespace date_time {
     {}
 
     explicit date_input_facet(const string_type& format_str,
-                              ::size_t a_ref = 0) 
-      : std::locale::facet(a_ref), 
+                              ::size_t a_ref = 0)
+      : std::locale::facet(a_ref),
         m_format(format_str),
         m_month_format(short_month_format),
         m_weekday_format(short_weekday_format),
@@ -513,7 +501,7 @@ namespace boost { namespace date_time {
     void year_format(const char_type* const format_str) {
       m_year_format = format_str;
     }
-    
+
     void period_parser(period_parser_type per_parser) {
       m_period_parser = per_parser;
     }
@@ -549,7 +537,7 @@ namespace boost { namespace date_time {
                                   const string_type& before,
                                   const string_type& after,
                                   const string_type& of)
-                           
+
     {
       m_date_gen_parser.element_strings(first,second,third,fourth,fifth,last,before,after,of);
     }
@@ -559,68 +547,68 @@ namespace boost { namespace date_time {
       m_sv_parser = sv_parser;
     }
 
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& /*a_ios*/, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& /*a_ios*/,
                date_type& d) const
     {
       d = m_parser.parse_date(from, to, m_format, m_sv_parser);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& /*a_ios*/, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& /*a_ios*/,
                month_type& m) const
     {
       m = m_parser.parse_month(from, to, m_month_format);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& /*a_ios*/, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& /*a_ios*/,
                day_of_week_type& wd) const
     {
       wd = m_parser.parse_weekday(from, to, m_weekday_format);
       return from;
     }
     //! Expects 1 or 2 digit day range: 1-31
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& /*a_ios*/, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& /*a_ios*/,
                day_type& d) const
     {
       d = m_parser.parse_var_day_of_month(from, to);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& /*a_ios*/, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& /*a_ios*/,
                year_type& y) const
     {
       y = m_parser.parse_year(from, to, m_year_format);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                duration_type& dd) const
     {
       // skip leading whitespace
-      while(std::isspace(*from) && from != to) { ++from; } 
-     
-      /* num_get.get() will always consume the first character if it 
-       * is a sign indicator (+/-). Special value strings may begin 
+      while(std::isspace(*from) && from != to) { ++from; }
+
+      /* num_get.get() will always consume the first character if it
+       * is a sign indicator (+/-). Special value strings may begin
        * with one of these signs so we'll need a copy of it
        * in case num_get.get() fails. */
-      char_type c = '\0'; 
+      char_type c = '\0';
       // TODO Are these characters somewhere in the locale?
-      if(*from == '-' || *from == '+') { 
+      if(*from == '-' || *from == '+') {
         c = *from;
       }
       typedef std::num_get<CharT, InItrT> num_get;
       typename duration_type::duration_rep_type val = 0;
       std::ios_base::iostate err = std::ios_base::goodbit;
-      
+
       if (std::has_facet<num_get>(a_ios.getloc())) {
         from = std::use_facet<num_get>(a_ios.getloc()).get(from, to, a_ios, err, val);
       }
@@ -638,67 +626,68 @@ namespace boost { namespace date_time {
         }
         m_sv_parser.match(from, to, mr);
         if(mr.current_match == match_results::PARSE_ERROR) {
-          throw std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'");
+          boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'"));
+          BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return from); // should never reach
         }
-        dd = duration_type(static_cast<special_values>(mr.current_match)); 
+        dd = duration_type(static_cast<special_values>(mr.current_match));
       }
       else {
         dd = duration_type(val);
       }
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                period_type& p) const
     {
-      p = m_period_parser.get_period(from, to, a_ios, p, duration_type::unit(), *this);     
+      p = m_period_parser.get_period(from, to, a_ios, p, duration_type::unit(), *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                nth_kday_type& nkd) const
     {
       nkd = m_date_gen_parser.get_nth_kday_type(from, to, a_ios, *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                partial_date_type& pd) const
     {
 
       pd = m_date_gen_parser.get_partial_date_type(from, to, a_ios, *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                first_kday_type& fkd) const
     {
       fkd = m_date_gen_parser.get_first_kday_type(from, to, a_ios, *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                last_kday_type& lkd) const
     {
       lkd = m_date_gen_parser.get_last_kday_type(from, to, a_ios, *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                kday_before_type& fkb) const
     {
       fkb = m_date_gen_parser.get_kday_before_type(from, to, a_ios, *this);
       return from;
     }
-    InItrT get(InItrT& from, 
-               InItrT& to, 
-               std::ios_base& a_ios, 
+    InItrT get(InItrT& from,
+               InItrT& to,
+               std::ios_base& a_ios,
                kday_after_type& fka) const
     {
       fka = m_date_gen_parser.get_kday_after_type(from, to, a_ios, *this);
@@ -721,52 +710,52 @@ namespace boost { namespace date_time {
   template <class date_type, class CharT, class OutItrT>
   std::locale::id date_input_facet<date_type, CharT, OutItrT>::id;
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::long_weekday_format[3] = {'%','A'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::short_weekday_format[3] = {'%','a'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::long_month_format[3] = {'%','B'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::short_month_format[3] = {'%','b'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::four_digit_year_format[3] = {'%','Y'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::two_digit_year_format[3] = {'%','y'};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
   date_input_facet<date_type, CharT, OutItrT>::default_period_separator[4] = { ' ', '/', ' '};
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
-  date_input_facet<date_type, CharT, OutItrT>::standard_format_specifier[3] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
+  date_input_facet<date_type, CharT, OutItrT>::standard_format_specifier[3] =
     {'%', 'x' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
-  date_input_facet<date_type, CharT, OutItrT>::iso_format_specifier[7] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
+  date_input_facet<date_type, CharT, OutItrT>::iso_format_specifier[7] =
     {'%', 'Y', '%', 'm', '%', 'd' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
-  date_input_facet<date_type, CharT, OutItrT>::iso_format_extended_specifier[9] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
+  date_input_facet<date_type, CharT, OutItrT>::iso_format_extended_specifier[9] =
     {'%', 'Y', '-', '%', 'm', '-', '%', 'd' };
 
-  template <class date_type, class CharT, class OutItrT>  
-  const typename date_input_facet<date_type, CharT, OutItrT>::char_type 
-  date_input_facet<date_type, CharT, OutItrT>::default_date_format[9] = 
+  template <class date_type, class CharT, class OutItrT>
+  const typename date_input_facet<date_type, CharT, OutItrT>::char_type
+  date_input_facet<date_type, CharT, OutItrT>::default_date_format[9] =
     {'%','Y','-','%','b','-','%','d'};
 
 } } // namespaces
similarity index 90%
rename from deal.II/contrib/boost/include/boost/date_time/date_generator_formatter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generator_formatter.hpp
index 919cc0b3388f70f0b401a98d19ee0624efdcb635..88cd7e1aba4049237d831b1cf897d75efea1b750 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 14:05:31 -0500 (Thu, 13 Nov 2008) $
  */
 
 #include <iostream>
@@ -63,6 +63,7 @@ namespace date_time {
       //! Default format elements used
       date_generator_formatter()
       {
+        phrase_strings.reserve(number_of_phrase_elements);
         phrase_strings.push_back(string_type(first_string));
         phrase_strings.push_back(string_type(second_string));
         phrase_strings.push_back(string_type(third_string));
@@ -75,25 +76,26 @@ namespace date_time {
       }
 
       //! Constructor that allows for a custom set of phrase elements
-      date_generator_formatter(const string_type& first,
-                               const string_type& second,
-                               const string_type& third,
-                               const string_type& fourth,
-                               const string_type& fifth,
-                               const string_type& last,
-                               const string_type& before,
-                               const string_type& after,
-                               const string_type& of)
+      date_generator_formatter(const string_type& first_str,
+                               const string_type& second_str,
+                               const string_type& third_str,
+                               const string_type& fourth_str,
+                               const string_type& fifth_str,
+                               const string_type& last_str,
+                               const string_type& before_str,
+                               const string_type& after_str,
+                               const string_type& of_str)
       {
-        phrase_strings.push_back(string_type(first_string));
-        phrase_strings.push_back(string_type(second_string));
-        phrase_strings.push_back(string_type(third_string));
-        phrase_strings.push_back(string_type(fourth_string));
-        phrase_strings.push_back(string_type(fifth_string));
-        phrase_strings.push_back(string_type(last_string));
-        phrase_strings.push_back(string_type(before_string));
-        phrase_strings.push_back(string_type(after_string));
-        phrase_strings.push_back(string_type(of_string));
+        phrase_strings.reserve(number_of_phrase_elements);
+        phrase_strings.push_back(first_str);
+        phrase_strings.push_back(second_str);
+        phrase_strings.push_back(third_str);
+        phrase_strings.push_back(fourth_str);
+        phrase_strings.push_back(fifth_str);
+        phrase_strings.push_back(last_str);
+        phrase_strings.push_back(before_str);
+        phrase_strings.push_back(after_str);
+        phrase_strings.push_back(of_str);
       }
 
       //! Replace the set of phrase elements with those contained in new_strings
@@ -148,7 +150,7 @@ namespace date_time {
         facet.put(next, a_ios, a_fill, nkd.month());
         return next;
       }
-   
+
       //! Put a first_day_of_the_week_in_month => "first weekday of month"
       template<class facet_type>
       OutItrT put_first_kday(OutItrT next, std::ios_base& a_ios,
similarity index 90%
rename from deal.II/contrib/boost/include/boost/date_time/date_generator_parser.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generator_parser.hpp
index fd662e44c7ada4317255a9aadca92b239097c84a..f11eb42d52e81ea45127ceb92b6d6c50d07db9f8 100644 (file)
@@ -7,15 +7,17 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
-
-#include "boost/date_time/string_parse_tree.hpp"
-#include "boost/date_time/date_generators.hpp"
-#include "boost/date_time/format_date_parser.hpp"
 #include <string>
 #include <vector>
+#include <iterator> // istreambuf_iterator
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/string_parse_tree.hpp>
+#include <boost/date_time/date_generators.hpp>
+#include <boost/date_time/format_date_parser.hpp>
 
 namespace boost { namespace date_time {
 
@@ -66,10 +68,10 @@ namespace boost { namespace date_time {
     static const char_type last_string[5];
     static const char_type before_string[8];
     static const char_type after_string[6];
-    static const char_type of_string[3];  
+    static const char_type of_string[3];
+
     enum phrase_elements {first=0, second, third, fourth, fifth, last,
-                          before, after, of, number_of_phrase_elements};   
+                          before, after, of, number_of_phrase_elements};
 
     //! Creates a date_generator_parser with the default set of "element_strings"
     date_generator_parser()
@@ -96,7 +98,7 @@ namespace boost { namespace date_time {
                           const string_type& after_str,
                           const string_type& of_str)
     {
-      element_strings(first_str, second_str, third_str, fourth_str, fifth_str, 
+      element_strings(first_str, second_str, third_str, fourth_str, fifth_str,
                       last_str, before_str, after_str, of_str);
     }
 
@@ -128,19 +130,18 @@ namespace boost { namespace date_time {
     {
       m_element_strings = parse_tree_type(col, this->first); // enum first
     }
-                     
 
     //! returns partial_date parsed from stream
     template<class facet_type>
     partial_date_type
-    get_partial_date_type(stream_itr_type& sitr, 
+    get_partial_date_type(stream_itr_type& sitr,
                           stream_itr_type& stream_end,
-                          std::ios_base& a_ios, 
+                          std::ios_base& a_ios,
                           const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
+
       day_type d(1);
       month_type m(1);
       facet.get(sitr, stream_end, a_ios, d);
@@ -152,18 +153,18 @@ namespace boost { namespace date_time {
     //! returns nth_kday_of_week parsed from stream
     template<class facet_type>
     nth_kday_type
-    get_nth_kday_type(stream_itr_type& sitr, 
+    get_nth_kday_type(stream_itr_type& sitr,
                       stream_itr_type& stream_end,
-                      std::ios_base& a_ios, 
+                      std::ios_base& a_ios,
                       const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
       typename nth_kday_type::week_num wn;
       day_of_week_type wd(0); // no default constructor
       month_type m(1);        // no default constructor
-     
+
       match_results mr = m_element_strings.match(sitr, stream_end);
       switch(mr.current_match) {
         case first  : { wn = nth_kday_type::first; break; }
@@ -173,98 +174,98 @@ namespace boost { namespace date_time {
         case fifth  : { wn = nth_kday_type::fifth; break; }
         default:
         {
-          throw std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'");
-          break;
+          boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'"));
+          BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(wn = nth_kday_type::first);
         }
       }                                         // week num
       facet.get(sitr, stream_end, a_ios, wd);   // day_of_week
       extract_element(sitr, stream_end, of);    // "of" element
       facet.get(sitr, stream_end, a_ios, m);    // month
-      
+
       return nth_kday_type(wn, wd, m);
     }
 
     //! returns first_kday_of_week parsed from stream
     template<class facet_type>
     first_kday_type
-    get_first_kday_type(stream_itr_type& sitr, 
+    get_first_kday_type(stream_itr_type& sitr,
                         stream_itr_type& stream_end,
-                        std::ios_base& a_ios, 
+                        std::ios_base& a_ios,
                         const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
+
       day_of_week_type wd(0); // no default constructor
       month_type m(1);        // no default constructor
-     
+
       extract_element(sitr, stream_end, first); // "first" element
       facet.get(sitr, stream_end, a_ios, wd);   // day_of_week
       extract_element(sitr, stream_end, of);    // "of" element
       facet.get(sitr, stream_end, a_ios, m);    // month
-      
-      
+
+
       return first_kday_type(wd, m);
     }
 
     //! returns last_kday_of_week parsed from stream
     template<class facet_type>
     last_kday_type
-    get_last_kday_type(stream_itr_type& sitr, 
+    get_last_kday_type(stream_itr_type& sitr,
                        stream_itr_type& stream_end,
-                       std::ios_base& a_ios, 
+                       std::ios_base& a_ios,
                        const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
+
       day_of_week_type wd(0); // no default constructor
       month_type m(1);        // no default constructor
-     
       extract_element(sitr, stream_end, last); // "last" element
       facet.get(sitr, stream_end, a_ios, wd);  // day_of_week
       extract_element(sitr, stream_end, of);   // "of" element
       facet.get(sitr, stream_end, a_ios, m);   // month
-      
-      
+
+
       return last_kday_type(wd, m);
     }
 
     //! returns first_kday_of_week parsed from stream
     template<class facet_type>
     kday_before_type
-    get_kday_before_type(stream_itr_type& sitr, 
+    get_kday_before_type(stream_itr_type& sitr,
                          stream_itr_type& stream_end,
-                         std::ios_base& a_ios, 
+                         std::ios_base& a_ios,
                          const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
+
       day_of_week_type wd(0); // no default constructor
-     
+
       facet.get(sitr, stream_end, a_ios, wd);   // day_of_week
       extract_element(sitr, stream_end, before);// "before" element
-      
+
       return kday_before_type(wd);
     }
 
     //! returns first_kday_of_week parsed from stream
     template<class facet_type>
     kday_after_type
-    get_kday_after_type(stream_itr_type& sitr, 
+    get_kday_after_type(stream_itr_type& sitr,
                         stream_itr_type& stream_end,
-                        std::ios_base& a_ios, 
+                        std::ios_base& a_ios,
                         const facet_type& facet) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-      
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
+
       day_of_week_type wd(0); // no default constructor
-     
+
       facet.get(sitr, stream_end, a_ios, wd);   // day_of_week
       extract_element(sitr, stream_end, after); // "after" element
-      
+
       return kday_after_type(wd);
     }
 
@@ -277,13 +278,13 @@ namespace boost { namespace date_time {
                          typename date_generator_parser::phrase_elements ele) const
     {
       // skip leading whitespace
-      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
+      while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; }
       match_results mr = m_element_strings.match(sitr, stream_end);
       if(mr.current_match != ele) {
-        throw std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'");
+        boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'"));
       }
     }
-    
+
   };
 
   template<class date_type, class CharT>
similarity index 97%
rename from deal.II/contrib/boost/include/boost/date_time/date_generators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_generators.hpp
index 96cdeead43f90dbf99a12811dd178d4ae4b3aa48..1f1a34a66779a1c849e076959bd40c2e975437c3 100644 (file)
@@ -6,16 +6,18 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 /*! @file date_generators.hpp
   Definition and implementation of date algorithm templates
 */
+
 #include <stdexcept>
 #include <sstream>
-#include "boost/date_time/date.hpp"
-#include "boost/date_time/compiler_config.hpp"
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/date.hpp>
+#include <boost/date_time/compiler_config.hpp>
 
 namespace boost {
 namespace date_time {
@@ -99,13 +101,11 @@ namespace date_time {
    date_type get_date(year_type y) const
    {
      if((day_ == 29) && (month_ == 2) && !(calendar_type::is_leap_year(y))) {
-       std::stringstream ss("");
+       std::ostringstream ss;
        ss << "No Feb 29th in given year of " << y << ".";
-       throw std::invalid_argument(ss.str());
-       //return date_type(1,1,1); // should never reach
-     } else {
-       return date_type(y, month_, day_);
+       boost::throw_exception(std::invalid_argument(ss.str()));
      }
+     return date_type(y, month_, day_);
    }
    date_type operator()(year_type y) const
    {
@@ -141,7 +141,7 @@ namespace date_time {
     * Dec-31 == "365" */
    virtual std::string to_string() const
    {
-     std::stringstream ss;
+     std::ostringstream ss;
      date_type d(2004, month_, day_);
      unsigned short c = d.day_of_year();     
      c--; // numbered 0-365 while day_of_year is 1 based...
@@ -154,6 +154,9 @@ namespace date_time {
  };
 
 
+  //! Returns nth arg as string. 1 -> "first", 2 -> "second", max is 5.
+  BOOST_DATE_TIME_DECL const char* nth_as_str(int n);
+
   //! Useful generator functor for finding holidays
   /*! Based on the idea in Cal. Calc. for finding holidays that are
    *  the 'first Monday of September'. When instantiated with
@@ -229,7 +232,7 @@ namespace date_time {
     /*! Returns a string formatted as "M4.3.0" ==> 3rd Sunday in April. */
     virtual std::string to_string() const
     {
-     std::stringstream ss;
+     std::ostringstream ss;
      ss << 'M' 
        << static_cast<int>(month_) << '.'
        << static_cast<int>(wn_) << '.'
@@ -242,9 +245,6 @@ namespace date_time {
     day_of_week_type dow_;
   };
   
-  //! Returns nth arg as string. 1 -> "first", 2 -> "second", max is 5.
-  BOOST_DATE_TIME_DECL const char* nth_as_str(int n);
-
   //! Useful generator functor for finding holidays and daylight savings
   /*! Similar to nth_kday_of_month, but requires less paramters
    *  \ingroup date_alg
@@ -275,7 +275,7 @@ namespace date_time {
         d = d + one_day;
       }
       return d;
-        }
+    }
     // added for streaming
     month_type month() const
     {
@@ -289,7 +289,7 @@ namespace date_time {
     /*! Returns a string formatted as "M4.1.0" ==> 1st Sunday in April. */
     virtual std::string to_string() const
     {
-     std::stringstream ss;
+     std::ostringstream ss;
      ss << 'M' 
        << static_cast<int>(month_) << '.'
        << 1 << '.'
@@ -350,7 +350,7 @@ namespace date_time {
     /*! Returns a string formatted as "M4.5.0" ==> last Sunday in April. */
     virtual std::string to_string() const
     {
-      std::stringstream ss;
+      std::ostringstream ss;
       ss << 'M' 
          << static_cast<int>(month_) << '.'
          << 5 << '.'
similarity index 69%
rename from deal.II/contrib/boost/include/boost/date_time/date_parsing.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/date_parsing.hpp
index ae09158967c9cf4ad235e713874ec7b963e7b42d..f361bc8096eb514b38abecc23ae82ad32825eb53 100644 (file)
@@ -2,22 +2,22 @@
 #define _DATE_TIME_DATE_PARSING_HPP___
 
 /* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
+ * Use, modification and distribution is subject to the
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $
  */
 
-#include "boost/tokenizer.hpp"
-#include "boost/lexical_cast.hpp"
-#include "boost/date_time/compiler_config.hpp"
-#include "boost/date_time/parse_format_base.hpp"
 #include <string>
 #include <iterator>
 #include <algorithm>
+#include <boost/tokenizer.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/parse_format_base.hpp>
 
-#if defined(BOOST_NO_STD_LOCALE)
+#if defined(BOOST_DATE_TIME_NO_LOCALE)
 #include <cctype> // ::tolower(int)
 #else
 #include <locale> // std::tolower(char, locale)
@@ -29,43 +29,43 @@ namespace date_time {
   //! A function to replace the std::transform( , , ,tolower) construct
   /*! This function simply takes a string, and changes all the characters
    * in that string to lowercase (according to the default system locale).
-   * In the event that a compiler does not support locales, the old 
+   * In the event that a compiler does not support locales, the old
    * C style tolower() is used.
    */
   inline
-  std::string 
-  convert_to_lower(const std::string& inp) {
-    std::string tmp;
-    unsigned i = 0;
-#if defined(BOOST_NO_STD_LOCALE)
-    while(i < inp.length()) {
-      tmp += static_cast<char>(std::tolower(inp.at(i++)));
+  std::string
+  convert_to_lower(std::string inp)
+  {
+#if !defined(BOOST_DATE_TIME_NO_LOCALE)
+    const std::locale loc(std::locale::classic());
+#endif
+    std::string::size_type i = 0, n = inp.length();
+    for (; i < n; ++i) {
+      inp[i] =
+#if defined(BOOST_DATE_TIME_NO_LOCALE)
+        static_cast<char>(std::tolower(inp[i]));
 #else
-      static const std::locale loc(std::locale::classic());
-      while(i < inp.length()) {
         // tolower and others were brought in to std for borland >= v564
         // in compiler_config.hpp
-        std::string::value_type c(inp.at(i++));
-        tmp += std::tolower(c, loc);
+        std::tolower(inp[i], loc);
 #endif
-        
-      }
-      return tmp;
     }
-    
+    return inp;
+  }
+
     //! Helper function for parse_date.
     /* Used by-value parameter because we change the string and may
      * want to preserve the original argument */
     template<class month_type>
-    unsigned short 
-    month_str_to_ushort(std::string s) {
+    inline unsigned short
+    month_str_to_ushort(std::string const& s) {
       if((s.at(0) >= '0') && (s.at(0) <= '9')) {
         return boost::lexical_cast<unsigned short>(s);
-      } 
+      }
       else {
-        s = convert_to_lower(s);
+        std::string str = convert_to_lower(s);
         typename month_type::month_map_ptr_type ptr = month_type::get_month_map_ptr();
-        typename month_type::month_map_type::iterator iter = ptr->find(s);
+        typename month_type::month_map_type::iterator iter = ptr->find(str);
         if(iter != ptr->end()) { // required for STLport
           return iter->second;
         }
@@ -74,44 +74,45 @@ namespace date_time {
     }
  
     //! Find index of a string in either of 2 arrays
-    /*! find_match searches both arrays for a match to 's'. Indexing of the 
-     * arrays is from 0 to 'limit'. The index of the match is returned.
+    /*! find_match searches both arrays for a match to 's'. Both arrays
+     * must contain 'size' elements. The index of the match is returned.
+     * If no match is found, 'size' is returned.
      * Ex. "Jan" returns 0, "Dec" returns 11, "Tue" returns 2.
-     * 'limit' can be sent in with: greg_month::max(), 
-     * greg_weekday::max() or date_time::NumSpecialValues */
+     * 'size' can be sent in with: (greg_month::max)() (which 12),
+     * (greg_weekday::max)() + 1 (which is 7) or date_time::NumSpecialValues */
     template<class charT>
-    short find_match(const charT* const* short_names, 
-                     const charT* const* long_names, 
-                     short limit,
+    short find_match(const charT* const* short_names,
+                     const charT* const* long_names,
+                     short size,
                      const std::basic_string<charT>& s) {
-      for(short i = 0; i <= limit; ++i){
+      for(short i = 0; i < size; ++i){
         if(short_names[i] == s || long_names[i] == s){
           return i;
         }
       }
-      return static_cast<short>(limit + 1); // not-found, return a value out of range
+      return size; // not-found, return a value out of range
     }
-    
+
     //! Generic function to parse a delimited date (eg: 2002-02-10)
     /*! Accepted formats are: "2003-02-10" or " 2003-Feb-10" or
-     * "2003-Feburary-10" 
-     * The order in which the Month, Day, & Year appear in the argument 
-     * string can be accomodated by passing in the appropriate ymd_order_spec 
+     * "2003-Feburary-10"
+     * The order in which the Month, Day, & Year appear in the argument
+     * string can be accomodated by passing in the appropriate ymd_order_spec
      */
     template<class date_type>
     date_type
     parse_date(const std::string& s, int order_spec = ymd_order_iso) {
-      std::string spec_str("");
+      std::string spec_str;
       if(order_spec == ymd_order_iso) {
         spec_str = "ymd";
-      } 
+      }
       else if(order_spec == ymd_order_dmy) {
         spec_str = "dmy";
-      } 
+      }
       else { // (order_spec == ymd_order_us)
         spec_str = "mdy";
       }
-      
+
       typedef typename date_type::year_type year_type;
       typedef typename date_type::month_type month_type;
       unsigned pos = 0;
@@ -128,21 +129,21 @@ namespace date_time {
       const char sep_char[] = {',','-','.',' ','/','\0'};
       char_separator_type sep(sep_char);
       tokenizer tok(s,sep);
-      for(tokenizer_iterator beg=tok.begin(); 
-          beg!=tok.end() && pos < spec_str.size(); 
+      for(tokenizer_iterator beg=tok.begin();
+          beg!=tok.end() && pos < spec_str.size();
           ++beg, ++pos) {
         switch(spec_str.at(pos)) {
-          case 'y': 
+          case 'y':
           {
             year = boost::lexical_cast<unsigned short>(*beg);
             break;
           }
-          case 'm': 
+          case 'm':
           {
             month = month_str_to_ushort<month_type>(*beg);
             break;
           }
-          case 'd': 
+          case 'd':
           {
             day = boost::lexical_cast<unsigned short>(*beg);
             break;
@@ -151,7 +152,7 @@ namespace date_time {
       }
       return date_type(year, month, day);
     }
-    
+
     //! Generic function to parse undelimited date (eg: 20020201)
     template<class date_type>
     date_type
@@ -161,16 +162,16 @@ namespace date_time {
       typedef typename date_type::year_type year_type;
       //typename date_type::ymd_type ymd((year_type::min)(),1,1);
       unsigned short y = 0, m = 0, d = 0;
-      
-      /* The two bool arguments state that parsing will not wrap 
-       * (only the first 8 characters will be parsed) and partial 
-       * strings will not be parsed. 
+
+      /* The two bool arguments state that parsing will not wrap
+       * (only the first 8 characters will be parsed) and partial
+       * strings will not be parsed.
        * Ex:
        * "2005121" will parse 2005 & 12, but not the "1" */
       boost::offset_separator osf(offsets, offsets+3, false, false);
-      
-      typedef typename boost::tokenizer<boost::offset_separator, 
-                                        std::basic_string<char>::const_iterator, 
+
+      typedef typename boost::tokenizer<boost::offset_separator,
+                                        std::basic_string<char>::const_iterator,
                                         std::basic_string<char> > tokenizer_type;
       tokenizer_type tok(s, osf);
       for(typename tokenizer_type::iterator ti=tok.begin(); ti!=tok.end();++ti) {
@@ -184,34 +185,34 @@ namespace date_time {
       }
       return date_type(y,m,d);
     }
-    
+
     //! Helper function for 'date gregorian::from_stream()'
     /*! Creates a string from the iterators that reference the
-     * begining & end of a char[] or string. All elements are 
+     * begining & end of a char[] or string. All elements are
      * used in output string */
     template<class date_type, class iterator_type>
-    inline 
+    inline
     date_type
-    from_stream_type(iterator_type& beg, 
-                     iterator_type& end,
-                     char) 
+    from_stream_type(iterator_type& beg,
+                     iterator_type const& end,
+                     char)
     {
-      std::stringstream ss("");
+      std::ostringstream ss;
       while(beg != end) {
         ss << *beg++;
       }
       return parse_date<date_type>(ss.str());
     }
+
     //! Helper function for 'date gregorian::from_stream()'
     /*! Returns the first string found in the stream referenced by the
      * begining & end iterators */
     template<class date_type, class iterator_type>
-    inline 
+    inline
     date_type
-    from_stream_type(iterator_type& beg, 
-                     iterator_type& end,
-                     std::string
+    from_stream_type(iterator_type& beg,
+                     iterator_type const& /* end */,
+                     std::string const&)
     {
       return parse_date<date_type>(*beg);
     }
@@ -220,22 +221,30 @@ namespace date_time {
      * parse_date<>()? In the mean time this gets us started... */
     //! Helper function for 'date gregorian::from_stream()'
     /*! Creates a string from the iterators that reference the
-     * begining & end of a wstring. All elements are 
+     * begining & end of a wstring. All elements are
      * used in output string */
     template<class date_type, class iterator_type>
-    inline 
-    date_type from_stream_type(iterator_type& beg, 
-                               iterator_type& end,
-                               wchar_t) 
+    inline
+    date_type from_stream_type(iterator_type& beg,
+                               iterator_type const& end,
+                               wchar_t)
     {
-      std::stringstream ss("");
-      while(beg != end) {
+      std::ostringstream ss;
 #if !defined(BOOST_DATE_TIME_NO_LOCALE)
-        ss << std::use_facet<std::ctype<wchar_t> >(std::locale()).narrow(*beg++, 'X'); // 'X' will cause exception to be thrown
+      std::locale loc;
+      std::ctype<wchar_t> const& fac = std::use_facet<std::ctype<wchar_t> >(loc);
+      while(beg != end) {
+        ss << fac.narrow(*beg++, 'X'); // 'X' will cause exception to be thrown
+      }
 #else
-        ss << ss.narrow(*beg++, 'X');
-#endif
+      while(beg != end) {
+        char c = 'X'; // 'X' will cause exception to be thrown
+        const wchar_t wc = *beg++;
+        if (wc >= 0 && wc <= 127)
+          c = static_cast< char >(wc);
+        ss << c;
       }
+#endif
       return parse_date<date_type>(ss.str());
     }
 #ifndef BOOST_NO_STD_WSTRING
@@ -243,21 +252,29 @@ namespace date_time {
     /*! Creates a string from the first wstring found in the stream
      * referenced by the begining & end iterators */
     template<class date_type, class iterator_type>
-    inline 
+    inline
     date_type
-    from_stream_type(iterator_type& beg, 
-                     iterator_type& end,
-                     std::wstring) {
+    from_stream_type(iterator_type& beg,
+                     iterator_type const& /* end */,
+                     std::wstring const&) {
       std::wstring ws = *beg;
-      std::stringstream ss("");
+      std::ostringstream ss;
       std::wstring::iterator wsb = ws.begin(), wse = ws.end();
-      while(wsb != wse) {
 #if !defined(BOOST_DATE_TIME_NO_LOCALE)
-        ss << std::use_facet<std::ctype<wchar_t> >(std::locale()).narrow(*wsb++, 'X'); // 'X' will cause exception to be thrown
+      std::locale loc;
+      std::ctype<wchar_t> const& fac = std::use_facet<std::ctype<wchar_t> >(loc);
+      while(wsb != wse) {
+        ss << fac.narrow(*wsb++, 'X'); // 'X' will cause exception to be thrown
+      }
 #else
-        ss << ss.narrow(*wsb++, 'X'); // 'X' will cause exception to be thrown
-#endif
+      while(wsb != wse) {
+        char c = 'X'; // 'X' will cause exception to be thrown
+        const wchar_t wc = *wsb++;
+        if (wc >= 0 && wc <= 127)
+          c = static_cast< char >(wc);
+        ss << c;
       }
+#endif
       return parse_date<date_type>(ss.str());
     }
 #endif // BOOST_NO_STD_WSTRING
@@ -266,30 +283,30 @@ namespace date_time {
 #else
     //! function called by wrapper functions: date_period_from_(w)string()
     template<class date_type, class charT>
-    period<date_type, typename date_type::duration_type> 
+    period<date_type, typename date_type::duration_type>
     from_simple_string_type(const std::basic_string<charT>& s){
       typedef typename std::basic_string<charT>::traits_type traits_type;
       typedef typename boost::char_separator<charT, traits_type> char_separator;
-      typedef typename boost::tokenizer<char_separator, 
-                                        typename std::basic_string<charT>::const_iterator, 
+      typedef typename boost::tokenizer<char_separator,
+                                        typename std::basic_string<charT>::const_iterator,
                                         std::basic_string<charT> > tokenizer;
       const charT sep_list[4] = {'[','/',']','\0'};
       char_separator sep(sep_list);
       tokenizer tokens(s, sep);
-      typename tokenizer::iterator tok_it = tokens.begin(); 
+      typename tokenizer::iterator tok_it = tokens.begin();
       std::basic_string<charT> date_string = *tok_it;
       // get 2 string iterators and generate a date from them
-      typename std::basic_string<charT>::iterator date_string_start = date_string.begin(), 
-                                                  date_string_end = date_string.end(); 
+      typename std::basic_string<charT>::iterator date_string_start = date_string.begin(),
+                                                  date_string_end = date_string.end();
       typedef typename std::iterator_traits<typename std::basic_string<charT>::iterator>::value_type value_type;
       date_type d1 = from_stream_type<date_type>(date_string_start, date_string_end, value_type());
       date_string = *(++tok_it); // next token
-      date_string_start = date_string.begin(), date_string_end = date_string.end(); 
+      date_string_start = date_string.begin(), date_string_end = date_string.end();
       date_type d2 = from_stream_type<date_type>(date_string_start, date_string_end, value_type());
-      return period<date_type, typename date_type::duration_type>(d1, d2); 
+      return period<date_type, typename date_type::duration_type>(d1, d2);
     }
 #endif
-    
+
 } } //namespace date_time
 
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/date_time/filetime_functions.hpp b/deal.II/contrib/boost-1.41.0/include/boost/date_time/filetime_functions.hpp
new file mode 100644 (file)
index 0000000..27ed754
--- /dev/null
@@ -0,0 +1,170 @@
+#ifndef DATE_TIME_FILETIME_FUNCTIONS_HPP__
+#define DATE_TIME_FILETIME_FUNCTIONS_HPP__
+
+/* Copyright (c) 2004 CrystalClear Software, Inc.
+ * Use, modification and distribution is subject to the
+ * Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2009-06-06 07:24:09 -0400 (Sat, 06 Jun 2009) $
+ */
+
+/*! @file filetime_functions.hpp
+ * Function(s) for converting between a FILETIME structure and a
+ * time object. This file is only available on systems that have
+ * BOOST_HAS_FTIME defined.
+ */
+
+#include <boost/date_time/compiler_config.hpp>
+
+#if defined(BOOST_HAS_FTIME) // skip this file if no FILETIME
+
+#if defined(BOOST_USE_WINDOWS_H)
+#  include <windows.h>
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/date_time/time.hpp>
+#include <boost/date_time/date_defs.hpp>
+
+namespace boost {
+
+namespace date_time {
+
+namespace winapi {
+
+#if !defined(BOOST_USE_WINDOWS_H)
+
+    extern "C" {
+
+        struct FILETIME
+        {
+            boost::uint32_t dwLowDateTime;
+            boost::uint32_t dwHighDateTime;
+        };
+        struct SYSTEMTIME
+        {
+            boost::uint16_t wYear;
+            boost::uint16_t wMonth;
+            boost::uint16_t wDayOfWeek;
+            boost::uint16_t wDay;
+            boost::uint16_t wHour;
+            boost::uint16_t wMinute;
+            boost::uint16_t wSecond;
+            boost::uint16_t wMilliseconds;
+        };
+
+        __declspec(dllimport) void __stdcall GetSystemTimeAsFileTime(FILETIME* lpFileTime);
+        __declspec(dllimport) int __stdcall FileTimeToLocalFileTime(const FILETIME* lpFileTime, FILETIME* lpLocalFileTime);
+        __declspec(dllimport) void __stdcall GetSystemTime(SYSTEMTIME* lpSystemTime);
+        __declspec(dllimport) int __stdcall SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime, FILETIME* lpFileTime);
+
+    } // extern "C"
+
+#endif // defined(BOOST_USE_WINDOWS_H)
+
+    typedef FILETIME file_time;
+    typedef SYSTEMTIME system_time;
+
+    inline void get_system_time_as_file_time(file_time& ft)
+    {
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+        // Some runtime library implementations expect local times as the norm for ctime.
+        file_time ft_utc;
+        GetSystemTimeAsFileTime(&ft_utc);
+        FileTimeToLocalFileTime(&ft_utc, &ft);
+#elif defined(BOOST_NO_GETSYSTEMTIMEASFILETIME)
+        system_time st;
+        GetSystemTime(&st);
+        SystemTimeToFileTime(&st, &ft);
+#else
+        GetSystemTimeAsFileTime(&ft);
+#endif
+    }
+
+    /*!
+     * The function converts file_time into number of microseconds elapsed since 1970-Jan-01
+     *
+     * \note Only dates after 1970-Jan-01 are supported. Dates before will be wrapped.
+     *
+     * \note The function is templated on the FILETIME type, so that
+     *       it can be used with both native FILETIME and the ad-hoc
+     *       boost::date_time::winapi::file_time type.
+     */
+    template< typename FileTimeT >
+    inline boost::uint64_t file_time_to_microseconds(FileTimeT const& ft)
+    {
+        /* shift is difference between 1970-Jan-01 & 1601-Jan-01
+        * in 100-nanosecond intervals */
+        const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008
+
+        union {
+            FileTimeT as_file_time;
+            uint64_t as_integer; // 100-nanos since 1601-Jan-01
+        } caster;
+        caster.as_file_time = ft;
+
+        caster.as_integer -= shift; // filetime is now 100-nanos since 1970-Jan-01
+        return (caster.as_integer / 10); // truncate to microseconds
+    }
+
+} // namespace winapi
+
+//! Create a time object from an initialized FILETIME struct.
+/*!
+ * Create a time object from an initialized FILETIME struct.
+ * A FILETIME struct holds 100-nanosecond units (0.0000001). When
+ * built with microsecond resolution the file_time's sub second value
+ * will be truncated. Nanosecond resolution has no truncation.
+ *
+ * \note The function is templated on the FILETIME type, so that
+ *       it can be used with both native FILETIME and the ad-hoc
+ *       boost::date_time::winapi::file_time type.
+ */
+template< typename TimeT, typename FileTimeT >
+inline
+TimeT time_from_ftime(const FileTimeT& ft)
+{
+    typedef typename TimeT::date_type date_type;
+    typedef typename TimeT::date_duration_type date_duration_type;
+    typedef typename TimeT::time_duration_type time_duration_type;
+
+    // https://svn.boost.org/trac/boost/ticket/2523
+    // Since this function can be called with arbitrary times, including ones that
+    // are before 1970-Jan-01, we'll have to cast the time a bit differently,
+    // than it is done in the file_time_to_microseconds function. This allows to
+    // avoid integer wrapping for dates before 1970-Jan-01.
+    union {
+        FileTimeT as_file_time;
+        uint64_t as_integer; // 100-nanos since 1601-Jan-01
+    } caster;
+    caster.as_file_time = ft;
+
+    uint64_t sec = caster.as_integer / 10000000UL;
+    uint32_t sub_sec = (caster.as_integer % 10000000UL) // 100-nanoseconds since the last second
+#if !defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
+        / 10; // microseconds since the last second
+#else
+        * 100; // nanoseconds since the last second
+#endif
+
+    // split sec into usable chunks: days, hours, minutes, & seconds
+    const uint32_t sec_per_day = 86400; // seconds per day
+    uint32_t days = static_cast< uint32_t >(sec / sec_per_day);
+    uint32_t tmp = static_cast< uint32_t >(sec % sec_per_day);
+    uint32_t hours = tmp / 3600; // sec_per_hour
+    tmp %= 3600;
+    uint32_t minutes = tmp / 60; // sec_per_min
+    tmp %= 60;
+    uint32_t seconds = tmp; // seconds
+
+    date_duration_type dd(days);
+    date_type d = date_type(1601, Jan, 01) + dd;
+    return TimeT(d, time_duration_type(hours, minutes, seconds, sub_sec));
+}
+
+}} // boost::date_time
+
+#endif // BOOST_HAS_FTIME
+
+#endif // DATE_TIME_FILETIME_FUNCTIONS_HPP__
similarity index 97%
rename from deal.II/contrib/boost/include/boost/date_time/format_date_parser.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/format_date_parser.hpp
index 63a78396ce718ca31a7ba7c5c5d93f6f8e0226ed..a4a4d0dfbeb400c84eb45ffa964d1e4391d20ff2 100644 (file)
@@ -7,7 +7,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $
  */
 
 
 #include "boost/date_time/special_values_parser.hpp"
 #include <string>
 #include <vector>
+#include <sstream>
+#include <iterator>
+#ifndef BOOST_NO_STDC_NAMESPACE
+#  include <cctype>
+#else
+#  include <ctype.h>
+#endif
 
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std {
+  using ::isspace;
+  using ::isdigit;
+}
+#endif
 namespace boost { namespace date_time {
   
 //! Helper function for parsing fixed length strings into integers
@@ -57,7 +70,7 @@ fixed_string_to_int(std::istreambuf_iterator<charT>& itr,
   }
   try {
     i = boost::lexical_cast<int_type>(mr.cache);
-  }catch(bad_lexical_cast blc){
+  }catch(bad_lexical_cast&){
     // we want to return -1 if the cast fails so nothing to do here
   }
   return i;
@@ -87,19 +100,19 @@ template<typename int_type, typename charT>
 inline
 int_type
 var_string_to_int(std::istreambuf_iterator<charT>& itr,
-                  std::istreambuf_iterator<charT>& /* stream_end */,
+                  const std::istreambuf_iterator<charT>& stream_end,
                   unsigned int max_length)
 {
   typedef std::basic_string<charT>  string_type;
   unsigned int j = 0;
   string_type s;
-  while ((j < max_length) && std::isdigit(*itr)) {
+  while (itr != stream_end && (j < max_length) && std::isdigit(*itr)) {
     s += (*itr);
-    itr++;
-    j++;
+    ++itr;
+    ++j;
   }
   int_type i = -1;
-  if(s.length() != 0) {
+  if(!s.empty()) {
     i = boost::lexical_cast<int_type>(s);
   }
   return i;
@@ -139,7 +152,7 @@ class format_date_parser
 {
  public:
   typedef std::basic_string<charT>        string_type;
-  typedef std::basic_ostringstream<charT>  stringstream_type;
+  typedef std::basic_istringstream<charT>  stringstream_type;
   typedef std::istreambuf_iterator<charT> stream_itr_type;
   typedef typename string_type::const_iterator const_itr;
   typedef typename date_type::year_type  year_type;
@@ -216,8 +229,7 @@ class format_date_parser
              const string_type& format_str,
              const special_values_parser<date_type,charT>& sv_parser) const
   {
-    stringstream_type ss;
-    ss << value; 
+    stringstream_type ss(value);
     stream_itr_type sitr(ss);
     stream_itr_type stream_end;
     return parse_date(sitr, stream_end, format_str, sv_parser);
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/conversion.hpp b/deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/conversion.hpp
new file mode 100644 (file)
index 0000000..f35796e
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef _GREGORIAN__CONVERSION_HPP___
+#define _GREGORIAN__CONVERSION_HPP___
+
+/* Copyright (c) 2004-2005 CrystalClear Software, Inc.
+ * Use, modification and distribution is subject to the
+ * Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2009-06-06 07:27:35 -0400 (Sat, 06 Jun 2009) $
+ */
+
+#include <string>
+#include <stdexcept>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/c_time.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/gregorian/gregorian_types.hpp>
+
+namespace boost {
+
+namespace gregorian {
+
+  //! Converts a date to a tm struct. Throws out_of_range exception if date is a special value
+  inline
+  std::tm to_tm(const date& d)
+  {
+    if (d.is_special())
+    {
+        std::string s = "tm unable to handle ";
+        switch (d.as_special())
+        {
+        case date_time::not_a_date_time:
+            s += "not-a-date-time value"; break;
+        case date_time::neg_infin:
+            s += "-infinity date value"; break;
+        case date_time::pos_infin:
+            s += "+infinity date value"; break;
+        default:
+            s += "a special date value"; break;
+        }
+        boost::throw_exception(std::out_of_range(s));
+    }
+
+    std::tm datetm = {}; // zero initialization is needed for extension members, like tm_zone
+    boost::gregorian::date::ymd_type ymd = d.year_month_day();
+    datetm.tm_year = ymd.year - 1900;
+    datetm.tm_mon = ymd.month - 1;
+    datetm.tm_mday = ymd.day;
+    datetm.tm_wday = d.day_of_week();
+    datetm.tm_yday = d.day_of_year() - 1;
+    datetm.tm_isdst = -1; // negative because not enough info to set tm_isdst
+    return datetm;
+  }
+
+  //! Converts a tm structure into a date dropping the any time values.
+  inline
+  date date_from_tm(const std::tm& datetm)
+  {
+    return date(static_cast<unsigned short>(datetm.tm_year+1900),
+                static_cast<unsigned short>(datetm.tm_mon+1),
+                static_cast<unsigned short>(datetm.tm_mday));
+  }
+
+} } //namespace boost::gregorian
+
+#endif
similarity index 74%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_calendar.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_calendar.hpp
index b8b1f5a69d3338caaab6e082adecdacdc04e35d2..48b84604d18aef3d0585aa241ba5e21e88637db6 100644 (file)
@@ -6,20 +6,21 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/gregorian/greg_weekday.hpp"
-#include "boost/date_time/gregorian/greg_day_of_year.hpp"
-#include "boost/date_time/gregorian_calendar.hpp"
-#include "boost/date_time/gregorian/greg_ymd.hpp"
-#include "boost/date_time/int_adapter.hpp"
+#include <boost/cstdint.hpp>
+#include <boost/date_time/gregorian/greg_weekday.hpp>
+#include <boost/date_time/gregorian/greg_day_of_year.hpp>
+#include <boost/date_time/gregorian_calendar.hpp>
+#include <boost/date_time/gregorian/greg_ymd.hpp>
+#include <boost/date_time/int_adapter.hpp>
 
 namespace boost {
 namespace gregorian {
     
   //!An internal date representation that includes infinities, not a date
-  typedef date_time::int_adapter<unsigned long> fancy_date_rep;
+  typedef date_time::int_adapter<uint32_t> fancy_date_rep;
 
   //! Gregorian calendar for this implementation, hard work in the base
   class gregorian_calendar : 
similarity index 90%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_date.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_date.hpp
index 2d34b2a0e08f3c02aedd68ae619abc01bc722f29..772c783d9db3c4f3f2adae6e24688dde91d377a8 100644 (file)
@@ -6,13 +6,14 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/date.hpp"
-#include "boost/date_time/special_defs.hpp"
-#include "boost/date_time/gregorian/greg_calendar.hpp"
-#include "boost/date_time/gregorian/greg_duration.hpp"
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/date.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/gregorian/greg_calendar.hpp>
+#include <boost/date_time/gregorian/greg_duration.hpp>
 
 namespace boost {
 namespace gregorian {
@@ -55,7 +56,7 @@ namespace gregorian {
       : date_time::date<date, gregorian_calendar, date_duration>(y, m, d)
     {
       if (gregorian_calendar::end_of_month_day(y, m) < d) {
-        throw bad_day_of_month(std::string("Day of month is not valid for year"));
+        boost::throw_exception(bad_day_of_month(std::string("Day of month is not valid for year")));
       }
     }
     //! Constructor from a ymd_type structure
@@ -98,7 +99,7 @@ namespace gregorian {
       return day_of_year_type(doy);
     }
     //!Return the Modified Julian Day number for the date.
-    long modjulian_day() const
+    date_int_type modjulian_day() const
     {
       ymd_type ymd = year_month_day();
       return gregorian_calendar::modjulian_day_number(ymd);      
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_duration.hpp b/deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_duration.hpp
new file mode 100644 (file)
index 0000000..fd75542
--- /dev/null
@@ -0,0 +1,134 @@
+#ifndef GREG_DURATION_HPP___
+#define GREG_DURATION_HPP___
+
+/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
+ * Use, modification and distribution is subject to the 
+ * Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+ * Author: Jeff Garland, Bart Garst 
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
+ */
+
+#include <boost/date_time/date_duration.hpp>
+#include <boost/date_time/int_adapter.hpp>
+#include <boost/date_time/special_defs.hpp>
+
+namespace boost {
+namespace gregorian {
+
+  //!An internal date representation that includes infinities, not a date
+  typedef boost::date_time::duration_traits_adapted date_duration_rep;
+
+  //! Durations in days for gregorian system
+  /*! \ingroup date_basics
+   */
+  class date_duration :
+    public boost::date_time::date_duration< date_duration_rep >
+  {
+    typedef boost::date_time::date_duration< date_duration_rep > base_type;
+
+  public:
+    typedef base_type::duration_rep duration_rep;
+
+    //! Construct from a day count
+    explicit date_duration(duration_rep day_count = 0) : base_type(day_count) {}
+
+    //! construct from special_values
+    date_duration(date_time::special_values sv) : base_type(sv) {}
+
+    //! Copy constructor
+    date_duration(const date_duration& other) : base_type(static_cast< base_type const& >(other))
+    {}
+
+    //! Construct from another date_duration
+    date_duration(const base_type& other) : base_type(other)
+    {}
+
+    //  Relational operators
+    //  NOTE: Because of date_time::date_duration< T > design choice we don't use Boost.Operators here,
+    //  because we need the class to be a direct base. Either lose EBO, or define operators by hand.
+    //  The latter is more effecient.
+    bool operator== (const date_duration& rhs) const
+    {
+      return base_type::operator== (rhs);
+    }
+    bool operator!= (const date_duration& rhs) const
+    {
+      return !operator== (rhs);
+    }
+    bool operator< (const date_duration& rhs) const
+    {
+      return base_type::operator< (rhs);
+    }
+    bool operator> (const date_duration& rhs) const
+    {
+      return !(base_type::operator< (rhs) || base_type::operator== (rhs));
+    }
+    bool operator<= (const date_duration& rhs) const
+    {
+      return (base_type::operator< (rhs) || base_type::operator== (rhs));
+    }
+    bool operator>= (const date_duration& rhs) const
+    {
+      return !base_type::operator< (rhs);
+    }
+
+    //! Subtract another duration -- result is signed
+    date_duration& operator-= (const date_duration& rhs)
+    {
+      base_type::operator-= (rhs);
+      return *this;
+    }
+    friend date_duration operator- (date_duration rhs, date_duration const& lhs)
+    {
+      rhs -= lhs;
+      return rhs;
+    }
+
+    //! Add a duration -- result is signed
+    date_duration& operator+= (const date_duration& rhs)
+    {
+      base_type::operator+= (rhs);
+      return *this;
+    }
+    friend date_duration operator+ (date_duration rhs, date_duration const& lhs)
+    {
+      rhs += lhs;
+      return rhs;
+    }
+
+    //! unary- Allows for dd = -date_duration(2); -> dd == -2
+    date_duration operator- ()const
+    {
+      return date_duration(get_rep() * (-1));
+    }
+
+    //! Division operations on a duration with an integer.
+    date_duration& operator/= (int divisor)
+    {
+      base_type::operator/= (divisor);
+      return *this;
+    }
+    friend date_duration operator/ (date_duration rhs, int lhs)
+    {
+      rhs /= lhs;
+      return rhs;
+    }
+
+    //! Returns the smallest duration -- used by to calculate 'end'
+    static date_duration unit()
+    {
+      return date_duration(base_type::unit().get_rep());
+    }
+  };      
+
+  //! Shorthand for date_duration
+  typedef date_duration days;
+
+} } //namespace gregorian
+
+#if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
+#include <boost/date_time/date_duration_types.hpp>
+#endif
+
+#endif
similarity index 62%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_duration_types.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_duration_types.hpp
index 9e85ae768ff45ffb8e6663a37dfd819a4b429b53..3d1ce62183d73f3e1bf0b84ca3e2bd0d3bc907d5 100644 (file)
@@ -5,15 +5,15 @@
  * Subject to Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
-#include "boost/date_time/gregorian/greg_date.hpp"
-#include "boost/date_time/int_adapter.hpp"
-#include "boost/date_time/adjust_functors.hpp"
-#include "boost/date_time/date_duration.hpp"
-#include "boost/date_time/date_duration_types.hpp"
+#include <boost/date_time/gregorian/greg_date.hpp>
+#include <boost/date_time/int_adapter.hpp>
+#include <boost/date_time/adjust_functors.hpp>
+#include <boost/date_time/date_duration_types.hpp>
+#include <boost/date_time/gregorian/greg_duration.hpp>
 
 namespace boost {
 namespace gregorian {
@@ -27,7 +27,16 @@ namespace gregorian {
 
   typedef date_time::months_duration<greg_durations_config> months;
   typedef date_time::years_duration<greg_durations_config> years;
-  typedef date_time::weeks_duration<date_time::duration_traits_adapted> weeks;
+
+  class weeks_duration : public date_duration {
+  public:
+    weeks_duration(duration_rep w) 
+      : date_duration(w * 7) {}
+    weeks_duration(date_time::special_values sv) 
+      : date_duration(sv) {}
+  };
+
+  typedef weeks_duration weeks;
 
 }} // namespace boost::gregorian
 
similarity index 90%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_facet.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_facet.hpp
index 876c980471c20ebd0ed1df96aa1b326de9c0d709..9c3877ed03c94095d12735f33a2037fec75b227c 100644 (file)
@@ -6,18 +6,21 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-23 06:13:35 -0500 (Sun, 23 Nov 2008) $
  */
 
 #include "boost/date_time/gregorian/gregorian_types.hpp"
 #include "boost/date_time/date_formatting_locales.hpp" // sets BOOST_DATE_TIME_NO_LOCALE
 #include "boost/date_time/gregorian/parsers.hpp"
-#include <string>
-#include <exception>
 
 //This file is basically commented out if locales are not supported
 #ifndef BOOST_DATE_TIME_NO_LOCALE
 
+#include <string>
+#include <memory>
+#include <locale>
+#include <iostream>
+#include <exception>
 
 namespace boost {
 namespace gregorian {
@@ -281,22 +284,22 @@ namespace gregorian {
       const facet_def& f = std::use_facet<facet_def>(is.getloc());
       num = date_time::find_match(f.get_short_month_names(), 
                                   f.get_long_month_names(), 
-                                  (greg_month::max)(), s); 
+                                  (greg_month::max)(), s); // greg_month spans 1..12, so max returns the array size,
+                                                           // which is needed by find_match
     }
     /* bad_cast will be thrown if the desired facet is not accessible
      * so we can generate the facet. This has the drawback of using english
      * names as a default. */
-    catch(std::bad_cast bc){
-      std::cout << "Month exception caught" << std::endl;
+    catch(std::bad_cast&){
       charT a = '\0';
-      const facet_def* f = create_facet_def(a);
+      std::auto_ptr< const facet_def > f(create_facet_def(a));
       num = date_time::find_match(f->get_short_month_names(), 
                                   f->get_long_month_names(), 
-                                  (greg_month::max)(), s); 
-      delete(f);
+                                  (greg_month::max)(), s); // greg_month spans 1..12, so max returns the array size,
+                                                           // which is needed by find_match
     }
     
-    num += 1; // months numbered 1-12
+    ++num; // months numbered 1-12
     m = greg_month(num); 
 
     return is;
@@ -323,19 +326,19 @@ namespace gregorian {
       const facet_def& f = std::use_facet<facet_def>(is.getloc());
       num = date_time::find_match(f.get_short_weekday_names(), 
                                   f.get_long_weekday_names(), 
-                                  (greg_weekday::max)(), s); 
+                                  (greg_weekday::max)() + 1, s); // greg_weekday spans 0..6, so increment is needed
+                                                                 // to form the array size which is needed by find_match
     }
     /* bad_cast will be thrown if the desired facet is not accessible
      * so we can generate the facet. This has the drawback of using english
      * names as a default. */
-    catch(std::bad_cast bc){
-      //std::cout << "Weekday exception caught" << std::endl;
+    catch(std::bad_cast&){
       charT a = '\0';
-      const facet_def* f = create_facet_def(a);
+      std::auto_ptr< const facet_def > f(create_facet_def(a));
       num = date_time::find_match(f->get_short_weekday_names(), 
                                   f->get_long_weekday_names(), 
-                                  (greg_weekday::max)(), s); 
-      delete(f);
+                                  (greg_weekday::max)() + 1, s); // greg_weekday spans 0..6, so increment is needed
+                                                                 // to form the array size which is needed by find_match
     }
    
     wd = greg_weekday(num); // weekdays numbered 0-6
similarity index 99%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_serialize.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_serialize.hpp
index b39b3a4e01e92058de9668fe4cade7fe63e9e4c8..c48cc0ae37a24913baa0caa0fb522f8321d42312 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 #include "boost/date_time/gregorian/gregorian_types.hpp"
@@ -72,10 +72,10 @@ void load(Archive & ar,
   ar & make_nvp("date", ds);
   try{
     d = ::boost::gregorian::from_undelimited_string(ds);
-  }catch(bad_lexical_cast be) {
+  }catch(bad_lexical_cast&) {
     gregorian::special_values sv = gregorian::special_value_from_string(ds);
     if(sv == gregorian::not_special) {
-      throw(be); // no match found, rethrow original exception
+      throw; // no match found, rethrow original exception
     }
     else {
       d = gregorian::date(sv);
similarity index 93%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/greg_weekday.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/greg_weekday.hpp
index 3c4a6a56678398c52097536d95066584292b83ff..9b566c440d9dc3fc1191f2a1dc8e896d0b5ec3e2 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 #include "boost/date_time/constrained_value.hpp"
@@ -31,7 +31,7 @@ namespace gregorian {
   //! Exception that flags that a weekday number is incorrect
   struct bad_weekday : public std::out_of_range
   {
-    bad_weekday() : std::out_of_range(std::string("Weekday os out of range 0..6")) {}
+    bad_weekday() : std::out_of_range(std::string("Weekday is out of range 0..6")) {}
   };
   typedef CV::simple_exception_policy<unsigned short, 0, 6, bad_weekday> greg_weekday_policies;
   typedef CV::constrained_value<greg_weekday_policies> greg_weekday_rep;
similarity index 98%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian/gregorian_io.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian/gregorian_io.hpp
index 5f4fd85ec14d7a57e2f690074156a0df201a64c8..62a759f55c7e5bbf1a1671fc02f89c6f389b0f46 100644 (file)
@@ -6,13 +6,20 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
-#include "boost/date_time/date_facet.hpp"
-#include "boost/io/ios_state.hpp"
-#include <iostream>
 #include <locale>
+#include <iostream>
+#include <iterator> // i/ostreambuf_iterator
+#include <boost/io/ios_state.hpp>
+#include <boost/date_time/date_facet.hpp>
+#include <boost/date_time/period_parser.hpp>
+#include <boost/date_time/period_formatter.hpp>
+#include <boost/date_time/special_values_parser.hpp>
+#include <boost/date_time/special_values_formatter.hpp>
+#include <boost/date_time/gregorian/gregorian_types.hpp>
+#include <boost/date_time/gregorian/conversion.hpp> // to_tm will be needed in the facets
 
 namespace boost {
 namespace gregorian {
similarity index 92%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian_calendar.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian_calendar.hpp
index 6386008beafbd7cb307b0e0842343cea4518ecdf..3df1ed59f95d742e1cf7ed2740c91c197ea681df 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
 
@@ -44,10 +44,10 @@ namespace date_time {
     //static unsigned short day_of_year(date_int_type);
     static date_int_type day_number(const ymd_type& ymd);
     static date_int_type julian_day_number(const ymd_type& ymd);
-    static long modjulian_day_number(const ymd_type& ymd);
+    static date_int_type modjulian_day_number(const ymd_type& ymd);
     static ymd_type from_day_number(date_int_type);
     static ymd_type from_julian_day_number(date_int_type);
-    static ymd_type from_modjulian_day_number(long);
+    static ymd_type from_modjulian_day_number(date_int_type);
     static bool is_leap_year(year_type);
     static unsigned short end_of_month_day(year_type y, month_type m);
     static ymd_type epoch();
similarity index 97%
rename from deal.II/contrib/boost/include/boost/date_time/gregorian_calendar.ipp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/gregorian_calendar.ipp
index 36bb4b9f8d2d3f2d66dec7f6a0e8f3d7d0b73920..85a3747d09958f11531e834b2b15d4154e7ae061 100644 (file)
@@ -3,7 +3,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
 #ifndef NO_BOOST_DATE_TIME_INLINE
@@ -14,7 +14,7 @@
 namespace boost {
 namespace date_time {
   //! Return the day of the week (0==Sunday, 1==Monday, etc)
-  /*! Converts a the year-month-day into a day of the week number
+  /*! Converts a year-month-day into a day of the week number
    */
   template<typename ymd_type_, typename date_int_type_>
   BOOST_DATE_TIME_INLINE
@@ -99,7 +99,7 @@ namespace date_time {
    */
   template<typename ymd_type_, typename date_int_type_>
   BOOST_DATE_TIME_INLINE
-  long
+  date_int_type_
   gregorian_calendar_base<ymd_type_,date_int_type_>::modjulian_day_number(const ymd_type& ymd) 
   {
     return julian_day_number(ymd)-2400001; //prerounded
@@ -149,7 +149,7 @@ namespace date_time {
   template<typename ymd_type_, typename date_int_type_>
   BOOST_DATE_TIME_INLINE
   ymd_type_
-  gregorian_calendar_base<ymd_type_,date_int_type_>::from_modjulian_day_number(long dayNumber) {
+  gregorian_calendar_base<ymd_type_,date_int_type_>::from_modjulian_day_number(date_int_type dayNumber) {
     date_int_type jd = dayNumber + 2400001; //is 2400000.5 prerounded
     return from_julian_day_number(jd);
   }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/date_time/int_adapter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/int_adapter.hpp
index a6ce1ec4046f51995da1d0e6555c4ec08aa3dc76..fc98fc1278e4fe5bff154a14eadc3a7b714c6788 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
@@ -14,7 +14,9 @@
 #include "boost/limits.hpp" //work around compilers without limits
 #include "boost/date_time/special_defs.hpp"
 #include "boost/date_time/locale_config.hpp"
-#include <iostream>
+#ifndef BOOST_DATE_TIME_NO_LOCALE
+#  include <ostream>
+#endif
 
 namespace boost {
 namespace date_time {
similarity index 83%
rename from deal.II/contrib/boost/include/boost/date_time/local_time/conversion.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/conversion.hpp
index 03c612f3ffc438134a31d1441ae6d854d5eb17ef..13e4d3eb5cc751914c39cd7b5f22dad197d744ab 100644 (file)
@@ -5,7 +5,7 @@
  * Subject to the Boost Software License, Version 1.0.
  * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $
  */
 
 
@@ -18,9 +18,8 @@ namespace local_time {
 
 //! Function that creates a tm struct from a local_date_time
 inline
-tm to_tm(const local_date_time& lt) {
-  tm lt_tm;
-  lt_tm = posix_time::to_tm(lt.local_time());
+std::tm to_tm(const local_date_time& lt) {
+  std::tm lt_tm = posix_time::to_tm(lt.local_time());
   if(lt.is_dst()){
     lt_tm.tm_isdst = 1;
   }
similarity index 93%
rename from deal.II/contrib/boost/include/boost/date_time/local_time/local_date_time.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_date_time.hpp
index d1967fe242c05c8674a51a8a81678400418227c8..166c4034e10ff8c331a64462b4de10c2c4fc02be 100644 (file)
@@ -5,18 +5,21 @@
  * Subject to the Boost Software License, Version 1.0. 
  * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-
-#include "boost/date_time/time.hpp"
-#include "boost/date_time/posix_time/posix_time.hpp" //todo remove?
-#include "boost/shared_ptr.hpp"
-#include "boost/date_time/dst_rules.hpp"
-#include "boost/date_time/time_zone_base.hpp"
-#include "boost/date_time/special_defs.hpp"
 #include <string>
+#include <iomanip>
 #include <sstream>
+#include <stdexcept>
+#include <boost/shared_ptr.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/time.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp> //todo remove?
+#include <boost/date_time/dst_rules.hpp>
+#include <boost/date_time/time_zone_base.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/time_resolution_traits.hpp> // absolute_value
 
 namespace boost {
 namespace local_time {
@@ -24,19 +27,19 @@ namespace local_time {
   //! simple exception for reporting when STD or DST cannot be determined
   struct ambiguous_result : public std::logic_error
   {
-    ambiguous_result (std::string _msg="") :
-      std::logic_error(std::string("Daylight Savings Results are ambiguous: " + _msg)) {}
+    ambiguous_result (std::string const& msg = std::string()) :
+      std::logic_error(std::string("Daylight Savings Results are ambiguous: " + msg)) {}
   };
   //! simple exception for when time label given cannot exist
   struct time_label_invalid : public std::logic_error
   {
-    time_label_invalid (std::string _msg="") :
-      std::logic_error(std::string("Time label given is invalid: " + _msg)) {}
+    time_label_invalid (std::string const& msg = std::string()) :
+      std::logic_error(std::string("Time label given is invalid: " + msg)) {}
   };
   struct dst_not_valid: public std::logic_error
   {
-    dst_not_valid(std::string _msg="") :
-      std::logic_error(std::string("is_dst flag does not match resulting dst for time label given: " + _msg)) {}
+    dst_not_valid(std::string const& msg = std::string()) :
+      std::logic_error(std::string("is_dst flag does not match resulting dst for time label given: " + msg)) {}
   };
 
   //TODO: I think these should be in local_date_time_base and not 
@@ -110,17 +113,17 @@ namespace local_time {
         // ambig occurs at end, invalid at start
         if(result == invalid_time_label){
           // Ex: 2:15am local on trans-in day in nyc, dst_flag irrelevant
-          std::stringstream ss;
+          std::ostringstream ss;
           ss << "time given: " << d << ' ' << td;
-          throw time_label_invalid(ss.str());
+          boost::throw_exception(time_label_invalid(ss.str()));
         }
         else if(result != ambiguous && in_dst != dst_flag){
           // is dst_flag accurate?
           // Ex: false flag in NYC in June
-          std::stringstream ss;
-          ss << "flag given: " << (dst_flag ? "dst=true" : "dst=false")
-            << ", dst calculated: " << (in_dst ? "dst=true" : "dst=false");
-          throw dst_not_valid(ss.str());
+          std::ostringstream ss;
+          ss.setf(std::ios_base::boolalpha);
+          ss << "flag given: dst=" << dst_flag << ", dst calculated: dst=" << in_dst;
+          boost::throw_exception(dst_not_valid(ss.str()));
         }
         
         // everything checks out and conversion to utc already done
@@ -146,9 +149,9 @@ namespace local_time {
       time_is_dst_result result = check_dst(d, td, tz);
       if(result == ambiguous) {
         if(calc_option == EXCEPTION_ON_ERROR){
-          std::stringstream ss;
+          std::ostringstream ss;
           ss << "time given: " << d << ' ' << td;
-          throw ambiguous_result(ss.str());
+          boost::throw_exception(ambiguous_result(ss.str()));
         }
         else{ // NADT on error
           this->time_ = posix_time::posix_time_system::get_time_rep(date_type(date_time::not_a_date_time), time_duration_type(date_time::not_a_date_time));
@@ -156,9 +159,9 @@ namespace local_time {
       }
       else if(result == invalid_time_label){
         if(calc_option == EXCEPTION_ON_ERROR){
-          std::stringstream ss;
+          std::ostringstream ss;
           ss << "time given: " << d << ' ' << td;
-          throw time_label_invalid(ss.str());
+          boost::throw_exception(time_label_invalid(ss.str()));
         }
         else{ // NADT on error
           this->time_ = posix_time::posix_time_system::get_time_rep(date_type(date_time::not_a_date_time), time_duration_type(date_time::not_a_date_time));
@@ -278,7 +281,7 @@ namespace local_time {
     std::string to_string() const
     {
       //TODO is this a temporary function ???
-      std::stringstream ss;
+      std::ostringstream ss;
       if(this->is_special()){
         ss << utc_time();
         return ss.str();
@@ -497,7 +500,7 @@ namespace local_time {
     std::string zone_as_offset(const time_duration_type& td, 
                                const std::string& separator) const
     {
-      std::stringstream ss;
+      std::ostringstream ss;
       if(td.is_negative()) {
         // a negative duration is represented as "-[h]h:mm"
         // we require two digits for the hour. A positive duration 
similarity index 57%
rename from deal.II/contrib/boost/include/boost/date_time/local_time/local_time_io.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/local_time_io.hpp
index fbd34b6f9894d328604a27105a9d12116d57b299..c161ff7e2363adae7a39504a5df3e551843b94ea 100644 (file)
@@ -5,15 +5,18 @@
  * Subject to the Boost Software License, Version 1.0.
  * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 14:05:31 -0500 (Thu, 13 Nov 2008) $
  */
 
+#include <locale>
 #include <iostream>
-#include "boost/date_time/local_time/local_date_time.hpp"
-#include "boost/date_time/local_time/posix_time_zone.hpp"
-#include "boost/date_time/time_facet.hpp"
-#include "boost/date_time/string_convert.hpp"
-#include "boost/io/ios_state.hpp"
+#include <iterator> // i/ostreambuf_iterator
+#include <boost/io/ios_state.hpp>
+#include <boost/date_time/time_facet.hpp>
+#include <boost/date_time/string_convert.hpp>
+#include <boost/date_time/local_time/local_date_time.hpp>
+#include <boost/date_time/local_time/posix_time_zone.hpp>
+#include <boost/date_time/local_time/conversion.hpp> // to_tm will be needed in the facets
 
 namespace boost {
 namespace local_time {
@@ -23,7 +26,7 @@ namespace local_time {
 
   typedef boost::date_time::time_input_facet<local_date_time::utc_time_type,wchar_t> wlocal_time_input_facet;
   typedef boost::date_time::time_input_facet<local_date_time::utc_time_type,char>     local_time_input_facet;
-  
+
   //! operator<< for local_date_time - see local_time docs for formatting details
   template<class CharT, class TraitsT>
   inline
@@ -35,7 +38,7 @@ namespace local_time {
     typedef date_time::time_facet<time_type, CharT> custom_time_facet;
     typedef std::time_put<CharT> std_time_facet;
     std::ostreambuf_iterator<CharT> oitr(os);
-    
+
     if(std::has_facet<custom_time_facet>(os.getloc())) {
       std::use_facet<custom_time_facet>(os.getloc()).put(oitr, 
                                                          os, 
@@ -60,7 +63,7 @@ namespace local_time {
   operator>>(std::basic_istream<CharT, Traits>& is, local_date_time& ldt)
   {
     boost::io::ios_flags_saver iflags(is);
-    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); 
+    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
     if (strm_sentry) {
       try {
         typedef typename local_date_time::utc_time_type utc_time_type;
@@ -69,7 +72,7 @@ namespace local_time {
         // intermediate objects
         std::basic_string<CharT> tz_str;
         utc_time_type pt(not_a_date_time); 
-        
+
         std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
         if(std::has_facet<time_input_facet>(is.getloc())) {
           std::use_facet<time_input_facet>(is.getloc()).get_local_time(sit, str_end, is, pt, tz_str);
@@ -92,27 +95,92 @@ namespace local_time {
           ldt = local_date_time(pt.date(), pt.time_of_day(), tz_ptr, local_date_time::EXCEPTION_ON_ERROR);
         }
       }
-      catch(...) { 
+      catch(...) {
         // mask tells us what exceptions are turned on
         std::ios_base::iostate exception_mask = is.exceptions();
         // if the user wants exceptions on failbit, we'll rethrow our 
         // date_time exception & set the failbit
         if(std::ios_base::failbit & exception_mask) {
-          try { is.setstate(std::ios_base::failbit); } 
+          try { is.setstate(std::ios_base::failbit); }
           catch(std::ios_base::failure&) {} // ignore this one
           throw; // rethrow original exception
         }
         else {
           // if the user want's to fail quietly, we simply set the failbit
-          is.setstate(std::ios_base::failbit); 
-        } 
-            
+          is.setstate(std::ios_base::failbit);
+        }
+
+      }
+    }
+    return is;
+  }
+
+  //! output operator for local_time_period
+  template <class CharT, class TraitsT>
+  inline
+  std::basic_ostream<CharT, TraitsT>&
+  operator<<(std::basic_ostream<CharT, TraitsT>& os,
+             const boost::local_time::local_time_period& p) {
+    boost::io::ios_flags_saver iflags(os);
+    typedef boost::date_time::time_facet<local_date_time, CharT> custom_facet;
+    typedef std::time_put<CharT> std_time_facet;
+    std::ostreambuf_iterator<CharT> oitr(os);
+    if (std::has_facet<custom_facet>(os.getloc())) {
+      std::use_facet<custom_facet>(os.getloc()).put(oitr, os, os.fill(), p);
+    }
+    else {
+      //instantiate a custom facet for dealing with periods since the user
+      //has not put one in the stream so far.  This is for efficiency 
+      //since we would always need to reconstruct for every time period
+      //if the local did not already exist.  Of course this will be overridden
+      //if the user imbues as some later point.
+      custom_facet* f = new custom_facet();
+      std::locale l = std::locale(os.getloc(), f);
+      os.imbue(l);
+      f->put(oitr, os, os.fill(), p);
+    }
+    return os;
+  }
+
+  //! input operator for local_time_period
+  template <class CharT, class Traits>
+  inline
+  std::basic_istream<CharT, Traits>&
+  operator>>(std::basic_istream<CharT, Traits>& is, boost::local_time::local_time_period& tp)
+  {
+    boost::io::ios_flags_saver iflags(is);
+    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
+    if (strm_sentry) {
+      try {
+        typedef typename date_time::time_input_facet<local_date_time, CharT> time_input_facet;
+
+        std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
+        if(std::has_facet<time_input_facet>(is.getloc())) {
+          std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, tp);
+        }
+        else {
+          time_input_facet* f = new time_input_facet();
+          std::locale l = std::locale(is.getloc(), f);
+          is.imbue(l);
+          f->get(sit, str_end, is, tp);
+        }
+      }
+      catch(...) {
+        std::ios_base::iostate exception_mask = is.exceptions();
+        if(std::ios_base::failbit & exception_mask) {
+          try { is.setstate(std::ios_base::failbit); }
+          catch(std::ios_base::failure&) {}
+          throw; // rethrow original exception
+        }
+        else {
+          is.setstate(std::ios_base::failbit);
+        }
+
       }
     }
     return is;
   }
 
-  
 } } // namespaces
 
 #endif // BOOST_DATE_TIME_LOCAL_TIME_IO_HPP__
similarity index 86%
rename from deal.II/contrib/boost/include/boost/date_time/local_time/posix_time_zone.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time/posix_time_zone.hpp
index c8f0fb798ad2e09c6be5a81fea52431eaaa41a54..416c95b68be26b7a08c7f9b8d1f61770764959f5 100644 (file)
@@ -5,20 +5,21 @@
  * Subject to the Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-10-03 06:04:00 -0400 (Sat, 03 Oct 2009) $
  */
 
 #include <string>
 #include <sstream>
-#include "boost/date_time/gregorian/gregorian.hpp"
-#include "boost/date_time/time_zone_names.hpp"
-#include "boost/date_time/time_zone_base.hpp"
-#include "boost/date_time/local_time/dst_transition_day_rules.hpp"
-#include "boost/date_time/posix_time/posix_time.hpp"
-#include "boost/date_time/string_convert.hpp"
-#include "boost/date_time/time_parsing.hpp"
-#include "boost/tokenizer.hpp"
 #include <stdexcept>
+#include <boost/tokenizer.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/time_zone_names.hpp>
+#include <boost/date_time/time_zone_base.hpp>
+#include <boost/date_time/local_time/dst_transition_day_rules.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/string_convert.hpp>
+#include <boost/date_time/time_parsing.hpp>
 
 namespace boost{
 namespace local_time{
@@ -26,12 +27,14 @@ namespace local_time{
   //! simple exception for UTC and Daylight savings start/end offsets
   struct bad_offset : public std::out_of_range
   {
-    bad_offset(std::string _msg="") : std::out_of_range(std::string("Offset out of range: " + _msg)) {}
+    bad_offset(std::string const& msg = std::string()) :
+      std::out_of_range(std::string("Offset out of range: " + msg)) {}
   };
   //! simple exception for UTC daylight savings adjustment
   struct bad_adjustment : public std::out_of_range
   {
-    bad_adjustment(std::string _msg="") : std::out_of_range(std::string("Adjustment out of range: " + _msg)) {}
+    bad_adjustment(std::string const& msg = std::string()) :
+      std::out_of_range(std::string("Adjustment out of range: " + msg)) {}
   };
   
   typedef boost::date_time::dst_adjustment_offsets<boost::posix_time::time_duration> dst_adjustment_offsets;
@@ -56,9 +59,12 @@ namespace local_time{
    * An invalid date spec (see date class)<br>
    * A boost::local_time::bad_offset exception will be thrown for:<br>
    * A DST start or end offset that is negative or more than 24 hours<br>
-   * A UTC zone that is greater than +12 or less than -12 hours<br>
+   * A UTC zone that is greater than +14 or less than -12 hours<br>
    * A boost::local_time::bad_adjustment exception will be thrown for:<br>
    * A DST adjustment that is 24 hours or more (positive or negative)<br>
+   *
+   * Note that UTC zone offsets can be greater than +12:
+   * http://www.worldtimezone.com/utc/utc+1200.html
    */
   template<class CharT>
   class posix_time_zone_base : public date_time::time_zone_base<posix_time::ptime,CharT> {
@@ -86,7 +92,13 @@ namespace local_time{
       dst_offsets_(posix_time::hours(0),posix_time::hours(0),posix_time::hours(0)),
       dst_calc_rules_()
     {
+#ifdef __HP_aCC
+      // Work around bug in aC++ compiler: see QXCR1000880488 in the
+      // HP bug tracking system
+      const char_type sep_chars[2] = {',',0};
+#else
       const char_type sep_chars[2] = {','};
+#endif
       char_separator_type sep(sep_chars);
       tokenizer_type tokens(s, sep);
       tokenizer_iterator_type it = tokens.begin();
@@ -231,7 +243,7 @@ namespace local_time{
     void calc_zone(const string_type& obj){
       const char_type empty_string[2] = {'\0'};
       stringstream_type ss(empty_string);
-      typename string_type::const_iterator sit = obj.begin();
+      typename string_type::const_pointer sit = obj.c_str(), obj_end = sit + obj.size();
       string_type l_std_zone_abbrev, l_dst_zone_abbrev;
 
       // get 'std' name/abbrev
@@ -242,37 +254,37 @@ namespace local_time{
       ss.str(empty_string);
 
       // get UTC offset
-      if(sit != obj.end()){
+      if(sit != obj_end){
         // get duration
-        while(sit != obj.end() && !std::isalpha(*sit)){
-        ss << *sit++;
+        while(sit != obj_end && !std::isalpha(*sit)){
+          ss << *sit++;
         }
         base_utc_offset_ = date_time::str_from_delimited_time_duration<time_duration_type,char_type>(ss.str()); 
         ss.str(empty_string);
 
-        // base offset must be within range of -12 hours to +12 hours
+        // base offset must be within range of -12 hours to +14 hours
         if(base_utc_offset_ < time_duration_type(-12,0,0) ||
-            base_utc_offset_ > time_duration_type(12,0,0))
+          base_utc_offset_ > time_duration_type(14,0,0))
         {
-            throw bad_offset(posix_time::to_simple_string(base_utc_offset_));
+          boost::throw_exception(bad_offset(posix_time::to_simple_string(base_utc_offset_)));
         }
       }
 
       // get DST data if given
-      if(sit != obj.end()){
+      if(sit != obj_end){
         has_dst_ = true;
     
         // get 'dst' name/abbrev
-        while(sit != obj.end() && std::isalpha(*sit)){
+        while(sit != obj_end && std::isalpha(*sit)){
           ss << *sit++;
         }
         l_dst_zone_abbrev = ss.str(); 
         ss.str(empty_string);
 
         // get DST offset if given
-        if(sit != obj.end()){
+        if(sit != obj_end){
           // get duration
-          while(sit != obj.end() && !std::isalpha(*sit)){
+          while(sit != obj_end && !std::isalpha(*sit)){
             ss << *sit++;
           }
           dst_offsets_.dst_adjust_ = date_time::str_from_delimited_time_duration<time_duration_type,char_type>(ss.str());  
@@ -286,7 +298,7 @@ namespace local_time{
         if(dst_offsets_.dst_adjust_ <= time_duration_type(-24,0,0) ||
             dst_offsets_.dst_adjust_ >= time_duration_type(24,0,0))
         {
-          throw bad_adjustment(posix_time::to_simple_string(dst_offsets_.dst_adjust_));
+          boost::throw_exception(bad_adjustment(posix_time::to_simple_string(dst_offsets_.dst_adjust_)));
         }
       }
       // full names not extracted so abbrevs used in their place
@@ -294,7 +306,13 @@ namespace local_time{
     }
 
     void calc_rules(const string_type& start, const string_type& end){
+#ifdef __HP_aCC
+      // Work around bug in aC++ compiler: see QXCR1000880488 in the
+      // HP bug tracking system
+      const char_type sep_chars[2] = {'/',0};
+#else
       const char_type sep_chars[2] = {'/'};
+#endif
       char_separator_type sep(sep_chars);
       tokenizer_type st_tok(start, sep);
       tokenizer_type et_tok(end, sep);
@@ -328,7 +346,7 @@ namespace local_time{
       if(dst_offsets_.dst_start_offset_ < time_duration_type(0,0,0) ||
           dst_offsets_.dst_start_offset_ >= time_duration_type(24,0,0))
       {
-        throw bad_offset(posix_time::to_simple_string(dst_offsets_.dst_start_offset_));
+        boost::throw_exception(bad_offset(posix_time::to_simple_string(dst_offsets_.dst_start_offset_)));
       }
 
       // ending offset
@@ -343,7 +361,7 @@ namespace local_time{
       if(dst_offsets_.dst_end_offset_ < time_duration_type(0,0,0) ||
         dst_offsets_.dst_end_offset_ >= time_duration_type(24,0,0))
       {
-        throw bad_offset(posix_time::to_simple_string(dst_offsets_.dst_end_offset_));
+        boost::throw_exception(bad_offset(posix_time::to_simple_string(dst_offsets_.dst_end_offset_)));
       }
     }
 
@@ -354,7 +372,13 @@ namespace local_time{
     void M_func(const string_type& s, const string_type& e){
       typedef gregorian::nth_kday_of_month nkday;
       unsigned short sm=0,sw=0,sd=0,em=0,ew=0,ed=0; // start/end month,week,day
+#ifdef __HP_aCC
+      // Work around bug in aC++ compiler: see QXCR1000880488 in the
+      // HP bug tracking system
+      const char_type sep_chars[3] = {'M','.',0};
+#else
       const char_type sep_chars[3] = {'M','.'};
+#endif
       char_separator_type sep(sep_chars);
       tokenizer_type stok(s, sep), etok(e, sep);
       
similarity index 89%
rename from deal.II/contrib/boost/include/boost/date_time/local_time_adjustor.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_time_adjustor.hpp
index 500a730436ead8bf544ca23bd251b3850ef70a70..eea4d37ae301df282c88ef7ba51b3e03e62ca897 100644 (file)
@@ -6,16 +6,20 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 /*! @file local_time_adjustor.hpp
   Time adjustment calculations for local times
 */
 
-#include "boost/date_time/date_generators.hpp"
-#include "boost/date_time/dst_rules.hpp"
 #include <stdexcept>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/date_generators.hpp>
+#include <boost/date_time/dst_rules.hpp>
+#include <boost/date_time/time_defs.hpp> // boost::date_time::dst_flags
+#include <boost/date_time/special_defs.hpp> // not_a_date_time
 
 namespace boost {
   namespace date_time {
@@ -109,7 +113,7 @@ namespace boost {
         time_is_dst_result dst_flag = 
           dst_rules::local_is_dst(initial.date(), initial.time_of_day());
         switch(dst_flag) {
-    case is_in_dst:        return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset();
+        case is_in_dst:        return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset();
         case is_not_in_dst:    return utc_offset_rules::utc_to_local_base_offset();
         case invalid_time_label:return utc_offset_rules::utc_to_local_base_offset() + dst_rules::dst_offset();
         case ambiguous: {
@@ -125,15 +129,15 @@ namespace boost {
           }
         }
         }//case
-        //TODO  better excpetion type
-        throw std::out_of_range("Unreachable case");
-
+        //TODO  better exception type
+        boost::throw_exception(std::out_of_range("Unreachable case"));
+        BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return time_duration_type(not_a_date_time)); // should never reach
       }
 
       //! Get the offset to UTC given a local time
       static time_duration_type local_to_utc_offset(const time_type& t, 
                                                     date_time::dst_flags dst=date_time::calculate) 
-      { 
+      {
         switch (dst) {
         case is_dst:
           return utc_offset_rules::local_to_utc_base_offset() - dst_rules::dst_offset();
@@ -146,13 +150,14 @@ namespace boost {
           case is_in_dst:      return utc_offset_rules::local_to_utc_base_offset() - dst_rules::dst_offset();
           case is_not_in_dst:      return utc_offset_rules::local_to_utc_base_offset();
           case ambiguous:          return utc_offset_rules::local_to_utc_base_offset();
-          case invalid_time_label: throw std::out_of_range("Time label invalid");
+          case invalid_time_label: break;
           }
-        }  
-        throw std::out_of_range("Time label invalid");
+        }
+        boost::throw_exception(std::out_of_range("Time label invalid"));
+        BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return time_duration_type(not_a_date_time)); // should never reach
       }
 
-    
+
     private:
 
     };
similarity index 98%
rename from deal.II/contrib/boost/include/boost/date_time/local_timezone_defs.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/local_timezone_defs.hpp
index 508fa7f742677e670470789b123329c6a860c0fc..fd6d3c2fab2b1b9fec21c1b3313a1092f8c064c7 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 15:10:23 -0500 (Thu, 13 Nov 2008) $
  */
 
 #include "boost/date_time/dst_rules.hpp"
@@ -66,7 +66,7 @@ namespace boost {
          if (y < 2007) return Apr;
          return Mar;
        }
-       static day_of_week_type end_day(year_type y) {return Sunday;}
+       static day_of_week_type end_day(year_type) {return Sunday;}
        static month_type end_month(year_type y) 
        {
          if (y < 2007) return Oct;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/date_time/microsec_time_clock.hpp b/deal.II/contrib/boost-1.41.0/include/boost/date_time/microsec_time_clock.hpp
new file mode 100644 (file)
index 0000000..e6f3b8e
--- /dev/null
@@ -0,0 +1,127 @@
+#ifndef DATE_TIME_HIGHRES_TIME_CLOCK_HPP___
+#define DATE_TIME_HIGHRES_TIME_CLOCK_HPP___
+
+/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
+ * Use, modification and distribution is subject to the
+ * Boost Software License, Version 1.0. (See accompanying
+ * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+ * Author: Jeff Garland, Bart Garst
+ * $Date: 2009-06-04 07:36:43 -0400 (Thu, 04 Jun 2009) $
+ */
+
+
+/*! @file microsec_time_clock.hpp
+  This file contains a high resolution time clock implementation.
+*/
+
+#include <boost/cstdint.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/c_time.hpp>
+#include <boost/date_time/time_clock.hpp>
+#include <boost/date_time/filetime_functions.hpp>
+
+#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+namespace boost {
+namespace date_time {
+
+  //! A clock providing microsecond level resolution
+  /*! A high precision clock that measures the local time
+   *  at a resolution up to microseconds and adjusts to the
+   *  resolution of the time system.  For example, for the
+   *  a library configuration with nano second resolution,
+   *  the last 3 places of the fractional seconds will always
+   *  be 000 since there are 1000 nano-seconds in a micro second.
+   */
+  template<class time_type>
+  class microsec_clock
+  {
+  private:
+    //! Type for the function used to convert time_t to tm
+    typedef std::tm* (*time_converter)(const std::time_t*, std::tm*);
+
+  public:
+    typedef typename time_type::date_type date_type;
+    typedef typename time_type::time_duration_type time_duration_type;
+    typedef typename time_duration_type::rep_type resolution_traits_type;
+
+    //! return a local time object for the given zone, based on computer clock
+    //JKG -- looks like we could rewrite this against universal_time
+    template<class time_zone_type>
+    static time_type local_time(shared_ptr<time_zone_type> tz_ptr)
+    {
+      typedef typename time_type::utc_time_type utc_time_type;
+      typedef second_clock<utc_time_type> second_clock;
+      // we'll need to know the utc_offset this machine has
+      // in order to get a utc_time_type set to utc
+      utc_time_type utc_time = second_clock::universal_time();
+      time_duration_type utc_offset = second_clock::local_time() - utc_time;
+      // use micro clock to get a local time with sub seconds
+      // and adjust it to get a true utc time reading with sub seconds
+      utc_time = microsec_clock<utc_time_type>::local_time() - utc_offset;
+      return time_type(utc_time, tz_ptr);
+    }
+
+    //! Returns the local time based on computer clock settings
+    static time_type local_time()
+    {
+      return create_time(&c_time::localtime);
+    }
+
+    //! Returns the UTC time based on computer settings
+    static time_type universal_time()
+    {
+      return create_time(&c_time::gmtime);
+    }
+
+  private:
+    static time_type create_time(time_converter converter)
+    {
+#ifdef BOOST_HAS_GETTIMEOFDAY
+      timeval tv;
+      gettimeofday(&tv, 0); //gettimeofday does not support TZ adjust on Linux.
+      std::time_t t = tv.tv_sec;
+      boost::uint32_t sub_sec = tv.tv_usec;
+#elif defined(BOOST_HAS_FTIME)
+      winapi::file_time ft;
+      winapi::get_system_time_as_file_time(ft);
+      uint64_t micros = winapi::file_time_to_microseconds(ft); // it will not wrap, since ft is the current time
+                                                               // and cannot be before 1970-Jan-01
+      std::time_t t = static_cast<std::time_t>(micros / 1000000UL); // seconds since epoch
+      // microseconds -- static casts supress warnings
+      boost::uint32_t sub_sec = static_cast<boost::uint32_t>(micros % 1000000UL);
+#else
+#error Internal Boost.DateTime error: BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK is defined, however neither gettimeofday nor FILETIME support is detected.
+#endif
+
+      std::tm curr;
+      std::tm* curr_ptr = converter(&t, &curr);
+      date_type d(curr_ptr->tm_year + 1900,
+                  curr_ptr->tm_mon + 1,
+                  curr_ptr->tm_mday);
+
+      //The following line will adjust the fractional second tick in terms
+      //of the current time system.  For example, if the time system
+      //doesn't support fractional seconds then res_adjust returns 0
+      //and all the fractional seconds return 0.
+      int adjust = static_cast< int >(resolution_traits_type::res_adjust() / 1000000);
+
+      time_duration_type td(curr_ptr->tm_hour,
+                            curr_ptr->tm_min,
+                            curr_ptr->tm_sec,
+                            sub_sec * adjust);
+
+      return time_type(d,td);
+    }
+  };
+
+
+} } //namespace date_time
+
+#endif //BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
+
+
+#endif
+
similarity index 92%
rename from deal.II/contrib/boost/include/boost/date_time/period_parser.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/period_parser.hpp
index 6c480148a5f891fdc6e188104a3499eeda926f7f..9cd57e18c7c968ee8a3939eca7128d99894fc0e5 100644 (file)
@@ -7,11 +7,12 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 15:10:23 -0500 (Thu, 13 Nov 2008) $
  */
 
-#include "boost/date_time/string_parse_tree.hpp"
-#include "boost/date_time/string_convert.hpp"
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/string_parse_tree.hpp>
+#include <boost/date_time/string_convert.hpp>
 
 
 namespace boost { namespace date_time {
@@ -32,7 +33,7 @@ namespace boost { namespace date_time {
    * where the date format is controlled by the date facet
    */
   template<class date_type, typename CharT>
-  class period_parser { 
+  class period_parser {
   public:
     typedef std::basic_string<CharT> string_type;
     typedef CharT                    char_type;
@@ -41,7 +42,7 @@ namespace boost { namespace date_time {
     typedef string_parse_tree<CharT> parse_tree_type;
     typedef typename parse_tree_type::parse_match_result_type match_results;
     typedef std::vector<std::basic_string<CharT> > collection_type;
-    
+
     static const char_type default_period_separator[2];
     static const char_type default_period_start_delimeter[2];
     static const char_type default_period_open_range_end_delimeter[2];
@@ -50,12 +51,12 @@ namespace boost { namespace date_time {
     enum period_range_option { AS_OPEN_RANGE, AS_CLOSED_RANGE };
 
     //! Constructor that sets up period parser options
-    period_parser(period_range_option range_option = AS_CLOSED_RANGE, 
-                  const char_type* const period_separator = default_period_separator, 
+    period_parser(period_range_option range_opt = AS_CLOSED_RANGE,
+                  const char_type* const period_separator = default_period_separator,
                   const char_type* const period_start_delimeter = default_period_start_delimeter,
                   const char_type* const period_open_range_end_delimeter = default_period_open_range_end_delimeter,
                   const char_type* const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter)
-      : m_range_option(range_option)
+      : m_range_option(range_opt)
     {
       delimiters.push_back(string_type(period_separator));
       delimiters.push_back(string_type(period_start_delimeter));
@@ -119,13 +120,13 @@ namespace boost { namespace date_time {
     period_type get_period(stream_itr_type& sitr, 
                            stream_itr_type& stream_end,
                            std::ios_base& a_ios, 
-                           const period_type& p,
+                           const period_type& /* p */,
                            const duration_type& dur_unit,
                            const facet_type& facet) const 
     {
       // skip leading whitespace
       while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } 
-     
+
       typedef typename period_type::point_type point_type;
       point_type p1(not_a_date_time), p2(not_a_date_time);
 
@@ -144,14 +145,14 @@ namespace boost { namespace date_time {
       else {
         consume_delim(sitr, stream_end, delimiters[OPEN_END]);  // end delim
       }
-    
+
       return period_type(p1, p2);
     }
-      
+
   private:
     collection_type delimiters; 
-    period_range_option m_range_option;    
-    
+    period_range_option m_range_option;
+
     enum delim_ids { SEPARATOR, START, OPEN_END, CLOSED_END };
 
     //! throws ios_base::failure if delimiter and parsed data do not match
@@ -170,7 +171,8 @@ namespace boost { namespace date_time {
         ++sitr;
       }
       if(s != delim) {
-        throw std::ios_base::failure("Parse failed. Expected '" + convert_string_type<char_type,char>(delim) + "' but found '" + convert_string_type<char_type,char>(s) + "'");
+        boost::throw_exception(std::ios_base::failure("Parse failed. Expected '"
+          + convert_string_type<char_type,char>(delim) + "' but found '" + convert_string_type<char_type,char>(s) + "'"));
       }
     }
   };
similarity index 70%
rename from deal.II/contrib/boost/include/boost/date_time/posix_time/conversion.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/conversion.hpp
index 27ad6a84f175845995153f0e0bc0df040faf040b..a7f84d8d832e15dbacc33b7b9dc873f68780ec9c 100644 (file)
@@ -6,14 +6,15 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/posix_time/ptime.hpp"
-#include "boost/date_time/posix_time/posix_time_duration.hpp"
-#include "boost/date_time/filetime_functions.hpp"
-#include "boost/date_time/c_time.hpp"
-#include "boost/date_time/gregorian/conversion.hpp"
+#include <boost/date_time/posix_time/ptime.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/filetime_functions.hpp>
+#include <boost/date_time/c_time.hpp>
+#include <boost/date_time/time_resolution_traits.hpp> // absolute_value
+#include <boost/date_time/gregorian/conversion.hpp>
 
 namespace boost {
 
@@ -22,7 +23,7 @@ namespace posix_time {
 
   //! Function that converts a time_t into a ptime.
   inline
-  ptime from_time_t(std::time_t t) 
+  ptime from_time_t(std::time_t t)
   {
     ptime start(gregorian::date(1970,1,1));
     return start + seconds(static_cast<long>(t));
@@ -42,14 +43,8 @@ namespace posix_time {
   //! Convert a time_duration to a tm structure truncating any fractional seconds and zeroing fields for date components 
   inline
   std::tm to_tm(const boost::posix_time::time_duration& td) {
-    std::tm timetm;
-    timetm.tm_year = 0;
-    timetm.tm_mon = 0;
-    timetm.tm_mday = 0;
-    timetm.tm_wday = 0;
-    timetm.tm_yday = 0;
-    
-    timetm.tm_hour = date_time::absolute_value(td.hours()); 
+    std::tm timetm = {};
+    timetm.tm_hour = date_time::absolute_value(td.hours());
     timetm.tm_min = date_time::absolute_value(td.minutes());
     timetm.tm_sec = date_time::absolute_value(td.seconds());
     timetm.tm_isdst = -1; // -1 used when dst info is unknown
@@ -72,14 +67,18 @@ namespace posix_time {
    * built with microsecond resolution the FILETIME's sub second value 
    * will be truncated. Nanosecond resolution has no truncation. 
    *
-   * Note ftime is part of the Win32 API, so it is not portable to non-windows
+   * \note FILETIME is part of the Win32 API, so it is not portable to non-windows
    * platforms.
+   *
+   * \note The function is templated on the FILETIME type, so that
+   *       it can be used with both native FILETIME and the ad-hoc
+   *       boost::date_time::winapi::file_time type.
    */
-  template<class time_type>
+  template< typename TimeT, typename FileTimeT >
   inline
-  time_type from_ftime(const FILETIME& ft)
+  TimeT from_ftime(const FileTimeT& ft)
   {
-    return boost::date_time::time_from_ftime<time_type>(ft);
+    return boost::date_time::time_from_ftime<TimeT>(ft);
   }
 
 #endif // BOOST_HAS_FTIME
similarity index 88%
rename from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_config.hpp
index c40a15cec8bf82a979bd343ec05952d16ffa9cdd..60c3f7ee372d8668a86d2c74994da08b9cf1672d 100644 (file)
@@ -2,22 +2,22 @@
 #define POSIX_TIME_CONFIG_HPP___
 
 /* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
+ * Use, modification and distribution is subject to the
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-10-13 05:00:03 -0400 (Mon, 13 Oct 2008) $
+ * $Date: 2009-06-04 07:52:28 -0400 (Thu, 04 Jun 2009) $
  */
 
-#include "boost/date_time/time_duration.hpp"
-#include "boost/date_time/time_resolution_traits.hpp"
-#include "boost/date_time/gregorian/gregorian_types.hpp"
-#include "boost/date_time/wrapping_int.hpp"
-#include "boost/limits.hpp"
-#include "boost/date_time/compiler_config.hpp"
-#include "boost/cstdint.hpp"
-#include <boost/config/no_tr1/cmath.hpp>
 #include <cstdlib> //for MCW 7.2 std::abs(long long)
+#include <boost/limits.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/date_time/time_duration.hpp>
+#include <boost/date_time/time_resolution_traits.hpp>
+#include <boost/date_time/gregorian/gregorian_types.hpp>
+#include <boost/date_time/wrapping_int.hpp>
+#include <boost/date_time/compiler_config.hpp>
 
 namespace boost {
 namespace posix_time {
@@ -30,7 +30,7 @@ namespace posix_time {
 #define BOOST_DATE_TIME_HAS_MILLISECONDS
 #define BOOST_DATE_TIME_HAS_MICROSECONDS
 #define BOOST_DATE_TIME_HAS_NANOSECONDS
-  typedef date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::nano, 
+  typedef date_time::time_resolution_traits<boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::nano,
     1000000000, 9 > time_res_traits;
 #else
   // set up conditional test compilations
@@ -38,14 +38,14 @@ namespace posix_time {
 #define BOOST_DATE_TIME_HAS_MICROSECONDS
 #undef  BOOST_DATE_TIME_HAS_NANOSECONDS
   typedef date_time::time_resolution_traits<
-    boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro, 
+    boost::date_time::time_resolution_traits_adapted64_impl, boost::date_time::micro,
                                             1000000, 6 > time_res_traits;
 
 
 // #undef BOOST_DATE_TIME_HAS_MILLISECONDS
 // #undef BOOST_DATE_TIME_HAS_MICROSECONDS
 // #undef BOOST_DATE_TIME_HAS_NANOSECONDS
-//   typedef date_time::time_resolution_traits<boost::int64_t, boost::date_time::tenth, 
+//   typedef date_time::time_resolution_traits<boost::int64_t, boost::date_time::tenth,
 //                                              10, 0 > time_res_traits;
 
 #endif
@@ -82,8 +82,8 @@ namespace posix_time {
     //Give duration access to ticks constructor -- hide from users
     friend class date_time::time_duration<time_duration, time_res_traits>;
   private:
-    explicit time_duration(impl_type ticks) :
-      date_time::time_duration<time_duration, time_res_traits>(ticks)
+    explicit time_duration(impl_type tick_count) :
+      date_time::time_duration<time_duration, time_res_traits>(tick_count)
     {}
   };
 
@@ -134,7 +134,7 @@ namespace posix_time {
     }
   };
 
-  class posix_time_system_config 
+  class posix_time_system_config
   {
    public:
     typedef simple_time_rep time_rep_type;
@@ -143,7 +143,7 @@ namespace posix_time {
     typedef time_duration time_duration_type;
     typedef time_res_traits::tick_type int_type;
     typedef time_res_traits resolution_traits;
-#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers 
+#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers
 #else
     BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000000);
 #endif
@@ -151,7 +151,7 @@ namespace posix_time {
 
 #else
 
-  class millisec_posix_time_system_config 
+  class millisec_posix_time_system_config
   {
    public:
     typedef boost::int64_t time_rep_type;
@@ -162,7 +162,7 @@ namespace posix_time {
     typedef time_res_traits::tick_type int_type;
     typedef time_res_traits::impl_type impl_type;
     typedef time_res_traits resolution_traits;
-#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers 
+#if (defined(BOOST_DATE_TIME_NO_MEMBER_INIT)) //help bad compilers
 #else
     BOOST_STATIC_CONSTANT(boost::int64_t, tick_per_second = 1000000);
 #endif
similarity index 88%
rename from deal.II/contrib/boost/include/boost/date_time/posix_time/posix_time_io.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/posix_time_io.hpp
index 5fa9ce284565c1d07cc858828bdae3c30dcb2938..9a80737a475c772ea2caaf3abcb910a758d53ca6 100644 (file)
@@ -6,17 +6,19 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 14:05:31 -0500 (Thu, 13 Nov 2008) $
  */
 
-#include "boost/date_time/time_facet.hpp"
-#include "boost/date_time/period_formatter.hpp"
-#include "boost/date_time/posix_time/time_period.hpp"
-#include "boost/date_time/posix_time/posix_time_duration.hpp"
-//#include "boost/date_time/gregorian/gregorian_io.hpp"
-#include "boost/io/ios_state.hpp"
-#include <iostream>
 #include <locale>
+#include <iostream>
+#include <iterator> // i/ostreambuf_iterator
+#include <boost/io/ios_state.hpp>
+#include <boost/date_time/time_facet.hpp>
+#include <boost/date_time/period_formatter.hpp>
+#include <boost/date_time/posix_time/ptime.hpp>
+#include <boost/date_time/posix_time/time_period.hpp>
+#include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/date_time/posix_time/conversion.hpp> // to_tm will be needed in the facets
 
 namespace boost {
 namespace posix_time {
@@ -39,9 +41,9 @@ namespace posix_time {
   typedef boost::date_time::time_input_facet<ptime, char>         time_input_facet;
 
   template <class CharT, class TraitsT>
-  inline 
+  inline
   std::basic_ostream<CharT, TraitsT>&
-  operator<<(std::basic_ostream<CharT, TraitsT>& os, 
+  operator<<(std::basic_ostream<CharT, TraitsT>& os,
              const ptime& p) {
     boost::io::ios_flags_saver iflags(os);
     typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
@@ -55,7 +57,6 @@ namespace posix_time {
       //since we would always need to reconstruct for every time period
       //if the locale did not already exist.  Of course this will be overridden
       //if the user imbues as some later point.
-      std::ostreambuf_iterator<CharT> oitr(os);
       custom_ptime_facet* f = new custom_ptime_facet();
       std::locale l = std::locale(os.getloc(), f);
       os.imbue(l);
@@ -71,11 +72,10 @@ namespace posix_time {
   operator>>(std::basic_istream<CharT, Traits>& is, ptime& pt)
   {
     boost::io::ios_flags_saver iflags(is);
-    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); 
+    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
     if (strm_sentry) {
       try {
         typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
-        
         std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
         if(std::has_facet<time_input_facet>(is.getloc())) {
           std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, pt);
@@ -87,31 +87,30 @@ namespace posix_time {
           f->get(sit, str_end, is, pt);
         }
       }
-      catch(...) { 
+      catch(...) {
         // mask tells us what exceptions are turned on
         std::ios_base::iostate exception_mask = is.exceptions();
         // if the user wants exceptions on failbit, we'll rethrow our 
         // date_time exception & set the failbit
         if(std::ios_base::failbit & exception_mask) {
-          try { is.setstate(std::ios_base::failbit); } 
+          try { is.setstate(std::ios_base::failbit); }
           catch(std::ios_base::failure&) {} // ignore this one
           throw; // rethrow original exception
         }
         else {
           // if the user want's to fail quietly, we simply set the failbit
-          is.setstate(std::ios_base::failbit); 
-        } 
-            
+          is.setstate(std::ios_base::failbit);
+        }
       }
     }
     return is;
   }
-  
+
 
   template <class CharT, class TraitsT>
   inline 
   std::basic_ostream<CharT, TraitsT>&
-  operator<<(std::basic_ostream<CharT, TraitsT>& os, 
+  operator<<(std::basic_ostream<CharT, TraitsT>& os,
              const boost::posix_time::time_period& p) {
     boost::io::ios_flags_saver iflags(os);
     typedef boost::date_time::time_facet<ptime, CharT> custom_ptime_facet;
@@ -126,7 +125,6 @@ namespace posix_time {
       //since we would always need to reconstruct for every time period
       //if the local did not already exist.  Of course this will be overridden
       //if the user imbues as some later point.
-      std::ostreambuf_iterator<CharT> oitr(os);
       custom_ptime_facet* f = new custom_ptime_facet();
       std::locale l = std::locale(os.getloc(), f);
       os.imbue(l);
@@ -142,11 +140,10 @@ namespace posix_time {
   operator>>(std::basic_istream<CharT, Traits>& is, time_period& tp)
   {
     boost::io::ios_flags_saver iflags(is);
-    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); 
+    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
     if (strm_sentry) {
       try {
         typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
-
         std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
         if(std::has_facet<time_input_facet>(is.getloc())) {
           std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, tp);
@@ -158,22 +155,21 @@ namespace posix_time {
           f->get(sit, str_end, is, tp);
         }
       }
-      catch(...) { 
+      catch(...) {
         std::ios_base::iostate exception_mask = is.exceptions();
         if(std::ios_base::failbit & exception_mask) {
-          try { is.setstate(std::ios_base::failbit); } 
+          try { is.setstate(std::ios_base::failbit); }
           catch(std::ios_base::failure&) {}
           throw; // rethrow original exception
         }
         else {
-          is.setstate(std::ios_base::failbit); 
-        } 
-            
+          is.setstate(std::ios_base::failbit);
+        }
       }
     }
     return is;
   }
-  
+
 
   //! ostream operator for posix_time::time_duration 
   //  todo fix to use facet --  place holder for now...
@@ -194,7 +190,6 @@ namespace posix_time {
       //since we would always need to reconstruct for every time period
       //if the locale did not already exist.  Of course this will be overridden
       //if the user imbues as some later point.
-      std::ostreambuf_iterator<CharT> oitr(os);
       custom_ptime_facet* f = new custom_ptime_facet();
       std::locale l = std::locale(os.getloc(), f);
       os.imbue(l);
@@ -210,11 +205,10 @@ namespace posix_time {
   operator>>(std::basic_istream<CharT, Traits>& is, time_duration& td)
   {
     boost::io::ios_flags_saver iflags(is);
-    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false); 
+    typename std::basic_istream<CharT, Traits>::sentry strm_sentry(is, false);
     if (strm_sentry) {
       try {
         typedef typename date_time::time_input_facet<ptime, CharT> time_input_facet;
-
         std::istreambuf_iterator<CharT,Traits> sit(is), str_end;
         if(std::has_facet<time_input_facet>(is.getloc())) {
           std::use_facet<time_input_facet>(is.getloc()).get(sit, str_end, is, td);
@@ -226,21 +220,20 @@ namespace posix_time {
           f->get(sit, str_end, is, td);
         }
       }
-      catch(...) { 
+      catch(...) {
         std::ios_base::iostate exception_mask = is.exceptions();
         if(std::ios_base::failbit & exception_mask) {
-          try { is.setstate(std::ios_base::failbit); } 
+          try { is.setstate(std::ios_base::failbit); }
           catch(std::ios_base::failure&) {}
           throw; // rethrow original exception
         }
         else {
-          is.setstate(std::ios_base::failbit); 
-        } 
-            
+          is.setstate(std::ios_base::failbit);
+        }
       }
     }
     return is;
   }
-  
+
 } } // namespaces
 #endif // DATE_TIME_POSIX_TIME_IO_HPP__
similarity index 94%
rename from deal.II/contrib/boost/include/boost/date_time/posix_time/time_formatters.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_formatters.hpp
index dc8facf57a0655785390c83326b037904793f594..255129276e56297302ec9b7cc896da99bf61dc84 100644 (file)
@@ -6,17 +6,17 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/gregorian/gregorian.hpp"
-#include "boost/date_time/compiler_config.hpp"
-#include "boost/date_time/iso_format.hpp"
-#include "boost/date_time/date_format_simple.hpp"
-#include "boost/date_time/posix_time/posix_time_types.hpp"
-#include "boost/date_time/time_formatting_streams.hpp"
-
-#include "boost/date_time/time_parsing.hpp"
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/iso_format.hpp>
+#include <boost/date_time/date_format_simple.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/time_formatting_streams.hpp>
+#include <boost/date_time/time_resolution_traits.hpp> // absolute_value
+#include <boost/date_time/time_parsing.hpp>
 
 /* NOTE: The "to_*_string" code for older compilers, ones that define 
  * BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS, is located in 
similarity index 92%
rename from deal.II/contrib/boost/include/boost/date_time/posix_time/time_formatters_limited.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/posix_time/time_formatters_limited.hpp
index def51694a189a49d0065293dee9220c1e7143abf..e4d1a6ef0a9890312628b003cdee77a53322c883 100644 (file)
@@ -6,15 +6,16 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-09-28 14:10:02 -0400 (Mon, 28 Sep 2009) $
  */
 
-#include "boost/date_time/gregorian/gregorian.hpp"
-#include "boost/date_time/compiler_config.hpp"
-#include "boost/date_time/iso_format.hpp"
-#include "boost/date_time/date_format_simple.hpp"
-#include "boost/date_time/posix_time/posix_time_types.hpp"
-#include "boost/date_time/time_formatting_streams.hpp"
+#include <boost/date_time/gregorian/gregorian.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/iso_format.hpp>
+#include <boost/date_time/date_format_simple.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/time_formatting_streams.hpp>
+#include <boost/date_time/time_resolution_traits.hpp> // absolute_value
  
 namespace boost {
 
similarity index 81%
rename from deal.II/contrib/boost/include/boost/date_time/string_parse_tree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/string_parse_tree.hpp
index 1ed5fe8db98f8e57c9fb557b8436fd45d09fa092..0d515ff824d2819b8953f0bc81bf9d60285a3e23 100644 (file)
@@ -2,16 +2,16 @@
 #define BOOST_DATE_TIME_STRING_PARSE_TREE___HPP__
 
 /* Copyright (c) 2004-2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
+ * Use, modification and distribution is subject to the
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
 #include "boost/lexical_cast.hpp" //error without?
-#include "boost/algorithm/string/case_conv.hpp" 
+#include "boost/algorithm/string/case_conv.hpp"
 #include <map>
 #include <string>
 #include <vector>
@@ -37,21 +37,21 @@ struct parse_match_result
       return cache;
     }
     //some of the cache was used return the rest
-    return string_type(cache, match_depth); 
+    return string_type(cache, match_depth);
   }
   charT last_char() const
   {
     return cache[cache.size()-1];
   }
   //! Returns true if more characters were parsed than was necessary
-  /*! Should be used in conjunction with last_char() 
-   *  to get the remaining character. 
+  /*! Should be used in conjunction with last_char()
+   *  to get the remaining character.
    */
   bool has_remaining() const
   {
     return (cache.size() > match_depth);
   }
-  
+
   // cache will hold characters that have been read from the stream
   string_type cache;
   unsigned short match_depth;
@@ -64,8 +64,8 @@ template<typename charT>
 std::basic_ostream<charT>&
 operator<<(std::basic_ostream<charT>& os, parse_match_result<charT>& mr)
 {
-  os << "cm: " << mr.current_match 
-     << " C: '" << mr.cache 
+  os << "cm: " << mr.current_match
+     << " C: '" << mr.cache
      << "' md: " << mr.match_depth
      << " R: " << mr.remaining();
   return os;
@@ -93,11 +93,11 @@ struct string_parse_tree
   typedef std::basic_string<charT> string_type;
   typedef std::vector<std::basic_string<charT> > collection_type;
   typedef parse_match_result<charT> parse_match_result_type;
-  /*! Parameter "starting_point" desingates where the numbering begins. 
-   * A starting_point of zero will start the numbering at zero 
-   * (Sun=0, Mon=1, ...) were a starting_point of one starts the 
-   * numbering at one (Jan=1, Feb=2, ...). The default is zero, 
+
+  /*! Parameter "starting_point" designates where the numbering begins.
+   * A starting_point of zero will start the numbering at zero
+   * (Sun=0, Mon=1, ...) were a starting_point of one starts the
+   * numbering at one (Jan=1, Feb=2, ...). The default is zero,
    * negative vaules are not allowed */
   string_parse_tree(collection_type names, unsigned int starting_point=0)
   {
@@ -126,44 +126,44 @@ struct string_parse_tree
     while(i < s.size()) {
       if (i==0) {
         if (i == (s.size()-1)) {
-          ti = m_next_chars.insert(value_type(s[i], 
+          ti = m_next_chars.insert(value_type(s[i],
                                               string_parse_tree<charT>(value)));
         }
         else {
-          ti = m_next_chars.insert(value_type(s[i], 
+          ti = m_next_chars.insert(value_type(s[i],
                                               string_parse_tree<charT>()));
         }
       }
       else {
         if (i == (s.size()-1)) {
-          ti = ti->second.m_next_chars.insert(value_type(s[i], 
+          ti = ti->second.m_next_chars.insert(value_type(s[i],
                                                          string_parse_tree<charT>(value)));
         }
-        
+
         else {
-          ti = ti->second.m_next_chars.insert(value_type(s[i], 
+          ti = ti->second.m_next_chars.insert(value_type(s[i],
                                                          string_parse_tree<charT>()));
         }
-      
-      } 
+
+      }
       i++;
     }
   }
-  
+
+
   //! Recursive function that finds a matching string in the tree.
-  /*! Must check match_results::has_remaining() after match() is 
-   * called. This is required so the user can determine if 
-   * stream iterator is already pointing to the expected 
+  /*! Must check match_results::has_remaining() after match() is
+   * called. This is required so the user can determine if
+   * stream iterator is already pointing to the expected
    * character or not (match() might advance sitr to next char in stream).
    *
-   * A parse_match_result that has been returned from a failed match 
-   * attempt can be sent in to the match function of a different 
-   * string_parse_tree to attempt a match there. Use the iterators 
-   * for the partially consumed stream, the parse_match_result object, 
+   * A parse_match_result that has been returned from a failed match
+   * attempt can be sent in to the match function of a different
+   * string_parse_tree to attempt a match there. Use the iterators
+   * for the partially consumed stream, the parse_match_result object,
    * and '0' for the level parameter. */
   short
-  match(std::istreambuf_iterator<charT>& sitr, 
+  match(std::istreambuf_iterator<charT>& sitr,
         std::istreambuf_iterator<charT>& stream_end,
         parse_match_result_type& result,
         unsigned int& level)  const
@@ -171,7 +171,7 @@ struct string_parse_tree
 
     level++;
     charT c;
-    // if we conditionally advance sitr, we won't have 
+    // if we conditionally advance sitr, we won't have
     // to consume the next character past the input
     bool adv_itr = true;
     if (level > result.cache.size()) {
@@ -181,16 +181,16 @@ struct string_parse_tree
       //sitr++;
     }
     else {
-      // if we're looking for characters from the cache, 
+      // if we're looking for characters from the cache,
       // we don't want to increment sitr
-      adv_itr = false; 
+      adv_itr = false;
       c = static_cast<charT>(std::tolower(result.cache[level-1]));
     }
     const_iterator litr = m_next_chars.lower_bound(c);
     const_iterator uitr = m_next_chars.upper_bound(c);
     while (litr != uitr) { // equal if not found
       if(adv_itr) {
-        sitr++; 
+        sitr++;
         result.cache += c;
       }
       if (litr->second.m_value != -1) { // -1 is default value
@@ -198,16 +198,16 @@ struct string_parse_tree
           result.current_match = litr->second.m_value;
           result.match_depth = static_cast<unsigned short>(level);
         }
-        litr->second.match(sitr, stream_end, 
+        litr->second.match(sitr, stream_end,
                            result, level);
         level--;
       }
       else {
-        litr->second.match(sitr, stream_end, 
+        litr->second.match(sitr, stream_end,
                            result, level);
         level--;
       }
-    
+
       if(level <= result.cache.size()) {
         adv_itr = false;
       }
@@ -218,13 +218,13 @@ struct string_parse_tree
 
   }
 
-  /*! Must check match_results::has_remaining() after match() is 
-   * called. This is required so the user can determine if 
-   * stream iterator is already pointing to the expected 
+  /*! Must check match_results::has_remaining() after match() is
+   * called. This is required so the user can determine if
+   * stream iterator is already pointing to the expected
    * character or not (match() might advance sitr to next char in stream).
    */
   parse_match_result_type
-  match(std::istreambuf_iterator<charT>& sitr, 
+  match(std::istreambuf_iterator<charT>& sitr,
         std::istreambuf_iterator<charT>& stream_end) const
   {
     // lookup to_lower of char in tree.
@@ -242,8 +242,8 @@ struct string_parse_tree
     iterator end = m_next_chars.end();
     //    os << "starting level: " << level << std::endl;
     while (itr != end) {
-      os << "level:  " << level 
-         << " node:  " << itr->first 
+      os << "level:  " << level
+         << " node:  " << itr->first
          << " value: " << itr->second.m_value
          << std::endl;
       itr->second.printme(os, level);
@@ -257,14 +257,14 @@ struct string_parse_tree
     int level = 0;
     printme(os, level);
   }
-    
+
   void printmatch(std::ostream& os, charT c)
   {
     iterator litr = m_next_chars.lower_bound(c);
     iterator uitr = m_next_chars.upper_bound(c);
     os << "matches for: " << c << std::endl;
     while (litr != uitr) {
-      os << " node:  " << litr->first 
+      os << " node:  " << litr->first
          << " value: " << litr->second.m_value
          << std::endl;
       litr++;
similarity index 89%
rename from deal.II/contrib/boost/include/boost/date_time/strings_from_facet.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/strings_from_facet.hpp
index 1d1b23414372450edee862587251bce606927d14..2bc26fb33e1bbcd7720c2c8e4d13fe5f8c50c1b5 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-02-01 06:29:43 -0500 (Sun, 01 Feb 2009) $
  */
 
 #include <sstream>
@@ -49,6 +49,7 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
   {
     //grab the needed strings by using the locale to
     //output each month
+    const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
     for (int m=0; m < 12; m++) {
       tm tm_value;
       tm_value.tm_mon = m;
@@ -56,8 +57,8 @@ gather_month_strings(const std::locale& locale, bool short_strings=true)
       ostream_iter_type oitr(ss);
       std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
                                                       &tm_value,
-                                                      &*outfmt.begin(),
-                                                      &*outfmt.begin()+outfmt.size());
+                                                      p_outfmt,
+                                                      p_outfmt_end);
       months.push_back(ss.str());
     }
   }
@@ -101,6 +102,7 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
   {
     //grab the needed strings by using the locale to
     //output each month / weekday
+    const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size();
     for (int i=0; i < 7; i++) {
       tm tm_value;
       tm_value.tm_wday = i;
@@ -108,8 +110,8 @@ gather_weekday_strings(const std::locale& locale, bool short_strings=true)
       ostream_iter_type oitr(ss);
       std::use_facet<time_put_facet_type>(locale).put(oitr, ss, ss.fill(),
                                                       &tm_value,
-                                                      &*outfmt.begin(),
-                                                      &*outfmt.begin()+outfmt.size());
+                                                      p_outfmt,
+                                                      p_outfmt_end);
 
       weekdays.push_back(ss.str());
     }
similarity index 94%
rename from deal.II/contrib/boost/include/boost/date_time/time.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time.hpp
index 58ac8d656706e87066c9b80b41e7da090cf95e4c..6a6cbe1f89be54ff4ea8ee3afcb9b3f4f10a6a53 100644 (file)
@@ -6,16 +6,17 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
 /*! @file time.hpp
   This file contains the interface for the time associated classes.
 */
-#include "boost/date_time/time_defs.hpp"
-#include "boost/operators.hpp"
 #include <string>
+#include <boost/operators.hpp>
+#include <boost/date_time/time_defs.hpp>
+#include <boost/date_time/special_defs.hpp>
 
 namespace boost {
 namespace date_time {
@@ -77,21 +78,21 @@ namespace date_time {
     /*! Optional bool parameter will return time zone as an offset 
      * (ie "+07:00"). Empty string is returned for classes that do 
      * not use a time_zone */
-    std::string zone_name(bool as_offset=false) const
+    std::string zone_name(bool /*as_offset*/=false) const
     {
       return time_system::zone_name(time_);
     }
     /*! Optional bool parameter will return time zone as an offset 
      * (ie "+07:00"). Empty string is returned for classes that do 
      * not use a time_zone */
-    std::string zone_abbrev(bool as_offset=false) const
+    std::string zone_abbrev(bool /*as_offset*/=false) const
     {
       return time_system::zone_name(time_);
     }
     //! An empty string is returned for classes that do not use a time_zone
     std::string zone_as_posix_string() const
     {
-      return std::string("");
+      return std::string();
     }
 
     //! check to see if date is not a value
similarity index 73%
rename from deal.II/contrib/boost/include/boost/date_time/time_defs.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_defs.hpp
index 312c5df27df4e0128cd49cbaf64c9b41905ea1ce..55fe42a594447b4f49d2bfad1dc982407ad1f891 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
@@ -20,7 +20,17 @@ namespace boost {
 namespace date_time {
 
   //!Defines some nice types for handling time level resolutions
-  enum time_resolutions {sec, tenth, hundreth, milli, ten_thousandth, micro, nano, NumResolutions };
+  enum time_resolutions {
+    sec,
+    tenth,
+    hundreth, // deprecated misspelled version of hundredth
+    hundredth = hundreth,
+    milli,
+    ten_thousandth,
+    micro,
+    nano,
+    NumResolutions
+  };
 
   //! Flags for daylight savings or summer time
   enum dst_flags {not_dst, is_dst, calculate};
similarity index 88%
rename from deal.II/contrib/boost/include/boost/date_time/time_duration.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_duration.hpp
index 40041250d34c0a5befc25f2d7f923d64ebc95f86..2fd259012e1f64f532c6cb04448cc58e4cd66f9d 100644 (file)
@@ -6,18 +6,19 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-04 04:24:49 -0400 (Thu, 04 Jun 2009) $
  */
 
-#include "boost/operators.hpp"
-#include "boost/date_time/time_defs.hpp"
-#include "boost/date_time/special_defs.hpp"
-#include "boost/date_time/compiler_config.hpp"
+#include <boost/cstdint.hpp>
+#include <boost/operators.hpp>
+#include <boost/date_time/time_defs.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/compiler_config.hpp>
 
 namespace boost {
 namespace date_time {
 
-  
+
   //! Represents some amount of elapsed time measure to a given resolution
   /*! This class represents a standard set of capabilities for all
       counted time durations.  Time duration implementations should derive
@@ -30,13 +31,13 @@ namespace date_time {
   */
   template<class T, typename rep_type>
   class time_duration : private
-      boost::less_than_comparable<T 
+      boost::less_than_comparable<T
     , boost::equality_comparable<T
     > >
   /* dividable, addable, and subtractable operator templates
-   * won't work with this class (MSVC++ 6.0). return type 
-   * from '+=' is different than expected return type 
-   * from '+'. multipliable probably wont work 
+   * won't work with this class (MSVC++ 6.0). return type
+   * from '+=' is different than expected return type
+   * from '+'. multipliable probably wont work
    * either (haven't tried) */
   {
   public:
@@ -50,12 +51,12 @@ namespace date_time {
     typedef typename rep_type::tick_type tick_type;
     typedef typename rep_type::impl_type impl_type;
 
-    time_duration() : ticks_(0) {} 
-    time_duration(hour_type hours_in, 
-                  min_type minutes_in, 
+    time_duration() : ticks_(0) {}
+    time_duration(hour_type hours_in,
+                  min_type minutes_in,
                   sec_type seconds_in=0,
                   fractional_seconds_type frac_sec_in = 0) :
-      ticks_(rep_type::to_tick_count(hours_in,minutes_in,seconds_in,frac_sec_in)) 
+      ticks_(rep_type::to_tick_count(hours_in,minutes_in,seconds_in,frac_sec_in))
     {}
     // copy constructor required for dividable<>
     //! Construct from another time_duration (Copy constructor)
@@ -136,17 +137,17 @@ namespace date_time {
     }
     duration_type invert_sign() const
     {
-      return duration_type(ticks_ * (-1)); 
-    }    
+      return duration_type(ticks_ * (-1));
+    }
     bool is_negative() const
     {
       return ticks_ < 0;
-    }    
-    bool operator<(const time_duration& rhs)  const 
+    }
+    bool operator<(const time_duration& rhs)  const
     {
       return ticks_ <  rhs.ticks_;
     }
-    bool operator==(const time_duration& rhs)  const 
+    bool operator==(const time_duration& rhs)  const
     {
       return ticks_ ==  rhs.ticks_;
     }
@@ -188,13 +189,13 @@ namespace date_time {
     {
       return duration_type(ticks_ * rhs);
     }
-    duration_type operator*=(int divisor) 
+    duration_type operator*=(int divisor)
     {
       ticks_ = ticks_ * divisor;
       return duration_type(ticks_);
     }
-    tick_type ticks() const 
-    { 
+    tick_type ticks() const
+    {
       return traits_type::as_number(ticks_);
     }
 
@@ -258,9 +259,9 @@ namespace date_time {
 
   //! Template for instantiating derived adjusting durations
   /* These templates are designed to work with multiples of
-   * 10 for frac_of_second and resoultion adjustment 
+   * 10 for frac_of_second and resoultion adjustment
    */
-   template<class base_duration, boost::int64_t frac_of_second>
+  template<class base_duration, boost::int64_t frac_of_second>
   class subsecond_duration : public base_duration
   {
   public:
@@ -270,8 +271,8 @@ namespace date_time {
     {}
   };
 
-  
-  
+
+
 } } //namespace date_time
 
 
similarity index 87%
rename from deal.II/contrib/boost/include/boost/date_time/time_facet.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_facet.hpp
index 47f43c6afd08168590c8edb2da6bc9ef035d1cce..60398dedb51fc3ef3d9ebf064bed7cdb44e8e5c3 100644 (file)
@@ -7,15 +7,27 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author:  Martin Andrian, Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-10-03 06:04:00 -0400 (Sat, 03 Oct 2009) $
  */
 
-#include "boost/date_time/date_facet.hpp"
-#include "boost/date_time/string_convert.hpp"
-#include "boost/algorithm/string/erase.hpp"
+#include <cctype>
+#include <locale>
+#include <limits>
+#include <string>
 #include <sstream>
 #include <iomanip>
+#include <iterator> // i/ostreambuf_iterator
 #include <exception>
+#include <boost/assert.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/algorithm/string/erase.hpp>
+#include <boost/algorithm/string/replace.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/date_facet.hpp>
+#include <boost/date_time/string_convert.hpp>
+#include <boost/date_time/special_defs.hpp>
+#include <boost/date_time/time_resolution_traits.hpp> // absolute_value
 
 namespace boost {
 namespace date_time {
@@ -28,6 +40,8 @@ namespace date_time {
       static const char_type fractional_seconds_or_none_format[3];       // F
       static const char_type seconds_with_fractional_seconds_format[3];  // s
       static const char_type seconds_format[3];                          // S
+      static const char_type hours_format[3];                            // H
+      static const char_type unrestricted_hours_format[3];               // O
       static const char_type standard_format[9];                         // x X
       static const char_type zone_abbrev_format[3];                      // z
       static const char_type zone_name_format[3];                        // Z
@@ -62,10 +76,18 @@ namespace date_time {
   time_formats<CharT>::seconds_with_fractional_seconds_format[3] = 
     {'%','s'};
 
-  template <class CharT>  
+  template <class CharT>
   const typename time_formats<CharT>::char_type 
   time_formats<CharT>::seconds_format[3] =  {'%','S'};
 
+  template <class CharT>
+  const typename time_formats<CharT>::char_type 
+  time_formats<CharT>::hours_format[3] =  {'%','H'};
+
+  template <class CharT>
+  const typename time_formats<CharT>::char_type 
+  time_formats<CharT>::unrestricted_hours_format[3] =  {'%','O'};
+
   template <class CharT>  
   const typename time_formats<CharT>::char_type 
   //time_formats<CharT>::standard_format[5] =  {'%','c',' ','%','z'};
@@ -138,7 +160,7 @@ namespace date_time {
   template <class CharT>  
   const typename time_formats<CharT>::char_type 
   time_formats<CharT>::default_time_duration_format[11] = 
-    {'%','H',':','%','M',':','%','S','%','F'};
+    {'%','O',':','%','M',':','%','S','%','F'};
 
 
 
@@ -172,6 +194,8 @@ namespace date_time {
     static const char_type* fractional_seconds_or_none_format;        // %F
     static const char_type* seconds_with_fractional_seconds_format;   // %s
     static const char_type* seconds_format;                           // %S
+    static const char_type* hours_format;                             // %H
+    static const char_type* unrestricted_hours_format;                // %O
     static const char_type* standard_format;                          // %x X
     static const char_type* zone_abbrev_format;                       // %z
     static const char_type* zone_name_format;                         // %Z
@@ -197,9 +221,8 @@ namespace date_time {
 #endif
 
     //! sets default formats for ptime, local_date_time, and time_duration
-    explicit time_facet(::size_t /* a_ref */ = 0) 
-      //: base_type(standard_format),
-      : base_type(default_time_format), 
+    explicit time_facet(::size_t a_ref = 0)
+      : base_type(default_time_format, period_formatter_type(), special_values_formatter_type(), date_gen_formatter_type(), a_ref),
         m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format)
     {}
 
@@ -242,6 +265,7 @@ namespace date_time {
                               a_time.date().as_special());
       }
       string_type format(this->m_format);
+
       string_type frac_str;
       if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) {
         // replace %s with %S.nnn 
@@ -263,9 +287,7 @@ namespace date_time {
         if(a_time.zone_abbrev().empty()) {
           // if zone_abbrev() returns an empty string, we want to
           // erase posix_zone_string_format from format
-          boost::algorithm::replace_all(format,
-                                        posix_zone_string_format,
-                                        "");
+          boost::algorithm::erase_all(format, posix_zone_string_format);
         }
         else{
           boost::algorithm::replace_all(format,
@@ -283,9 +305,7 @@ namespace date_time {
           // erase zone_name_format & one preceeding space
           std::basic_ostringstream<char_type> ss;
           ss << ' ' << zone_name_format;
-          boost::algorithm::replace_all(format,
-                                        ss.str(),
-                                        "");
+          boost::algorithm::erase_all(format, ss.str());
         }
         else{
           boost::algorithm::replace_all(format,
@@ -303,9 +323,7 @@ namespace date_time {
           // erase zone_abbrev_format & one preceeding space
           std::basic_ostringstream<char_type> ss;
           ss << ' ' << zone_abbrev_format;
-          boost::algorithm::replace_all(format,
-                                        ss.str(),
-                                        "");
+          boost::algorithm::erase_all(format, ss.str());
         }
         else{
           boost::algorithm::replace_all(format,
@@ -321,9 +339,7 @@ namespace date_time {
 
           // if zone_name() returns an empty string, we want to
           // erase zone_iso_extended_format from format
-          boost::algorithm::replace_all(format,
-                                        zone_iso_extended_format,
-                                        "");
+          boost::algorithm::erase_all(format, zone_iso_extended_format);
         }
         else{
           boost::algorithm::replace_all(format,
@@ -340,9 +356,7 @@ namespace date_time {
 
           // if zone_abbrev() returns an empty string, we want to
           // erase zone_iso_format from format
-          boost::algorithm::replace_all(format,
-                                        zone_iso_format,
-                                        "");
+          boost::algorithm::erase_all(format, zone_iso_format);
         }
         else{
           boost::algorithm::replace_all(format,
@@ -396,24 +410,45 @@ namespace date_time {
 
       string_type format(m_time_duration_format);
       if (a_time_dur.is_negative()) {
-          // replace %- with minus sign.  Should we use the numpunct facet?
-          boost::algorithm::replace_all(format, 
-                                        duration_sign_negative_only, 
-                                        negative_sign);
+        // replace %- with minus sign.  Should we use the numpunct facet?
+        boost::algorithm::replace_all(format, 
+                                      duration_sign_negative_only, 
+                                      negative_sign);
           // remove all the %+ in the string with '-'
-          boost::algorithm::replace_all(format, 
-                                        duration_sign_always, 
-                                        negative_sign);
+        boost::algorithm::replace_all(format, 
+                                      duration_sign_always, 
+                                      negative_sign);
       }
       else { //duration is positive
-          // remove all the %- combos from the string
-          boost::algorithm::replace_all(format, 
-                                        duration_sign_negative_only, 
-                                        "");
-          // remove all the %+ in the string with '+'
-          boost::algorithm::replace_all(format, 
-                                        duration_sign_always, 
-                                        positive_sign);
+        // remove all the %- combos from the string
+        boost::algorithm::erase_all(format, duration_sign_negative_only);
+        // remove all the %+ in the string with '+'
+        boost::algorithm::replace_all(format, 
+                                      duration_sign_always, 
+                                      positive_sign);
+      }
+
+      /*
+       * It is possible for a time duration to span more then 24 hours.  
+       * Standard time_put::put is obliged to behave the same as strftime 
+       * (See ISO 14882-2003 22.2.5.3.1 par. 1) and strftime's behavior is 
+       * unspecified for the case when tm_hour field is outside 0-23 range 
+       * (See ISO 9899-1999 7.23.3.5 par. 3). So we must output %H and %O
+       * here ourself.
+       */
+      string_type hours_str;
+      if (format.find(unrestricted_hours_format) != string_type::npos) {
+        hours_str = hours_as_string(a_time_dur);
+        boost::algorithm::replace_all(format, unrestricted_hours_format, hours_str);
+      }
+      // We still have to process restricted hours format specifier. In order to
+      // support parseability of durations in ISO format (%H%M%S), we'll have to
+      // restrict the stringified hours length to 2 characters.
+      if (format.find(hours_format) != string_type::npos) {
+        if (hours_str.empty())
+          hours_str = hours_as_string(a_time_dur);
+        BOOST_ASSERT(hours_str.length() <= 2);
+        boost::algorithm::replace_all(format, hours_format, hours_str);
       }
 
       string_type frac_str;
@@ -485,17 +520,33 @@ namespace date_time {
       }
 
       //make sure there is no sign
-      frac_sec = date_time::absolute_value(frac_sec);
+      return integral_as_string(
+        date_time::absolute_value(frac_sec),
+        time_duration_type::num_fractional_digits());
+    }
+
+    static
+    string_type
+    hours_as_string(const time_duration_type& a_time, int width = 2)
+    {
+      return integral_as_string(date_time::absolute_value(a_time.hours()), width);
+    }
+
+    template< typename IntT >
+    static
+    string_type
+    integral_as_string(IntT val, int width = 2)
+    {
       std::basic_ostringstream<char_type> ss;
       ss.imbue(std::locale::classic()); // don't want any formatting
-      ss << std::setw(time_duration_type::num_fractional_digits())
-         << std::setfill(static_cast<char_type>('0'));
+      ss << std::setw(width) 
+        << std::setfill(static_cast<char_type>('0'));
 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
       // JDG [7/6/02 VC++ compatibility]
       char_type buff[34];
-      ss << _i64toa(static_cast<boost::int64_t>(frac_sec), buff, 10);
+      ss << _i64toa(static_cast<boost::int64_t>(val), buff, 10);
 #else
-      ss << frac_sec;
+      ss << val;
 #endif
       return ss.str();
     }
@@ -504,7 +555,7 @@ namespace date_time {
     string_type m_time_duration_format;
 
   };
-  
+
   template <class time_type, class CharT, class OutItrT>  
   std::locale::id time_facet<time_type, CharT, OutItrT>::id;
 
@@ -546,6 +597,14 @@ namespace date_time {
   const typename time_facet<time_type, CharT, OutItrT>::char_type*
   time_facet<time_type, CharT, OutItrT>::seconds_format =  time_formats<CharT>::seconds_format;
 
+  template <class time_type, class CharT, class OutItrT>  
+  const typename time_facet<time_type, CharT, OutItrT>::char_type*
+  time_facet<time_type, CharT, OutItrT>::hours_format =  time_formats<CharT>::hours_format;
+
+  template <class time_type, class CharT, class OutItrT>  
+  const typename time_facet<time_type, CharT, OutItrT>::char_type*
+  time_facet<time_type, CharT, OutItrT>::unrestricted_hours_format =  time_formats<CharT>::unrestricted_hours_format;
+
   template <class time_type, class CharT, class OutItrT>  
   const typename time_facet<time_type, CharT, OutItrT>::char_type*
   time_facet<time_type, CharT, OutItrT>::standard_format =  time_formats<CharT>::standard_format;
@@ -705,11 +764,15 @@ namespace date_time {
           c = *sitr;
         }
         
-        long hour = 0; 
-        long min = 0; 
-        long sec = 0; 
+        typedef typename time_duration_type::hour_type hour_type;
+        typedef typename time_duration_type::min_type min_type;
+        typedef typename time_duration_type::sec_type sec_type;
+
+        hour_type hour = 0; 
+        min_type min = 0; 
+        sec_type sec = 0; 
         typename time_duration_type::fractional_seconds_type frac(0);
-        
+
         typedef std::num_get<CharT, InItrT> num_get;
         if(!std::has_facet<num_get>(a_ios.getloc())) {
           num_get* ng = new num_get();
@@ -720,45 +783,49 @@ namespace date_time {
         const_itr itr(m_time_duration_format.begin());
         while (itr != m_time_duration_format.end() && (sitr != stream_end)) {
           if (*itr == '%') {
-            itr++;
+            ++itr;
             if (*itr != '%') {
               switch(*itr) {
-              case 'H': 
+              case 'O': 
                 {
-                  match_results mr;
-                  hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
+                  // A period may span more than 24 hours. In that case the format
+                  // string should be composed with the unrestricted hours specifier.
+                  hour = var_string_to_int<hour_type, CharT>(sitr, stream_end, 
+                                      std::numeric_limits<hour_type>::digits10 + 1);
                   if(hour == -1){
                      return check_special_value(sitr, stream_end, td, c);
                   }
                   break;
                 }
-              case 'M': 
+              case 'H': 
                 {
                   match_results mr;
-                  min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
-                  if(min == -1){
+                  hour = fixed_string_to_int<hour_type, CharT>(sitr, stream_end, mr, 2);
+                  if(hour == -1){
                      return check_special_value(sitr, stream_end, td, c);
                   }
                   break;
                 }
-              case 'S': 
+              case 'M': 
                 {
                   match_results mr;
-                  sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
-                  if(sec == -1){
+                  min = fixed_string_to_int<min_type, CharT>(sitr, stream_end, mr, 2);
+                  if(min == -1){
                      return check_special_value(sitr, stream_end, td, c);
                   }
                   break;
                 }
               case 's':
+              case 'S': 
                 {
                   match_results mr;
-                  sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
+                  sec = fixed_string_to_int<sec_type, CharT>(sitr, stream_end, mr, 2);
                   if(sec == -1){
                      return check_special_value(sitr, stream_end, td, c);
                   }
+                  if (*itr == 'S')
+                    break;
                   // %s is the same as %S%f so we drop through into %f
-                  //break;
                 }
               case 'f':
                 {
@@ -796,20 +863,20 @@ namespace date_time {
               }// switch
             }
             else { // itr == '%', second consecutive
-              sitr++;
+              ++sitr;
             }
         
-            itr++; //advance past format specifier
+            ++itr; //advance past format specifier
           }
           else {  //skip past chars in format and in buffer
-            itr++;
+            ++itr;
             // set use_current_char when sitr is already 
             // pointing at the next character to process
             if (use_current_char) {
               use_current_char = false;
             }
             else {
-              sitr++;
+              ++sitr;
             }
           }
         }
@@ -858,11 +925,15 @@ namespace date_time {
         if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) {
           c = *sitr;
         }
-       
+
+        typedef typename time_duration_type::hour_type hour_type;
+        typedef typename time_duration_type::min_type min_type;
+        typedef typename time_duration_type::sec_type sec_type;
+
         // time elements
-        long hour = 0; 
-        long min = 0; 
-        long sec = 0; 
+        hour_type hour = 0; 
+        min_type min = 0; 
+        sec_type sec = 0; 
         typename time_duration_type::fractional_seconds_type frac(0);
         // date elements
         short day_of_year(0);
@@ -884,7 +955,7 @@ namespace date_time {
         const_itr itr(this->m_format.begin());
         while (itr != this->m_format.end() && (sitr != stream_end)) {
           if (*itr == '%') {
-            itr++;
+            ++itr;
             if (*itr != '%') {
               // the cases are grouped by date & time flags - not alphabetical order
               switch(*itr) {
@@ -898,7 +969,7 @@ namespace date_time {
                     try {
                       t_year = this->m_parser.parse_year(sitr, stream_end, s, mr);
                     }
-                    catch(std::out_of_range bad_year) { // base class for bad_year exception
+                    catch(std::out_of_range&) { // base class for bad_year exception
                       if(this->m_sv_parser.match(sitr, stream_end, mr)) {
                         t = time_type(static_cast<special_values>(mr.current_match));
                         return sitr;
@@ -919,13 +990,13 @@ namespace date_time {
                     try {
                       t_month = this->m_parser.parse_month(sitr, stream_end, s, mr);
                     }
-                    catch(std::out_of_range bad_month) { // base class for bad_month exception
+                    catch(std::out_of_range&) { // base class for bad_month exception
                       if(this->m_sv_parser.match(sitr, stream_end, mr)) {
                         t = time_type(static_cast<special_values>(mr.current_match));
                         return sitr;
                       }
                       else {
-                        throw; // rethrow bad_year
+                        throw; // rethrow bad_month
                       }
                     }
                     // did m_parser already advance sitr to next char?
@@ -946,7 +1017,7 @@ namespace date_time {
                     try {
                       wd = this->m_parser.parse_weekday(sitr, stream_end, s, mr);
                     }
-                    catch(std::out_of_range bad_weekday) { // base class for bad_weekday exception
+                    catch(std::out_of_range&) { // base class for bad_weekday exception
                       if(this->m_sv_parser.match(sitr, stream_end, mr)) {
                         t = time_type(static_cast<special_values>(mr.current_match));
                         return sitr;
@@ -982,14 +1053,14 @@ namespace date_time {
                     try {
                       t_day = this->m_parser.parse_day_of_month(sitr, stream_end);
                     }
-                    catch(std::out_of_range bad_day_of_month) { // base class for exception
+                    catch(std::out_of_range&) { // base class for exception bad_day_of_month
                       match_results mr;
                       if(this->m_sv_parser.match(sitr, stream_end, mr)) {
                         t = time_type(static_cast<special_values>(mr.current_match));
                         return sitr;
                       }
                       else {
-                        throw; // rethrow bad_year
+                        throw; // rethrow bad_day_of_month
                       }
                     }
                     break;
@@ -998,7 +1069,7 @@ namespace date_time {
                 case 'H': 
                   {
                     match_results mr;
-                    hour = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
+                    hour = fixed_string_to_int<hour_type, CharT>(sitr, stream_end, mr, 2);
                     if(hour == -1){
                        return check_special_value(sitr, stream_end, t, c);
                     }
@@ -1007,30 +1078,23 @@ namespace date_time {
                 case 'M': 
                   {
                     match_results mr;
-                    min = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
+                    min = fixed_string_to_int<min_type, CharT>(sitr, stream_end, mr, 2);
                     if(min == -1){
                        return check_special_value(sitr, stream_end, t, c);
                     }
                     break;
                   }
-                case 'S': 
-                  {
-                    match_results mr;
-                    sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
-                    if(sec == -1){
-                       return check_special_value(sitr, stream_end, t, c);
-                    }
-                    break;
-                  }
                 case 's':
+                case 'S': 
                   {
                     match_results mr;
-                    sec = fixed_string_to_int<short, CharT>(sitr, stream_end, mr, 2);
+                    sec = fixed_string_to_int<sec_type, CharT>(sitr, stream_end, mr, 2);
                     if(sec == -1){
                        return check_special_value(sitr, stream_end, t, c);
                     }
+                    if (*itr == 'S')
+                      break;
                     // %s is the same as %S%f so we drop through into %f
-                    //break;
                   }
                 case 'f':
                   {
@@ -1097,26 +1161,26 @@ namespace date_time {
               }// switch
             } 
             else { // itr == '%', second consecutive
-              sitr++;
+              ++sitr;
             }
        
             if(use_current_format_char) {
               use_current_format_char = false;
             }
             else {
-              itr++; //advance past format specifier
+              ++itr; //advance past format specifier
             }
              
           }
           else {  //skip past chars in format and in buffer
-            itr++;
+            ++itr;
             // set use_current_char when sitr is already 
             // pointing at the next character to process
             if (use_current_char) {
               use_current_char = false;
             }
             else {
-              sitr++;
+              ++sitr;
             }
           }
         }
@@ -1149,7 +1213,8 @@ namespace date_time {
         this->m_sv_parser.match(sitr, stream_end, mr);
         if(mr.current_match == match_results::PARSE_ERROR) {
           std::string tmp = convert_string_type<char_type, char>(mr.cache);
-          throw std::ios_base::failure("Parse failed. No match found for '" + tmp + "'");
+          boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + tmp + "'"));
+          BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return sitr); // should never reach
         }
         tt = temporal_type(static_cast<special_values>(mr.current_match)); 
         return sitr;
similarity index 92%
rename from deal.II/contrib/boost/include/boost/date_time/time_formatting_streams.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_formatting_streams.hpp
index 8ff2ef089042cf5a67aa91de6c3a70b04da1779d..3537c103cc7b2cd8b6b2554f6bf4727169d17e1b 100644 (file)
@@ -6,15 +6,19 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
-
-#include "boost/date_time/date_formatting_locales.hpp" 
-#include "boost/date_time/time_resolution_traits.hpp"
+#include <boost/date_time/compiler_config.hpp>
 
 #ifndef BOOST_DATE_TIME_NO_LOCALE
 
+#include <locale>
+#include <iomanip>
+#include <iostream>
+#include <boost/date_time/date_formatting_locales.hpp>
+#include <boost/date_time/time_resolution_traits.hpp>
+
 namespace boost {
 namespace date_time {
 
@@ -116,4 +120,3 @@ namespace date_time {
 #endif //BOOST_DATE_TIME_NO_LOCALE
 
 #endif
-
similarity index 78%
rename from deal.II/contrib/boost/include/boost/date_time/time_resolution_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_resolution_traits.hpp
index 14879117a6948198c25652c7877b4986082188cd..658f3d207cef92c449d39ff0ac86119abe4c7fab 100644 (file)
@@ -2,26 +2,27 @@
 #define DATE_TIME_TIME_RESOLUTION_TRAITS_HPP
 
 /* Copyright (c) 2002,2003 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
+ * Use, modification and distribution is subject to the
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2009-06-06 07:25:55 -0400 (Sat, 06 Jun 2009) $
  */
 
 
-#include "boost/date_time/time_defs.hpp"
-#include "boost/date_time/int_adapter.hpp"
-#include "boost/cstdint.hpp"
+#include <boost/cstdint.hpp>
+#include <boost/date_time/time_defs.hpp>
+#include <boost/date_time/int_adapter.hpp>
+#include <boost/date_time/compiler_config.hpp>
 
 namespace boost {
 namespace date_time {
 
   //! Simple function to calculate absolute value of a numeric type
-  template <typename T> 
-  // JDG [7/6/02 made a template], 
+  template <typename T>
+  // JDG [7/6/02 made a template],
   // moved here from time_duration.hpp 2003-Sept-4.
-  inline T absolute_value(T x) 
+  inline T absolute_value(T x)
   {
     return x < 0 ? -x : x;
   }
@@ -58,16 +59,16 @@ namespace date_time {
     //! Used to determine if implemented type is int_adapter or int
     static bool is_adapted() { return true;}
   };
-  
-  template<typename frac_sec_type, 
+
+  template<typename frac_sec_type,
            time_resolutions res,
 #if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
-             boost::int64_t resolution_adjust,
+           boost::int64_t resolution_adjust,
 #else
-             typename frac_sec_type::int_type resolution_adjust,
+           typename frac_sec_type::int_type resolution_adjust,
 #endif
-             unsigned short frac_digits,
-             typename v_type = boost::int32_t >
+           unsigned short frac_digits,
+           typename v_type = boost::int32_t >
   class time_resolution_traits {
   public:
     typedef typename frac_sec_type::int_type fractional_seconds_type;
@@ -77,9 +78,9 @@ namespace date_time {
     typedef v_type  hour_type;
     typedef v_type  min_type;
     typedef v_type  sec_type;
-    
+
     // bring in function from frac_sec_type traits structs
-    static typename frac_sec_type::int_type as_number(typename frac_sec_type::impl_type i)
+    static fractional_seconds_type as_number(impl_type i)
     {
       return frac_sec_type::as_number(i);
     }
@@ -87,11 +88,14 @@ namespace date_time {
     {
       return frac_sec_type::is_adapted();
     }
-    
+
     //Would like this to be frac_sec_type, but some compilers complain
-    BOOST_STATIC_CONSTANT(int, ticks_per_second = resolution_adjust);
-    //    static const boost::int32_t ticks_per_second = resolution_adjust;
-    
+#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
+    BOOST_STATIC_CONSTANT(boost::int64_t, ticks_per_second = resolution_adjust);
+#else
+    BOOST_STATIC_CONSTANT(fractional_seconds_type, ticks_per_second = resolution_adjust);
+#endif
+
     static time_resolutions resolution()
     {
       return res;
@@ -116,16 +120,16 @@ namespace date_time {
         minutes = absolute_value(minutes);
         seconds = absolute_value(seconds);
         fs = absolute_value(fs);
-        return (((((fractional_seconds_type(hours)*3600) 
-                   + (fractional_seconds_type(minutes)*60) 
+        return (((((fractional_seconds_type(hours)*3600)
+                   + (fractional_seconds_type(minutes)*60)
                    + seconds)*res_adjust()) + fs) * -1);
       }
 
-      return (((fractional_seconds_type(hours)*3600) 
-               + (fractional_seconds_type(minutes)*60) 
+      return (((fractional_seconds_type(hours)*3600)
+               + (fractional_seconds_type(minutes)*60)
                + seconds)*res_adjust()) + fs;
     }
-    
+
   };
 
   typedef time_resolution_traits<time_resolution_traits_adapted32_impl, milli, 1000, 3 > milli_res;
similarity index 90%
rename from deal.II/contrib/boost/include/boost/date_time/time_system_split.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/time_system_split.hpp
index a882b12541b6a66a7dd9077ba83eb8c24cb968a9..08ea1ec2d1ae196b6f2d615270543fbeeb310e84 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-13 15:10:23 -0500 (Thu, 13 Nov 2008) $
  */
 
 
@@ -76,7 +76,7 @@ namespace date_time {
 
     static time_rep_type get_time_rep(const date_type& day,
                                       const time_duration_type& tod,
-                                      date_time::dst_flags dst=not_dst)
+                                      date_time::dst_flags /* dst */ = not_dst)
     {
       if(day.is_special() || tod.is_special()) {
         if(day.is_not_a_date() || tod.is_not_a_date_time()) {
@@ -132,7 +132,7 @@ namespace date_time {
     }
     static std::string zone_name(const time_rep_type&)
     {
-      return "";
+      return std::string();
     }
     static bool is_equal(const time_rep_type& lhs, const time_rep_type& rhs)
     {
@@ -166,12 +166,9 @@ namespace date_time {
         return add_time_duration(base,td1);
       }
 
-      //std::cout << td.ticks() << std::endl;
       wrap_int_type  day_offset(base.time_of_day.ticks());
       date_duration_type day_overflow(static_cast<typename date_duration_type::duration_rep_type>(day_offset.subtract(td.ticks())));
-//       std::cout << "sub: " << base.time_of_day.ticks() << "|"
-//                 << day_offset.as_int() << "|"
-//                 << day_overflow.days() << std::endl;
+
       return time_rep_type(base.day-day_overflow,
                            time_duration_type(0,0,0,day_offset.as_int()));
     }
@@ -185,13 +182,10 @@ namespace date_time {
         time_duration_type td1 = td.invert_sign();
         return subtract_time_duration(base,td1);
       }
+
       wrap_int_type day_offset(base.time_of_day.ticks());      
-      typename date_duration_type::duration_rep_type doff = day_offset.add(td.ticks());
-//       std::cout << "day overflow: " << doff << std::endl;
-//       std::cout << "ticks: "         << td.ticks() << std::endl;
-      date_duration_type day_overflow(doff);
-//       std::cout << "base: " << to_simple_string(base.day) << std::endl;
-//       std::cout << "overflow " << day_overflow.days() << std::endl;
+      date_duration_type day_overflow(static_cast< typename date_duration_type::duration_rep_type >(day_offset.add(td.ticks())));
+
       return time_rep_type(base.day+day_overflow,
                            time_duration_type(0,0,0,day_offset.as_int()));
     }
similarity index 94%
rename from deal.II/contrib/boost/include/boost/date_time/tz_db_base.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/tz_db_base.hpp
index ead3c20a441c6f919753901163d3b89f936c71e8..2440115460a4df2013fbc0112f2ddb17c4d65852 100644 (file)
@@ -5,20 +5,22 @@
  * Subject to the Boost Software License, Version 1.0. 
  * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
-#include "boost/shared_ptr.hpp"
-#include "boost/date_time/time_zone_names.hpp"
-#include "boost/date_time/time_zone_base.hpp"
-#include "boost/date_time/time_parsing.hpp"
-#include "boost/tokenizer.hpp"
-#include <string>
-#include <sstream>
 #include <map>
 #include <vector>
-#include <stdexcept>
+#include <string>
+#include <sstream>
 #include <fstream>
+#include <stdexcept>
+#include <boost/tokenizer.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/date_time/compiler_config.hpp>
+#include <boost/date_time/time_zone_names.hpp>
+#include <boost/date_time/time_zone_base.hpp>
+#include <boost/date_time/time_parsing.hpp>
 
 namespace boost {
   namespace date_time {
@@ -158,7 +160,7 @@ namespace boost {
       typedef typename time_zone_type::base_type time_zone_base_type;
       typedef typename time_zone_type::time_duration_type time_duration_type;
       typedef time_zone_names_base<char_type> time_zone_names;
-      typedef dst_adjustment_offsets<time_duration_type> dst_adjustment_offsets;
+      typedef boost::date_time::dst_adjustment_offsets<time_duration_type> dst_adjustment_offsets;
       typedef std::basic_string<char_type> string_type;
 
       //! Constructs an empty database
@@ -173,7 +175,7 @@ namespace boost {
         
         std::ifstream ifs(pathspec.c_str());
         if(!ifs){
-          throw data_not_accessible(pathspec);
+          boost::throw_exception(data_not_accessible(pathspec));
         }
         std::getline(ifs, buff); // first line is column headings
 
@@ -183,13 +185,13 @@ namespace boost {
       }
 
       //! returns true if record successfully added to map
-      /*! Takes an id string in the form of "America/Phoenix", and a 
+      /*! Takes a region name in the form of "America/Phoenix", and a 
        * time_zone object for that region. The id string must be a unique 
        * name that does not already exist in the database. */
-      bool add_record(const string_type& id
+      bool add_record(const string_type& region
                       boost::shared_ptr<time_zone_base_type> tz)
       {
-        typename map_type::value_type p(id, tz); 
+        typename map_type::value_type p(region, tz); 
         return (m_zone_map.insert(p)).second;
       }
 
@@ -307,7 +309,6 @@ namespace boost {
        * zone_spec successfully added to database */
       bool parse_string(string_type& s)
       {
-        
         std::vector<string_type> result;
         typedef boost::token_iterator_generator<boost::escaped_list_separator<char_type>, string_type::const_iterator, string_type >::type token_iter_type;
 
@@ -326,10 +327,11 @@ namespace boost {
         //take a shot at fixing gcc 4.x error
         const unsigned int expected_fields = static_cast<unsigned int>(FIELD_COUNT);
         if (result.size() != expected_fields) { 
-          std::stringstream msg;
+          std::ostringstream msg;
           msg << "Expecting " << FIELD_COUNT << " fields, got " 
             << result.size() << " fields in line: " << s;
-          throw bad_field_count(msg.str());
+          boost::throw_exception(bad_field_count(msg.str()));
+          BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return false); // should never reach
         }
 
         // initializations
similarity index 87%
rename from deal.II/contrib/boost/include/boost/date_time/wrapping_int.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/date_time/wrapping_int.hpp
index 1457dc869a54b47b34c27538dd069cdec7a4af4d..969b078ac1b46b4900e088acba425dc7b61832a8 100644 (file)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
+ * $Date: 2008-11-12 14:37:53 -0500 (Wed, 12 Nov 2008) $
  */
 
 
@@ -43,10 +43,11 @@ public:
    * wraps went. Ex: add a negative number and wrapping under could occur,
    * this would be indicated by a negative return value. If wrapping over 
    * took place, a positive value would be returned */
-  int_type add(int_type v) 
+  template< typename IntT >
+  IntT add(IntT v) 
   {
     int_type remainder = static_cast<int_type>(v % (wrap_val));
-    int_type overflow = static_cast<int_type>(v / (wrap_val));
+    IntT overflow = static_cast<IntT>(v / (wrap_val));
     value_ = static_cast<int_type>(value_ + remainder);
     return calculate_wrap(overflow);
   }
@@ -56,26 +57,28 @@ public:
    * Ex: subtract a negative number and wrapping over could 
    * occur, this would be indicated by a negative return value. If 
    * wrapping under took place, a positive value would be returned. */
-  int_type subtract(int_type v) 
+  template< typename IntT >
+  IntT subtract(IntT v) 
   {
     int_type remainder = static_cast<int_type>(v % (wrap_val));
-    int_type underflow = static_cast<int_type>(-(v / (wrap_val)));
+    IntT underflow = static_cast<IntT>(-(v / (wrap_val)));
     value_ = static_cast<int_type>(value_ - remainder);
     return calculate_wrap(underflow) * -1;
   }
 private:
   int_type value_;
 
-  int_type calculate_wrap(int_type wrap)
+  template< typename IntT >
+  IntT calculate_wrap(IntT wrap)
   {
     if ((value_) >= wrap_val) 
     {
-      wrap++;
+      ++wrap;
       value_ -= (wrap_val);
     }
     else if(value_ < 0) 
     {
-      wrap--;
+      --wrap;
       value_ += (wrap_val);
     }
     return wrap;
@@ -114,10 +117,11 @@ public:
    * wraps went. Ex: add a negative number and wrapping under could occur,
    * this would be indicated by a negative return value. If wrapping over 
    * took place, a positive value would be returned */
-  int_type add(int_type v) 
+  template< typename IntT >
+  IntT add(IntT v) 
   {
     int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
-    int_type overflow = static_cast<int_type>(v / (wrap_max - wrap_min + 1));
+    IntT overflow = static_cast<IntT>(v / (wrap_max - wrap_min + 1));
     value_ = static_cast<int_type>(value_ + remainder);
     return calculate_wrap(overflow);
   }
@@ -126,10 +130,11 @@ public:
    * wraps went. Ex: subtract a negative number and wrapping over could 
    * occur, this would be indicated by a positive return value. If 
    * wrapping under took place, a negative value would be returned */
-  int_type subtract(int_type v) 
+  template< typename IntT >
+  IntT subtract(IntT v) 
   {
     int_type remainder = static_cast<int_type>(v % (wrap_max - wrap_min + 1));
-    int_type underflow = static_cast<int_type>(-(v / (wrap_max - wrap_min + 1)));
+    IntT underflow = static_cast<IntT>(-(v / (wrap_max - wrap_min + 1)));
     value_ = static_cast<int_type>(value_ - remainder);
     return calculate_wrap(underflow);
   }
@@ -137,16 +142,17 @@ public:
 private:
   int_type value_;
 
-  int_type calculate_wrap(int_type wrap)
+  template< typename IntT >
+  IntT calculate_wrap(IntT wrap)
   {
     if ((value_) > wrap_max) 
     {
-      wrap++;
+      ++wrap;
       value_ -= (wrap_max - wrap_min + 1);
     }
     else if((value_) < wrap_min) 
     {
-      wrap--;
+      --wrap;
       value_ += (wrap_max - wrap_min + 1);
     }
     return wrap;
similarity index 90%
rename from deal.II/contrib/boost/include/boost/detail/allocator_utilities.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/allocator_utilities.hpp
index 91b0fa7b396912839e981b9017758935daecd60f..5d6ef48b05b149bded13d98e70a4757e3a2e3ad7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
+/* Copyright 2003-2009 Joaquin M Lopez Munoz.
  * 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)
@@ -178,12 +178,31 @@ void construct(void* p,const Type& t)
   new (p) Type(t);
 }
 
+#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
+/* MSVC++ issues spurious warnings about unreferencend formal parameters
+ * in destroy<Type> when Type is a class with trivial dtor.
+ */
+
+#pragma warning(push)
+#pragma warning(disable:4100)  
+#endif
+
 template<typename Type>
 void destroy(const Type* p)
 {
+
+#if BOOST_WORKAROUND(__SUNPRO_CC,BOOST_TESTED_AT(0x590))
+  const_cast<Type*>(p)->~Type();
+#else
   p->~Type();
+#endif
+
 }
 
+#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))
+#pragma warning(pop)
+#endif
+
 } /* namespace boost::detail::allocator */
 
 } /* namespace boost::detail */
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/detail/atomic_count.hpp b/deal.II/contrib/boost-1.41.0/include/boost/detail/atomic_count.hpp
new file mode 100644 (file)
index 0000000..5411c7a
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/atomic_count.hpp - thread/SMP safe reference counter
+//
+//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.
+//
+//  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/smart_ptr/detail/atomic_count.hpp>
+
+#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
similarity index 89%
rename from deal.II/contrib/boost/include/boost/functional/detail/container_fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/container_fwd.hpp
index 8685905cda6169d35fd8cdbb47bf69deb00b4ea7..bc7f780b060965c5e96ed47b5ce4ec1613c9d522 100644 (file)
@@ -6,16 +6,14 @@
 #if !defined(BOOST_DETAIL_CONTAINER_FWD_HPP)
 #define BOOST_DETAIL_CONTAINER_FWD_HPP
 
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
 
-#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
-#define BOOST_HASH_CHAR_TRAITS string_char_traits
-#else
-#define BOOST_HASH_CHAR_TRAITS char_traits
-#endif
-
-#if (defined(__GLIBCXX__) && defined(_GLIBCXX_DEBUG)) \
+#if ((defined(__GLIBCPP__) || defined(__GLIBCXX__)) && defined(_GLIBCXX_DEBUG)) \
     || BOOST_WORKAROUND(__BORLANDC__, > 0x551) \
     || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x842)) \
     || (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))
@@ -61,7 +59,13 @@ namespace std
 {
     template <class T> class allocator;
     template <class charT, class traits, class Allocator> class basic_string;
-    template <class charT> struct BOOST_HASH_CHAR_TRAITS;
+
+#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+    template <class charT> struct string_char_traits;
+#else
+    template <class charT> struct char_traits;
+#endif
+
     template <class T> class complex;
 }
 
similarity index 91%
rename from deal.II/contrib/boost/include/boost/detail/endian.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/endian.hpp
index 6936dba0f35062a8468c958c3195c3ede859e717..36ddb7e1e5d0f9d59c824f40afe9e15866985b49 100644 (file)
 #  error Unknown machine endianness detected.
 # endif
 # define BOOST_BYTE_ORDER __BYTE_ORDER
-#elif defined(_BIG_ENDIAN)
+#elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
 # define BOOST_BIG_ENDIAN
 # define BOOST_BYTE_ORDER 4321
-#elif defined(_LITTLE_ENDIAN)
+#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
 # define BOOST_LITTLE_ENDIAN
 # define BOOST_BYTE_ORDER 1234
 #elif defined(__sparc) || defined(__sparc__) \
    || defined(_POWER) || defined(__powerpc__) \
-   || defined(__ppc__) || defined(__hpux) \
+   || defined(__ppc__) || defined(__hpux) || defined(__hppa) \
    || defined(_MIPSEB) || defined(_POWER) \
    || defined(__s390__)
 # define BOOST_BIG_ENDIAN
@@ -61,7 +61,7 @@
    || defined(_M_ALPHA) || defined(__amd64) \
    || defined(__amd64__) || defined(_M_AMD64) \
    || defined(__x86_64) || defined(__x86_64__) \
-   || defined(_M_X64)
+   || defined(_M_X64) || defined(__bfin__)
 
 # define BOOST_LITTLE_ENDIAN
 # define BOOST_BYTE_ORDER 1234
similarity index 95%
rename from deal.II/contrib/boost/include/boost/detail/is_incrementable.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/is_incrementable.hpp
index cb7d7a7b59d8006f63aded3dcef678aa2dd271fe..1c8fd5785b5aedebd3eb04ac4ec2d83386d5c80d 100644 (file)
@@ -63,7 +63,12 @@ namespace is_incrementable_
   tag operator,(tag,int);  
 #  define BOOST_comma(a,b) (a,b)
 # endif 
-  
+
+# if defined(BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning(disable:4913) // Warning about operator,
+# endif 
+
   // two check overloads help us identify which operator++ was picked
   char (& check(tag) )[2];
   
@@ -92,6 +97,11 @@ namespace is_incrementable_
         , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1
       );
   };
+
+# if defined(BOOST_MSVC)
+#  pragma warning(pop)
+# endif 
+
 }
 
 # undef BOOST_comma
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_mutex.hpp b/deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_mutex.hpp
new file mode 100644 (file)
index 0000000..b7a7f6d
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/detail/lightweight_mutex.hpp - lightweight mutex
+//
+//  Copyright (c) 2002, 2003 Peter Dimov and Multi Media Ltd.
+//
+//  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/smart_ptr/detail/lightweight_mutex.hpp>
+
+#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
similarity index 65%
rename from deal.II/contrib/boost/include/boost/detail/lightweight_test.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/lightweight_test.hpp
index b651e0e335a67fd575c0741c0da8af50ef142f4f..ffa750d324e7735e04f20eff6b44e6e9567557ff 100644 (file)
 //
 //  boost/detail/lightweight_test.hpp - lightweight test library
 //
-//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//  Copyright (c) 2002, 2009 Peter Dimov
 //
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
 //
 //  BOOST_TEST(expression)
 //  BOOST_ERROR(message)
+//  BOOST_TEST_EQ(expr1, expr2)
 //
 //  int boost::report_errors()
 //
@@ -49,13 +50,27 @@ inline void error_impl(char const * msg, char const * file, int line, char const
     ++test_errors();
 }
 
+template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2, char const * file, int line, char const * function, T const & t, U const & u )
+{
+    if( t == u )
+    {
+    }
+    else
+    {
+        std::cerr << file << "(" << line << "): test '" << expr1 << " == " << expr2
+            << "' failed in function '" << function << "': "
+            << "'" << t << "' != '" << u << "'" << std::endl;
+        ++test_errors();
+    }
+}
+
 } // namespace detail
 
 inline int report_errors()
 {
     int errors = detail::test_errors();
 
-    if(errors == 0)
+    if( errors == 0 )
     {
         std::cerr << "No errors detected." << std::endl;
         return 0;
@@ -71,5 +86,6 @@ inline int report_errors()
 
 #define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
 #define BOOST_ERROR(msg) ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION)
+#define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
 
 #endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_TEST_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/detail/quick_allocator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/detail/quick_allocator.hpp
new file mode 100644 (file)
index 0000000..d54b3a7
--- /dev/null
@@ -0,0 +1,23 @@
+#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  detail/quick_allocator.hpp
+//
+//  Copyright (c) 2003 David Abrahams
+//  Copyright (c) 2003 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+
+#include <boost/smart_ptr/detail/quick_allocator.hpp>
+
+#endif  // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/detail/scoped_enum_emulation.hpp b/deal.II/contrib/boost-1.41.0/include/boost/detail/scoped_enum_emulation.hpp
new file mode 100644 (file)
index 0000000..644c138
--- /dev/null
@@ -0,0 +1,56 @@
+//  scoped_enum_emulation.hpp  ---------------------------------------------------------//
+
+//  Copyright Beman Dawes, 2009
+
+//  Distributed under the Boost Software License, Version 1.0.
+//  See http://www.boost.org/LICENSE_1_0.txt
+
+//  Generates C++0x scoped enums if the feature is present, otherwise emulates C++0x
+//  scoped enums with C++03 namespaces and enums. The Boost.Config BOOST_NO_SCOPED_ENUMS
+//  macro is used to detect feature support.
+//
+//  See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf for a
+//  description of the scoped enum feature. Note that the committee changed the name
+//  from strongly typed enum to scoped enum.  
+//
+//  Caution: only the syntax is emulated; the semantics are not emulated and
+//  the syntax emulation doesn't include being able to specify the underlying
+//  representation type.
+//
+//  The emulation is via struct rather than namespace to allow use within classes.
+//  Thanks to Andrey Semashev for pointing that out.
+//
+//  Helpful comments and suggestions were also made by Kjell Elster, Phil Endecott,
+//  Joel Falcou, Mathias Gaunard, Felipe Magno de Almeida, Matt Calabrese, Vincente
+//  Botet, and Daniel James. 
+//
+//  Sample usage:
+//
+//     BOOST_SCOPED_ENUM_START(algae) { green, red, cyan }; BOOST_SCOPED_ENUM_END
+//     ...
+//     BOOST_SCOPED_ENUM(algae) sample( algae::red );
+//     void foo( BOOST_SCOPED_ENUM(algae) color );
+//     ...
+//     sample = algae::green;
+//     foo( algae::cyan );
+
+#ifndef BOOST_SCOPED_ENUM_EMULATION_HPP
+#define BOOST_SCOPED_ENUM_EMULATION_HPP
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_NO_SCOPED_ENUMS
+
+# define BOOST_SCOPED_ENUM_START(name) struct name { enum enum_t
+# define BOOST_SCOPED_ENUM_END };
+# define BOOST_SCOPED_ENUM(name) name::enum_t
+
+#else
+
+# define BOOST_SCOPED_ENUM_START(name) enum class name
+# define BOOST_SCOPED_ENUM_END
+# define BOOST_SCOPED_ENUM(name) name
+
+#endif
+
+#endif  // BOOST_SCOPED_ENUM_EMULATION_HPP
similarity index 94%
rename from deal.II/contrib/boost/include/boost/detail/utf8_codecvt_facet.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/utf8_codecvt_facet.hpp
index ac7e7bfded2854a61e563f1c14816e2e6bef20eb..b777ff934ebfed8964c89ee0a2dc0b42e8694ccf 100644 (file)
 // specialized on those types for this to work.
 
 #include <locale>
-// for mbstate_t
-#include <wchar.h>
-// for std::size_t
-#include <cstddef>
+#include <cwchar>   // for mbstate_t
+#include <cstddef>  // for std::size_t
 
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
 
+#if defined(BOOST_NO_STDC_NAMESPACE)
 namespace std {
-    #if defined(__LIBCOMO__)
-        using ::mbstate_t;
-    #elif defined(BOOST_DINKUMWARE_STDLIB) && !defined(__BORLANDC__)
-        using ::mbstate_t;
-    #elif defined(__SGI_STL_PORT)
-    #elif defined(BOOST_NO_STDC_NAMESPACE)
-        using ::mbstate_t;
-        using ::codecvt;
-    #endif
-} // namespace std
+    using ::mbstate_t;
+    using ::size_t;
+}
+#endif
 
 #if !defined(__MSL_CPP__) && !defined(__LIBCOMO__)
     #define BOOST_CODECVT_DO_LENGTH_CONST const
similarity index 79%
rename from deal.II/contrib/boost/include/boost/detail/workaround.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/detail/workaround.hpp
index 4933a531f908cc6f2ff277f4375d867426aed5c7..b6b64125c6a8165ac7e033f6d872cfd5be5edfcb 100644 (file)
 #else
 #define __BORLANDC___WORKAROUND_GUARD 0
 #endif
-#ifndef __MSC_VER
-#define __MSC_VER_WORKAROUND_GUARD 1
+#ifndef __CODEGEARC__
+#define __CODEGEARC___WORKAROUND_GUARD 1
 #else
-#define __MSC_VER_WORKAROUND_GUARD 0
+#define __CODEGEARC___WORKAROUND_GUARD 0
+#endif
+#ifndef _MSC_VER
+#define _MSC_VER_WORKAROUND_GUARD 1
+#else
+#define _MSC_VER_WORKAROUND_GUARD 0
 #endif
 #ifndef _MSC_FULL_VER
 #define _MSC_FULL_VER_WORKAROUND_GUARD 1
 #else
 #define __MWERKS___WORKAROUND_GUARD 0
 #endif
+#ifndef __EDG__
+#define __EDG___WORKAROUND_GUARD 1
+#else
+#define __EDG___WORKAROUND_GUARD 0
+#endif
 #ifndef __EDG_VERSION__
 #define __EDG_VERSION___WORKAROUND_GUARD 1
 #else
 #else
 #define __HP_aCC_WORKAROUND_GUARD 0
 #endif
+#ifndef __hpxstd98
+#define __hpxstd98_WORKAROUND_GUARD 1
+#else
+#define __hpxstd98_WORKAROUND_GUARD 0
+#endif
 #ifndef _CRAYC
 #define _CRAYC_WORKAROUND_GUARD 1
 #else
 #else
 #define MPW_CPLUS_WORKAROUND_GUARD 0
 #endif
+#ifndef __COMO__
+#define __COMO___WORKAROUND_GUARD 1
+#else
+#define __COMO___WORKAROUND_GUARD 0
+#endif
+#ifndef __COMO_VERSION__
+#define __COMO_VERSION___WORKAROUND_GUARD 1
+#else
+#define __COMO_VERSION___WORKAROUND_GUARD 0
+#endif
+#ifndef __INTEL_COMPILER
+#define __INTEL_COMPILER_WORKAROUND_GUARD 1
+#else
+#define __INTEL_COMPILER_WORKAROUND_GUARD 0
+#endif
+#ifndef __ICL
+#define __ICL_WORKAROUND_GUARD 1
+#else
+#define __ICL_WORKAROUND_GUARD 0
+#endif
+#ifndef _COMPILER_VERSION
+#define _COMPILER_VERSION_WORKAROUND_GUARD 1
+#else
+#define _COMPILER_VERSION_WORKAROUND_GUARD 0
+#endif
 
 #ifndef _RWSTD_VER
 #define _RWSTD_VER_WORKAROUND_GUARD 1
 #else
 #define _RWSTD_VER_WORKAROUND_GUARD 0
 #endif
+#ifndef BOOST_RWSTD_VER
+#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1
+#else
+#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0
+#endif
+#ifndef __GLIBCPP__
+#define __GLIBCPP___WORKAROUND_GUARD 1
+#else
+#define __GLIBCPP___WORKAROUND_GUARD 0
+#endif
 #ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC
 #define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1
 #else
 #else
 #define _STLPORT_VERSION_WORKAROUND_GUARD 0
 #endif
+#ifndef __LIBCOMO_VERSION__
+#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1
+#else
+#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0
+#endif
+#ifndef _CPPLIB_VER
+#define _CPPLIB_VER_WORKAROUND_GUARD 1
+#else
+#define _CPPLIB_VER_WORKAROUND_GUARD 0
+#endif
 
 #ifndef BOOST_INTEL_CXX_VERSION
 #define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/dynamic_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/dynamic_property_map.hpp
new file mode 100644 (file)
index 0000000..58a4ac9
--- /dev/null
@@ -0,0 +1,19 @@
+/*=============================================================================
+Copyright (c) 2009 Trustees of Indiana University
+
+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)
+=============================================================================*/
+// Redirect/warning header, adapted from the version in Spirit
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/property_map/dynamic_property_map.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/property_map/dynamic_property_map.hpp"
+#endif
+#endif
+
+#include <boost/property_map/dynamic_property_map.hpp>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/enable_shared_from_this.hpp b/deal.II/contrib/boost-1.41.0/include/boost/enable_shared_from_this.hpp
new file mode 100644 (file)
index 0000000..b1bb63d
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+#define BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+
+//
+//  enable_shared_from_this.hpp
+//
+//  Copyright (c) 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
+//
+
+#include <boost/smart_ptr/enable_shared_from_this.hpp>
+
+#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
similarity index 52%
rename from deal.II/contrib/boost/include/boost/exception.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception.hpp
index c77f215b8f4224ea6c3c09d9f9b28e354a4cc235..ff315654b0678c09add41ee0707b48847f681245 100644 (file)
@@ -6,12 +6,8 @@
 #ifndef UUID_1D94A7C6054E11DB9804B622A1EF5492
 #define UUID_1D94A7C6054E11DB9804B622A1EF5492
 
-#include <boost/exception/diagnostic_information.hpp>
-#include <boost/exception/error_info.hpp>
-#include <boost/exception/exception.hpp>
-#include <boost/exception/get_error_info.hpp>
-#include <boost/exception/info.hpp>
-#include <boost/exception/info_tuple.hpp>
-#include <boost/exception_ptr.hpp>
+//The header <boost/exception.hpp> has been deprecated.
+//Please #include <boost/exception/all.hpp> instead.
+#include <boost/exception/all.hpp>
 
 #endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/all.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/all.hpp
new file mode 100644 (file)
index 0000000..c47738b
--- /dev/null
@@ -0,0 +1,27 @@
+//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_316FDA946C0D11DEA9CBAE5255D89593
+#define UUID_316FDA946C0D11DEA9CBAE5255D89593
+
+#include <boost/exception/diagnostic_information.hpp>
+#include <boost/exception/error_info.hpp>
+#include <boost/exception/exception.hpp>
+#include <boost/exception/get_error_info.hpp>
+#include <boost/exception/info.hpp>
+#include <boost/exception/info_tuple.hpp>
+#include <boost/exception/errinfo_api_function.hpp>
+#include <boost/exception/errinfo_at_line.hpp>
+#include <boost/exception/errinfo_errno.hpp>
+#include <boost/exception/errinfo_file_handle.hpp>
+#include <boost/exception/errinfo_file_name.hpp>
+#include <boost/exception/errinfo_file_open_mode.hpp>
+#include <boost/exception/errinfo_type_info_name.hpp>
+#ifndef BOOST_NO_EXCEPTIONS
+#include <boost/exception/errinfo_nested_exception.hpp>
+#include <boost/exception_ptr.hpp>
+#endif
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/current_exception_cast.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/current_exception_cast.hpp
new file mode 100644 (file)
index 0000000..228b6ea
--- /dev/null
@@ -0,0 +1,34 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_7E83C166200811DE885E826156D89593
+#define UUID_7E83C166200811DE885E826156D89593
+
+namespace
+boost
+    {
+    template <class E>
+    inline
+    E *
+    current_exception_cast()
+        {
+        try
+            {
+            throw;
+            }
+        catch(
+        E & e )
+            {
+            return &e;
+            }
+        catch(
+        ...)
+            {
+            return 0;
+            }
+        }
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/detail/attribute_noreturn.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/detail/attribute_noreturn.hpp
new file mode 100644 (file)
index 0000000..1cb0763
--- /dev/null
@@ -0,0 +1,19 @@
+//Copyright (c) 2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_61531AB0680611DEADD5846855D89593
+#define UUID_61531AB0680611DEADD5846855D89593
+
+#include <boost/config.hpp>
+
+#if defined(BOOST_MSVC)
+#define BOOST_ATTRIBUTE_NORETURN __declspec(noreturn)
+#elif defined(__GNUC__)
+#define BOOST_ATTRIBUTE_NORETURN __attribute__((noreturn))
+#else
+#define BOOST_ATTRIBUTE_NORETURN
+#endif
+
+#endif
similarity index 86%
rename from deal.II/contrib/boost/include/boost/exception/detail/error_info_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/detail/error_info_impl.hpp
index 7a57b8bd6d299e59cbad7c12e0b8a7b7ebf0c7de..a25d066fd1d8a5f5f648ae620447a33d7c4f5fb1 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -49,12 +49,18 @@ boost
             return value_;
             }
 
+        value_type &
+        value()
+            {
+            return value_;
+            }
+
         private:
 
         char const * tag_typeid_name() const;
         std::string value_as_string() const;
 
-        value_type const value_;
+        value_type value_;
         };
     }
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/detail/exception_ptr_base.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/detail/exception_ptr_base.hpp
new file mode 100644 (file)
index 0000000..ac68cab
--- /dev/null
@@ -0,0 +1,33 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_DC4208C6417811DEBF11E1EC55D89593
+#define UUID_DC4208C6417811DEBF11E1EC55D89593
+
+namespace
+boost
+    {
+        namespace
+        exception_detail
+                {
+                class
+                exception_ptr_base
+                        {
+                        public:
+
+                        virtual void _rethrow() const=0;
+                        virtual bool _empty() const=0;
+
+                        protected:
+
+                        virtual
+                        ~exception_ptr_base() throw()
+                            {
+                            }
+                        };
+                }
+    }
+
+#endif
similarity index 93%
rename from deal.II/contrib/boost/include/boost/exception/detail/is_output_streamable.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/detail/is_output_streamable.hpp
index 57376bf3da635c71e559f933f55a18736373006c..af59cb8d2f6a034f4fcae6a456eb163bf9c27c74 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 94%
rename from deal.II/contrib/boost/include/boost/exception/detail/object_hex_dump.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/detail/object_hex_dump.hpp
index a6221b6db57b6700f0a20d0662125d0108cfd1a1..f535944ea297dc5c46875ffa1a565775c17e6dc6 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/exception/detail/type_info.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/detail/type_info.hpp
index 97bf72615cce301881d131de982ce3e7398d8659..ac0960db68af6a4aee8cb8a731e17ca2eb27d1f9 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/diagnostic_information.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/diagnostic_information.hpp
new file mode 100644 (file)
index 0000000..1ea9dc1
--- /dev/null
@@ -0,0 +1,186 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_0552D49838DD11DD90146B8956D89593
+#define UUID_0552D49838DD11DD90146B8956D89593
+
+#include <boost/config.hpp>
+#include <boost/exception/get_error_info.hpp>
+#include <boost/exception/detail/exception_ptr_base.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <exception>
+#include <sstream>
+#include <string>
+
+namespace
+boost
+    {
+    namespace
+    exception_detail
+        {
+        template <class T>
+        struct
+        enable_boost_exception_overload
+            {
+            struct yes { char q[100]; };
+            typedef char no;
+            static yes check(exception const *);
+            static no check(...);
+            enum e { value=sizeof(check((T*)0))==sizeof(yes) };
+            };
+
+        template <class T>
+        struct
+        enable_std_exception_overload
+            {
+            struct yes { char q[100]; };
+            typedef char no;
+            static yes check(std::exception const *);
+            static no check(...);
+            enum e { value = !enable_boost_exception_overload<T>::value && sizeof(check((T*)0))==sizeof(yes) };
+            };
+
+        inline
+        char const *
+        get_diagnostic_information( exception const & x, char const * header )
+            {
+            if( error_info_container * c=x.data_.get() )
+#ifndef BOOST_NO_EXCEPTIONS
+                try
+                    {
+#endif
+                    return c->diagnostic_information(header);
+#ifndef BOOST_NO_EXCEPTIONS
+                    }
+                catch(...)
+                    {
+                    }
+#endif
+            return 0;
+            }
+
+        inline
+        std::string
+        diagnostic_information_impl( boost::exception const * be, std::exception const * se, bool with_what )
+            {
+            BOOST_ASSERT(be||se);
+#ifndef BOOST_NO_RTTI
+            if( !se )
+                se = dynamic_cast<std::exception const *>(be);
+            if( !be )
+                be = dynamic_cast<boost::exception const *>(se);
+#endif
+            char const * wh=0;
+            if( with_what && se )
+                {
+                wh=se->what();
+                if( be && exception_detail::get_diagnostic_information(*be,0)==wh )
+                    return wh;
+                }
+            std::ostringstream tmp;
+            if( be )
+                {
+                if( char const * const * f=get_error_info<throw_file>(*be) )
+                    {
+                    tmp << *f;
+                    if( int const * l=get_error_info<throw_line>(*be) )
+                        tmp << '(' << *l << "): ";
+                    }
+                tmp << "Throw in function ";
+                if( char const * const * fn=get_error_info<throw_function>(*be) )
+                    tmp << *fn;
+                else
+                    tmp << "(unknown)";
+                tmp << '\n';
+                }
+#ifndef BOOST_NO_RTTI
+            tmp << std::string("Dynamic exception type: ") <<
+                (be?BOOST_EXCEPTION_DYNAMIC_TYPEID(*be):BOOST_EXCEPTION_DYNAMIC_TYPEID(*se)).name() << '\n';
+#endif
+            if( with_what && se )
+                tmp << "std::exception::what: " << wh << '\n';
+            if( be )
+                if( char const * s=exception_detail::get_diagnostic_information(*be,tmp.str().c_str()) )
+                    if( *s )
+                        return s;
+            return tmp.str();
+            }
+        }
+
+    template <class T>
+    inline
+    typename enable_if<exception_detail::enable_boost_exception_overload<T>,std::string>::type
+    diagnostic_information( T const & e )
+        {
+        return exception_detail::diagnostic_information_impl(&e,0,true);
+        }
+
+    template <class T>
+    inline
+    typename enable_if<exception_detail::enable_std_exception_overload<T>,std::string>::type
+    diagnostic_information( T const & e )
+        {
+        return exception_detail::diagnostic_information_impl(0,&e,true);
+        }
+
+    inline
+    char const *
+    diagnostic_information_what( exception const & e ) throw()
+        {
+        char const * w=0;
+#ifndef BOOST_NO_EXCEPTIONS
+        try
+            {
+#endif
+            (void) exception_detail::diagnostic_information_impl(&e,0,false);
+            return exception_detail::get_diagnostic_information(e,0);
+#ifndef BOOST_NO_EXCEPTIONS
+            }
+        catch(
+        ... )
+            {
+            }
+#endif
+        return w;
+        }
+    }
+
+#ifndef BOOST_NO_EXCEPTIONS
+#include <boost/exception/current_exception_cast.hpp>
+namespace
+boost
+    {
+    inline
+    std::string
+    current_exception_diagnostic_information()
+        {
+        boost::exception const * be=current_exception_cast<boost::exception const>();
+        std::exception const * se=current_exception_cast<std::exception const>();
+        if( be || se )
+            return exception_detail::diagnostic_information_impl(be,se,true);
+        else
+            return "No diagnostic information available.";
+        }
+
+    inline
+    std::string
+    diagnostic_information( exception_detail::exception_ptr_base const & p )
+        {
+        if( !p._empty() )
+            try
+                {
+                p._rethrow();
+                }
+            catch(
+            ... )
+                {
+                return current_exception_diagnostic_information();
+                }
+        return "<empty>";
+        }
+    }
+#endif
+
+#endif
similarity index 75%
rename from deal.II/contrib/boost/include/boost/exception/enable_current_exception.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/enable_current_exception.hpp
index 7e6403b83e69324c0989cb35793e67e4dcc9a95a..988105378cc7e67af18ea4c834f9f078a087b9d8 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 75%
rename from deal.II/contrib/boost/include/boost/exception/enable_error_info.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/enable_error_info.hpp
index 7e6403b83e69324c0989cb35793e67e4dcc9a95a..988105378cc7e67af18ea4c834f9f078a087b9d8 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_api_function.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_api_function.hpp
new file mode 100644 (file)
index 0000000..481c613
--- /dev/null
@@ -0,0 +1,22 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_DDFBB4546C1211DEA4659E9055D89593
+#define UUID_DDFBB4546C1211DEA4659E9055D89593
+
+#include "boost/exception/error_info.hpp"
+
+namespace
+boost
+    {
+    //Usage hint:
+    //if( api_function(....)!=0 )
+    //    BOOST_THROW_EXCEPTION(
+    //        failure() <<
+    //        errinfo_api_function("api_function") );
+    typedef error_info<struct errinfo_api_function_,char const *> errinfo_api_function;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_at_line.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_at_line.hpp
new file mode 100644 (file)
index 0000000..cbd5cce
--- /dev/null
@@ -0,0 +1,18 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_E7255CE26C1211DE85800C9155D89593
+#define UUID_E7255CE26C1211DE85800C9155D89593
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Use with parsing errors exceptions, for example in a XML file parser.
+    typedef error_info<struct errinfo_at_line_,int> errinfo_at_line;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_errno.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_errno.hpp
new file mode 100644 (file)
index 0000000..310ceb7
--- /dev/null
@@ -0,0 +1,35 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_F0EE17BE6C1211DE87FF459155D89593
+#define UUID_F0EE17BE6C1211DE87FF459155D89593
+
+#include "boost/exception/info.hpp"
+#include <errno.h>
+#include <string.h>
+
+namespace
+boost
+    {
+    typedef error_info<struct errinfo_errno_,int> errinfo_errno;
+
+    //Usage hint:
+    //if( c_function(....)!=0 )
+    //    BOOST_THROW_EXCEPTION(
+    //        failure() <<
+    //        errinfo_errno(errno) <<
+    //        errinfo_api_function("c_function") );
+    inline
+    std::string
+    to_string( errinfo_errno const & e )
+        {
+        std::ostringstream tmp;
+        int v=e.value();
+        tmp << v << ", \"" << strerror(v) << "\"";
+        return tmp.str();
+        }
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_handle.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_handle.hpp
new file mode 100644 (file)
index 0000000..8e6cff8
--- /dev/null
@@ -0,0 +1,20 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_F79E6EE26C1211DEB26E929155D89593
+#define UUID_F79E6EE26C1211DEB26E929155D89593
+
+#include <stdio.h>
+
+namespace
+boost
+    {
+    template <class> class weak_ptr;
+    template <class Tag,class T> class error_info;
+
+    typedef error_info<struct errinfo_file_handle_,weak_ptr<FILE> > errinfo_file_handle;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_name.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_name.hpp
new file mode 100644 (file)
index 0000000..d3cce4d
--- /dev/null
@@ -0,0 +1,26 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_FEE5120A6C1211DE94E8BC9155D89593
+#define UUID_FEE5120A6C1211DE94E8BC9155D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //FILE * f=fopen(name,mode);
+    //if( !f )
+    //    BOOST_THROW_EXCEPTION(
+    //        file_open_error() <<
+    //        errinfo_file_name(name) <<
+    //        errinfo_file_open_mode(mode) );
+    typedef error_info<struct errinfo_file_name_,std::string> errinfo_file_name;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_open_mode.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_file_open_mode.hpp
new file mode 100644 (file)
index 0000000..f4fba0d
--- /dev/null
@@ -0,0 +1,26 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_056F1F266C1311DE8E74299255D89593
+#define UUID_056F1F266C1311DE8E74299255D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //FILE * f=fopen(name,mode);
+    //if( !f )
+    //    BOOST_THROW_EXCEPTION(
+    //        file_open_error() <<
+    //        errinfo_file_name(name) <<
+    //        errinfo_file_open_mode(mode) );
+    typedef error_info<struct errinfo_file_open_mode_,std::string> errinfo_file_open_mode;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_nested_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_nested_exception.hpp
new file mode 100644 (file)
index 0000000..de055e0
--- /dev/null
@@ -0,0 +1,17 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_45CC9A82B77511DEB330FC4956D89593
+#define UUID_45CC9A82B77511DEB330FC4956D89593
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+    class exception_ptr;
+    typedef error_info<struct errinfo_nested_exception_,exception_ptr> errinfo_nested_exception;
+    }
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_type_info_name.hpp b/deal.II/contrib/boost-1.41.0/include/boost/exception/errinfo_type_info_name.hpp
new file mode 100644 (file)
index 0000000..0b060e2
--- /dev/null
@@ -0,0 +1,23 @@
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
+
+//Distributed under the Boost Software License, Version 1.0. (See accompanying
+//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef UUID_0E11109E6C1311DEB7EA649255D89593
+#define UUID_0E11109E6C1311DEB7EA649255D89593
+
+#include <string>
+
+namespace
+boost
+    {
+    template <class Tag,class T> class error_info;
+
+    //Usage hint:
+    //BOOST_THROW_EXCEPTION(
+    //    bad_type() <<
+    //    errinfo_type_info_name(typeid(x).name()) );
+    typedef error_info<struct errinfo_type_info_name_,std::string> errinfo_type_info_name;
+    }
+
+#endif
similarity index 77%
rename from deal.II/contrib/boost/include/boost/exception/error_info.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/error_info.hpp
index d80bf399d8e7106d24ec21fa8b1b47091353b0eb..2e6832a338e12ea654d39399f0def106427cab1f 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 92%
rename from deal.II/contrib/boost/include/boost/exception/exception.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/exception.hpp
index 53e6ed0c87def2eaec1fb60dde4563addfabcd69..e7faf594c4b3aded37c37f960c8c11fc7fc5feda 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -80,13 +80,13 @@ boost
     template <class Tag,class T>
     class error_info;
 
-    typedef error_info<struct tag_throw_function,char const *> throw_function;
-    typedef error_info<struct tag_throw_file,char const *> throw_file;
-    typedef error_info<struct tag_throw_line,int> throw_line;
+    typedef error_info<struct throw_function_,char const *> throw_function;
+    typedef error_info<struct throw_file_,char const *> throw_file;
+    typedef error_info<struct throw_line_,int> throw_line;
 
     template <>
     class
-    error_info<tag_throw_function,char const *>
+    error_info<throw_function_,char const *>
         {
         public:
         typedef char const * value_type;
@@ -100,7 +100,7 @@ boost
 
     template <>
     class
-    error_info<tag_throw_file,char const *>
+    error_info<throw_file_,char const *>
         {
         public:
         typedef char const * value_type;
@@ -114,7 +114,7 @@ boost
 
     template <>
     class
-    error_info<tag_throw_line,int>
+    error_info<throw_line_,int>
         {
         public:
         typedef int value_type;
@@ -143,9 +143,9 @@ boost
         struct
         error_info_container
             {
-            virtual char const * diagnostic_information() const = 0;
-            virtual shared_ptr<error_info_base const> get( type_info_ const & ) const = 0;
-            virtual void set( shared_ptr<error_info_base const> const &, type_info_ const & ) = 0;
+            virtual char const * diagnostic_information( char const * ) const = 0;
+            virtual shared_ptr<error_info_base> get( type_info_ const & ) const = 0;
+            virtual void set( shared_ptr<error_info_base> const &, type_info_ const & ) = 0;
             virtual void add_ref() const = 0;
             virtual void release() const = 0;
 
@@ -169,7 +169,7 @@ boost
         template <>
         struct get_info<throw_line>;
 
-        char const * get_diagnostic_information( exception const & );
+        char const * get_diagnostic_information( exception const &, char const * );
         }
 
     class
@@ -231,7 +231,7 @@ boost
             return x;
             }
 
-        friend char const * exception_detail::get_diagnostic_information( exception const & );
+        friend char const * exception_detail::get_diagnostic_information( exception const &, char const * );
 
         template <class E,class Tag,class T>
         friend E const & operator<<( E const &, error_info<Tag,T> const & );
similarity index 50%
rename from deal.II/contrib/boost/include/boost/exception/get_error_info.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/get_error_info.hpp
index e45d3d6eb0d9d31aa8538c2589f52dfd45116471..640a612f3d20b5682c99acf5144accd2463c2dd7 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -17,23 +17,25 @@ boost
     namespace
     exception_detail
         {
+        template <class ErrorInfo>
         struct
-        strwrap
+        get_info
             {
-                       std::string str;
-            char const * ptr;
-
-            explicit
-            strwrap( char const * s ):
-                str(s),
-                ptr(&str[0])
+            static
+            typename ErrorInfo::value_type *
+            get( exception const & x )
                 {
+                if( exception_detail::error_info_container * c=x.data_.get() )
+                    if( shared_ptr<exception_detail::error_info_base> eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) )
+                        {
+#ifndef BOOST_NO_RTTI
+                        BOOST_ASSERT( 0!=dynamic_cast<ErrorInfo *>(eib.get()) );
+#endif
+                        ErrorInfo * w = static_cast<ErrorInfo *>(eib.get());
+                        return &w->value();
+                        }
+                return 0;
                 }
-
-            private:
-
-            strwrap( strwrap const & );
-            strwrap & operator=( strwrap const & );
             };
 
         template <>
@@ -41,16 +43,10 @@ boost
         get_info<throw_function>
             {
             static
-            shared_ptr<char const * const>
+            char const * *
             get( exception const & x )
                 {
-                if( x.throw_function_ && *x.throw_function_ )
-                    {
-                    shared_ptr<strwrap> s(new strwrap(x.throw_function_));
-                    return shared_ptr<char const *>(s,&s->ptr);
-                    }
-                else
-                    return shared_ptr<char const * const>();
+                return x.throw_function_ ? &x.throw_function_ : 0;
                 }
             };
 
@@ -59,16 +55,10 @@ boost
         get_info<throw_file>
             {
             static
-            shared_ptr<char const * const>
+            char const * *
             get( exception const & x )
                 {
-                if( x.throw_file_ && *x.throw_file_ )
-                    {
-                    shared_ptr<strwrap> s(new strwrap(x.throw_file_));
-                    return shared_ptr<char const *>(s,&s->ptr);
-                    }
-                else
-                    return shared_ptr<char const * const>();
+                return x.throw_file_ ? &x.throw_file_ : 0;
                 }
             };
 
@@ -77,56 +67,53 @@ boost
         get_info<throw_line>
             {
             static
-            shared_ptr<int const>
+            int *
             get( exception const & x )
                 {
-                if( x.throw_line_!=-1 )
-                    return boost::shared_ptr<int>(new int(x.throw_line_));
-                else
-                    return shared_ptr<int const>();
+                return x.throw_line_!=-1 ? &x.throw_line_ : 0;
                 }
             };
 
-        template <class ErrorInfo>
+        template <class T,class R>
         struct
-        get_info
+        get_error_info_return_type
             {
-            static
-            shared_ptr<typename ErrorInfo::value_type const>
-            get( exception const & x )
-                {
-                if( exception_detail::error_info_container * c=x.data_.get() )
-                    if( shared_ptr<exception_detail::error_info_base const> eib = c->get(BOOST_EXCEPTION_STATIC_TYPEID(ErrorInfo)) )
-                        {
-#ifndef BOOST_NO_RTTI
-                        BOOST_ASSERT( 0!=dynamic_cast<ErrorInfo const *>(eib.get()) );
-#endif
-                        ErrorInfo const * w = static_cast<ErrorInfo const *>(eib.get());
-                        return shared_ptr<typename ErrorInfo::value_type const>(eib,&w->value());
-                        }
-                return shared_ptr<typename ErrorInfo::value_type const>();
-                }
+            typedef R * type;
+            };
+
+        template <class T,class R>
+        struct
+        get_error_info_return_type<T const,R>
+            {
+            typedef R const * type;
             };
         }
 
 #ifdef BOOST_NO_RTTI
     template <class ErrorInfo>
     inline
-    shared_ptr<typename ErrorInfo::value_type const>
+    typename ErrorInfo::value_type const *
     get_error_info( boost::exception const & x )
         {
         return exception_detail::get_info<ErrorInfo>::get(x);
         }
+    template <class ErrorInfo>
+    inline
+    typename ErrorInfo::value_type *
+    get_error_info( boost::exception & x )
+        {
+        return exception_detail::get_info<ErrorInfo>::get(x);
+        }
 #else
     template <class ErrorInfo,class E>
     inline
-    shared_ptr<typename ErrorInfo::value_type const>
-    get_error_info( E const & some_exception )
+    typename exception_detail::get_error_info_return_type<E,typename ErrorInfo::value_type>::type
+    get_error_info( E & some_exception )
         {
         if( exception const * x = dynamic_cast<exception const *>(&some_exception) )
             return exception_detail::get_info<ErrorInfo>::get(*x);
         else
-            return shared_ptr<typename ErrorInfo::value_type const>();
+            return 0;
         }
 #endif
     }
similarity index 77%
rename from deal.II/contrib/boost/include/boost/exception/info.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/info.hpp
index a0892c9c8420be233b794b9df20e962f15d8c2d8..c1b76c02cf61a7461dd104d4c1096c502d388f2e 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 namespace
 boost
     {
+    template <class Tag,class T>
+    inline
+    typename enable_if<has_to_string<T>,std::string>::type
+    to_string( error_info<Tag,T> const & x )
+        {
+        return to_string(x.value());
+        }
+
     template <class Tag,class T>
     inline
     error_info<Tag,T>::
@@ -45,7 +53,7 @@ boost
     error_info<Tag,T>::
     value_as_string() const
         {
-        return to_string_stub(value_);
+        return to_string_stub(*this);
         }
 
     namespace
@@ -67,44 +75,42 @@ boost
                 }
 
             void
-            set( shared_ptr<error_info_base const> const & x, type_info_ const & typeid_ )
+            set( shared_ptr<error_info_base> const & x, type_info_ const & typeid_ )
                 {
                 BOOST_ASSERT(x);
                 info_[typeid_] = x;
                 diagnostic_info_str_.clear();
                 }
 
-            shared_ptr<error_info_base const>
+            shared_ptr<error_info_base>
             get( type_info_ const & ti ) const
                 {
                 error_info_map::const_iterator i=info_.find(ti);
                 if( info_.end()!=i )
                     {
-                    shared_ptr<error_info_base const> const & p = i->second;
+                    shared_ptr<error_info_base> const & p = i->second;
 #ifndef BOOST_NO_RTTI
                     BOOST_ASSERT( BOOST_EXCEPTION_DYNAMIC_TYPEID(*p)==ti );
 #endif
                     return p;
                     }
-                return shared_ptr<error_info_base const>();
+                return shared_ptr<error_info_base>();
                 }
 
             char const *
-            diagnostic_information() const
+            diagnostic_information( char const * header ) const
                 {
-                if( diagnostic_info_str_.empty() )
+                if( header )
                     {
-                    std::string tmp;
+                    BOOST_ASSERT(*header!=0);
+                    std::ostringstream tmp;
+                    tmp << header;
                     for( error_info_map::const_iterator i=info_.begin(),end=info_.end(); i!=end; ++i )
                         {
                         shared_ptr<error_info_base const> const & x = i->second;
-                        tmp += '[';
-                        tmp += x->tag_typeid_name();
-                        tmp += "] = ";
-                        tmp += x->value_as_string();
-                        tmp += '\n';
+                        tmp << '[' << x->tag_typeid_name() << "] = " << x->value_as_string() << '\n';
                         }
-                    diagnostic_info_str_.swap(tmp);
+                    tmp.str().swap(diagnostic_info_str_);
                     }
                 return diagnostic_info_str_.c_str();
                 }
@@ -113,7 +119,7 @@ boost
 
             friend class boost::exception;
 
-            typedef std::map< type_info_, shared_ptr<error_info_base const> > error_info_map;
+            typedef std::map< type_info_, shared_ptr<error_info_base> > error_info_map;
             error_info_map info_;
             mutable std::string diagnostic_info_str_;
             mutable int count_;
similarity index 96%
rename from deal.II/contrib/boost/include/boost/exception/info_tuple.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/info_tuple.hpp
index 3c8197a7e3fb742fdcede6157473cc8005b3babe..38b2512626831c70e100062dd259ad6eea534491 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 96%
rename from deal.II/contrib/boost/include/boost/exception/to_string.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/to_string.hpp
index e10cbfdebc8bc33aa1646a778c7c332ddcc77dcc..5d88efa4676a007e3f30cae7fdd4b93ee440d3ff 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/exception/to_string_stub.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception/to_string_stub.hpp
index 1cd08bbc8f03658f8fa96366fdaaaa0f5853b84b..4b7028144fc422ac371163bb6624ff89d328cd41 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
similarity index 67%
rename from deal.II/contrib/boost/include/boost/exception_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/exception_ptr.hpp
index 196329d2543b8b5d3bed2c579c13f353227a7ae2..91dce257c07daef82770ee14fe8e40221f6d3d7d 100644 (file)
@@ -1,4 +1,4 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
+//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
 
 //Distributed under the Boost Software License, Version 1.0. (See accompanying
 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -6,21 +6,40 @@
 #ifndef UUID_FA5836A2CADA11DC8CD47C8555D89593
 #define UUID_FA5836A2CADA11DC8CD47C8555D89593
 
+#include <boost/config.hpp>
+#ifdef BOOST_NO_EXCEPTIONS
+#error This header requires exception handling to be enabled.
+#endif
 #include <boost/exception/exception.hpp>
+#include <boost/exception/info.hpp>
+#include <boost/exception/diagnostic_information.hpp>
 #include <boost/exception/detail/type_info.hpp>
 #include <boost/shared_ptr.hpp>
 #include <stdexcept>
 #include <new>
+#include <ios>
 
 namespace
 boost
     {
+#ifndef BOOST_NO_RTTI
+    typedef error_info<struct tag_original_exception_type,std::type_info const *> original_exception_type;
+
+    inline
+    std::string
+    to_string( original_exception_type const & x )
+        {
+        return x.value()->name();
+        }
+#endif
+
     class exception_ptr;
     exception_ptr current_exception();
     void rethrow_exception( exception_ptr const & );
 
     class
-    exception_ptr
+    exception_ptr:
+        public exception_detail::exception_ptr_base
         {
         typedef bool exception_ptr::*unspecified_bool_type;
         friend exception_ptr current_exception();
@@ -48,6 +67,22 @@ boost
             BOOST_ASSERT(c);
             }
 
+        void
+        _rethrow() const
+            {
+            BOOST_ASSERT(*this);
+            if( bad_alloc_ )
+                throw enable_current_exception(std::bad_alloc());
+            else
+                c_->rethrow();
+            }
+
+        bool
+        _empty() const
+            {
+            return !bad_alloc_ && !c_;
+            }
+
         public:
 
         exception_ptr():
@@ -57,7 +92,7 @@ boost
 
         operator unspecified_bool_type() const
             {
-            return (bad_alloc_ || c_) ? &exception_ptr::bad_alloc_ : 0;
+            return _empty() ? 0 : &exception_ptr::bad_alloc_;
             }
 
         friend
@@ -87,10 +122,17 @@ boost
             {
             }
 
+        explicit
+        unknown_exception( std::exception const & e )
+            {
+            add_original_type(e);
+            }
+
         explicit
         unknown_exception( boost::exception const & e ):
             boost::exception(e)
             {
+            add_original_type(e);
             }
 
         ~unknown_exception() throw()
@@ -99,7 +141,7 @@ boost
 
         private:
 
-               exception_detail::clone_base const *
+        exception_detail::clone_base const *
         clone() const
             {
             return new unknown_exception(*this);
@@ -110,6 +152,15 @@ boost
             {
             throw*this;
             }
+
+        template <class E>
+        void
+        add_original_type( E const & e )
+            {
+#ifndef BOOST_NO_RTTI
+            (*this) << original_exception_type(&typeid(e));
+#endif
+            }
         };
 
     namespace
@@ -128,12 +179,14 @@ boost
             current_exception_std_exception_wrapper( T const & e1 ):
                 T(e1)
                 {
+                add_original_type(e1);
                 }
 
             current_exception_std_exception_wrapper( T const & e1, boost::exception const & e2 ):
                 T(e1),
                 boost::exception(e2)
                 {
+                add_original_type(e1);
                 }
 
             ~current_exception_std_exception_wrapper() throw()
@@ -153,6 +206,15 @@ boost
                 {
                 throw *this;
                 }
+
+            template <class E>
+            void
+            add_original_type( E const & e )
+                {
+#ifndef BOOST_NO_RTTI
+                (*this) << original_exception_type(&typeid(e));
+#endif
+                }
             };
 
 #ifdef BOOST_NO_RTTI
@@ -189,23 +251,23 @@ boost
         current_exception_std_exception( T const & e1 )
             {
             if( boost::exception const * e2 = get_boost_exception(&e1) )
-                return shared_ptr<clone_base const>(new current_exception_std_exception_wrapper<T>(e1,*e2));
+                return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1,*e2));
             else
-                return shared_ptr<clone_base const>(new current_exception_std_exception_wrapper<T>(e1));
+                return shared_ptr<current_exception_std_exception_wrapper<T> const>(new current_exception_std_exception_wrapper<T>(e1));
             }
 
         inline
         shared_ptr<clone_base const>
         current_exception_unknown_exception()
             {
-            return shared_ptr<clone_base const>(new unknown_exception());
+            return shared_ptr<unknown_exception const>(new unknown_exception());
             }
 
         inline
         shared_ptr<clone_base const>
         current_exception_unknown_boost_exception( boost::exception const & e )
             {
-            return shared_ptr<clone_base const>(new unknown_exception(e));
+            return shared_ptr<unknown_exception const>(new unknown_exception(e));
             }
 
         inline
@@ -215,7 +277,7 @@ boost
             if( boost::exception const * be = get_boost_exception(&e) )
                 return current_exception_unknown_boost_exception(*be);
             else
-                return current_exception_unknown_exception();
+                return shared_ptr<unknown_exception const>(new unknown_exception(e));
             }
 
         inline
@@ -232,11 +294,21 @@ boost
                 return shared_ptr<exception_detail::clone_base const>(e.clone());
                 }
             catch(
+            std::domain_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
             std::invalid_argument & e )
                 {
                 return exception_detail::current_exception_std_exception(e);
                 }
             catch(
+            std::length_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
             std::out_of_range & e )
                 {
                 return exception_detail::current_exception_std_exception(e);
@@ -247,6 +319,31 @@ boost
                 return exception_detail::current_exception_std_exception(e);
                 }
             catch(
+            std::range_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
+            std::overflow_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
+            std::underflow_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
+            std::ios_base::failure & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
+            std::runtime_error & e )
+                {
+                return exception_detail::current_exception_std_exception(e);
+                }
+            catch(
             std::bad_alloc & e )
                 {
                 return exception_detail::current_exception_std_exception(e);
@@ -338,11 +435,26 @@ boost
     void
     rethrow_exception( exception_ptr const & p )
         {
-        BOOST_ASSERT(p);
-        if( p.bad_alloc_ )
-            throw enable_current_exception(std::bad_alloc());
-        else
-            p.c_->rethrow();
+        p._rethrow();
+        }
+
+    inline
+    std::string
+    to_string( exception_ptr const & p )
+        {
+        std::string s='\n'+diagnostic_information(p);
+        std::string padding("  ");
+        std::string r;
+        bool f=false;
+        for( std::string::const_iterator i=s.begin(),e=s.end(); i!=e; ++i )
+            {
+            if( f )
+                r+=padding;
+            char c=*i;
+            r+=c;
+            f=(c=='\n');
+            }
+        return r;
         }
     }
 
similarity index 91%
rename from deal.II/contrib/boost/include/boost/foreach.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/foreach.hpp
index 86f8f9cb85e8a83794254c0f8b124a07c37bdb7b..9a5b931bcb2222e9772ad13d5db2992978b024a5 100644 (file)
@@ -50,7 +50,7 @@
 # if defined(BOOST_FOREACH_NO_RVALUE_DETECTION)                                                 \
   || defined(BOOST_NO_SFINAE)                                                                   \
   || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400))                                        \
-  || BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 810)                                                  \
+  || BOOST_WORKAROUND(BOOST_INTEL_WIN, BOOST_TESTED_AT(1400))                                   \
   || BOOST_WORKAROUND(__GNUC__, < 3)                                                            \
   || (BOOST_WORKAROUND(__GNUC__, == 3) && (__GNUC_MINOR__ <= 2))                                \
   || (BOOST_WORKAROUND(__GNUC__, == 3) && (__GNUC_MINOR__ <= 3) && defined(__APPLE_CC__))       \
@@ -218,8 +218,8 @@ inline boost::mpl::or_<Bool1, Bool2> *or_(Bool1 *, Bool2 *) { return 0; }
 template<typename Bool1, typename Bool2, typename Bool3>
 inline boost::mpl::or_<Bool1, Bool2, Bool3> *or_(Bool1 *, Bool2 *, Bool3 *) { return 0; }
 
-template<typename Bool>
-inline boost::mpl::not_<Bool> *not_(Bool *) { return 0; }
+template<typename Bool1>
+inline boost::mpl::not_<Bool1> *not_(Bool1 *) { return 0; }
 
 template<typename T>
 inline boost::mpl::false_ *is_rvalue_(T &, int) { return 0; }
@@ -868,6 +868,17 @@ rderef(auto_any_t cur, type2type<T, C> *)
 # define BOOST_FOREACH_SUPPRESS_WARNINGS()
 #endif
 
+///////////////////////////////////////////////////////////////////////////////
+// Define a macro for giving hidden variables a unique name. Not strictly
+// needed, but eliminates some warnings on some compilers.
+#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))
+// With some versions of MSVC, use of __LINE__ to create unique identifiers
+// can fail when the Edit-and-Continue debug flag is used.
+# define BOOST_FOREACH_ID(x) x
+#else
+# define BOOST_FOREACH_ID(x) BOOST_PP_CAT(x, __LINE__)
+#endif
+
 // A sneaky way to get the type of the collection without evaluating the expression
 #define BOOST_FOREACH_TYPEOF(COL)                                                               \
     (true ? 0 : boost::foreach_detail_::encode_type(COL, boost::foreach_detail_::is_const_(COL)))
@@ -912,11 +923,11 @@ rderef(auto_any_t cur, type2type<T, C> *)
 // Declare a variable to track the rvalue-ness of the collection expression
 # define BOOST_FOREACH_PREAMBLE()                                                               \
     BOOST_FOREACH_SUPPRESS_WARNINGS()                                                           \
-    if (bool _foreach_is_rvalue = false) {} else
+    if (bool BOOST_FOREACH_ID(_foreach_is_rvalue) = false) {} else
 
 // Evaluate the collection expression, and detect if it is an lvalue or and rvalue
 # define BOOST_FOREACH_EVALUATE(COL)                                                            \
-    (true ? boost::foreach_detail_::make_probe((COL), _foreach_is_rvalue) : (COL))
+    (true ? boost::foreach_detail_::make_probe((COL), BOOST_FOREACH_ID(_foreach_is_rvalue)) : (COL))
 
 // The rvalue/lvalue-ness of the collection expression is determined dynamically, unless
 // type type is an array or is noncopyable or is non-const, in which case we know it's an lvalue.
@@ -928,7 +939,7 @@ rderef(auto_any_t cur, type2type<T, C> *)
           , BOOST_FOREACH_IS_NONCOPYABLE(COL)                                                   \
           , boost::foreach_detail_::not_(boost::foreach_detail_::is_const_(COL)))               \
       , true ? 0 : BOOST_FOREACH_IS_LIGHTWEIGHT_PROXY(COL)                                      \
-      , &_foreach_is_rvalue))
+      , &BOOST_FOREACH_ID(_foreach_is_rvalue)))
 
 #elif !defined(BOOST_FOREACH_NO_RVALUE_DETECTION)
 ///////////////////////////////////////////////////////////////////////////////
@@ -976,58 +987,58 @@ rderef(auto_any_t cur, type2type<T, C> *)
 
 #define BOOST_FOREACH_BEGIN(COL)                                                                \
     boost::foreach_detail_::begin(                                                              \
-        _foreach_col                                                                            \
+        BOOST_FOREACH_ID(_foreach_col)                                                          \
       , BOOST_FOREACH_TYPEOF(COL)                                                               \
       , BOOST_FOREACH_SHOULD_COPY(COL))
 
 #define BOOST_FOREACH_END(COL)                                                                  \
     boost::foreach_detail_::end(                                                                \
-        _foreach_col                                                                            \
+        BOOST_FOREACH_ID(_foreach_col)                                                          \
       , BOOST_FOREACH_TYPEOF(COL)                                                               \
       , BOOST_FOREACH_SHOULD_COPY(COL))
 
 #define BOOST_FOREACH_DONE(COL)                                                                 \
     boost::foreach_detail_::done(                                                               \
-        _foreach_cur                                                                            \
-      , _foreach_end                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
+      , BOOST_FOREACH_ID(_foreach_end)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 #define BOOST_FOREACH_NEXT(COL)                                                                 \
     boost::foreach_detail_::next(                                                               \
-        _foreach_cur                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 #define BOOST_FOREACH_DEREF(COL)                                                                \
     boost::foreach_detail_::deref(                                                              \
-        _foreach_cur                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 #define BOOST_FOREACH_RBEGIN(COL)                                                               \
     boost::foreach_detail_::rbegin(                                                             \
-        _foreach_col                                                                            \
+        BOOST_FOREACH_ID(_foreach_col)                                                          \
       , BOOST_FOREACH_TYPEOF(COL)                                                               \
       , BOOST_FOREACH_SHOULD_COPY(COL))
 
 #define BOOST_FOREACH_REND(COL)                                                                 \
     boost::foreach_detail_::rend(                                                               \
-        _foreach_col                                                                            \
+        BOOST_FOREACH_ID(_foreach_col)                                                          \
       , BOOST_FOREACH_TYPEOF(COL)                                                               \
       , BOOST_FOREACH_SHOULD_COPY(COL))
 
 #define BOOST_FOREACH_RDONE(COL)                                                                \
     boost::foreach_detail_::rdone(                                                              \
-        _foreach_cur                                                                            \
-      , _foreach_end                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
+      , BOOST_FOREACH_ID(_foreach_end)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 #define BOOST_FOREACH_RNEXT(COL)                                                                \
     boost::foreach_detail_::rnext(                                                              \
-        _foreach_cur                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 #define BOOST_FOREACH_RDEREF(COL)                                                               \
     boost::foreach_detail_::rderef(                                                             \
-        _foreach_cur                                                                            \
+        BOOST_FOREACH_ID(_foreach_cur)                                                          \
       , BOOST_FOREACH_TYPEOF(COL))
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1056,16 +1067,16 @@ rderef(auto_any_t cur, type2type<T, C> *)
 //   BOOST_FOREACH(i, int_list)
 //       { ... }
 //
-#define BOOST_FOREACH(VAR, COL)                                                                 \
-    BOOST_FOREACH_PREAMBLE()                                                                    \
-    if (boost::foreach_detail_::auto_any_t _foreach_col = BOOST_FOREACH_CONTAIN(COL)) {} else   \
-    if (boost::foreach_detail_::auto_any_t _foreach_cur = BOOST_FOREACH_BEGIN(COL)) {} else     \
-    if (boost::foreach_detail_::auto_any_t _foreach_end = BOOST_FOREACH_END(COL)) {} else       \
-    for (bool _foreach_continue = true;                                                         \
-              _foreach_continue && !BOOST_FOREACH_DONE(COL);                                    \
-              _foreach_continue ? BOOST_FOREACH_NEXT(COL) : (void)0)                            \
-        if  (boost::foreach_detail_::set_false(_foreach_continue)) {} else                      \
-        for (VAR = BOOST_FOREACH_DEREF(COL); !_foreach_continue; _foreach_continue = true)
+#define BOOST_FOREACH(VAR, COL)                                                                                   \
+    BOOST_FOREACH_PREAMBLE()                                                                                      \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL)) {} else   \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_cur) = BOOST_FOREACH_BEGIN(COL)) {} else     \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_end) = BOOST_FOREACH_END(COL)) {} else       \
+    for (bool BOOST_FOREACH_ID(_foreach_continue) = true;                                                         \
+              BOOST_FOREACH_ID(_foreach_continue) && !BOOST_FOREACH_DONE(COL);                                    \
+              BOOST_FOREACH_ID(_foreach_continue) ? BOOST_FOREACH_NEXT(COL) : (void)0)                            \
+        if  (boost::foreach_detail_::set_false(BOOST_FOREACH_ID(_foreach_continue))) {} else                      \
+        for (VAR = BOOST_FOREACH_DEREF(COL); !BOOST_FOREACH_ID(_foreach_continue); BOOST_FOREACH_ID(_foreach_continue) = true)
 
 ///////////////////////////////////////////////////////////////////////////////
 // BOOST_REVERSE_FOREACH
@@ -1074,15 +1085,15 @@ rderef(auto_any_t cur, type2type<T, C> *)
 //   all other respects, BOOST_REVERSE_FOREACH is like
 //   BOOST_FOREACH.
 //
-#define BOOST_REVERSE_FOREACH(VAR, COL)                                                         \
-    BOOST_FOREACH_PREAMBLE()                                                                    \
-    if (boost::foreach_detail_::auto_any_t _foreach_col = BOOST_FOREACH_CONTAIN(COL)) {} else   \
-    if (boost::foreach_detail_::auto_any_t _foreach_cur = BOOST_FOREACH_RBEGIN(COL)) {} else    \
-    if (boost::foreach_detail_::auto_any_t _foreach_end = BOOST_FOREACH_REND(COL)) {} else      \
-    for (bool _foreach_continue = true;                                                         \
-              _foreach_continue && !BOOST_FOREACH_RDONE(COL);                                   \
-              _foreach_continue ? BOOST_FOREACH_RNEXT(COL) : (void)0)                           \
-        if  (boost::foreach_detail_::set_false(_foreach_continue)) {} else                      \
-        for (VAR = BOOST_FOREACH_RDEREF(COL); !_foreach_continue; _foreach_continue = true)
+#define BOOST_REVERSE_FOREACH(VAR, COL)                                                                           \
+    BOOST_FOREACH_PREAMBLE()                                                                                      \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL)) {} else   \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_cur) = BOOST_FOREACH_RBEGIN(COL)) {} else    \
+    if (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_end) = BOOST_FOREACH_REND(COL)) {} else      \
+    for (bool BOOST_FOREACH_ID(_foreach_continue) = true;                                                         \
+              BOOST_FOREACH_ID(_foreach_continue) && !BOOST_FOREACH_RDONE(COL);                                   \
+              BOOST_FOREACH_ID(_foreach_continue) ? BOOST_FOREACH_RNEXT(COL) : (void)0)                           \
+        if  (boost::foreach_detail_::set_false(BOOST_FOREACH_ID(_foreach_continue))) {} else                      \
+        for (VAR = BOOST_FOREACH_RDEREF(COL); !BOOST_FOREACH_ID(_foreach_continue); BOOST_FOREACH_ID(_foreach_continue) = true)
 
 #endif
similarity index 99%
rename from deal.II/contrib/boost/include/boost/format/format_implementation.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/format/format_implementation.hpp
index 28300e579f1a1e6027220907fef53c1194b0922b..9dd93a5acf3580ccfc38a411f5efdf003ca1cf0b 100644 (file)
@@ -37,7 +37,7 @@ namespace boost {
     template< class Ch, class Tr, class Alloc>
     basic_format<Ch, Tr, Alloc>:: basic_format(const Ch* s, const std::locale & loc)
         : style_(0), cur_arg_(0), num_args_(0), dumped_(false),
-          loc_(loc), exceptions_(io::all_error_bits)
+          exceptions_(io::all_error_bits), loc_(loc)
     {
         if(s) parse( s );
     }
@@ -45,7 +45,7 @@ namespace boost {
     template< class Ch, class Tr, class Alloc>
     basic_format<Ch, Tr, Alloc>:: basic_format(const string_type& s, const std::locale & loc)
         : style_(0), cur_arg_(0), num_args_(0), dumped_(false),
-          loc_(loc), exceptions_(io::all_error_bits)
+          exceptions_(io::all_error_bits), loc_(loc)
     {
         parse(s);  
     }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/format/parsing.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/format/parsing.hpp
index 7f1bfc883fb6342537fe9e6a5c4b26695a9f7443..b14ca82c984699c12fa0dcdb4a8285609aedc85c 100644 (file)
@@ -48,6 +48,7 @@ namespace detail {
 #if ! defined( BOOST_NO_LOCALE_ISDIGIT )
         return fac.is(std::ctype<Ch>::digit, c);
 # else
+        (void) fac;     // remove "unused parameter" warning
         using namespace std;
         return isdigit(c); 
 #endif 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/function/function_base.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function/function_base.hpp
index 6612fb8415229eae7d98c87dc780c47716f13b3e..c4663c35a873f168995c4cdf79a2f48e48e668aa 100644 (file)
@@ -18,6 +18,9 @@
 #include <typeinfo>
 #include <boost/config.hpp>
 #include <boost/assert.hpp>
+#include <boost/integer.hpp>
+#include <boost/type_traits/has_trivial_copy.hpp>
+#include <boost/type_traits/has_trivial_destructor.hpp>
 #include <boost/type_traits/is_const.hpp>
 #include <boost/type_traits/is_integral.hpp>
 #include <boost/type_traits/is_volatile.hpp>
@@ -42,7 +45,7 @@
 #endif       
 
 // Define BOOST_FUNCTION_STD_NS to the namespace that contains type_info.
-#ifdef BOOST_NO_EXCEPTION_STD_NAMESPACE
+#ifdef BOOST_NO_STD_TYPEINFO
 // Embedded VC++ does not have type_info in namespace std
 #  define BOOST_FUNCTION_STD_NS
 #else
@@ -259,6 +262,12 @@ namespace boost {
           A(a)
         {
         }
+       
+       functor_wrapper(const functor_wrapper& f) :
+          F(static_cast<const F&>(f)),
+          A(static_cast<const A&>(f))
+       {
+       }
       };
 
       /**
@@ -625,7 +634,7 @@ public:
     if (!vtable) return typeid(void);
 
     detail::function::function_buffer type;
-    vtable->manager(functor, type, detail::function::get_functor_type_tag);
+    get_vtable()->manager(functor, type, detail::function::get_functor_type_tag);
     return *type.type.type;
   }
 
@@ -638,7 +647,7 @@ public:
       type_result.type.type = &typeid(Functor);
       type_result.type.const_qualified = is_const<Functor>::value;
       type_result.type.volatile_qualified = is_volatile<Functor>::value;
-      vtable->manager(functor, type_result, 
+      get_vtable()->manager(functor, type_result, 
                       detail::function::check_functor_type_tag);
       return static_cast<Functor*>(type_result.obj_ptr);
     }
@@ -656,7 +665,7 @@ public:
       type_result.type.type = &typeid(Functor);
       type_result.type.const_qualified = true;
       type_result.type.volatile_qualified = is_volatile<Functor>::value;
-      vtable->manager(functor, type_result, 
+      get_vtable()->manager(functor, type_result, 
                       detail::function::check_functor_type_tag);
       // GCC 2.95.3 gets the CV qualifiers wrong here, so we
       // can't do the static_cast that we should do.
@@ -702,6 +711,15 @@ public:
 #endif
 
 public: // should be protected, but GCC 2.95.3 will fail to allow access
+  detail::function::vtable_base* get_vtable() const {
+    return reinterpret_cast<detail::function::vtable_base*>(
+             reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
+  }
+
+  bool has_trivial_copy_and_destroy() const {
+    return reinterpret_cast<std::size_t>(vtable) & 0x01;
+  }
+
   detail::function::vtable_base* vtable;
   mutable detail::function::function_buffer functor;
 };
@@ -877,4 +895,8 @@ namespace detail {
 #undef BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL
 #undef BOOST_FUNCTION_COMPARE_TYPE_ID
 
+#if defined(BOOST_MSVC)
+#   pragma warning( pop )
+#endif       
+
 #endif // BOOST_FUNCTION_BASE_HEADER
similarity index 96%
rename from deal.II/contrib/boost/include/boost/function/function_fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function/function_fwd.hpp
index d2f713a5dcd41931f531dc9efc7f1bce4eaaf840..fb318c990af4b5b5d0b0558b609b8f2928c0500b 100644 (file)
@@ -21,7 +21,7 @@ namespace boost { namespace python { namespace objects {
 
 #if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)                    \
  || defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG)                         \
- || !(BOOST_STRICT_CONFIG || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
+ || !(defined(BOOST_STRICT_CONFIG) || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
 #  define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX
 #endif
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/function/function_template.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function/function_template.hpp
index 584abe96ba17a54964a9c2353a140648e60c3586..6a99109ab12737141a0960281afa51bd952ecc5d 100644 (file)
@@ -11,6 +11,7 @@
 // Note: this header is a header template and must NOT have multiple-inclusion
 // protection.
 #include <boost/function/detail/prologue.hpp>
+#include <boost/detail/no_exceptions_support.hpp>
 
 #if defined(BOOST_MSVC)
 #   pragma warning( push )
@@ -624,14 +625,10 @@ namespace boost {
         assign_to(const reference_wrapper<FunctionObj>& f, 
                   function_buffer& functor, function_obj_ref_tag)
         {
-          if (!boost::detail::function::has_empty_target(f.get_pointer())) {
-            functor.obj_ref.obj_ptr = (void *)f.get_pointer();
-            functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
-            functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
-            return true;
-          } else {
-            return false;
-          }
+          functor.obj_ref.obj_ptr = (void *)f.get_pointer();
+          functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
+          functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
+          return true;
         }
         template<typename FunctionObj,typename Allocator>
         bool 
@@ -678,6 +675,11 @@ namespace boost {
               R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
       vtable_type;
 
+    vtable_type* get_vtable() const {
+      return reinterpret_cast<vtable_type*>(
+               reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
+    }
+
     struct clear_type {};
 
   public:
@@ -757,7 +759,7 @@ namespace boost {
       if (this->empty())
         boost::throw_exception(bad_function_call());
 
-      return static_cast<vtable_type*>(vtable)->invoker
+      return get_vtable()->invoker
                (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
     }
 #else
@@ -781,24 +783,26 @@ namespace boost {
     operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
     {
       this->clear();
-      try {
+      BOOST_TRY  {
         this->assign_to(f);
-      } catch (...) {
+      } BOOST_CATCH (...) {
         vtable = 0;
-        throw;
+        BOOST_RETHROW;
       }
+      BOOST_CATCH_END
       return *this;
     }
     template<typename Functor,typename Allocator>
     void assign(Functor BOOST_FUNCTION_TARGET_FIX(const &) f, Allocator a)
     {
       this->clear();
-      try {
+      BOOST_TRY{
         this->assign_to_a(f,a);
-      } catch (...) {
+      } BOOST_CATCH (...) {
         vtable = 0;
-        throw;
+        BOOST_RETHROW;
       }
+      BOOST_CATCH_END
     }
 
 #ifndef BOOST_NO_SFINAE
@@ -823,12 +827,13 @@ namespace boost {
         return *this;
 
       this->clear();
-      try {
+      BOOST_TRY {
         this->assign_to_own(f);
-      } catch (...) {
+      } BOOST_CATCH (...) {
         vtable = 0;
-        throw;
+        BOOST_RETHROW;
       }
+      BOOST_CATCH_END
       return *this;
     }
 
@@ -847,7 +852,8 @@ namespace boost {
     void clear()
     {
       if (vtable) {
-        reinterpret_cast<vtable_type*>(vtable)->clear(this->functor);
+        if (!this->has_trivial_copy_and_destroy())
+          get_vtable()->clear(this->functor);
         vtable = 0;
       }
     }
@@ -876,8 +882,11 @@ namespace boost {
     {
       if (!f.empty()) {
         this->vtable = f.vtable;
-        f.vtable->manager(f.functor, this->functor,
-                          boost::detail::function::clone_functor_tag);
+        if (this->has_trivial_copy_and_destroy())
+          this->functor = f.functor;
+        else
+          get_vtable()->base.manager(f.functor, this->functor,
+                                     boost::detail::function::clone_functor_tag);
       }
     }
 
@@ -903,8 +912,15 @@ namespace boost {
       static vtable_type stored_vtable = 
         { { &manager_type::manage }, &invoker_type::invoke };
 
-      if (stored_vtable.assign_to(f, functor)) vtable = &stored_vtable.base;
-      else vtable = 0;
+      if (stored_vtable.assign_to(f, functor)) {
+        std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+        if (boost::has_trivial_copy_constructor<Functor>::value &&
+            boost::has_trivial_destructor<Functor>::value &&
+            detail::function::function_allows_small_object_optimization<Functor>::value)
+          value |= (std::size_t)0x01;
+        vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+      } else 
+        vtable = 0;
     }
 
     template<typename Functor,typename Allocator>
@@ -930,8 +946,15 @@ namespace boost {
       static vtable_type stored_vtable =
         { { &manager_type::manage }, &invoker_type::invoke };
 
-      if (stored_vtable.assign_to_a(f, functor, a)) vtable = &stored_vtable.base;
-      else vtable = 0;
+      if (stored_vtable.assign_to_a(f, functor, a)) { 
+        std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base);
+        if (boost::has_trivial_copy_constructor<Functor>::value &&
+            boost::has_trivial_destructor<Functor>::value &&
+            detail::function::function_allows_small_object_optimization<Functor>::value)
+          value |= (std::size_t)0x01;
+        vtable = reinterpret_cast<detail::function::vtable_base *>(value);
+      } else 
+        vtable = 0;
     }
 
     // Moves the value from the specified argument to *this. If the argument 
@@ -942,23 +965,23 @@ namespace boost {
       if (&f == this)
         return;
 
-#if !defined(BOOST_NO_EXCEPTIONS)      
-      try {
-#endif
+      BOOST_TRY {
         if (!f.empty()) {
           this->vtable = f.vtable;
-          f.vtable->manager(f.functor, this->functor,
-                            boost::detail::function::move_functor_tag);
-                 f.vtable = 0;
-#if !defined(BOOST_NO_EXCEPTIONS)      
+          if (this->has_trivial_copy_and_destroy())
+            this->functor = f.functor;
+          else
+            get_vtable()->base.manager(f.functor, this->functor,
+                                     boost::detail::function::move_functor_tag);
+          f.vtable = 0;
         } else {
           clear();
         }
-      } catch (...) {
+      } BOOST_CATCH (...) {
         vtable = 0;
-        throw;
+        BOOST_RETHROW;
       }
-#endif
+      BOOST_CATCH_END
     }
   };
 
@@ -979,13 +1002,14 @@ namespace boost {
   template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
   typename BOOST_FUNCTION_FUNCTION<
       R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>::result_type
-   BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
+  inline 
+  BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
   ::operator()(BOOST_FUNCTION_PARMS) const
   {
     if (this->empty())
       boost::throw_exception(bad_function_call());
 
-    return reinterpret_cast<const vtable_type*>(vtable)->invoker
+    return get_vtable()->invoker
              (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
   }
 #endif
similarity index 94%
rename from deal.II/contrib/boost/include/boost/function_types/detail/pp_retag_default_cc/master.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_retag_default_cc/master.hpp
index f97d385ed7a93b942e0261bc8b9a820af8ebe519..865efce519c9555042dd0a9fd0fe649e30cf1056 100644 (file)
@@ -30,8 +30,8 @@ namespace detail
 #   include BOOST_PP_ASSIGN_SLOT(1)
 
     BOOST_STATIC_CONSTANT(bits_t, value = (
-        ::boost::function_types::detail::bits<Tag>::value & BOOST_FT_default_cc 
-      | ::boost::function_types::detail::bits<RefTag>::value & BOOST_PP_SLOT(1)
+        (::boost::function_types::detail::bits<Tag>::value & BOOST_FT_default_cc) 
+      | (::boost::function_types::detail::bits<RefTag>::value & BOOST_PP_SLOT(1))
     ));
   };
 
similarity index 92%
rename from deal.II/contrib/boost/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_retag_default_cc/preprocessed.hpp
index c21a4fd2bd0c0c2f3b52036400a8e2d77220dc5c..72666d0f277b48856f6c9bce7cecf2e9874ba3b0 100644 (file)
@@ -15,8 +15,8 @@ namespace detail
 template<class Tag, class RefTag> struct selector_bits
 {
 BOOST_STATIC_CONSTANT(bits_t, value = (
-::boost::function_types::detail::bits<Tag> ::value & 0x00008000 
-| ::boost::function_types::detail::bits<RefTag> ::value & 802
+(::boost::function_types::detail::bits<Tag> ::value & 0x00008000) 
+| (::boost::function_types::detail::bits<RefTag> ::value & 802)
 ));
 };
 template<bits_t SelectorBits> struct default_cc_tag; 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/function_types/detail/pp_tags/master.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_tags/master.hpp
index 783b93cdf7120ad8579798f686c7a3eb10f7f96b..9cce212fcd65ff39fbd1c5a32bf2eee9d7de73b5 100644 (file)
@@ -82,7 +82,7 @@ namespace detail {
     );
 
     BOOST_STATIC_CONSTANT(bits_t, combined_bits = 
-      LHS_bits & ~RHS_mask | RHS_bits
+      (LHS_bits & ~RHS_mask) | RHS_bits
     );
 
     BOOST_STATIC_CONSTANT(bits_t, combined_mask =
similarity index 98%
rename from deal.II/contrib/boost/include/boost/function_types/detail/pp_tags/preprocessed.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/function_types/detail/pp_tags/preprocessed.hpp
index 811d62a74dcb2cdd69ff6af31fed2270eff425f0..823c3cc1cdefe7f41470720ae6dc33cbc5ddbe73 100644 (file)
@@ -53,7 +53,7 @@ BOOST_STATIC_CONSTANT(bool, match =
 RHS_bits == (LHS_bits & RHS_mask & (RHS_bits | ~0x000000ff))
 );
 BOOST_STATIC_CONSTANT(bits_t, combined_bits = 
-LHS_bits & ~RHS_mask | RHS_bits
+(LHS_bits & ~RHS_mask) | RHS_bits
 );
 BOOST_STATIC_CONSTANT(bits_t, combined_mask =
 LHS_mask | RHS_mask
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/detail/container_fwd.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/detail/container_fwd.hpp
new file mode 100644 (file)
index 0000000..9a69d15
--- /dev/null
@@ -0,0 +1,19 @@
+
+// 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)
+
+// Forwarding header for container_fwd.hpp's new location.
+// This header is deprecated, I'll be adding a warning in a future release,
+// then converting it to an error and finally removing this header completely.
+
+#if !defined(BOOST_FUNCTIONAL_DETAIL_CONTAINER_FWD_HPP)
+#define BOOST_FUNCTIONAL_DETAIL_CONTAINER_FWD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/detail/container_fwd.hpp>
+
+#endif
similarity index 55%
rename from deal.II/contrib/boost/include/boost/functional/hash.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/functional/hash.hpp
index 46b611b3f5d8e053e9a70e37c5de15acb7f3adb0..44983f19b2670e932f8ad94b4a27386b5a567e4f 100644 (file)
@@ -1,11 +1,7 @@
 
-// Copyright 2005-2008 Daniel James.
+// 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)
 
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
 #include <boost/functional/hash/hash.hpp>
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/float_functions.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/float_functions.hpp
new file mode 100644 (file)
index 0000000..01cac09
--- /dev/null
@@ -0,0 +1,246 @@
+
+// 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(BOOST_FUNCTIONAL_HASH_DETAIL_FLOAT_FUNCTIONS_HPP)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_FLOAT_FUNCTIONS_HPP
+
+#include <boost/config.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// The C++ standard requires that the C float functions are overloarded
+// for float, double and long double in the std namespace, but some of the older
+// library implementations don't support this. On some that don't, the C99
+// float functions (frexpf, frexpl, etc.) are available.
+//
+// The following tries to automatically detect which are available.
+
+namespace boost {
+    namespace hash_detail {
+
+        // Returned by dummy versions of the float functions.
+    
+        struct not_found {
+            // Implicitly convertible to float and long double in order to avoid
+            // a compile error when the dummy float functions are used.
+
+            inline operator float() const { return 0; }
+            inline operator long double() const { return 0; }
+        };
+          
+        // A type for detecting the return type of functions.
+
+        template <typename T> struct is;
+        template <> struct is<float> { char x[10]; };
+        template <> struct is<double> { char x[20]; };
+        template <> struct is<long double> { char x[30]; };
+        template <> struct is<boost::hash_detail::not_found> { char x[40]; };
+            
+        // Used to convert the return type of a function to a type for sizeof.
+
+        template <typename T> is<T> float_type(T);
+
+        // call_ldexp
+        //
+        // This will get specialized for float and long double
+        
+        template <typename Float> struct call_ldexp
+        {
+            typedef double float_type;
+            
+            inline double operator()(double a, int b) const
+            {
+                using namespace std;
+                return ldexp(a, b);
+            }
+        };
+
+        // call_frexp
+        //
+        // This will get specialized for float and long double
+
+        template <typename Float> struct call_frexp
+        {
+            typedef double float_type;
+            
+            inline double operator()(double a, int* b) const
+            {
+                using namespace std;
+                return frexp(a, b);
+            }
+        };
+    }
+}
+            
+// A namespace for dummy functions to detect when the actual function we want
+// isn't available. ldexpl, ldexpf etc. might be added tby the macros below.
+//
+// AFAICT these have to be outside of the boost namespace, as if they're in
+// the boost namespace they'll always be preferable to any other function
+// (since the arguments are built in types, ADL can't be used).
+
+namespace BOOST_HASH_DETECT_FLOAT_FUNCTIONS {
+    template <class Float> boost::hash_detail::not_found ldexp(Float, int);
+    template <class Float> boost::hash_detail::not_found frexp(Float, int*);    
+}
+
+// Macros for generating specializations of call_ldexp and call_frexp.
+//
+// check_cpp and check_c99 check if the C++ or C99 functions are available.
+//
+// Then the call_* functions select an appropriate implementation.
+//
+// I used c99_func in a few places just to get a unique name.
+//
+// Important: when using 'using namespace' at namespace level, include as
+// little as possible in that namespace, as Visual C++ has an odd bug which
+// can cause the namespace to be imported at the global level. This seems to
+// happen mainly when there's a template in the same namesapce.
+
+#define BOOST_HASH_CALL_FLOAT_FUNC(cpp_func, c99_func, type1, type2)    \
+namespace BOOST_HASH_DETECT_FLOAT_FUNCTIONS {                           \
+    template <class Float>                                              \
+    boost::hash_detail::not_found c99_func(Float, type2);               \
+}                                                                       \
+                                                                        \
+namespace boost {                                                       \
+    namespace hash_detail {                                             \
+        namespace c99_func##_detect {                                   \
+            using namespace std;                                        \
+            using namespace BOOST_HASH_DETECT_FLOAT_FUNCTIONS;          \
+                                                                        \
+            struct check {                                              \
+                static type1 x;                                         \
+                static type2 y;                                         \
+                BOOST_STATIC_CONSTANT(bool, cpp =                       \
+                    sizeof(float_type(cpp_func(x,y)))                   \
+                        == sizeof(is<type1>));                          \
+                BOOST_STATIC_CONSTANT(bool, c99 =                       \
+                    sizeof(float_type(c99_func(x,y)))                   \
+                        == sizeof(is<type1>));                          \
+            };                                                          \
+        }                                                               \
+                                                                        \
+        template <bool x>                                               \
+        struct call_c99_##c99_func :                                    \
+            boost::hash_detail::call_##cpp_func<double> {};             \
+                                                                        \
+        template <>                                                     \
+        struct call_c99_##c99_func<true> {                              \
+            typedef type1 float_type;                                   \
+                                                                        \
+            template <typename T>                                       \
+            inline type1 operator()(type1 a, T b)  const                \
+            {                                                           \
+                using namespace std;                                    \
+                return c99_func(a, b);                                  \
+            }                                                           \
+        };                                                              \
+                                                                        \
+        template <bool x>                                               \
+        struct call_cpp_##c99_func :                                    \
+            call_c99_##c99_func<                                        \
+                ::boost::hash_detail::c99_func##_detect::check::c99     \
+            > {};                                                       \
+                                                                        \
+        template <>                                                     \
+        struct call_cpp_##c99_func<true> {                              \
+            typedef type1 float_type;                                   \
+                                                                        \
+            template <typename T>                                       \
+            inline type1 operator()(type1 a, T b)  const                \
+            {                                                           \
+                using namespace std;                                    \
+                return cpp_func(a, b);                                  \
+            }                                                           \
+        };                                                              \
+                                                                        \
+        template <>                                                     \
+        struct call_##cpp_func<type1> :                                 \
+            call_cpp_##c99_func<                                        \
+                ::boost::hash_detail::c99_func##_detect::check::cpp     \
+            > {};                                                       \
+    }                                                                   \
+}
+
+#define BOOST_HASH_CALL_FLOAT_MACRO(cpp_func, c99_func, type1, type2)   \
+namespace boost {                                                       \
+    namespace hash_detail {                                             \
+                                                                        \
+        template <>                                                     \
+        struct call_##cpp_func<type1> {                                 \
+            typedef type1 float_type;                                   \
+            inline type1 operator()(type1 x, type2 y) const {           \
+                return c99_func(x, y);                                  \
+            }                                                           \
+        };                                                              \
+    }                                                                   \
+}
+
+#if defined(ldexpf)
+BOOST_HASH_CALL_FLOAT_MACRO(ldexp, ldexpf, float, int)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(ldexp, ldexpf, float, int)
+#endif
+
+#if defined(ldexpl)
+BOOST_HASH_CALL_FLOAT_MACRO(ldexp, ldexpl, long double, int)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(ldexp, ldexpl, long double, int)
+#endif
+
+#if defined(frexpf)
+BOOST_HASH_CALL_FLOAT_MACRO(frexp, frexpf, float, int*)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(frexp, frexpf, float, int*)
+#endif
+
+#if defined(frexpl)
+BOOST_HASH_CALL_FLOAT_MACRO(frexp, frexpl, long double, int*)
+#else
+BOOST_HASH_CALL_FLOAT_FUNC(frexp, frexpl, long double, int*)
+#endif
+
+#undef BOOST_HASH_CALL_FLOAT_MACRO
+#undef BOOST_HASH_CALL_FLOAT_FUNC
+
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <typename Float1, typename Float2>
+        struct select_hash_type_impl {
+            typedef double type;
+        };
+
+        template <>
+        struct select_hash_type_impl<float, float> {
+            typedef float type;
+        };
+
+        template <>
+        struct select_hash_type_impl<long double, long double> {
+            typedef long double type;
+        };
+
+
+        // select_hash_type
+        //
+        // If there is support for a particular floating point type, use that
+        // otherwise use double (there's always support for double).
+             
+        template <typename Float>
+        struct select_hash_type : select_hash_type_impl<
+                BOOST_DEDUCED_TYPENAME call_ldexp<Float>::float_type,
+                BOOST_DEDUCED_TYPENAME call_frexp<Float>::float_type
+            > {};            
+    }
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float.hpp
new file mode 100644 (file)
index 0000000..ea1bc25
--- /dev/null
@@ -0,0 +1,101 @@
+
+// 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(BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_HEADER
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+#include <boost/functional/hash/detail/float_functions.hpp>
+#include <boost/functional/hash/detail/limits.hpp>
+#include <boost/integer/static_log2.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+
+// Include hash implementation for the current platform.
+
+// Cygwn
+#if defined(__CYGWIN__)
+#  if defined(__i386__) || defined(_M_IX86)
+#    include <boost/functional/hash/detail/hash_float_x86.hpp>
+#  else
+#    include <boost/functional/hash/detail/hash_float_generic.hpp>
+#  endif
+#else
+#  include <boost/functional/hash/detail/hash_float_generic.hpp>
+#endif
+
+// Can we use fpclassify?
+
+// STLport
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define BOOST_HASH_USE_FPCLASSIFY 0
+
+// GNU libstdc++ 3
+#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
+#  if (defined(__USE_ISOC99) || defined(_GLIBCXX_USE_C99_MATH)) && \
+      !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
+#    define BOOST_HASH_USE_FPCLASSIFY 1
+#  else
+#    define BOOST_HASH_USE_FPCLASSIFY 0
+#  endif
+
+// Everything else
+#else
+#  define BOOST_HASH_USE_FPCLASSIFY 0
+#endif
+
+#if BOOST_HASH_USE_FPCLASSIFY
+
+#include <boost/config/no_tr1/cmath.hpp>
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        inline std::size_t float_hash_value(T v)
+        {
+            using namespace std;
+            switch (fpclassify(v)) {
+            case FP_ZERO:
+                return 0;
+            case FP_INFINITE:
+                return (std::size_t)(v > 0 ? -1 : -2);
+            case FP_NAN:
+                return (std::size_t)(-3);
+            case FP_NORMAL:
+            case FP_SUBNORMAL:
+                return float_hash_impl(v);
+            default:
+                BOOST_ASSERT(0);
+                return 0;
+            }
+        }
+    }
+}
+
+#else // !BOOST_HASH_USE_FPCLASSIFY
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        inline std::size_t float_hash_value(T v)
+        {
+            return v == 0 ? 0 : float_hash_impl(v);
+        }
+    }
+}
+
+#endif // BOOST_HASH_USE_FPCLASSIFY
+
+#undef BOOST_HASH_USE_FPCLASSIFY
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_generic.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_generic.hpp
new file mode 100644 (file)
index 0000000..f9acee9
--- /dev/null
@@ -0,0 +1,93 @@
+
+// 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)
+
+// A general purpose hash function for non-zero floating point values.
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_GENERIC_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_GENERIC_HEADER
+
+#include <boost/functional/hash/detail/float_functions.hpp>
+#include <boost/integer/static_log2.hpp>
+#include <boost/functional/hash/detail/limits.hpp>
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#if BOOST_MSVC >= 1400
+#pragma warning(disable:6294) // Ill-defined for-loop: initial condition does
+                              // not satisfy test. Loop body not executed 
+#endif
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        inline void hash_float_combine(std::size_t& seed, std::size_t value)
+        {
+            seed ^= value + (seed<<6) + (seed>>2);
+        }
+
+        template <class T>
+        inline std::size_t float_hash_impl2(T v)
+        {
+            boost::hash_detail::call_frexp<T> frexp;
+            boost::hash_detail::call_ldexp<T> ldexp;
+        
+            int exp = 0;
+
+            v = frexp(v, &exp);
+
+            // A postive value is easier to hash, so combine the
+            // sign with the exponent and use the absolute value.
+            if(v < 0) {
+                v = -v;
+                exp += limits<T>::max_exponent -
+                    limits<T>::min_exponent;
+            }
+
+            // The result of frexp is always between 0.5 and 1, so its
+            // top bit will always be 1. Subtract by 0.5 to remove that.
+            v -= T(0.5);
+            v = ldexp(v, limits<std::size_t>::digits + 1);
+            std::size_t seed = static_cast<std::size_t>(v);
+            v -= seed;
+
+            // ceiling(digits(T) * log2(radix(T))/ digits(size_t)) - 1;
+            std::size_t const length
+                = (limits<T>::digits *
+                        boost::static_log2<limits<T>::radix>::value - 1)
+                / limits<std::size_t>::digits;
+
+            for(std::size_t i = 0; i != length; ++i)
+            {
+                v = ldexp(v, limits<std::size_t>::digits);
+                std::size_t part = static_cast<std::size_t>(v);
+                v -= part;
+                hash_float_combine(seed, part);
+            }
+
+            hash_float_combine(seed, exp);
+
+            return seed;
+        }
+
+        template <class T>
+        inline std::size_t float_hash_impl(T v)
+        {
+            typedef BOOST_DEDUCED_TYPENAME select_hash_type<T>::type type;
+            return float_hash_impl2(static_cast<type>(v));
+        }
+    }
+}
+
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_x86.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/hash_float_x86.hpp
new file mode 100644 (file)
index 0000000..b39bb0d
--- /dev/null
@@ -0,0 +1,56 @@
+
+// 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)
+
+// A non-portable hash function form non-zero floats on x86.
+//
+// Even if you're on an x86 platform, this might not work if their floating
+// point isn't set up as this expects. So this should only be used if it's
+// absolutely certain that it will work.
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_X86_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_HASH_FLOAT_X86_HEADER
+
+#include <boost/cstdint.hpp>
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        inline void hash_float_combine(std::size_t& seed, std::size_t value)
+        {
+            seed ^= value + (seed<<6) + (seed>>2);
+        }
+
+        inline std::size_t float_hash_impl(float v)
+        {
+            boost::uint32_t* ptr = (boost::uint32_t*)&v;
+            std::size_t seed = *ptr;
+            return seed;
+        }
+
+        inline std::size_t float_hash_impl(double v)
+        {
+            boost::uint32_t* ptr = (boost::uint32_t*)&v;
+            std::size_t seed = *ptr++;
+            hash_float_combine(seed, *ptr);
+            return seed;
+        }
+
+        inline std::size_t float_hash_impl(long double v)
+        {
+            boost::uint32_t* ptr = (boost::uint32_t*)&v;
+            std::size_t seed = *ptr++;
+            hash_float_combine(seed, *ptr++);
+            hash_float_combine(seed, *(boost::uint16_t*)ptr);
+            return seed;
+        }
+    }
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/limits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash/detail/limits.hpp
new file mode 100644 (file)
index 0000000..f5b520e
--- /dev/null
@@ -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)
+//
+// On some platforms std::limits gives incorrect values for long double.
+// This tries to work around them.
+
+#if !defined(BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER)
+#define BOOST_FUNCTIONAL_HASH_DETAIL_LIMITS_HEADER
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/limits.hpp>
+
+// On OpenBSD, numeric_limits is not reliable for long doubles, but
+// the macros defined in <float.h> are and support long double when STLport
+// doesn't.
+
+#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
+#include <float.h>
+#endif
+
+namespace boost
+{
+    namespace hash_detail
+    {
+        template <class T>
+        struct limits : std::numeric_limits<T> {};
+
+#if defined(__OpenBSD__) || defined(_STLP_NO_LONG_DOUBLE)
+        template <>
+        struct limits<long double>
+             : std::numeric_limits<long double>
+        {
+            static long double epsilon() {
+                return LDBL_EPSILON;
+            }
+
+            static long double (max)() {
+                return LDBL_MAX;
+            }
+
+            static long double (min)() {
+                return LDBL_MIN;
+            }
+
+            BOOST_STATIC_CONSTANT(int, digits = LDBL_MANT_DIG);
+            BOOST_STATIC_CONSTANT(int, max_exponent = LDBL_MAX_EXP);
+            BOOST_STATIC_CONSTANT(int, min_exponent = LDBL_MIN_EXP);
+#if defined(_STLP_NO_LONG_DOUBLE)
+            BOOST_STATIC_CONSTANT(int, radix = FLT_RADIX);
+#endif
+        };
+#endif // __OpenBSD__
+    }
+}
+
+#endif
similarity index 59%
rename from deal.II/contrib/boost/include/boost/functional/hash/extensions.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/functional/hash/extensions.hpp
index b9d868e7a050a7cdcf0ababd033d23c899a96d84..3c587a3bf5de05c8e61bb95b75009480c3e2ea46 100644 (file)
@@ -1,5 +1,5 @@
 
-// Copyright 2005-2008 Daniel James.
+// 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)
 
 //  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
 //  issue 6.18. 
 
+// This implements the extensions to the standard.
+// It's undocumented, so you shouldn't use it....
+
 #if !defined(BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP)
 #define BOOST_FUNCTIONAL_HASH_EXTENSIONS_HPP
 
+#include <boost/functional/hash/hash.hpp>
+#include <boost/detail/container_fwd.hpp>
+
 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
 # pragma once
 #endif
 
+#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+#include <boost/type_traits/is_array.hpp>
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#include <boost/type_traits/is_const.hpp>
+#endif
+
 namespace boost
 {
+    template <class A, class B>
+    std::size_t hash_value(std::pair<A, B> const&);
+    template <class T, class A>
+    std::size_t hash_value(std::vector<T, A> const&);
+    template <class T, class A>
+    std::size_t hash_value(std::list<T, A> const& v);
+    template <class T, class A>
+    std::size_t hash_value(std::deque<T, A> const& v);
+    template <class K, class C, class A>
+    std::size_t hash_value(std::set<K, C, A> const& v);
+    template <class K, class C, class A>
+    std::size_t hash_value(std::multiset<K, C, A> const& v);
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::map<K, T, C, A> const& v);
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::multimap<K, T, C, A> const& v);
+
+    template <class T>
+    std::size_t hash_value(std::complex<T> const&);
+
+    template <class A, class B>
+    std::size_t hash_value(std::pair<A, B> const& v)
+    {
+        std::size_t seed = 0;
+        hash_combine(seed, v.first);
+        hash_combine(seed, v.second);
+        return seed;
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::vector<T, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::list<T, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class T, class A>
+    std::size_t hash_value(std::deque<T, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class C, class A>
+    std::size_t hash_value(std::set<K, C, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class C, class A>
+    std::size_t hash_value(std::multiset<K, C, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::map<K, T, C, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class K, class T, class C, class A>
+    std::size_t hash_value(std::multimap<K, T, C, A> const& v)
+    {
+        return hash_range(v.begin(), v.end());
+    }
+
+    template <class T>
+    std::size_t hash_value(std::complex<T> const& v)
+    {
+        boost::hash<T> hasher;
+        std::size_t seed = hasher(v.imag());
+        seed ^= hasher(v.real()) + (seed<<6) + (seed>>2);
+        return seed;
+    }
+
+    //
+    // call_hash_impl
+    //
+
+    // On compilers without function template ordering, this deals with arrays.
 
 #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
     namespace hash_detail
@@ -61,6 +160,11 @@ namespace boost
     }
 #endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
 
+    //
+    // boost::hash
+    //
+
+
 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 
     template <class T> struct hash
@@ -94,7 +198,7 @@ namespace boost
 
     // On compilers without partial specialization, boost::hash<T>
     // has already been declared to deal with pointers, so just
-    // need to supply the non-pointer version.
+    // need to supply the non-pointer version of hash_impl.
 
     namespace hash_detail
     {
@@ -126,8 +230,8 @@ namespace boost
 
 #else // Visual C++ 6.5
 
-    // There's probably a more elegant way to Visual C++ 6.5 to work
-    // but I don't know what it is.
+        // Visual C++ 6.5 has problems with nested member functions and
+        // applying const to const types in templates. So we get this:
 
         template <bool IsConst>
         struct hash_impl_msvc
similarity index 78%
rename from deal.II/contrib/boost/include/boost/functional/hash/hash.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/functional/hash/hash.hpp
index 09ca5671e2c39a64662915ebfe8a3efa76479eac..6784f3ef6b040ff5e1845330ecd3b5abe5d8f847 100644 (file)
@@ -1,5 +1,5 @@
 
-// Copyright 2005-2008 Daniel James.
+// 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(BOOST_FUNCTIONAL_HASH_HASH_HPP)
 #define BOOST_FUNCTIONAL_HASH_HASH_HPP
 
-#include <boost/functional/hash_fwd.hpp>
+#include <boost/functional/hash/hash_fwd.hpp>
 #include <functional>
-#include <boost/functional/detail/hash_float.hpp>
-#include <boost/functional/detail/container_fwd.hpp>
+#include <boost/functional/hash/detail/hash_float.hpp>
 #include <string>
+#include <boost/limits.hpp>
 
 #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 #include <boost/type_traits/is_pointer.hpp>
 #endif
 
-#if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
-#include <boost/type_traits/is_array.hpp>
-#endif
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-#include <boost/type_traits/is_const.hpp>
+#if BOOST_WORKAROUND(__GNUC__, < 3) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+#define BOOST_HASH_CHAR_TRAITS string_char_traits
+#else
+#define BOOST_HASH_CHAR_TRAITS char_traits
 #endif
 
 namespace boost
@@ -58,10 +56,10 @@ namespace boost
 
 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
     template< class T, unsigned N >
-    std::size_t hash_value(const T (&array)[N]);
+    std::size_t hash_value(const T (&x)[N]);
 
     template< class T, unsigned N >
-    std::size_t hash_value(T (&array)[N]);
+    std::size_t hash_value(T (&x)[N]);
 #endif
 
     std::size_t hash_value(float v);
@@ -71,26 +69,6 @@ namespace boost
     template <class Ch, class A>
     std::size_t hash_value(std::basic_string<Ch, std::BOOST_HASH_CHAR_TRAITS<Ch>, A> const&);
 
-    template <class A, class B>
-    std::size_t hash_value(std::pair<A, B> const&);
-    template <class T, class A>
-    std::size_t hash_value(std::vector<T, A> const&);
-    template <class T, class A>
-    std::size_t hash_value(std::list<T, A> const& v);
-    template <class T, class A>
-    std::size_t hash_value(std::deque<T, A> const& v);
-    template <class K, class C, class A>
-    std::size_t hash_value(std::set<K, C, A> const& v);
-    template <class K, class C, class A>
-    std::size_t hash_value(std::multiset<K, C, A> const& v);
-    template <class K, class T, class C, class A>
-    std::size_t hash_value(std::map<K, T, C, A> const& v);
-    template <class K, class T, class C, class A>
-    std::size_t hash_value(std::multimap<K, T, C, A> const& v);
-
-    template <class T>
-    std::size_t hash_value(std::complex<T> const&);
-
     // Implementation
 
     namespace hash_detail
@@ -281,15 +259,15 @@ namespace boost
 
 #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
     template< class T, unsigned N >
-    inline std::size_t hash_value(const T (&array)[N])
+    inline std::size_t hash_value(const T (&x)[N])
     {
-        return hash_range(array, array + N);
+        return hash_range(x, x + N);
     }
 
     template< class T, unsigned N >
-    inline std::size_t hash_value(T (&array)[N])
+    inline std::size_t hash_value(T (&x)[N])
     {
-        return hash_range(array, array + N);
+        return hash_range(x, x + N);
     }
 #endif
 
@@ -314,69 +292,21 @@ namespace boost
         return boost::hash_detail::float_hash_value(v);
     }
 
-    template <class A, class B>
-    std::size_t hash_value(std::pair<A, B> const& v)
-    {
-        std::size_t seed = 0;
-        hash_combine(seed, v.first);
-        hash_combine(seed, v.second);
-        return seed;
-    }
-
-    template <class T, class A>
-    std::size_t hash_value(std::vector<T, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class T, class A>
-    std::size_t hash_value(std::list<T, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class T, class A>
-    std::size_t hash_value(std::deque<T, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class K, class C, class A>
-    std::size_t hash_value(std::set<K, C, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class K, class C, class A>
-    std::size_t hash_value(std::multiset<K, C, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class K, class T, class C, class A>
-    std::size_t hash_value(std::map<K, T, C, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class K, class T, class C, class A>
-    std::size_t hash_value(std::multimap<K, T, C, A> const& v)
-    {
-        return hash_range(v.begin(), v.end());
-    }
-
-    template <class T>
-    std::size_t hash_value(std::complex<T> const& v)
-    {
-        boost::hash<T> hasher;
-        std::size_t seed = hasher(v.imag());
-        seed ^= hasher(v.real()) + (seed<<6) + (seed>>2);
-        return seed;
-    }
-
     //
     // boost::hash
     //
+    
+    // Define the specializations required by the standard. The general purpose
+    // boost::hash is defined later in extensions.hpp if BOOST_HASH_NO_EXTENSIONS
+    // is not defined.
+    
+    // BOOST_HASH_SPECIALIZE - define a specialization for a type which is
+    // passed by copy.
+    //
+    // BOOST_HASH_SPECIALIZE_REF - define a specialization for a type which is
+    // passed by copy.
+    //
+    // These are undefined later.
 
 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
 #define BOOST_HASH_SPECIALIZE(type) \
@@ -461,10 +391,18 @@ namespace boost
     BOOST_HASH_SPECIALIZE_REF(std::wstring)
 #endif
 
+#if defined(BOOST_HAS_LONG_LONG)
+    BOOST_HASH_SPECIALIZE(boost::long_long_type)
+    BOOST_HASH_SPECIALIZE(boost::ulong_long_type)
+#endif
+
 #undef BOOST_HASH_SPECIALIZE
 #undef BOOST_HASH_SPECIALIZE_REF
 
+// Specializing boost::hash for pointers.
+
 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
     template <class T>
     struct hash<T*>
         : public std::unary_function<T*, std::size_t>
@@ -481,7 +419,15 @@ namespace boost
 #endif
         }
     };
+
 #else
+
+    // For compilers without partial specialization, we define a
+    // boost::hash for all remaining types. But hash_impl is only defined
+    // for pointers in 'extensions.hpp' - so when BOOST_HASH_NO_EXTENSIONS
+    // is defined there will still be a compile error for types not supported
+    // in the standard.
+
     namespace hash_detail
     {
         template <bool IsPointer>
@@ -514,9 +460,12 @@ namespace boost
             ::BOOST_NESTED_TEMPLATE inner<T>
     {
     };
+
 #endif
 }
 
+#undef BOOST_HASH_CHAR_TRAITS
+
 #endif // BOOST_FUNCTIONAL_HASH_HASH_HPP
 
 // Include this outside of the include guards in case the file is included
similarity index 96%
rename from deal.II/contrib/boost/include/boost/functional/hash_fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/functional/hash/hash_fwd.hpp
index 8b7d8e5a4168b8bf34d3acd971a02e469162cab5..1d51b07f2de4488e7cdeb522d12676e52d4c3b3a 100644 (file)
@@ -1,5 +1,5 @@
 
-// Copyright 2005-2008 Daniel James.
+// 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)
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/functional/hash_fwd.hpp b/deal.II/contrib/boost-1.41.0/include/boost/functional/hash_fwd.hpp
new file mode 100644 (file)
index 0000000..b640988
--- /dev/null
@@ -0,0 +1,7 @@
+
+// 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/functional/hash/hash_fwd.hpp>
+
similarity index 81%
rename from deal.II/contrib/boost/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/boost_tuple/boost_tuple_iterator.hpp
index fca135e55a9e09b18b2088b348ed38f7431c71d4..cf3183b1052000d3155ac14f624a340ff28445cf 100644 (file)
@@ -14,6 +14,9 @@
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/or.hpp>
+#include <boost/mpl/plus.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/apply.hpp>
 #include <boost/tuple/tuple.hpp>
 
 namespace boost { namespace fusion
@@ -91,6 +94,39 @@ namespace boost { namespace fusion
                 return type(iter.cons.get_tail());
             }
         };
+        
+        template <typename I1, typename I2>
+        struct distance;
+
+        // detail
+        template <typename I1, typename I2>
+        struct lazy_next_distance
+        {
+            typedef
+                typename mpl::plus<
+                    mpl::int_<1>,
+                    typename distance<
+                        typename next<I1>::type,
+                        I2
+                    >::type
+                >::type type;
+        };
+        
+        template <typename I1, typename I2>
+        struct distance
+        {
+            typedef typename mpl::eval_if<
+                boost::is_same<I1, I2>,
+                mpl::int_<0>,
+                lazy_next_distance<I1, I2>
+            >::type type;
+            
+            static type
+            call(I1 const&, I2 const&)
+            {
+                return type();
+            }
+        };
     };
 
     template <typename Null>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class.hpp
new file mode 100644 (file)
index 0000000..be97383
--- /dev/null
@@ -0,0 +1,28 @@
+/*=============================================================================
+    Copyright (c) 2001-2006 Joel de Guzman
+    Copyright (c) 2005-2006 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CLASS_OCTOBER_4_2009_839PM)
+#define BOOST_FUSION_CLASS_OCTOBER_4_2009_839PM
+
+#include <boost/fusion/adapted/class/extension.hpp>
+#include <boost/fusion/adapted/class/adapt_struct.hpp>
+#include <boost/fusion/adapted/class/adapt_assoc_struct.hpp>
+#include <boost/fusion/adapted/class/class_iterator.hpp>
+
+#include <boost/fusion/adapted/class/detail/at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/at_key_impl.hpp>
+#include <boost/fusion/adapted/class/detail/begin_impl.hpp>
+#include <boost/fusion/adapted/class/detail/category_of_impl.hpp>
+#include <boost/fusion/adapted/class/detail/end_impl.hpp>
+#include <boost/fusion/adapted/class/detail/has_key_impl.hpp>
+#include <boost/fusion/adapted/class/detail/is_sequence_impl.hpp>
+#include <boost/fusion/adapted/class/detail/is_view_impl.hpp>
+#include <boost/fusion/adapted/class/detail/size_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_key_impl.hpp>
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_assoc_class.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_assoc_class.hpp
new file mode 100644 (file)
index 0000000..11f40ad
--- /dev/null
@@ -0,0 +1,94 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2007 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_ADAPT_ASSOC_CLASS_OCTOBER_4_2009_840PM)
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_OCTOBER_4_2009_840PM
+
+#include <boost/fusion/support/tag_of_fwd.hpp>
+#include <boost/fusion/adapted/class/extension.hpp>
+#include <boost/fusion/adapted/class/class_iterator.hpp>
+#include <boost/fusion/adapted/class/detail/is_view_impl.hpp>
+#include <boost/fusion/adapted/class/detail/is_sequence_impl.hpp>
+#include <boost/fusion/adapted/class/detail/category_of_impl.hpp>
+#include <boost/fusion/adapted/class/detail/begin_impl.hpp>
+#include <boost/fusion/adapted/class/detail/end_impl.hpp>
+#include <boost/fusion/adapted/class/detail/size_impl.hpp>
+#include <boost/fusion/adapted/class/detail/at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/has_key_impl.hpp>
+#include <boost/fusion/adapted/class/detail/at_key_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_key_impl.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/config/no_tr1/utility.hpp>
+
+namespace boost { namespace fusion { namespace extension {
+    template<typename Class, typename Key>
+    struct class_assoc_member;
+}}}
+
+
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS(name, bseq)                             \
+    BOOST_FUSION_ADAPT_ASSOC_CLASS_I(                                           \
+        name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_CLASS_X bseq, 0))           \
+    /***/
+
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_X(x, y, z) ((x, y, z)) BOOST_FUSION_ADAPT_ASSOC_CLASS_Y
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_Y(x, y, z) ((x, y, z)) BOOST_FUSION_ADAPT_ASSOC_CLASS_X
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_X0
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_Y0
+
+// BOOST_FUSION_ADAPT_ASSOC_CLASS_I generates the overarching structure and uses
+// SEQ_FOR_EACH_I to generate the "linear" substructures.
+// Thanks to Paul Mensonides for the PP macro help
+
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_I(name, seq)                             \
+    namespace boost { namespace fusion { namespace traits                       \
+    {                                                                           \
+        template <>                                                             \
+        struct tag_of<name>                                                     \
+        {                                                                       \
+            typedef class_tag type;                                             \
+        };                                                                      \
+    }}}                                                                         \
+    namespace boost { namespace fusion { namespace extension                    \
+    {                                                                           \
+        template <>                                                             \
+        struct class_size<name> : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {};         \
+        BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_ASSOC_CLASS_C, name, seq)    \
+    }}}                                                                         \
+    /***/
+
+#define BOOST_FUSION_ADAPT_ASSOC_CLASS_C(r, name, i, xy)                        \
+    template <>                                                                 \
+    struct class_member<name, i>                                                \
+    {                                                                           \
+        typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type;                             \
+        static type& call(name& class_)                                         \
+        {                                                                       \
+            return class_.BOOST_PP_TUPLE_ELEM(3, 1, xy);                        \
+        };                                                                      \
+    };                                                                          \
+    template<>                                                                  \
+    struct class_assoc_member<name, BOOST_PP_TUPLE_ELEM(3, 2, xy)>              \
+    {                                                                           \
+        typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type;                             \
+        static type& call(name& class_)                                         \
+        {                                                                       \
+            return class_.BOOST_PP_TUPLE_ELEM(3, 1, xy);                        \
+        };                                                                      \
+    };
+    /***/
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_class.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/adapt_class.hpp
new file mode 100644 (file)
index 0000000..c4e5c29
--- /dev/null
@@ -0,0 +1,104 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_ADAPT_CLASS_OCTOBER_4_2009_840PM)
+#define BOOST_FUSION_ADAPT_CLASS_OCTOBER_4_2009_840PM
+
+#include <boost/fusion/support/tag_of_fwd.hpp>
+#include <boost/fusion/adapted/class/extension.hpp>
+#include <boost/fusion/adapted/class/class_iterator.hpp>
+#include <boost/fusion/adapted/class/detail/is_view_impl.hpp>
+#include <boost/fusion/adapted/class/detail/is_sequence_impl.hpp>
+#include <boost/fusion/adapted/class/detail/category_of_impl.hpp>
+#include <boost/fusion/adapted/class/detail/begin_impl.hpp>
+#include <boost/fusion/adapted/class/detail/end_impl.hpp>
+#include <boost/fusion/adapted/class/detail/size_impl.hpp>
+#include <boost/fusion/adapted/class/detail/at_impl.hpp>
+#include <boost/fusion/adapted/class/detail/value_at_impl.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/config/no_tr1/utility.hpp>
+
+#define BOOST_FUSION_ADAPT_CLASS(name, bseq)                                    \
+    BOOST_FUSION_ADAPT_CLASS_I(                                                 \
+        name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_CLASS_X bseq, 0))                 \
+    /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_X(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_Y
+#define BOOST_FUSION_ADAPT_CLASS_Y(w, x, y, z) ((w, x, y, z)) BOOST_FUSION_ADAPT_CLASS_X
+#define BOOST_FUSION_ADAPT_CLASS_X0
+#define BOOST_FUSION_ADAPT_CLASS_Y0
+
+// BOOST_FUSION_ADAPT_CLASS_I generates the overarching structure and uses
+// SEQ_FOR_EACH_I to generate the "linear" substructures.
+// Thanks to Paul Mensonides for the PP macro help
+
+#define BOOST_FUSION_ADAPT_CLASS_I(name, seq)                                   \
+    namespace boost { namespace fusion { namespace traits                       \
+    {                                                                           \
+        template <>                                                             \
+        struct tag_of<name>                                                     \
+        {                                                                       \
+            typedef class_tag type;                                             \
+        };                                                                      \
+    }}}                                                                         \
+    namespace boost { namespace fusion { namespace extension                    \
+    {                                                                           \
+        template <>                                                             \
+        struct class_size<name> : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {};         \
+        BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_CLASS_C, name, seq)          \
+    }}}                                                                         \
+    /***/
+
+#define BOOST_FUSION_ADAPT_CLASS_C(r, name, i, xy)                              \
+    template <>                                                                 \
+    struct class_member<name, i>                                                \
+    {                                                                           \
+        typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type;                             \
+        typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type;                         \
+        struct proxy                                                            \
+        {                                                                       \
+            typedef BOOST_PP_TUPLE_ELEM(4, 0, xy) type;                         \
+            typedef BOOST_PP_TUPLE_ELEM(4, 1, xy) get_type;                     \
+            typedef                                                             \
+                add_reference<add_const<type>::type>::type                      \
+            cref_type;                                                          \
+                                                                                \
+            proxy(name& obj) : obj(obj) {}                                      \
+            name& obj;                                                          \
+                                                                                \
+            proxy& operator=(cref_type val)                                     \
+            {                                                                   \
+                BOOST_PP_TUPLE_ELEM(4, 3, xy);                                  \
+                return *this;                                                   \
+            }                                                                   \
+                                                                                \
+            operator get_type()                                                 \
+            {                                                                   \
+                return BOOST_PP_TUPLE_ELEM(4, 2, xy);                           \
+            }                                                                   \
+        };                                                                      \
+                                                                                \
+        static get_type call(name const& obj)                                   \
+        {                                                                       \
+            return BOOST_PP_TUPLE_ELEM(4, 2, xy);                               \
+        };                                                                      \
+                                                                                \
+        static proxy call(name& obj)                                            \
+        {                                                                       \
+            return proxy(obj);                                                  \
+        };                                                                      \
+    };                                                                          \
+    /***/
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/class_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/class_iterator.hpp
new file mode 100644 (file)
index 0000000..639ee92
--- /dev/null
@@ -0,0 +1,105 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2005-2006 Dan Marsden
+
+    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(FUSION_CLASS_ITERATOR_OCTOBER_4_2009_839M)
+#define FUSION_CLASS_ITERATOR_OCTOBER_4_2009_839M
+
+#include <boost/fusion/iterator/iterator_facade.hpp>
+#include <boost/fusion/adapted/class/extension.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/minus.hpp>
+#include <boost/config/no_tr1/utility.hpp>
+
+namespace boost { namespace fusion
+{
+    struct random_access_traversal_tag;
+
+    template <typename Class, int N_>
+    struct class_iterator
+        : iterator_facade<class_iterator<Class, N_>, random_access_traversal_tag>
+    {
+        BOOST_MPL_ASSERT_RELATION(N_, >=, 0);
+        BOOST_MPL_ASSERT_RELATION(N_, <=, extension::class_size<Class>::value);
+
+        typedef mpl::int_<N_> index;
+        typedef Class class_type;
+
+        class_iterator(Class& class_)
+            : class_(class_) {}
+        Class& class_;
+
+        template <typename Iterator>
+        struct value_of
+            : extension::class_member<Class, N_>
+        {
+        };
+
+        template <typename Iterator>
+        struct deref
+        {
+            typedef typename
+                mpl::if_<
+                    is_const<Class>
+                  , typename extension::class_member<Class, N_>::get_type
+                  , typename extension::class_member<Class, N_>::proxy
+                >::type
+            type;
+
+            static type
+            call(Iterator const& iter)
+            {
+                return extension::class_member<Class, N_>::
+                    call(iter.class_);
+            }
+        };
+
+        template <typename Iterator, typename N>
+        struct advance
+        {
+            typedef typename Iterator::index index;
+            typedef typename Iterator::class_type class_type;
+            typedef class_iterator<class_type, index::value + N::value> type;
+
+            static type
+            call(Iterator const& iter)
+            {
+                return type(iter.class_);
+            }
+        };
+
+        template <typename Iterator>
+        struct next : advance<Iterator, mpl::int_<1> > {};
+
+        template <typename Iterator>
+        struct prior : advance<Iterator, mpl::int_<-1> > {};
+
+        template <typename I1, typename I2>
+        struct distance : mpl::minus<typename I2::index, typename I1::index>
+        {
+            typedef typename
+                mpl::minus<
+                    typename I2::index, typename I1::index
+                >::type
+            type;
+
+            static type
+            call(I1 const&, I2 const&)
+            {
+                return type();
+            }
+        };
+    };
+}}
+
+#endif
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_impl.hpp
new file mode 100644 (file)
index 0000000..12b5171
--- /dev/null
@@ -0,0 +1,70 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2005-2006 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_AT_IMPL_OCTOBER_4_2009_920PM)
+#define BOOST_FUSION_AT_IMPL_OCTOBER_4_2009_920PM
+
+#include <boost/fusion/support/detail/access.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/int.hpp>
+
+namespace boost { namespace fusion
+{
+    struct class_tag;
+
+    namespace extension
+    {
+        template<typename T>
+        struct at_impl;
+
+        template <typename Class, int N>
+        struct class_member;
+
+        template <typename Class>
+        struct class_size;
+
+        template <>
+        struct at_impl<class_tag>
+        {
+            template <typename Sequence, typename N>
+            struct apply
+            {
+                static int const n_value = N::value;
+                BOOST_MPL_ASSERT_RELATION(
+                    n_value, <=, extension::class_size<Sequence>::value);
+
+                typedef typename
+                    extension::class_member<Sequence, N::value>
+                element;
+
+                typedef typename
+                    mpl::if_<
+                        is_const<Sequence>
+                      , typename class_member<Sequence, N::value>::get_type
+                      , typename class_member<Sequence, N::value>::proxy
+                    >::type
+                type;
+
+                static type
+                call(Sequence& seq)
+                {
+                    return extension::
+                        class_member<Sequence, N::value>::call(seq);
+                }
+                
+                //~ static typename class_member<Sequence, N::value>::get_type
+                //~ call(Sequence const& seq)
+                //~ {
+                    //~ return extension::
+                        //~ class_member<Sequence, N::value>::call(seq);
+                //~ }
+            };
+        };
+    }
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_key_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/at_key_impl.hpp
new file mode 100644 (file)
index 0000000..9df985b
--- /dev/null
@@ -0,0 +1,54 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2005-2007 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_AT_KEY_IMPL_OCTOBER_4_2009_920PM)
+#define BOOST_FUSION_AT_KEY_IMPL_OCTOBER_4_2009_920PM
+
+#include <boost/fusion/support/detail/access.hpp>
+
+namespace boost { namespace fusion
+{
+    struct class_tag;
+
+    namespace extension
+    {
+        template<typename T>
+        struct at_key_impl;
+
+        template <typename Class, typename Key>
+        struct class_assoc_member;
+
+        template <>
+        struct at_key_impl<class_tag>
+        {
+            template <typename Sequence, typename Key>
+            struct apply
+            {
+                typedef typename
+                extension::class_assoc_member<Sequence, Key>
+                element;
+
+                typedef typename
+                    mpl::eval_if<
+                        is_const<Sequence>
+                      , detail::cref_result<element>
+                      , detail::ref_result<element>
+                    >::type
+                type;
+
+                static type
+                call(Sequence& seq)
+                {
+                    return extension::
+                        class_assoc_member<Sequence, Key>::call(seq);
+                }
+            };
+        };
+    }
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/begin_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/begin_impl.hpp
new file mode 100644 (file)
index 0000000..4fadac4
--- /dev/null
@@ -0,0 +1,40 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2005-2006 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_BEGIN_IMPL_OCTOBER_4_2009_920PM)
+#define BOOST_FUSION_BEGIN_IMPL_OCTOBER_4_2009_920PM
+
+#include <boost/fusion/adapted/class/class_iterator.hpp>
+
+namespace boost { namespace fusion
+{
+    struct class_tag;
+
+    namespace extension
+    {
+        template<typename T>
+        struct begin_impl;
+
+        template <>
+        struct begin_impl<class_tag>
+        {
+            template <typename Sequence>
+            struct apply
+            {
+                typedef class_iterator<Sequence, 0> type;
+
+                static type
+                call(Sequence& v)
+                {
+                    return type(v);
+                }
+            };
+        };
+    }
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/category_of_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/class/detail/category_of_impl.hpp
new file mode 100644 (file)
index 0000000..821cf38
--- /dev/null
@@ -0,0 +1,35 @@
+/*=============================================================================
+    Copyright (c) 2001-2009 Joel de Guzman
+    Copyright (c) 2005-2006 Dan Marsden
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_CATEGORY_OF_IMPL_OCTOBER_4_2009_919PM)
+#define BOOST_FUSION_CATEGORY_OF_IMPL_OCTOBER_4_2009_919PM
+
+#include <boost/config/no_tr1/utility.hpp>
+
+namespace boost { namespace fusion
+{
+    struct class_tag;
+    struct random_access_traversal_tag;
+
+    namespace extension
+    {
+        template<typename T>
+        struct category_of_impl;
+
+        template<>
+        struct category_of_impl<class_tag>
+        {
+            template<typename T>
+            struct apply
+            {
+                typedef random_access_traversal_tag type;
+            };
+        };
+    }
+}}
+
+#endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/fusion/adapted/struct/struct_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/adapted/struct/struct_iterator.hpp
index f2eb7ea907129a79c9783750dcfe4fd0a3147463..fe26aa33ce63efc4ce0b2d02d405eee2d2253ab2 100644 (file)
@@ -95,6 +95,10 @@ namespace boost { namespace fusion
                 return type();
             }
         };
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        struct_iterator& operator= (struct_iterator const&);
     };
 }}
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/fusion/algorithm/query/detail/all.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/query/detail/all.hpp
index 979cfb1182b9036484ef97f654ecdd7daa04d4c2..51fd393fe72f857a84afe1f2c5b9c070777aa09f 100644 (file)
@@ -108,7 +108,7 @@ namespace boost { namespace fusion { namespace detail
         template <typename It, typename F>
         static bool call(It const& it, F f)
         {
-            return false;
+            return true;
         }
     };
 
similarity index 92%
rename from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation.hpp
index 0757b5ee659fcecd09daff1f64315cd0c8f6deb4..9221cd45c657999152c015e3fe9f4085f398888c 100644 (file)
@@ -14,6 +14,7 @@
 #include <boost/fusion/algorithm/transformation/filter_if.hpp>
 #include <boost/fusion/algorithm/transformation/insert.hpp>
 #include <boost/fusion/algorithm/transformation/insert_range.hpp>
+#include <boost/fusion/algorithm/transformation/join.hpp> 
 #include <boost/fusion/algorithm/transformation/pop_back.hpp>
 #include <boost/fusion/algorithm/transformation/pop_front.hpp>
 #include <boost/fusion/algorithm/transformation/push_back.hpp>
@@ -24,5 +25,6 @@
 #include <boost/fusion/algorithm/transformation/replace_if.hpp>
 #include <boost/fusion/algorithm/transformation/reverse.hpp>
 #include <boost/fusion/algorithm/transformation/transform.hpp>
+#include <boost/fusion/algorithm/transformation/zip.hpp> 
 
 #endif
similarity index 92%
rename from deal.II/contrib/boost/include/boost/fusion/algorithm/transformation/clear.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/algorithm/transformation/clear.hpp
index 7532823265863e54e4583bd5c48101f5bc111bd5..c9f849cb90edac0610f842d6b182f99102f0156c 100644 (file)
@@ -16,7 +16,7 @@ namespace boost { namespace fusion
         template <typename Sequence>
         struct clear
         {
-            typedef vector0 type;
+            typedef vector0<> type;
         };
     }
 
@@ -24,7 +24,7 @@ namespace boost { namespace fusion
     inline typename result_of::clear<Sequence const>::type
     clear(Sequence const& seq)
     {
-        return vector0();
+        return vector0<>();
     }
 }}
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/fusion/container/deque/deque_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/deque/deque_iterator.hpp
index 90c68918a6e4a25cd5fd6c0a68fdabd2995fbda1..c6e46d54a54a25c6a6b45d8a85ef06488ad7d333 100644 (file)
@@ -12,6 +12,7 @@
 #include <boost/fusion/container/deque/detail/keyed_element.hpp>
 #include <boost/mpl/minus.hpp>
 #include <boost/mpl/equal_to.hpp>
+#include <boost/type_traits/is_const.hpp> 
 
 namespace boost { namespace fusion {
 
similarity index 86%
rename from deal.II/contrib/boost/include/boost/fusion/container/generation/make_vector.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/generation/make_vector.hpp
index 3f9b27f21a51dc8367f27f4b29c7f427d016c683..868ad0ca7a3ce4d4709fc7b1afee41a442e8edd4 100644 (file)
@@ -1,7 +1,7 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
 
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 ==============================================================================*/
 #ifndef BOOST_PP_IS_ITERATING
@@ -19,7 +19,7 @@
 namespace boost { namespace fusion
 {
     struct void_;
-        
+
     namespace result_of
     {
         template <
@@ -28,18 +28,18 @@ namespace boost { namespace fusion
           , typename Extra = void_
         >
         struct make_vector;
-            
+
         template <>
         struct make_vector<>
         {
-            typedef vector<> type;
+            typedef vector0<> type;
         };
     }
-    
-    inline vector<>
+
+    inline vector0<>
     make_vector()
     {
-        return vector<>();
+        return vector0<>();
     }
 
 #define BOOST_FUSION_AS_FUSION_ELEMENT(z, n, data)                               \
@@ -74,15 +74,15 @@ namespace boost { namespace fusion
         struct make_vector<BOOST_PP_ENUM_PARAMS(N, T)>
 #endif
         {
-            typedef vector<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)> type;
+            typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)> type;
         };
     }
 
     template <BOOST_PP_ENUM_PARAMS(N, typename T)>
-    inline vector<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>
+    inline BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>
     make_vector(BOOST_PP_ENUM_BINARY_PARAMS(N, T, const& _))
     {
-        return vector<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>(
+        return BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM(N, BOOST_FUSION_AS_FUSION_ELEMENT, _)>(
             BOOST_PP_ENUM_PARAMS(N, _));
     }
 
similarity index 94%
rename from deal.II/contrib/boost/include/boost/fusion/container/list/cons_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/list/cons_iterator.hpp
index 7ef034e30f2a7592b05515eeed5dc593acf3511f..9d67a64919053b54e35c23be972b5e19601a3fc9 100644 (file)
@@ -34,11 +34,15 @@ namespace boost { namespace fusion
         typedef cons_iterator_identity<
             typename add_const<Cons>::type> 
         identity;
-        
+
         explicit cons_iterator(cons_type& cons)
             : cons(cons) {}
 
         cons_type& cons;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        cons_iterator& operator= (cons_iterator const&);
     };
 
     struct nil_iterator : iterator_base<nil_iterator>
similarity index 95%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/as_vector.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/as_vector.hpp
index fa8dadcfeff59a28a8c5abce3698ebba93b225af..a70fd4aea595cc89048318c797553b0bef7942b0 100644 (file)
@@ -31,14 +31,14 @@ namespace boost { namespace fusion { namespace detail
         template <typename Iterator>
         struct apply
         {
-            typedef vector<> type;
+            typedef vector0<> type;
         };
 
         template <typename Iterator>
         static typename apply<Iterator>::type
         call(Iterator)
         {
-            return vector<>();
+            return vector0<>();
         }
     };
 
@@ -82,7 +82,7 @@ namespace boost { namespace fusion { namespace detail
         {
             BOOST_PP_REPEAT(N, BOOST_FUSION_NEXT_ITERATOR, _)
             BOOST_PP_REPEAT(N, BOOST_FUSION_VALUE_OF_ITERATOR, _)
-            typedef vector<BOOST_PP_ENUM_PARAMS(N, T)> type;
+            typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> type;
         };
 
         template <typename Iterator>
similarity index 69%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/at_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/at_impl.hpp
index 1a00f428cd78dd2151397ab601d54d1b6e3df514..1366ec9f40003de095d61fd6574005a7259bdbad 100644 (file)
@@ -28,13 +28,7 @@ namespace boost { namespace fusion
             struct apply 
             {
                 typedef mpl::at<typename Sequence::types, N> element;
-                typedef typename
-                    mpl::eval_if<
-                        is_const<Sequence>
-                      , detail::cref_result<element>
-                      , detail::ref_result<element>
-                    >::type
-                type;
+                typedef typename detail::ref_result<element>::type type;
     
                 static type
                 call(Sequence& v)
@@ -42,6 +36,19 @@ namespace boost { namespace fusion
                     return v.at_impl(N());
                 }
             };
+
+            template <typename Sequence, typename N>
+            struct apply <Sequence const, N>
+            {
+                typedef mpl::at<typename Sequence::types, N> element;
+                typedef typename detail::cref_result<element>::type type;
+    
+                static type
+                call(Sequence const& v)
+                {
+                    return v.at_impl(N());
+                }
+            };
         };
     }
 }}
similarity index 97%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/vector_n.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/vector_n.hpp
index 01981ab369530d49243405c64e07d567e20b007a..ea314ac28e16a0d6a0c4f883325347c90ec57ea6 100644 (file)
@@ -9,7 +9,7 @@
 #if !defined(FUSION_MACRO_05042005)
 #define FUSION_MACRO_05042005
 
-#define FUSION_MEMBER_DEFAULT_INIT(z, n, _)     m##n(T##n())
+#define FUSION_MEMBER_DEFAULT_INIT(z, n, _)     m##n()
 #define FUSION_MEMBER_INIT(z, n, _)             m##n(_##n)
 #define FUSION_COPY_INIT(z, n, _)               m##n(other.m##n)
 #define FUSION_MEMBER_DECL(z, n, _)             T##n m##n;
         BOOST_PP_CAT(vector, N)(
             Sequence const& seq
 #if (N == 1)
-          , typename disable_if<is_convertible<Sequence, T0> >::type* dummy = 0
+          , typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
 #endif
             )
             : base_type(base_type::init_from_sequence(seq)) {}
 
         template<typename I>
         typename add_reference<typename mpl::at<types, I>::type>::type
-        at_impl(I i)
+        at_impl(I)
         {
             return this->at_impl(mpl::int_<I::value>());
         }
 
         template<typename I>
         typename add_reference<typename add_const<typename mpl::at<types, I>::type>::type>::type
-        at_impl(I i) const
+        at_impl(I) const
         {
             return this->at_impl(mpl::int_<I::value>());
         }
similarity index 62%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/detail/vector_n_chooser.hpp
index 29248907dec01b5ecf563665310ada2417b08ae2..f4b85d89c45c479640a4fc904aa42c7328e15367 100644 (file)
 #include <boost/fusion/container/vector/vector50.hpp>
 #endif
 
-#include <boost/mpl/distance.hpp>
-#include <boost/mpl/find.hpp>
-#include <boost/mpl/begin_end.hpp>
 #include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
 
 namespace boost { namespace fusion
 {
@@ -38,40 +39,23 @@ namespace boost { namespace fusion
 
 namespace boost { namespace fusion { namespace detail
 {
-    template <int N>
-    struct get_vector_n;
+    template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
+    struct vector_n_chooser
+    {
+        typedef BOOST_PP_CAT(vector, FUSION_MAX_VECTOR_SIZE)<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)> type;
+    };
 
     template <>
-    struct get_vector_n<0>
+    struct vector_n_chooser<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, void_ BOOST_PP_INTERCEPT)>
     {
-        template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-        struct call
-        {
-            typedef vector0 type;
-        };
+        typedef vector0<> type;
     };
 
 #define BOOST_PP_FILENAME_1 \
     <boost/fusion/container/vector/detail/vector_n_chooser.hpp>
-#define BOOST_PP_ITERATION_LIMITS (1, FUSION_MAX_VECTOR_SIZE)
+#define BOOST_PP_ITERATION_LIMITS (1, BOOST_PP_DEC(FUSION_MAX_VECTOR_SIZE))
 #include BOOST_PP_ITERATE()
 
-    template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-    struct vector_n_chooser
-    {
-        typedef
-            mpl::BOOST_PP_CAT(vector, FUSION_MAX_VECTOR_SIZE)
-                <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>
-        input;
-
-        typedef typename mpl::begin<input>::type begin;
-        typedef typename mpl::find<input, void_>::type end;
-        typedef typename mpl::distance<begin, end>::type size;
-
-        typedef typename get_vector_n<size::value>::template
-            call<BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, T)>::type
-        type;
-    };
 }}}
 
 #endif
@@ -85,14 +69,12 @@ namespace boost { namespace fusion { namespace detail
 
 #define N BOOST_PP_ITERATION()
 
-    template <>
-    struct get_vector_n<N>
+    template <BOOST_PP_ENUM_PARAMS(N, typename T)>
+    struct vector_n_chooser<
+        BOOST_PP_ENUM_PARAMS(N, T)
+        BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_SUB(FUSION_MAX_VECTOR_SIZE, N), void_ BOOST_PP_INTERCEPT)>
     {
-        template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, typename T)>
-        struct call
-        {
-            typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> type;
-        };
+        typedef BOOST_PP_CAT(vector, N)<BOOST_PP_ENUM_PARAMS(N, T)> type;
     };
 
 #undef N
similarity index 98%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/vector.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector.hpp
index aef3134cacaf0765f7780a87d93c4d068b1b747d..5b9a56084360a270b512c7976d187f252a765c36 100644 (file)
@@ -56,7 +56,7 @@ namespace boost { namespace fusion
 
         template <typename Sequence>
         vector(Sequence const& rhs)
-#if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1500)
             : vec(ctor_helper(rhs, is_base_of<vector, Sequence>())) {}
 #else
             : vec(rhs) {}
@@ -129,7 +129,7 @@ namespace boost { namespace fusion
 
     private:
 
-#if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1500)
         static vector_n const&
         ctor_helper(vector const& rhs, mpl::true_)
         {
similarity index 96%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/vector10.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector10.hpp
index 28531b6f1d734cb03eab1464f3d115766fee477a..929815ab3ca85e20547163e8135bcac64e3b14fd 100644 (file)
@@ -39,7 +39,8 @@ namespace boost { namespace fusion
     struct fusion_sequence_tag;
     struct random_access_traversal_tag;
 
-    struct vector0 : sequence_base<vector0>
+    template <typename Dummy = void>
+    struct vector0 : sequence_base<vector0<Dummy> >
     {
         typedef mpl::vector0<> types;
         typedef vector_tag fusion_tag;
similarity index 89%
rename from deal.II/contrib/boost/include/boost/fusion/container/vector/vector_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/container/vector/vector_iterator.hpp
index 9feeb5209708aef8e34840a6719240af492693af..d7ba8c883392d9b59d71ff90af995b797bdc7059 100644 (file)
@@ -7,6 +7,11 @@
 #if !defined(FUSION_VECTOR_ITERATOR_05042005_0635)
 #define FUSION_VECTOR_ITERATOR_05042005_0635
 
+#if defined (BOOST_MSVC)
+#  pragma warning(push)
+#  pragma warning (disable: 4512) // assignment operator could not be generated.
+#endif
+
 #include <boost/fusion/support/iterator_base.hpp>
 #include <boost/fusion/container/vector/detail/deref_impl.hpp>
 #include <boost/fusion/container/vector/detail/value_of_impl.hpp>
@@ -42,5 +47,9 @@ namespace boost { namespace fusion
     };
 }}
 
+#if defined (BOOST_MSVC)
+#  pragma warning(pop)
+#endif
+
 #endif
 
similarity index 79%
rename from deal.II/contrib/boost/include/boost/fusion/functional/adapter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter.hpp
index 734dac39724e4ae1f607853e894de67c2d15a627..1a1f9819f0e813573b4a0ca289b2d223f56e7392 100644 (file)
@@ -11,8 +11,6 @@
 #include <boost/fusion/functional/adapter/fused.hpp>
 #include <boost/fusion/functional/adapter/fused_procedure.hpp>
 #include <boost/fusion/functional/adapter/fused_function_object.hpp>
-#include <boost/fusion/functional/adapter/unfused_generic.hpp>
-#include <boost/fusion/functional/adapter/unfused_lvalue_args.hpp>
-#include <boost/fusion/functional/adapter/unfused_rvalue_args.hpp>
+#include <boost/fusion/functional/adapter/unfused.hpp>
 #include <boost/fusion/functional/adapter/unfused_typed.hpp>
 #endif
similarity index 55%
rename from deal.II/contrib/boost/include/boost/fusion/functional/adapter/limits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/limits.hpp
index cf6701c4994e862125bdb032deb254992f8fa100..783bc632753c4e00c1a64ff387ff62b5ec1af6f7 100644 (file)
 
 #   include <boost/fusion/container/vector/limits.hpp>
 
-#   if !defined(BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY)
-#       define BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY 6
+#   if !defined(BOOST_FUSION_UNFUSED_MAX_ARITY)
+#       define BOOST_FUSION_UNFUSED_MAX_ARITY 6
 #   elif BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
 #       error "BOOST_FUSION_UNFUSED_GENERIC_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
 #   endif
-#   if !defined(BOOST_FUSION_UNFUSED_RVALUE_ARGS_MAX_ARITY)
-#       define BOOST_FUSION_UNFUSED_RVALUE_ARGS_MAX_ARITY 6
-#   elif BOOST_FUSION_UNFUSED_RVALUE_ARGS_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
-#       error "BOOST_FUSION_UNFUSED_RVALUE_ARGS_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
-#   endif
-#   if !defined(BOOST_FUSION_UNFUSED_LVALUE_ARGS_MAX_ARITY)
-#       define BOOST_FUSION_UNFUSED_LVALUE_ARGS_MAX_ARITY 6
-#   elif BOOST_FUSION_UNFUSED_LVALUE_ARGS_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
-#       error "BOOST_FUSION_UNFUSED_LVALUE_ARGS_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
-#   endif
 #   if !defined(BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY)
 #       define BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY 6
 #   elif BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY > FUSION_MAX_VECTOR_SIZE
 #       error "BOOST_FUSION_UNFUSED_TYPED_MAX_ARITY > FUSION_MAX_VECTOR_SIZE"
 #   endif
-#   if !defined(BOOST_FUSION_CONSTRUCTOR_MAX_ARITY)
-#       define BOOST_FUSION_CONSTRUCTOR_MAX_ARITY 6
-#   endif
 
 #endif
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/adapter/unfused.hpp
new file mode 100755 (executable)
index 0000000..48baf75
--- /dev/null
@@ -0,0 +1,151 @@
+/*=============================================================================
+    Copyright (c) 2006-2007 Tobias Schwinger
+  
+    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).
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_FUNCTIONAL_ADAPTER_UNFUSED_HPP_INCLUDED)
+#if !defined(BOOST_PP_IS_ITERATING)
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+#include <boost/utility/result_of.hpp>
+
+#include <boost/fusion/container/vector/vector.hpp>
+
+#include <boost/fusion/functional/adapter/limits.hpp>
+#include <boost/fusion/functional/adapter/detail/access.hpp>
+
+namespace boost { namespace fusion
+{
+    template <class Function, bool AllowNullary = true>
+    class unfused;
+
+    //----- ---- --- -- - -  -   -
+
+    template <class Function> 
+    class unfused<Function,true>
+      : public unfused<Function,false>
+    {
+        typedef typename detail::qf_c<Function>::type function_c;
+        typedef typename detail::qf<Function>::type function;
+        typedef typename detail::call_param<Function>::type func_const_fwd_t;
+      public:
+
+        using unfused<Function,false>::operator();
+
+        inline explicit unfused(func_const_fwd_t f = function())
+            : unfused<Function,false>(f)
+        { }
+
+        typedef typename boost::result_of<
+            function_c(fusion::vector0<> &) >::type call_const_0_result;
+
+        inline call_const_0_result operator()() const
+        {
+            fusion::vector0<> arg;
+            return this->fnc_transformed(arg);
+        }
+
+        typedef typename boost::result_of< 
+            function(fusion::vector0<> &) >::type call_0_result;
+
+        inline call_0_result operator()() 
+        {
+            fusion::vector0<> arg;
+            return this->fnc_transformed(arg);
+        }
+    };
+
+    template <class Function> class unfused<Function,false>
+    {
+      protected:
+        Function fnc_transformed;
+        typedef typename detail::qf_c<Function>::type function_c;
+        typedef typename detail::qf<Function>::type function;
+        typedef typename detail::call_param<Function>::type func_const_fwd_t;
+      public:
+
+        inline explicit unfused(func_const_fwd_t f = function())
+            : fnc_transformed(f)
+        { }
+
+        template <typename Sig>
+        struct result;
+
+        #define  BOOST_PP_FILENAME_1 \
+            <boost/fusion/functional/adapter/unfused.hpp>
+        #define  BOOST_PP_ITERATION_LIMITS \
+            (1,BOOST_FUSION_UNFUSED_MAX_ARITY)
+        #include BOOST_PP_ITERATE()
+    };
+}}
+
+namespace boost 
+{
+    template<class F>
+    struct result_of< boost::fusion::unfused<F> const () >
+    {
+        typedef typename boost::fusion::unfused<F>::call_const_0_result type;
+    };
+    template<class F>
+    struct result_of< boost::fusion::unfused<F>() >
+    {
+        typedef typename boost::fusion::unfused<F>::call_0_result type;
+    };
+}
+
+#define BOOST_FUSION_FUNCTIONAL_ADAPTER_UNFUSED_HPP_INCLUDED
+#else // defined(BOOST_PP_IS_ITERATING)
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Preprocessor vertical repetition code
+//
+////////////////////////////////////////////////////////////////////////////////
+#define N BOOST_PP_ITERATION()
+
+        template <class Self, BOOST_PP_ENUM_PARAMS(N,typename T)>
+        struct result< Self const (BOOST_PP_ENUM_PARAMS(N,T)) >
+            : boost::result_of< function_c(
+                BOOST_PP_CAT(fusion::vector,N)< BOOST_PP_ENUM_BINARY_PARAMS(N,
+                    typename detail::mref<T,>::type BOOST_PP_INTERCEPT) > & )>
+        { };
+
+        template <class Self, BOOST_PP_ENUM_PARAMS(N,typename T)>
+        struct result< Self(BOOST_PP_ENUM_PARAMS(N,T)) >
+            : boost::result_of< function(
+                BOOST_PP_CAT(fusion::vector,N)< BOOST_PP_ENUM_BINARY_PARAMS(N,
+                    typename detail::mref<T,>::type BOOST_PP_INTERCEPT) > & )>
+        { };
+
+        template <BOOST_PP_ENUM_PARAMS(N,typename T)>
+        inline typename boost::result_of<function_c(BOOST_PP_CAT(fusion::vector,N)
+            <BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT)> & )>::type
+        operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) const
+        {
+            BOOST_PP_CAT(fusion::vector,N)<
+                  BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT) >
+                arg(BOOST_PP_ENUM_PARAMS(N,a));
+            return this->fnc_transformed(arg);
+        }
+
+        template <BOOST_PP_ENUM_PARAMS(N,typename T)>
+        inline typename boost::result_of<function(BOOST_PP_CAT(fusion::vector,N)
+            <BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT)> & )>::type
+        operator()(BOOST_PP_ENUM_BINARY_PARAMS(N,T,& a)) 
+        {
+            BOOST_PP_CAT(fusion::vector,N)<
+                  BOOST_PP_ENUM_BINARY_PARAMS(N,T,& BOOST_PP_INTERCEPT) >
+                arg(BOOST_PP_ENUM_PARAMS(N,a));
+            return this->fnc_transformed(arg);
+        }
+#undef N
+#endif // defined(BOOST_PP_IS_ITERATING)
+#endif
+
similarity index 76%
rename from deal.II/contrib/boost/include/boost/fusion/functional/generation.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation.hpp
index 3dabd3eea582f4ad9524162a5ae300a98f4c2ca3..3d812b9f7e7096628ee7b9b2c790d0072cbfb410 100644 (file)
@@ -12,8 +12,6 @@
 #include <boost/fusion/functional/generation/make_fused.hpp>
 #include <boost/fusion/functional/generation/make_fused_procedure.hpp>
 #include <boost/fusion/functional/generation/make_fused_function_object.hpp>
-#include <boost/fusion/functional/generation/make_unfused_generic.hpp>
-#include <boost/fusion/functional/generation/make_unfused_lvalue_args.hpp>
-#include <boost/fusion/functional/generation/make_unfused_rvalue_args.hpp>
+#include <boost/fusion/functional/generation/make_unfused.hpp>
 
 #endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/functional/generation/make_unfused.hpp
new file mode 100644 (file)
index 0000000..79eadbd
--- /dev/null
@@ -0,0 +1,18 @@
+/*=============================================================================
+    Copyright (c) 2007 Tobias Schwinger
+  
+    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).
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_FUNCTIONAL_GENERATION_MAKE_UNFUSED_HPP_INCLUDED)
+#define BOOST_FUSION_FUNCTIONAL_GENERATION_MAKE_UNFUSED_HPP_INCLUDED
+
+#include <boost/fusion/functional/adapter/unfused.hpp>
+
+#define BOOST_FUSION_CLASS_TPL_NAME unfused
+#include <boost/fusion/functional/generation/detail/gen_make_adapter.hpp>
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/include/nview.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/include/nview.hpp
new file mode 100644 (file)
index 0000000..215329d
--- /dev/null
@@ -0,0 +1,12 @@
+/*=============================================================================
+    Copyright (c) 2001-2007 Joel de Guzman
+
+    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(FUSION_INCLUDE_NVIEW)
+#define FUSION_INCLUDE_NVIEW
+
+#include <boost/fusion/view/nview.hpp>
+
+#endif
similarity index 73%
rename from deal.II/contrib/boost/include/boost/fusion/include/remove.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/include/remove.hpp
index 7f0b4657da714735169cba67997c107ec566db5b..9f11d696171a1d5c7c39bc9fca3ce6fb4c9fb9d4 100644 (file)
@@ -4,9 +4,9 @@
     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(FUSION_INCLUDE_REMOVE_IF)
-#define FUSION_INCLUDE_REMOVE_IF
+#if !defined(FUSION_INCLUDE_REMOVE)
+#define FUSION_INCLUDE_REMOVE
 
-#include <boost/fusion/algorithm/transformation/remove_if.hpp>
+#include <boost/fusion/algorithm/transformation/remove.hpp>
 
 #endif
similarity index 86%
rename from deal.II/contrib/boost/include/boost/fusion/iterator/iterator_facade.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/iterator/iterator_facade.hpp
index f1720bdba44fac4bd6436d0eee2bee85cec1f105..3e0a926f2b36d82857b79b9318ed52181fb91e6a 100644 (file)
@@ -1,7 +1,7 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
 
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    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(FUSION_ITERATOR_FACADE_09252006_1011)
@@ -9,6 +9,7 @@
 
 #include <boost/fusion/support/iterator_base.hpp>
 #include <boost/fusion/iterator/detail/advance.hpp>
+#include <boost/fusion/iterator/detail/distance.hpp>
 #include <boost/fusion/support/category_of.hpp>
 #include <boost/type_traits/is_same.hpp>
 #include <boost/mpl/assert.hpp>
@@ -44,6 +45,13 @@ namespace boost { namespace fusion
         {
             BOOST_MPL_ASSERT_NOT((traits::is_random_access<Iterator>));
         };
+
+        // default implementation
+        template <typename First, typename Last>
+        struct distance :
+            distance_detail::linear_distance<First, Last>
+        {
+        };
     };
 }}
 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/fusion/sequence/intrinsic/at.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/intrinsic/at.hpp
index 4524ace5dc094eca025c0994e25650c48eeadffd..bcb67990e9d0a1e53afb05bc4c218a4c4101fa41 100644 (file)
@@ -91,14 +91,14 @@ namespace boost { namespace fusion
         >::type
     at_c(Sequence& seq)
     {
-        return at<mpl::int_<N> >(seq);
+        return fusion::at<mpl::int_<N> >(seq);
     }
 
     template <int N, typename Sequence>
     inline typename result_of::at_c<Sequence const, N>::type
     at_c(Sequence const& seq)
     {
-        return at<mpl::int_<N> >(seq);
+        return fusion::at<mpl::int_<N> >(seq);
     }
 }}
 
similarity index 95%
rename from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/in.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/in.hpp
index cd772514309c3ceebb3891ced5e48962878db666..b0620284ed7845c5b71e757988ee0b9fedf2e34f 100644 (file)
@@ -35,7 +35,7 @@ namespace boost { namespace fusion { namespace detail
 
         template <typename IS>
         static void
-        read(IS& is, char const* delim, mpl::true_)
+        read(IS&, char const*, mpl::true_)
         {
         }
     };
@@ -44,7 +44,7 @@ namespace boost { namespace fusion { namespace detail
     {
         template <typename IS, typename First, typename Last>
         static void
-        call(IS& is, First const&, Last const&, mpl::true_)
+        call(IS&, First const&, Last const&, mpl::true_)
         {
         }
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/manip.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/manip.hpp
index dd9a52659bd84696facb02ff60c19a82c1326f6a..988f8bc2bc99eefbfad77697116dea07bde1be12 100644 (file)
@@ -146,6 +146,10 @@ namespace boost { namespace fusion
             }
 
             Stream& stream;
+
+        private:
+            // silence MSVC warning C4512: assignment operator could not be generated
+            string_ios_manip& operator= (string_ios_manip const&);
         };
 
     } // detail
similarity index 95%
rename from deal.II/contrib/boost/include/boost/fusion/sequence/io/detail/out.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/sequence/io/detail/out.hpp
index c8ab2085d0b9d4f85362904476393ab5a127c290..6d0c28a7cea5b618f466c269f5f7466495bda92b 100644 (file)
@@ -35,7 +35,7 @@ namespace boost { namespace fusion { namespace detail
 
         template <typename OS>
         static void
-        print(OS& os, char const* delim, mpl::true_)
+        print(OS&, char const*, mpl::true_)
         {
         }
     };
@@ -44,7 +44,7 @@ namespace boost { namespace fusion { namespace detail
     {
         template <typename OS, typename First, typename Last>
         static void
-        call(OS& os, First const&, Last const&, mpl::true_)
+        call(OS&, First const&, Last const&, mpl::true_)
         {
         }
 
similarity index 90%
rename from deal.II/contrib/boost/include/boost/fusion/support/deduce.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/support/deduce.hpp
index 37710ec1f2f3d5209cac79514e5b600c95ec92d1..3a7231bdf14700725e8e78403430c85084c0a68c 100644 (file)
@@ -87,6 +87,18 @@ namespace boost { namespace fusion { namespace traits
 
     // Keep references on arrays, even if const
 
+    template <typename T, int N>
+    struct deduce<T(&)[N]>
+    {
+        typedef T(&type)[N];
+    };
+
+    template <typename T, int N>
+    struct deduce<volatile T(&)[N]>
+    {
+        typedef volatile T(&type)[N]; 
+    };
+
     template <typename T, int N>
     struct deduce<const T(&)[N]>
     {
similarity index 70%
rename from deal.II/contrib/boost/include/boost/fusion/support/detail/access.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/support/detail/access.hpp
index 0508e50f138b088f98f791cee5785e0f86db52a1..af7374ccc7ae68b3fe424ee4a0960d755cf5f704 100644 (file)
@@ -7,12 +7,8 @@
 #if !defined(FUSION_ACCESS_04182005_0737)
 #define FUSION_ACCESS_04182005_0737
 
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
 #include <boost/type_traits/add_const.hpp>
 #include <boost/type_traits/add_reference.hpp>
-#include <boost/type_traits/is_reference.hpp>
-#include <boost/type_traits/remove_cv.hpp>
 
 namespace boost { namespace fusion { namespace detail
 {
@@ -33,22 +29,35 @@ namespace boost { namespace fusion { namespace detail
     };
 
     template <typename T>
-    struct non_ref_parameter
+    struct call_param
     {
-        typedef typename boost::remove_cv<T>::type const& type;
+        typedef T const& type;
     };
 
     template <typename T>
-    struct call_param
+    struct call_param<T &>
     {
-        typedef typename 
-            mpl::eval_if<
-                is_reference<T>
-              , mpl::identity<T>
-              , non_ref_parameter<T>
-            >::type
-        type;
+        typedef T& type;
     };
+
+    template <typename T>
+    struct call_param<T const>
+    {
+        typedef T const& type;
+    };
+
+    template <typename T>
+    struct call_param<T volatile>
+    {
+        typedef T const& type;
+    };
+
+    template <typename T>
+    struct call_param<T const volatile>
+    {
+        typedef T const& type;
+    };
+
 }}}
 
 #endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/fusion/support/tag_of.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/support/tag_of.hpp
index 282da4112a3e1c27c4fe4126f230157ca01fc325..a8e2ed07a044dc167d9f2a387f4c6da9efa50cb0 100644 (file)
@@ -85,11 +85,11 @@ namespace boost { namespace fusion
     {
         template <typename Sequence, typename Active>
         struct tag_of
-          : mpl::if_< detail::is_mpl_sequence<Sequence>,
+          : mpl::if_< fusion::detail::is_mpl_sequence<Sequence>,
               mpl::identity<mpl_sequence_tag>,
               mpl::identity<non_fusion_tag> >::type
         {
-            BOOST_MPL_ASSERT_NOT((detail::is_specialized<Sequence>));
+            BOOST_MPL_ASSERT_NOT((fusion::detail::is_specialized<Sequence>));
         };
 
         template <typename Sequence>
similarity index 75%
rename from deal.II/contrib/boost/include/boost/fusion/support/unused.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/support/unused.hpp
index dc2014ec0c1357b8d7a161ae4b2f9af0995072a1..c62b738a34273ea54ac42dbb5a98610af606d5bf 100644 (file)
@@ -1,7 +1,7 @@
 /*=============================================================================
     Copyright (c) 2001-2006 Joel de Guzman
 
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 ==============================================================================*/
 #if !defined(BOOST_FUSION_SUPPORT_UNUSED_20070305_1038)
 # pragma warning(disable: 4522) // multiple assignment operators specified warning
 #endif
 
-namespace boost { namespace fusion {
+#define BOOST_FUSION_UNUSED_HAS_IO
+
+namespace boost { namespace fusion
+{
     struct unused_type
     {
         unused_type()
@@ -53,6 +56,26 @@ namespace boost { namespace fusion {
     };
 
     unused_type const unused = unused_type();
+
+    namespace detail
+    {
+        struct unused_only
+        {
+            unused_only(unused_type const&) {}
+        };
+    }
+
+    template <typename Out>
+    inline Out& operator<<(Out& out, detail::unused_only const&)
+    {
+        return out;
+    }
+
+    template <typename In>
+    inline In& operator>>(In& in, unused_type&)
+    {
+        return in;
+    }
 }}
 
 #if defined(BOOST_MSVC)
similarity index 99%
rename from deal.II/contrib/boost/include/boost/fusion/view/ext_/segmented_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/view/ext_/segmented_iterator.hpp
index 0a192bdce71ebfafc50536997a4180300542dbf7..b28182a4cf59d902d50551f96d5e97e873310e72 100644 (file)
@@ -327,8 +327,8 @@ namespace boost { namespace fusion
         typedef typename Cons::car_type car_type;
         typedef typename Cons::cdr_type cdr_type;
 
-        explicit segmented_iterator(Cons const &cons)
-          : cons_(cons)
+        explicit segmented_iterator(Cons const &c)
+          : cons_(c)
         {}
 
         cons_type const &cons() const { return this->cons_; };
similarity index 92%
rename from deal.II/contrib/boost/include/boost/fusion/view/filter_view/filter_view.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/view/filter_view/filter_view.hpp
index a34747e6eb6e3aa0bff14f45dc0a478e22654e60..c3e63fdb73893ee1bea7ebb2c6ee4ca50e8d84e5 100644 (file)
@@ -43,6 +43,10 @@ namespace boost { namespace fusion
         first_type first() const { return fusion::begin(seq); }
         last_type last() const { return fusion::end(seq); }
         typename mpl::if_<traits::is_view<Sequence>, Sequence, Sequence&>::type seq;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        filter_view& operator= (filter_view const&);
     };
 }}
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview.hpp
new file mode 100644 (file)
index 0000000..92e2f26
--- /dev/null
@@ -0,0 +1,15 @@
+/*=============================================================================
+    Copyright (c) 2001-2006 Joel de Guzman
+    Copyright (c) 2006 Dan Marsden
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(FUSION_NVIEW_SEP_23_2009_1107PM)
+#define FUSION_NVIEW_SEP_23_2009_1107PM
+
+#include <boost/fusion/view/nview/nview.hpp>
+#include <boost/fusion/view/nview/nview_iterator.hpp>
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/advance_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/advance_impl.hpp
new file mode 100644 (file)
index 0000000..391bebd
--- /dev/null
@@ -0,0 +1,49 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_ADVANCE_IMPL_SEP_24_2009_0212PM)
+#define BOOST_FUSION_NVIEW_ADVANCE_IMPL_SEP_24_2009_0212PM
+
+#include <boost/mpl/advance.hpp>
+#include <boost/fusion/iterator/advance.hpp>
+
+namespace boost { namespace fusion 
+{
+    struct nview_iterator_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct advance_impl;
+
+        template<>
+        struct advance_impl<nview_iterator_tag>
+        {
+            template<typename Iterator, typename Dist>
+            struct apply
+            {
+                typedef typename Iterator::first_type::iterator_type iterator_type;
+                typedef typename Iterator::sequence_type sequence_type;
+
+                typedef nview_iterator<sequence_type, 
+                    typename mpl::advance<iterator_type, Dist>::type> type;
+
+                static type
+                call(Iterator const& i)
+                {
+                    return type(i.seq);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/at_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/at_impl.hpp
new file mode 100644 (file)
index 0000000..f1f4164
--- /dev/null
@@ -0,0 +1,45 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_AT_IMPL_SEP_24_2009_0225PM)
+#define BOOST_FUSION_NVIEW_AT_IMPL_SEP_24_2009_0225PM
+
+#include <boost/fusion/sequence/intrinsic/at.hpp>
+
+namespace boost { namespace fusion 
+{
+    struct nview_tag;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct at_impl;
+
+        template<>
+        struct at_impl<nview_tag>
+        {
+            template<typename Sequence, typename N>
+            struct apply
+            {
+                typedef typename Sequence::sequence_type sequence_type;
+                typedef typename Sequence::index_type index_type;
+
+                typedef typename result_of::at<index_type, N>::type index;
+                typedef typename result_of::at<sequence_type, index>::type type;
+
+                static type 
+                call(Sequence& seq)
+                {
+                    return fusion::at<index>(seq.seq);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/begin_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/begin_impl.hpp
new file mode 100644 (file)
index 0000000..8ba59fc
--- /dev/null
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_BEGIN_IMPL_SEP_23_2009_1036PM)
+#define BOOST_FUSION_NVIEW_BEGIN_IMPL_SEP_23_2009_1036PM
+
+#include <boost/mpl/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct begin_impl;
+
+        template<>
+        struct begin_impl<nview_tag>
+        {
+            template<typename Sequence>
+            struct apply
+            {
+                typedef typename Sequence::index_type index_type;
+
+                typedef nview_iterator<Sequence, 
+                    typename mpl::begin<index_type>::type> type;
+
+                static type call(Sequence& s)
+                {
+                    return type(s);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/deref_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/deref_impl.hpp
new file mode 100644 (file)
index 0000000..075f0b0
--- /dev/null
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_DEREF_IMPL_SEP_24_2009_0818AM)
+#define BOOST_FUSION_NVIEW_DEREF_IMPL_SEP_24_2009_0818AM
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/container/vector.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_iterator_tag;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct deref_impl;
+
+        template<>
+        struct deref_impl<nview_iterator_tag>
+        {
+            template<typename Iterator>
+            struct apply
+            {
+                typedef typename Iterator::first_type first_type;
+                typedef typename Iterator::sequence_type sequence_type;
+
+                typedef typename result_of::deref<first_type>::type index;
+                typedef typename result_of::at<
+                    typename sequence_type::sequence_type, index>::type type;
+
+                static type call(Iterator const& i)
+                {
+                    return at<index>(i.seq.seq);
+                }
+            };
+        };
+
+    }
+
+}}
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/distance_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/distance_impl.hpp
new file mode 100644 (file)
index 0000000..9bc860c
--- /dev/null
@@ -0,0 +1,44 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_DISTANCE_IMPL_SEP_23_2009_0328PM)
+#define BOOST_FUSION_NVIEW_DISTANCE_IMPL_SEP_23_2009_0328PM
+
+#include <boost/fusion/iterator/distance.hpp>
+
+namespace boost { namespace fusion 
+{
+    struct nview_iterator_tag;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct distance_impl;
+
+        template<>
+        struct distance_impl<nview_iterator_tag>
+        {
+            template<typename First, typename Last>
+            struct apply
+              : result_of::distance<typename First::first_type, typename Last::first_type>
+            {
+                typedef typename result_of::distance<
+                    typename First::first_type, typename Last::first_type
+                >::type type;
+
+                static type
+                call(First const& first, Last const& last)
+                {
+                    return type();
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/end_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/end_impl.hpp
new file mode 100644 (file)
index 0000000..7897748
--- /dev/null
@@ -0,0 +1,50 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_END_IMPL_SEP_24_2009_0140PM)
+#define BOOST_FUSION_NVIEW_END_IMPL_SEP_24_2009_0140PM
+
+#include <boost/mpl/end.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template <typename Tag>
+        struct end_impl;
+
+        // Unary Version
+        template <>
+        struct end_impl<nview_tag>
+        {
+            template <typename Sequence>
+            struct apply
+            {
+                typedef typename Sequence::index_type index_type;
+
+                typedef nview_iterator<Sequence, 
+                    typename mpl::end<index_type>::type> type;
+
+                static type call(Sequence& s)
+                {
+                    return type(s);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/equal_to_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/equal_to_impl.hpp
new file mode 100644 (file)
index 0000000..517204b
--- /dev/null
@@ -0,0 +1,33 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_ITERATOR_SEP_24_2009_0329PM)
+#define BOOST_FUSION_NVIEW_ITERATOR_SEP_24_2009_0329PM
+
+#include <boost/fusion/iterator/equal_to.hpp>
+
+namespace boost { namespace fusion 
+{
+    struct nview_iterator_tag;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct equal_to_impl;
+
+        template<>
+        struct equal_to_impl<nview_iterator_tag>
+        {
+            template<typename It1, typename It2>
+            struct apply
+              : result_of::equal_to<typename It1::first_type, typename It2::first_type>
+            {};
+        };
+    }
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/next_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/next_impl.hpp
new file mode 100644 (file)
index 0000000..01cccf2
--- /dev/null
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_NEXT_IMPL_SEP_24_2009_0116PM)
+#define BOOST_FUSION_NVIEW_NEXT_IMPL_SEP_24_2009_0116PM
+
+#include <boost/mpl/next.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_iterator_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template <typename Tag>
+        struct next_impl;
+
+        template <>
+        struct next_impl<nview_iterator_tag>
+        {
+            template <typename Iterator>
+            struct apply 
+            {
+                typedef typename Iterator::first_type::iterator_type first_type;
+                typedef typename Iterator::sequence_type sequence_type;
+
+                typedef nview_iterator<sequence_type,
+                    typename mpl::next<first_type>::type> type;
+
+                static type
+                call(Iterator const& i)
+                {
+                    return type(i.seq);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/nview_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/nview_impl.hpp
new file mode 100644 (file)
index 0000000..03aa49f
--- /dev/null
@@ -0,0 +1,77 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#ifndef BOOST_PP_IS_ITERATING
+
+#if !defined(BOOST_FUSION_NVIEW_IMPL_SEP_23_2009_1017PM)
+#define BOOST_FUSION_NVIEW_IMPL_SEP_23_2009_1017PM
+
+#include <climits>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repeat.hpp>
+#include <boost/preprocessor/iterate.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+#define BOOST_PP_ITERATION_PARAMS_1                                           \
+    (3, (1, FUSION_MAX_VECTOR_SIZE,                                           \
+    "boost/fusion/view/nview/detail/nview_impl.hpp"))                         \
+    /**/
+
+///////////////////////////////////////////////////////////////////////////////
+namespace boost { namespace fusion { namespace result_of
+{
+    template <typename Sequence
+      , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(FUSION_MAX_VECTOR_SIZE, int I, LONG_MAX)>
+    struct as_nview
+    {
+        typedef mpl::vector_c<
+            int, BOOST_PP_ENUM_PARAMS(FUSION_MAX_VECTOR_SIZE, I)
+        > index_type;
+        typedef nview<Sequence, index_type> type;
+    };
+}}}
+
+#include BOOST_PP_ITERATE()
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+//  Preprocessor vertical repetition code
+///////////////////////////////////////////////////////////////////////////////
+#else // defined(BOOST_PP_IS_ITERATING)
+
+#define N BOOST_PP_ITERATION()
+
+#if N < FUSION_MAX_VECTOR_SIZE
+namespace boost { namespace fusion { namespace result_of
+{
+    template <typename Sequence, BOOST_PP_ENUM_PARAMS(N, int I)>
+    struct as_nview<Sequence, BOOST_PP_ENUM_PARAMS(N, I)>
+    {
+        typedef mpl::vector_c<int, BOOST_PP_ENUM_PARAMS(N, I)> index_type;
+        typedef nview<Sequence, index_type> type;
+    };
+}}}
+#endif
+
+namespace boost { namespace fusion
+{
+    template<BOOST_PP_ENUM_PARAMS(N, int I), typename Sequence>
+    inline nview<Sequence, mpl::vector_c<int, BOOST_PP_ENUM_PARAMS(N, I)> >
+    as_nview(Sequence& s)
+    {
+        typedef mpl::vector_c<int, BOOST_PP_ENUM_PARAMS(N, I)> index_type;
+        return nview<Sequence, index_type>(s);
+    }
+
+}}
+
+#undef N
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/prior_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/prior_impl.hpp
new file mode 100644 (file)
index 0000000..079a9ca
--- /dev/null
@@ -0,0 +1,48 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_PRIOR_IMPL_SEP_24_2009_0142PM)
+#define BOOST_FUSION_NVIEW_PRIOR_IMPL_SEP_24_2009_0142PM
+
+#include <boost/mpl/prior.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_iterator_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template <typename Tag>
+        struct prior_impl;
+
+        template <>
+        struct prior_impl<nview_iterator_tag>
+        {
+            template <typename Iterator>
+            struct apply 
+            {
+                typedef typename Iterator::first_type::iterator_type first_type;
+                typedef typename Iterator::sequence_type sequence_type;
+
+                typedef nview_iterator<sequence_type,
+                    typename mpl::prior<first_type>::type> type;
+
+                static type
+                call(Iterator const& i)
+                {
+                    return type(i.seq);
+                }
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/size_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/size_impl.hpp
new file mode 100644 (file)
index 0000000..0c83402
--- /dev/null
@@ -0,0 +1,38 @@
+/*=============================================================================
+    Copyright (c) 2001-2006 Joel de Guzman
+
+    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(FUSION_NVIEW_SIZE_IMPL_OCT_06_2009_0525PM)
+#define FUSION_NVIEW_SIZE_IMPL_OCT_06_2009_0525PM
+
+#include <boost/fusion/iterator/distance.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_tag;
+
+    namespace extension
+    {
+        template <typename Tag>
+        struct size_impl;
+
+        template <>
+        struct size_impl<nview_tag>
+        {
+            template <typename Sequence>
+            struct apply
+                : result_of::distance<
+                    typename result_of::begin<Sequence>::type
+                  , typename result_of::end<Sequence>::type>
+            {};
+        };
+    }
+}}
+
+#endif
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_at_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_at_impl.hpp
new file mode 100644 (file)
index 0000000..145bb62
--- /dev/null
@@ -0,0 +1,39 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_VALUE_AT_IMPL_SEP_24_2009_0234PM)
+#define BOOST_FUSION_NVIEW_VALUE_AT_IMPL_SEP_24_2009_0234PM
+
+#include <boost/fusion/sequence/intrinsic/value_at.hpp>
+
+namespace boost { namespace fusion 
+{
+    struct nview_tag;
+
+    namespace extension
+    {
+        template<typename Tag>
+        struct value_at_impl;
+
+        template<>
+        struct value_at_impl<nview_tag>
+        {
+            template<typename Sequence, typename N>
+            struct apply
+            {
+                typedef typename Sequence::sequence_type sequence_type;
+                typedef typename Sequence::index_type index_type;
+
+                typedef typename result_of::at<index_type, N>::type index;
+                typedef typename result_of::at<sequence_type, index>::type type;
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_of_impl.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/detail/value_of_impl.hpp
new file mode 100644 (file)
index 0000000..5b0a85b
--- /dev/null
@@ -0,0 +1,44 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_VALUE_OF_PRIOR_IMPL_SEP_24_2009_0158PM)
+#define BOOST_FUSION_VALUE_OF_PRIOR_IMPL_SEP_24_2009_0158PM
+
+#include <boost/fusion/iterator/deref.hpp>
+#include <boost/fusion/container/vector.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_iterator_tag;
+
+    template <typename Sequence, typename Pos>
+    struct nview_iterator;
+
+    namespace extension
+    {
+        template <typename Tag>
+        struct value_of_impl;
+
+        template <>
+        struct value_of_impl<nview_iterator_tag>
+        {
+            template <typename Iterator>
+            struct apply 
+            {
+                typedef typename Iterator::first_type first_type;
+                typedef typename Iterator::sequence_type sequence_type;
+
+                typedef typename result_of::deref<first_type>::type index;
+                typedef typename result_of::at<
+                    typename sequence_type::sequence_type, index>::type type;
+            };
+        };
+    }
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview.hpp
new file mode 100644 (file)
index 0000000..fe8d35c
--- /dev/null
@@ -0,0 +1,100 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+
+#if !defined(BOOST_FUSION_NVIEW_SEP_23_2009_0948PM)
+#define BOOST_FUSION_NVIEW_SEP_23_2009_0948PM
+
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/vector_c.hpp>
+#include <boost/utility/result_of.hpp>
+
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/fusion/support/is_view.hpp>
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/sequence_base.hpp>
+#include <boost/fusion/container/vector.hpp>
+#include <boost/fusion/view/transform_view.hpp>
+
+namespace boost { namespace fusion
+{
+    namespace detail
+    {
+        struct addref
+        {
+            template<typename Sig>
+            struct result;
+
+            template<typename U>
+            struct result<addref(U)> : add_reference<U> {};
+
+            template <typename T>
+            typename boost::result_of<addref(T)>::type 
+            operator()(T& x) const
+            {
+                return x;
+            }
+        };
+
+        struct addconstref
+        {
+            template<typename Sig>
+            struct result;
+
+            template<typename U>
+            struct result<addconstref(U)> 
+              : add_reference<typename add_const<U>::type> 
+            {};
+
+            template <typename T>
+            typename boost::result_of<addconstref(T)>::type 
+            operator()(T& x) const
+            {
+                return x;
+            }
+        };
+    }
+
+    struct nview_tag;
+    struct random_access_traversal_tag;
+    struct fusion_sequence_tag;
+
+    template<typename Sequence, typename Indicies>
+    struct nview
+      : sequence_base<nview<Sequence, Indicies> >
+    {
+        typedef nview_tag fusion_tag;
+        typedef fusion_sequence_tag tag; // this gets picked up by MPL
+        typedef random_access_traversal_tag category;
+
+        typedef mpl::true_ is_view;
+        typedef Indicies index_type;
+        typedef typename mpl::size<Indicies>::type size;
+
+        typedef typename mpl::if_<
+            is_const<Sequence>, detail::addconstref, detail::addref
+        >::type transform_type;
+        typedef transform_view<Sequence, transform_type> transform_view_type;
+        typedef typename result_of::as_vector<transform_view_type>::type 
+            sequence_type;
+
+        explicit nview(Sequence& val)
+          : seq(sequence_type(transform_view_type(val, transform_type()))) 
+        {}
+
+        sequence_type seq;
+    };
+
+}}
+
+// define the nview() generator functions
+#include <boost/fusion/view/nview/detail/nview_impl.hpp>
+
+#endif
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/fusion/view/nview/nview_iterator.hpp
new file mode 100644 (file)
index 0000000..4fc06a8
--- /dev/null
@@ -0,0 +1,58 @@
+/*=============================================================================
+    Copyright (c) 2009 Hartmut Kaiser
+
+    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+==============================================================================*/
+#if !defined(BOOST_FUSION_NVIEW_ITERATOR_SEP_23_2009_0948PM)
+#define BOOST_FUSION_NVIEW_ITERATOR_SEP_23_2009_0948PM
+
+#include <boost/fusion/support/iterator_base.hpp>
+#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/sequence/intrinsic/begin.hpp>
+#include <boost/fusion/sequence/intrinsic/end.hpp>
+#include <boost/fusion/adapted/mpl/mpl_iterator.hpp>
+
+#include <boost/fusion/view/nview/detail/size_impl.hpp>
+#include <boost/fusion/view/nview/detail/begin_impl.hpp>
+#include <boost/fusion/view/nview/detail/end_impl.hpp>
+#include <boost/fusion/view/nview/detail/deref_impl.hpp>
+#include <boost/fusion/view/nview/detail/value_of_impl.hpp>
+#include <boost/fusion/view/nview/detail/next_impl.hpp>
+#include <boost/fusion/view/nview/detail/prior_impl.hpp>
+#include <boost/fusion/view/nview/detail/at_impl.hpp>
+#include <boost/fusion/view/nview/detail/value_at_impl.hpp>
+#include <boost/fusion/view/nview/detail/advance_impl.hpp>
+#include <boost/fusion/view/nview/detail/distance_impl.hpp>
+#include <boost/fusion/view/nview/detail/equal_to_impl.hpp>
+
+namespace boost { namespace fusion
+{
+    struct nview_iterator_tag;
+    struct random_access_traversal_tag;
+
+    template<typename Sequence, typename Pos>
+    struct nview_iterator
+      : iterator_base<nview_iterator<Sequence, Pos> >
+    {
+        typedef nview_iterator_tag fusion_tag;
+        typedef random_access_traversal_tag category;
+
+        typedef Sequence sequence_type;
+        typedef mpl_iterator<Pos> first_type;
+
+        explicit nview_iterator(Sequence& seq)
+          : seq(seq) {}
+
+        Sequence& seq;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        nview_iterator& operator= (nview_iterator const&);
+    };
+
+}}
+
+#endif
+
+
similarity index 96%
rename from deal.II/contrib/boost/include/boost/fusion/view/transform_view/transform_view.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/transform_view.hpp
index fcf876a0a17fa4be3a94ee1b4ec3a3bf3173dea0..78b6560e767ce88d895a45ec421045e0d7f00bde 100644 (file)
@@ -99,6 +99,10 @@ namespace boost { namespace fusion
         last_type last() const { return fusion::end(seq); }
         typename mpl::if_<traits::is_view<Sequence>, Sequence, Sequence&>::type seq;
         transform_type f;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        transform_view& operator= (transform_view const&);
     };
 }}
 
similarity index 88%
rename from deal.II/contrib/boost/include/boost/fusion/view/transform_view/transform_view_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/fusion/view/transform_view/transform_view_iterator.hpp
index bb4b6afdb47708190048ef7d7fcb40c61a6e75da..fde67323c80b55846fe7d74e6731e4619c5a96af 100644 (file)
@@ -39,6 +39,10 @@ namespace boost { namespace fusion
 
         first_type first;
         transform_type f;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        transform_view_iterator& operator= (transform_view_iterator const&);
     };
 
     // Binary Version
@@ -62,6 +66,10 @@ namespace boost { namespace fusion
         first1_type first1;
         first2_type first2;
         transform_type f;
+
+    private:
+        // silence MSVC warning C4512: assignment operator could not be generated
+        transform_view_iterator2& operator= (transform_view_iterator2 const&);
     };
 }}
 
similarity index 69%
rename from deal.II/contrib/boost/include/boost/get_pointer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/get_pointer.hpp
index 17d11b8fef73b47500e28297da63af926bb71f68..a0cd5c0b196af495deadfe6a8aeb98cdad64aea5 100644 (file)
@@ -5,7 +5,11 @@
 #ifndef GET_POINTER_DWA20021219_HPP
 # define GET_POINTER_DWA20021219_HPP
 
-# include <memory>
+// In order to avoid circular dependencies with Boost.TR1
+// we make sure that our include of <memory> doesn't try to
+// pull in the TR1 headers: that's why we use this header 
+// rather than including <memory> directly:
+# include <boost/config/no_tr1/memory.hpp>  // std::auto_ptr
 
 namespace boost { 
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/accounting.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/accounting.hpp
new file mode 100644 (file)
index 0000000..6643e75
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_ACCOUNTING_HPP
+#define BOOST_GRAPH_ACCOUNTING_HPP
+
+#include <iomanip>
+#include <iostream>
+#include <string>
+#include <sstream>
+#include <boost/mpi/config.hpp>
+
+namespace boost { namespace graph { namespace accounting {
+
+typedef double time_type;
+
+inline time_type get_time()
+{
+  return MPI_Wtime();
+}
+
+inline std::string print_time(time_type t)
+{
+  std::ostringstream out;
+  out << std::setiosflags(std::ios::fixed) << std::setprecision(2) << t;
+  return out.str();
+}
+
+} } } // end namespace boost::graph::accounting
+
+#endif // BOOST_GRAPH_ACCOUNTING_HPP
similarity index 88%
rename from deal.II/contrib/boost/include/boost/graph/adj_list_serialize.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/adj_list_serialize.hpp
index de6ce5c36703cb8e408407bfe0d34d45ece09610..af0c0d89760410f0874ab109591e72f661bbcd15 100644 (file)
@@ -10,6 +10,7 @@
 #define ADJ_LIST_SERIALIZE_HPP
 
 #include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/iteration_macros.hpp>
 #include <boost/pending/property_serialize.hpp>
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
@@ -49,18 +50,16 @@ inline void save(
   // assign indices to vertices
   std::map<Vertex,int> indices;
   int num = 0;
-  typename graph_traits<Graph>::vertex_iterator vi;
-  for (vi = vertices(graph).first; vi != vertices(graph).second; ++vi) {
-    indices[*vi] = num++;
-    ar << serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, *vi) );
+  BGL_FORALL_VERTICES_T(v, graph, Graph) {
+    indices[v] = num++;
+    ar << serialization::make_nvp("vertex_property", get(vertex_all_t(), graph, v) );
   }
   
   // write edges
-  typename graph_traits<Graph>::edge_iterator ei;
-  for (ei = edges(graph).first; ei != edges(graph).second; ++ei){
-    ar << serialization::make_nvp("u" , indices[source(*ei,graph)]);
-    ar << serialization::make_nvp("v" , indices[target(*ei,graph)]);
-    ar << serialization::make_nvp("edge_property", get(edge_all_t(), graph, *ei) );
+  BGL_FORALL_EDGES_T(e, graph, Graph) {
+    ar << serialization::make_nvp("u" , indices[source(e,graph)]);
+    ar << serialization::make_nvp("v" , indices[target(e,graph)]);
+    ar << serialization::make_nvp("edge_property", get(edge_all_t(), graph, e) );
   }
 }
 
similarity index 83%
rename from deal.II/contrib/boost/include/boost/graph/adjacency_list.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_list.hpp
index a60916a250c059777677a60269be46b7f616c205..6ba8f435c0b2dabbfde375165eae5b22d95f9ea0 100644 (file)
@@ -17,6 +17,9 @@
 #include <list>
 #include <set>
 
+// TODO: Deprecating this requires some cooperation from Boost.Config. It's not
+// a good idea to just refuse the inclusion because it could break otherwise
+// functioning code.
 #if !defined BOOST_NO_HASH
 #  ifdef BOOST_HASH_SET_HEADER
 #    include BOOST_HASH_SET_HEADER
@@ -34,8 +37,9 @@
 #endif
 
 #include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_mutability_traits.hpp>
 #include <boost/graph/graph_selectors.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/mpl/and.hpp>
 #include <boost/mpl/not.hpp>
@@ -44,6 +48,7 @@
 #include <boost/type_traits/is_same.hpp>
 #include <boost/detail/workaround.hpp>
 #include <boost/graph/properties.hpp>
+#include <boost/graph/named_graph.hpp>
 
 namespace boost {
 
@@ -59,17 +64,20 @@ namespace boost {
 #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 
 #if !defined BOOST_NO_SLIST
-  struct slistS {};  
+  struct slistS {};
 #endif
 
   struct vecS  { };
   struct listS { };
   struct setS { };
-  struct multisetS { };
   struct mapS  { };
+  struct multisetS { };
+  struct multimapS { };
 #if !defined BOOST_NO_HASH
-  struct hash_mapS { };
   struct hash_setS { };
+  struct hash_mapS { };
+  struct hash_multisetS { };
+  struct hash_multimapS { };
 #endif
 
   template <class Selector, class ValueType>
@@ -105,16 +113,31 @@ namespace boost {
     typedef std::multiset<ValueType> type;
   };
 
+  template <class ValueType>
+  struct container_gen<multimapS, ValueType> {
+    typedef std::multiset<ValueType> type;
+  };
+
 #if !defined BOOST_NO_HASH
   template <class ValueType>
-  struct container_gen<hash_mapS, ValueType> {
+  struct container_gen<hash_setS, ValueType> {
     typedef BOOST_STD_EXTENSION_NAMESPACE::hash_set<ValueType> type;
   };
 
   template <class ValueType>
-  struct container_gen<hash_setS, ValueType> {
+  struct container_gen<hash_mapS, ValueType> {
     typedef BOOST_STD_EXTENSION_NAMESPACE::hash_set<ValueType> type;
   };
+
+  template <class ValueType>
+  struct container_gen<hash_multisetS, ValueType> {
+    typedef BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<ValueType> type;
+  };
+
+  template <class ValueType>
+  struct container_gen<hash_multimapS, ValueType> {
+    typedef BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<ValueType> type;
+  };
 #endif
 
 #else // !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
@@ -131,37 +154,51 @@ namespace boost {
     struct bind_ { typedef std::vector<T> type; };
   };
 
-  struct listS { 
+  struct listS {
     template <class T>
     struct bind_ { typedef std::list<T> type; };
   };
 
-  struct setS  { 
+  struct setS  {
+    template <class T>
+    struct bind_ { typedef std::set<T, std::less<T> > type; };
+  };
+
+
+  struct mapS  {
     template <class T>
     struct bind_ { typedef std::set<T, std::less<T> > type; };
   };
 
-  struct multisetS  { 
+  struct multisetS  {
+    template <class T>
+    struct bind_ { typedef std::multiset<T, std::less<T> > type; };
+  };
+
+  struct multimapS  {
     template <class T>
     struct bind_ { typedef std::multiset<T, std::less<T> > type; };
   };
 
 #if !defined BOOST_NO_HASH
-  struct hash_setS { 
+  struct hash_setS {
     template <class T>
     struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::hash_set<T, std::less<T> > type; };
   };
-#endif
 
-  struct mapS  { 
+  struct hash_mapS {
     template <class T>
-    struct bind_ { typedef std::set<T, std::less<T> > type; };
+    struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::hash_set<T, std::less<T> > type; };
   };
 
-#if !defined BOOST_NO_HASH
-  struct hash_mapS { 
+  struct hash_multisetS {
     template <class T>
-    struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::hash_set<T, std::less<T> > type; };
+    struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<T, std::less<T> > type; };
+  };
+
+  struct hash_multimapS {
+    template <class T>
+    struct bind_ { typedef BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<T, std::less<T> > type; };
   };
 #endif
 
@@ -198,54 +235,54 @@ namespace boost {
   struct parallel_edge_traits { };
 
   template <>
-  struct parallel_edge_traits<vecS> { 
+  struct parallel_edge_traits<vecS> {
     typedef allow_parallel_edge_tag type; };
 
   template <>
-  struct parallel_edge_traits<listS> { 
+  struct parallel_edge_traits<listS> {
     typedef allow_parallel_edge_tag type; };
 
 #if !defined BOOST_NO_SLIST
   template <>
-  struct parallel_edge_traits<slistS> { 
+  struct parallel_edge_traits<slistS> {
     typedef allow_parallel_edge_tag type; };
 #endif
 
   template <>
-  struct parallel_edge_traits<setS> { 
+  struct parallel_edge_traits<setS> {
     typedef disallow_parallel_edge_tag type; };
 
   template <>
-  struct parallel_edge_traits<multisetS> { 
+  struct parallel_edge_traits<multisetS> {
     typedef allow_parallel_edge_tag type; };
 
 #if !defined BOOST_NO_HASH
   template <>
   struct parallel_edge_traits<hash_setS> {
-    typedef disallow_parallel_edge_tag type; 
+    typedef disallow_parallel_edge_tag type;
   };
 #endif
 
   // mapS is obsolete, replaced with setS
   template <>
-  struct parallel_edge_traits<mapS> { 
+  struct parallel_edge_traits<mapS> {
     typedef disallow_parallel_edge_tag type; };
 
 #if !defined BOOST_NO_HASH
   template <>
   struct parallel_edge_traits<hash_mapS> {
-    typedef disallow_parallel_edge_tag type; 
+    typedef disallow_parallel_edge_tag type;
   };
 #endif
 
   namespace detail {
-    template <class Directed> struct is_random_access { 
+    template <class Directed> struct is_random_access {
       enum { value = false};
       typedef mpl::false_ type;
     };
     template <>
-    struct is_random_access<vecS> { 
-      enum { value = true }; 
+    struct is_random_access<vecS> {
+      enum { value = true };
       typedef mpl::true_ type;
     };
 
@@ -281,21 +318,20 @@ namespace boost {
     typedef typename parallel_edge_traits<OutEdgeListS>::type
       edge_parallel_category;
 
+    typedef std::size_t vertices_size_type;
     typedef void* vertex_ptr;
     typedef typename mpl::if_<is_rand_access,
-      std::size_t, vertex_ptr>::type vertex_descriptor;
+      vertices_size_type, vertex_ptr>::type vertex_descriptor;
     typedef detail::edge_desc_impl<directed_category, vertex_descriptor>
       edge_descriptor;
 
-    typedef std::size_t vertices_size_type;
-
   private:
     // Logic to figure out the edges_size_type
     struct dummy {};
     typedef typename container_gen<EdgeListS, dummy>::type EdgeContainer;
     typedef typename DirectedS::is_bidir_t BidirectionalT;
     typedef typename DirectedS::is_directed_t DirectedT;
-    typedef typename mpl::and_<DirectedT, 
+    typedef typename mpl::and_<DirectedT,
       typename mpl::not_<BidirectionalT>::type >::type on_edge_storage;
   public:
     typedef typename mpl::if_<on_edge_storage,
@@ -325,7 +361,7 @@ namespace boost {
     : public detail::adj_list_gen<
       adjacency_list<OutEdgeListS,VertexListS,DirectedS,
                      VertexProperty,EdgeProperty,GraphProperty,EdgeListS>,
-      VertexListS, OutEdgeListS, DirectedS, 
+      VertexListS, OutEdgeListS, DirectedS,
 #if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
       typename detail::retag_property_list<vertex_bundle_t,
                                            VertexProperty>::type,
@@ -333,8 +369,16 @@ namespace boost {
 #else
       VertexProperty, EdgeProperty,
 #endif
-      GraphProperty, EdgeListS>::type
+      GraphProperty, EdgeListS>::type,
+      // Support for named vertices
+      public graph::maybe_named_graph<
+        adjacency_list<OutEdgeListS,VertexListS,DirectedS,
+                       VertexProperty,EdgeProperty,GraphProperty,EdgeListS>,
+        typename adjacency_list_traits<OutEdgeListS, VertexListS, DirectedS,
+                                       EdgeListS>::vertex_descriptor,
+        VertexProperty>
   {
+      public: // TODO Remove me
 #if !defined(BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
     typedef typename detail::retag_property_list<vertex_bundle_t,
                                                  VertexProperty>::retagged
@@ -371,7 +415,7 @@ namespace boost {
   private:
     typedef adjacency_list self;
     typedef typename detail::adj_list_gen<
-      self, VertexListS, OutEdgeListS, DirectedS, 
+      self, VertexListS, OutEdgeListS, DirectedS,
       vertex_property_type, edge_property_type, GraphProperty, EdgeListS
     >::type Base;
 
@@ -389,7 +433,7 @@ namespace boost {
 
     typedef GraphProperty graph_property_type;
 
-    inline adjacency_list(const GraphProperty& p = GraphProperty()) 
+    inline adjacency_list(const GraphProperty& p = GraphProperty())
       : m_property(p) { }
 
     inline adjacency_list(const adjacency_list& x)
@@ -405,7 +449,7 @@ namespace boost {
     }
 
     // Required by Mutable Graph
-    inline adjacency_list(vertices_size_type num_vertices, 
+    inline adjacency_list(vertices_size_type num_vertices,
                           const GraphProperty& p = GraphProperty())
       : Base(num_vertices), m_property(p) { }
 
@@ -434,6 +478,12 @@ namespace boost {
       *this = tmp;
     }
 
+    void clear()
+    {
+      this->clearing_graph();
+      Base::clear();
+    }
+
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
     // Directly access a vertex or edge bundle
     vertex_bundled& operator[](vertex_descriptor v)
@@ -515,12 +565,12 @@ namespace boost {
   get(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
                                     GraphProperty, EdgeListS>& g)
   {
-    typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, 
+    typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty,
                                                  EdgeProperty, GraphProperty, EdgeListS>, T Bundle::*>::type
       result_type;
     return result_type(&g, p);
   }
-  
+
   template<typename OutEdgeListS, typename VertexListS, typename DirectedS, typename VertexProperty,
            typename EdgeProperty, typename GraphProperty, typename EdgeListS, typename T, typename Bundle>
   inline
@@ -529,7 +579,7 @@ namespace boost {
   get(T Bundle::* p, adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, EdgeProperty,
                                     GraphProperty, EdgeListS> const & g)
   {
-    typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty, 
+    typedef typename property_map<adjacency_list<OutEdgeListS, VertexListS, DirectedS, VertexProperty,
                                                  EdgeProperty, GraphProperty, EdgeListS>, T Bundle::*>::const_type
       result_type;
     return result_type(&g, p);
@@ -557,6 +607,24 @@ namespace boost {
 
 #endif
 
+// Mutability Traits
+#define ADJLIST_PARAMS \
+    typename OEL, typename VL, typename D, typename VP, typename EP, \
+    typename GP, typename EL
+#define ADJLIST adjacency_list<OEL,VL,D,VP,EP,GP,EL>
+template <ADJLIST_PARAMS>
+struct graph_mutability_traits<ADJLIST> {
+    typedef mutable_property_graph_tag category;
+};
+
+// Can't remove vertices from adjacency lists with VL==vecS
+template <typename OEL, typename D, typename VP, typename EP, typename GP, typename EL>
+struct graph_mutability_traits< adjacency_list<OEL,vecS,D,VP,EP,GP,EL> > {
+    typedef add_only_property_graph_tag category;
+};
+#undef ADJLIST_PARAMS
+#undef ADJLIST
+
 
 } // namespace boost
 
similarity index 89%
rename from deal.II/contrib/boost/include/boost/graph/adjacency_list_io.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_list_io.hpp
index fb762fe0162229af5b7a34da858d627d1d510aa8..326d490d04177bb9464d8c0b28e55a0ddda29cb6 100644 (file)
@@ -1,6 +1,6 @@
 //=======================================================================
 // Copyright 2001 Universite Joseph Fourier, Grenoble.
-// Author: François Faure
+// Author: Francois Faure
 //
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
@@ -12,6 +12,7 @@
 #include <iostream>
 #include <vector>
 #include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/iteration_macros.hpp>
 #include <cctype>
 
 // Method read to parse an adjacency list from an input stream. Examples:
@@ -211,13 +212,13 @@ struct PropertyPrinter
         
         PropertyPrinter( const Graph& g ):graph(&g){}
         
-        template<class Iterator>
-        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
+        template<class Val>
+        PropertyPrinter& operator () ( std::ostream& out, const Val& v )
         {
                 typename property_map<Graph,Tag>::type ps = get(Tag(), *graph);
-                out << ps[ *it ] <<" ";
+                out << ps[ v ] <<" ";
                 PropertyPrinter<Graph,Next> print(*graph);
-                print(out, it);
+                print(out, v);
                 return (*this);
         }
 private:
@@ -229,10 +230,10 @@ struct PropertyPrinter
 {
         PropertyPrinter( const Graph& g ):graph(&g){}
         
-        template<class Iterator>
-        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
+        template<class Val>
+        PropertyPrinter& operator () ( std::ostream& out, const Val& v )
         {
-                out << (*graph)[ *it ] <<" ";
+                out << (*graph)[ v ] <<" ";
                 return (*this);
         }
 private:
@@ -244,13 +245,13 @@ struct PropertyPrinter<Graph, property<Tag, Value, Next> >
 {
         PropertyPrinter( const Graph& g ):graph(&g){}
         
-        template<class Iterator>
-        PropertyPrinter& operator () ( std::ostream& out, Iterator it )
+        template<class Val>
+        PropertyPrinter& operator () ( std::ostream& out, const Val& v )
         {
                 typename property_map<Graph,Tag>::type ps = get(Tag(), *graph);
-                out << ps[ *it ] <<" ";
+                out << ps[ v ] <<" ";
                 PropertyPrinter<Graph,Next> print(*graph);
-                print(out, it);
+                print(out, v);
                 return (*this);
         }
 private:
@@ -263,8 +264,8 @@ struct PropertyPrinter<Graph, no_property>
 {
         PropertyPrinter( const Graph& ){}
 
-        template<class Iterator>
-        PropertyPrinter& operator () ( std::ostream&, Iterator it ){ return *this; }
+        template<class Val>
+        PropertyPrinter& operator () ( std::ostream&, const Val& ){ return *this; }
 };
 
 // property printer
@@ -287,18 +288,16 @@ struct EdgePrinter
                 // assign indices to vertices
                 std::map<Vertex,int> indices;
                 int num = 0;
-                typename graph_traits<Graph>::vertex_iterator vi;
-                for (vi = vertices(graph).first; vi != vertices(graph).second; ++vi){
-                        indices[*vi] = num++;
+                BGL_FORALL_VERTICES_T(v, graph, Graph) {
+                        indices[v] = num++;
                 }
 
                 // write edges
                 PropertyPrinter<Graph, EdgeProperty> print_Edge(graph);
                 out << "e" << std::endl;
-                typename graph_traits<Graph>::edge_iterator ei;
-                for (ei = edges(graph).first; ei != edges(graph).second; ++ei){
-                        out << indices[source(*ei,graph)] <<  " " << indices[target(*ei,graph)] << "  "; 
-                        print_Edge(out,ei); 
+                BGL_FORALL_EDGES_T(e, graph, Graph) {
+                        out << indices[source(e,graph)] <<  " " << indices[target(e,graph)] << "  "; 
+                        print_Edge(out,e); 
                         out << std::endl;
                 }
                 out << std::endl;            
@@ -322,9 +321,8 @@ struct GraphPrinter: public EdgePrinter<Graph,E>
         {
                 PropertyPrinter<Graph, V> printNode(this->graph);
                 out << "v"<<std::endl;
-                typename graph_traits<Graph>::vertex_iterator vi;
-                for (vi = vertices(this->graph).first; vi != vertices(this->graph).second; ++vi){
-                        printNode(out,vi); 
+                BGL_FORALL_VERTICES_T(v, this->graph, Graph) {
+                        printNode(out,v); 
                         out << std::endl;
                 }
                 
similarity index 89%
rename from deal.II/contrib/boost/include/boost/graph/adjacency_matrix.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/adjacency_matrix.hpp
index 9770e51af7e1d50b438558779c69a3ef0be3a597..cf02a1d644ba7cd4514b99bf111b30868720d688 100644 (file)
@@ -18,6 +18,7 @@
 #include <boost/limits.hpp>
 #include <boost/iterator.hpp>
 #include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_mutability_traits.hpp>
 #include <boost/graph/graph_selectors.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/graph/adjacency_iterator.hpp>
@@ -31,7 +32,7 @@
 #include <boost/type_traits/ice.hpp>
 
 namespace boost {
-  
+
   namespace detail {
 
     template <class Directed, class Vertex>
@@ -40,7 +41,7 @@ namespace boost {
       typedef edge_desc_impl<Directed,Vertex> Base;
     public:
       matrix_edge_desc_impl() { }
-      matrix_edge_desc_impl(bool exists, Vertex s, Vertex d, 
+      matrix_edge_desc_impl(bool exists, Vertex s, Vertex d,
                             const void* ep = 0)
         : Base(s, d, ep), m_exists(exists) { }
       bool exists() const { return m_exists; }
@@ -53,13 +54,15 @@ namespace boost {
       bool operator()(const Edge& e) const { return e.exists(); }
     };
 
+    // Note to self... The int for get_edge_exists and set_edge exist helps
+    // make these calls unambiguous.
     template <typename EdgeProperty>
     bool get_edge_exists(const std::pair<bool, EdgeProperty>& stored_edge, int) {
       return stored_edge.first;
     }
     template <typename EdgeProperty>
     void set_edge_exists(
-        std::pair<bool, EdgeProperty>& stored_edge, 
+        std::pair<bool, EdgeProperty>& stored_edge,
         bool flag,
         int
         ) {
@@ -91,7 +94,7 @@ namespace boost {
 
     template <typename StoredEdgeProperty, typename EdgeProperty>
     inline void
-    set_property(std::pair<bool, StoredEdgeProperty>& stored_edge, 
+    set_property(std::pair<bool, StoredEdgeProperty>& stored_edge,
                  const EdgeProperty& ep, int) {
       stored_edge.second = ep;
     }
@@ -107,7 +110,7 @@ namespace boost {
     template <typename EdgeProxy, typename EdgeProperty>
     inline void
     set_property(EdgeProxy, const EdgeProperty&, ...) {}
-    
+
     //=======================================================================
     // Directed Out Edge Iterator
 
@@ -133,9 +136,9 @@ namespace boost {
           , EdgeDescriptor
           , std::ptrdiff_t
         > super_t;
-        
+
         dir_adj_matrix_out_edge_iter() { }
-        
+
         dir_adj_matrix_out_edge_iter(
             const MatrixIter& i
           , const VertexDescriptor& src
@@ -148,11 +151,11 @@ namespace boost {
             ++this->base_reference();
             ++m_targ;
         }
-        
+
         inline EdgeDescriptor
-        dereference() const 
+        dereference() const
         {
-            return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ, 
+            return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ,
                                   &get_property(*this->base()));
         }
         VertexDescriptor m_src, m_targ;
@@ -184,9 +187,9 @@ namespace boost {
           , EdgeDescriptor
           , std::ptrdiff_t
         > super_t;
-        
+
         dir_adj_matrix_in_edge_iter() { }
-        
+
         dir_adj_matrix_in_edge_iter(
             const MatrixIter& i
           , const MatrixIter& last
@@ -204,11 +207,11 @@ namespace boost {
             this->base_reference() = m_last;
           }
         }
-        
+
         inline EdgeDescriptor
-        dereference() const 
+        dereference() const
         {
-            return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ, 
+            return EdgeDescriptor(get_edge_exists(*this->base(), 0), m_src, m_targ,
                                   &get_property(*this->base()));
         }
         MatrixIter m_last;
@@ -223,7 +226,7 @@ namespace boost {
         typename VertexDescriptor, typename MatrixIter
       , typename VerticesSizeType, typename EdgeDescriptor
     >
-    struct undir_adj_matrix_out_edge_iter 
+    struct undir_adj_matrix_out_edge_iter
       : iterator_adaptor<
             undir_adj_matrix_out_edge_iter<VertexDescriptor, MatrixIter,  VerticesSizeType, EdgeDescriptor>
           , MatrixIter
@@ -241,9 +244,9 @@ namespace boost {
           , EdgeDescriptor
           , std::ptrdiff_t
         > super_t;
-        
+
         undir_adj_matrix_out_edge_iter() { }
-        
+
         undir_adj_matrix_out_edge_iter(
             const MatrixIter& i
           , const VertexDescriptor& src
@@ -269,16 +272,16 @@ namespace boost {
             }
             ++m_targ;
         }
-        
+
         inline EdgeDescriptor
-        dereference() const 
+        dereference() const
         {
             return EdgeDescriptor(
                 get_edge_exists(*this->base(), 0), m_src, m_targ
               , &get_property(*this->base())
             );
         }
-        
+
         VertexDescriptor m_src, m_inc, m_targ;
         VerticesSizeType m_n;
     };
@@ -290,7 +293,7 @@ namespace boost {
         typename VertexDescriptor, typename MatrixIter
       , typename VerticesSizeType, typename EdgeDescriptor
     >
-    struct undir_adj_matrix_in_edge_iter 
+    struct undir_adj_matrix_in_edge_iter
       : iterator_adaptor<
             undir_adj_matrix_in_edge_iter<VertexDescriptor, MatrixIter,  VerticesSizeType, EdgeDescriptor>
           , MatrixIter
@@ -308,9 +311,9 @@ namespace boost {
           , EdgeDescriptor
           , std::ptrdiff_t
         > super_t;
-        
+
         undir_adj_matrix_in_edge_iter() { }
-        
+
         undir_adj_matrix_in_edge_iter(
             const MatrixIter& i
           , const VertexDescriptor& src
@@ -336,16 +339,16 @@ namespace boost {
             }
             ++m_targ;
         }
-        
+
         inline EdgeDescriptor
-        dereference() const 
+        dereference() const
         {
             return EdgeDescriptor(
                      get_edge_exists(*this->base(), 0), m_targ, m_src
               , &get_property(*this->base())
             );
         }
-        
+
         VertexDescriptor m_src, m_inc, m_targ;
         VerticesSizeType m_n;
     };
@@ -353,7 +356,7 @@ namespace boost {
     //=======================================================================
     // Edge Iterator
 
-    template <typename Directed, typename MatrixIter, 
+    template <typename Directed, typename MatrixIter,
               typename VerticesSizeType, typename EdgeDescriptor>
     struct adj_matrix_edge_iter
       : iterator_adaptor<
@@ -373,17 +376,17 @@ namespace boost {
           , EdgeDescriptor
           , std::ptrdiff_t
         > super_t;
-        
+
         adj_matrix_edge_iter() { }
-        
-        adj_matrix_edge_iter(const MatrixIter& i, const MatrixIter& start, const VerticesSizeType& n) 
+
+        adj_matrix_edge_iter(const MatrixIter& i, const MatrixIter& start, const VerticesSizeType& n)
             : super_t(i), m_start(start), m_src(0), m_targ(0), m_n(n) { }
 
         void increment()
         {
             increment_dispatch(this->base_reference(), Directed());
         }
-        
+
         void increment_dispatch(MatrixIter& i, directedS)
         {
             ++i;
@@ -397,7 +400,7 @@ namespace boost {
                 ++m_targ;
             }
         }
-        
+
         void increment_dispatch(MatrixIter& i, undirectedS)
         {
             ++i;
@@ -413,14 +416,14 @@ namespace boost {
         }
 
         inline EdgeDescriptor
-        dereference() const 
+        dereference() const
         {
             return EdgeDescriptor(
                 get_edge_exists(
                     *this->base(), 0), m_src, m_targ, &get_property(*this->base())
             );
         }
-      
+
         MatrixIter m_start;
         VerticesSizeType m_src, m_targ, m_n;
     };
@@ -444,9 +447,9 @@ namespace boost {
     typedef typename mpl::if_<is_directed,
                                     bidirectional_tag, undirected_tag>::type
       directed_category;
-    
+
     typedef disallow_parallel_edge_tag edge_parallel_category;
-    
+
     typedef std::size_t vertex_descriptor;
 
     typedef detail::matrix_edge_desc_impl<directed_category,
@@ -461,7 +464,7 @@ namespace boost {
     public virtual incidence_graph_tag,
     public virtual adjacency_graph_tag,
     public virtual edge_list_graph_tag { };
-  
+
   //=========================================================================
   // Adjacency Matrix Class
   template <typename Directed = directedS,
@@ -472,7 +475,7 @@ namespace boost {
   class adjacency_matrix {
     typedef adjacency_matrix self;
     typedef adjacency_matrix_traits<Directed> Traits;
-    
+
   public:
 #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
     // The bidirectionalS tag is not allowed with the adjacency_matrix
@@ -487,14 +490,14 @@ namespace boost {
       vertex_property_type;
     typedef typename detail::retag_property_list<edge_bundle_t, EdgeProperty>::type
       edge_property_type;
-      
+
   private:
     typedef typename detail::retag_property_list<vertex_bundle_t, VertexProperty>::retagged
       maybe_vertex_bundled;
 
     typedef typename detail::retag_property_list<edge_bundle_t, EdgeProperty>::retagged
       maybe_edge_bundled;
-    
+
   public:
     // The types that are actually bundled
     typedef typename mpl::if_c<(is_same<maybe_vertex_bundled, no_property>::value),
@@ -509,6 +512,7 @@ namespace boost {
     typedef no_vertex_bundle vertex_bundled;
     typedef no_edge_bundle   edge_bundled;
 #endif
+    typedef GraphProperty    graph_property_type;
 
   public: // should be private
     typedef typename mpl::if_<typename has_property<edge_property_type>::type,
@@ -534,7 +538,7 @@ namespace boost {
     {
       return (std::numeric_limits<vertex_descriptor>::max)();
     }
-      
+
     //private: if friends worked, these would be private
 
     typedef detail::dir_adj_matrix_out_edge_iter<
@@ -560,11 +564,11 @@ namespace boost {
     typedef typename mpl::if_<
         typename Directed::is_directed_t, DirInEdgeIter, UnDirInEdgeIter
     >::type unfiltered_in_edge_iter;
-    
+
     typedef detail::adj_matrix_edge_iter<
         Directed, MatrixIter, size_type, edge_descriptor
     > unfiltered_edge_iter;
-    
+
   public:
 
     // IncidenceGraph concept required types
@@ -596,13 +600,52 @@ namespace boost {
     typedef adjacency_matrix_class_tag graph_tag;
 
     // Constructor required by MutableGraph
-    adjacency_matrix(vertices_size_type n_vertices) 
-      : m_matrix(Directed::is_directed ? 
+    adjacency_matrix(vertices_size_type n_vertices,
+                     const GraphProperty& p = GraphProperty())
+      : m_matrix(Directed::is_directed ?
+                 (n_vertices * n_vertices)
+                 : (n_vertices * (n_vertices + 1) / 2)),
+      m_vertex_set(0, n_vertices),
+      m_vertex_properties(n_vertices),
+      m_num_edges(0),
+      m_property(p) { }
+
+    template <typename EdgeIterator>
+    adjacency_matrix(EdgeIterator first,
+                     EdgeIterator last,
+                     vertices_size_type n_vertices,
+                     const GraphProperty& p = GraphProperty())
+      : m_matrix(Directed::is_directed ?
                  (n_vertices * n_vertices)
                  : (n_vertices * (n_vertices + 1) / 2)),
       m_vertex_set(0, n_vertices),
       m_vertex_properties(n_vertices),
-      m_num_edges(0) { }
+      m_num_edges(0),
+      m_property(p)
+    {
+      for (; first != last; ++first) {
+        add_edge(first->first, first->second, *this);
+      }
+    }
+
+    template <typename EdgeIterator, typename EdgePropertyIterator>
+    adjacency_matrix(EdgeIterator first,
+                     EdgeIterator last,
+                     EdgePropertyIterator ep_iter,
+                     vertices_size_type n_vertices,
+                     const GraphProperty& p = GraphProperty())
+      : m_matrix(Directed::is_directed ?
+                 (n_vertices * n_vertices)
+                 : (n_vertices * (n_vertices + 1) / 2)),
+      m_vertex_set(0, n_vertices),
+      m_vertex_properties(n_vertices),
+      m_num_edges(0),
+      m_property(p)
+    {
+      for (; first != last; ++first, ++ep_iter) {
+        add_edge(first->first, first->second, *ep_iter, *this);
+      }
+    }
 
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
     // Directly access a vertex or edge bundle
@@ -618,7 +661,7 @@ namespace boost {
     const edge_bundled& operator[](edge_descriptor e) const
     { return get(edge_bundle, *this)[e]; }
 #endif
-    
+
     //private: if friends worked, these would be private
 
     typename Matrix::const_reference
@@ -646,10 +689,11 @@ namespace boost {
     VertexList m_vertex_set;
     std::vector<vertex_property_type> m_vertex_properties;
     size_type m_num_edges;
+    GraphProperty m_property;
   };
-  
+
   //=========================================================================
-  // Functions required by the AdjacencyMatrix concept 
+  // Functions required by the AdjacencyMatrix concept
 
   template <typename D, typename VP, typename EP, typename GP, typename A>
   std::pair<typename adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor,
@@ -665,7 +709,7 @@ namespace boost {
   }
 
   //=========================================================================
-  // Functions required by the IncidenceGraph concept 
+  // Functions required by the IncidenceGraph concept
 
   // O(1)
   template <typename VP, typename EP, typename GP, typename A>
@@ -685,7 +729,7 @@ namespace boost {
         , last(l, u, g.m_vertex_set.size());
     detail::does_edge_exist pred;
     typedef typename Graph::out_edge_iterator out_edge_iterator;
-    return std::make_pair(out_edge_iterator(pred, first, last), 
+    return std::make_pair(out_edge_iterator(pred, first, last),
                           out_edge_iterator(pred, last, last));
   }
 
@@ -707,15 +751,15 @@ namespace boost {
     typename Graph::unfiltered_out_edge_iter
         first(f, u, g.m_vertex_set.size())
       , last(l, u, g.m_vertex_set.size());
-    
+
     detail::does_edge_exist pred;
     typedef typename Graph::out_edge_iterator out_edge_iterator;
-    return std::make_pair(out_edge_iterator(pred, first, last), 
+    return std::make_pair(out_edge_iterator(pred, first, last),
                           out_edge_iterator(pred, last, last));
   }
-  
+
   // O(N)
-  template <typename D, typename VP, typename EP, typename GP, typename A>  
+  template <typename D, typename VP, typename EP, typename GP, typename A>
   typename adjacency_matrix<D,VP,EP,GP,A>::degree_size_type
   out_degree(typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor u,
              const adjacency_matrix<D,VP,EP,GP,A>& g)
@@ -729,7 +773,7 @@ namespace boost {
 
   // O(1)
   template <typename D, typename VP, typename EP, typename GP, typename A,
-    typename Dir, typename Vertex>  
+    typename Dir, typename Vertex>
   typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor
   source(const detail::matrix_edge_desc_impl<Dir,Vertex>& e,
          const adjacency_matrix<D,VP,EP,GP,A>&)
@@ -739,7 +783,7 @@ namespace boost {
 
   // O(1)
   template <typename D, typename VP, typename EP, typename GP, typename A,
-    typename Dir, typename Vertex>  
+    typename Dir, typename Vertex>
   typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor
   target(const detail::matrix_edge_desc_impl<Dir,Vertex>& e,
          const adjacency_matrix<D,VP,EP,GP,A>&)
@@ -748,7 +792,7 @@ namespace boost {
   }
 
   //=========================================================================
-  // Functions required by the BidirectionalGraph concept 
+  // Functions required by the BidirectionalGraph concept
 
   // O(1)
   template <typename VP, typename EP, typename GP, typename A>
@@ -767,7 +811,7 @@ namespace boost {
       , last(l, l, u, g.m_vertex_set.size());
     detail::does_edge_exist pred;
     typedef typename Graph::in_edge_iterator in_edge_iterator;
-    return std::make_pair(in_edge_iterator(pred, first, last), 
+    return std::make_pair(in_edge_iterator(pred, first, last),
                           in_edge_iterator(pred, last, last));
   }
 
@@ -789,15 +833,15 @@ namespace boost {
     typename Graph::unfiltered_in_edge_iter
         first(f, u, g.m_vertex_set.size())
       , last(l, u, g.m_vertex_set.size());
-    
+
     detail::does_edge_exist pred;
     typedef typename Graph::in_edge_iterator in_edge_iterator;
-    return std::make_pair(in_edge_iterator(pred, first, last), 
+    return std::make_pair(in_edge_iterator(pred, first, last),
                           in_edge_iterator(pred, last, last));
   }
-  
+
   // O(N)
-  template <typename D, typename VP, typename EP, typename GP, typename A>  
+  template <typename D, typename VP, typename EP, typename GP, typename A>
   typename adjacency_matrix<D,VP,EP,GP,A>::degree_size_type
   in_degree(typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor u,
              const adjacency_matrix<D,VP,EP,GP,A>& g)
@@ -810,7 +854,7 @@ namespace boost {
   }
 
   //=========================================================================
-  // Functions required by the AdjacencyGraph concept 
+  // Functions required by the AdjacencyGraph concept
 
   template <typename D, typename VP, typename EP, typename GP, typename A>
   std::pair<typename adjacency_matrix<D,VP,EP,GP,A>::adjacency_iterator,
@@ -830,7 +874,7 @@ namespace boost {
   }
 
   //=========================================================================
-  // Functions required by the VertexListGraph concept 
+  // Functions required by the VertexListGraph concept
 
   template <typename D, typename VP, typename EP, typename GP, typename A>
   std::pair<typename adjacency_matrix<D,VP,EP,GP,A>::vertex_iterator,
@@ -846,10 +890,10 @@ namespace boost {
   num_vertices(const adjacency_matrix<D,VP,EP,GP,A>& g) {
     return g.m_vertex_set.size();
   }
-  
+
   //=========================================================================
-  // Functions required by the EdgeListGraph concept 
-  
+  // Functions required by the EdgeListGraph concept
+
   template <typename D, typename VP, typename EP, typename GP, typename A>
   std::pair<typename adjacency_matrix<D,VP,EP,GP,A>::edge_iterator,
             typename adjacency_matrix<D,VP,EP,GP,A>::edge_iterator>
@@ -857,11 +901,11 @@ namespace boost {
   {
     typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
     Graph& g = const_cast<Graph&>(g_);
-    
+
     typename Graph::unfiltered_edge_iter
-      first(g.m_matrix.begin(), g.m_matrix.begin(), 
+      first(g.m_matrix.begin(), g.m_matrix.begin(),
                                     g.m_vertex_set.size()),
-      last(g.m_matrix.end(), g.m_matrix.begin(), 
+      last(g.m_matrix.end(), g.m_matrix.begin(),
                                     g.m_vertex_set.size());
     detail::does_edge_exist pred;
     typedef typename Graph::edge_iterator edge_iterator;
@@ -876,9 +920,9 @@ namespace boost {
   {
     return g.m_num_edges;
   }
-  
+
   //=========================================================================
-  // Functions required by the MutableGraph concept 
+  // Functions required by the MutableGraph concept
 
   // O(1)
   template <typename D, typename VP, typename EP, typename GP, typename A>
@@ -888,14 +932,14 @@ namespace boost {
            const EP& ep,
            adjacency_matrix<D,VP,EP,GP,A>& g)
   {
-    typedef typename adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor 
+    typedef typename adjacency_matrix<D,VP,EP,GP,A>::edge_descriptor
       edge_descriptor;
     if (detail::get_edge_exists(g.get_edge(u,v), 0) == false) {
       ++(g.m_num_edges);
       detail::set_property(g.get_edge(u,v), ep, 0);
       detail::set_edge_exists(g.get_edge(u,v), true, 0);
       return std::make_pair
-        (edge_descriptor(true, u, v, &detail::get_property(g.get_edge(u,v))), 
+        (edge_descriptor(true, u, v, &detail::get_property(g.get_edge(u,v))),
          true);
     } else
       return std::make_pair
@@ -913,15 +957,18 @@ namespace boost {
     return add_edge(u, v, ep, g);
   }
 
-  // O(1)  
+  // O(1)
   template <typename D, typename VP, typename EP, typename GP, typename A>
   void
   remove_edge(typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor u,
               typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor v,
               adjacency_matrix<D,VP,EP,GP,A>& g)
   {
-    --(g.m_num_edges);
-    detail::set_edge_exists(g.get_edge(u,v), false, 0);
+    // Don'remove the edge unless it already exists.
+    if(detail::get_edge_exists(g.get_edge(u,v), 0)) {
+      --(g.m_num_edges);
+      detail::set_edge_exists(g.get_edge(u,v), false, 0);
+    }
   }
 
   // O(1)
@@ -933,7 +980,7 @@ namespace boost {
     remove_edge(source(e, g), target(e, g), g);
   }
 
-  
+
   template <typename D, typename VP, typename EP, typename GP, typename A>
   inline typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor
   add_vertex(adjacency_matrix<D,VP,EP,GP,A>& g) {
@@ -966,7 +1013,7 @@ namespace boost {
     (typename adjacency_matrix<directedS,VP,EP,GP,A>::vertex_descriptor u,
      adjacency_matrix<directedS,VP,EP,GP,A>& g)
   {
-    typename adjacency_matrix<directedS,VP,EP,GP,A>::vertex_iterator 
+    typename adjacency_matrix<directedS,VP,EP,GP,A>::vertex_iterator
       vi, vi_end;
     for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
       remove_edge(u, *vi, g);
@@ -987,12 +1034,43 @@ namespace boost {
       remove_edge(u, *vi, g);
   }
 
+  //=========================================================================
+  // Functions required by the PropertyGraph concept
+
+  // O(1)
+  template <typename D, typename VP, typename EP, typename GP, typename A,
+            typename Tag, typename Value>
+  inline void
+  set_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag, const Value& value)
+  {
+      get_property_value(g.m_property, Tag()) = value;
+  }
+
+  template <typename D, typename VP, typename EP, typename GP, typename A,
+            typename Tag>
+  inline
+  typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
+  get_property(adjacency_matrix<D,VP,EP,GP,A>& g, Tag)
+  {
+      return get_property_value(g.m_property, Tag());
+  }
+
+  template <typename D, typename VP, typename EP, typename GP, typename A,
+            typename Tag>
+  inline
+  const
+  typename graph_property<adjacency_matrix<D,VP,EP,GP,A>, Tag>::type&
+  get_property(const adjacency_matrix<D,VP,EP,GP,A>& g, Tag)
+  {
+      return get_property_value(g.m_property, Tag());
+  }
+
   //=========================================================================
   // Vertex Property Map
-  
-  template <typename GraphPtr, typename Vertex, typename T, typename R, 
-    typename Tag> 
-  class adj_matrix_vertex_property_map 
+
+  template <typename GraphPtr, typename Vertex, typename T, typename R,
+    typename Tag>
+  class adj_matrix_vertex_property_map
     : public put_get_helper<R,
          adj_matrix_vertex_property_map<GraphPtr, Vertex, T, R, Tag> >
   {
@@ -1031,10 +1109,10 @@ namespace boost {
       struct bind_ {
         typedef typename property_value<Property,Tag>::type Value;
         typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
-        
+
         typedef adj_matrix_vertex_property_map<Graph*, Vertex, Value, Value&,
           Tag> type;
-        typedef adj_matrix_vertex_property_map<const Graph*, Vertex, Value, 
+        typedef adj_matrix_vertex_property_map<const Graph*, Vertex, Value,
           const Value&, Tag> const_type;
       };
     };
@@ -1079,14 +1157,14 @@ namespace boost {
   struct vertex_property_selector<adjacency_matrix_class_tag> {
     typedef detail::adj_matrix_vertex_property_selector type;
   };
-  
+
   //=========================================================================
   // Edge Property Map
 
 
-  template <typename Directed, typename Property, typename Vertex, 
-    typename T, typename R, typename Tag> 
-  class adj_matrix_edge_property_map 
+  template <typename Directed, typename Property, typename Vertex,
+    typename T, typename R, typename Tag>
+  class adj_matrix_edge_property_map
     : public put_get_helper<R,
          adj_matrix_edge_property_map<Directed, Property, Vertex, T, R, Tag> >
   {
@@ -1121,56 +1199,56 @@ namespace boost {
 
   namespace detail {
 
-    template <typename Property, typename D, typename VP, typename EP, 
+    template <typename Property, typename D, typename VP, typename EP,
               typename GP, typename A>
-    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
       Property>::type
     get_dispatch(adjacency_matrix<D,VP,EP,GP,A>& g, Property,
                  vertex_property_tag)
     {
       typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
-      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
         Property>::type PA;
       return PA(&g);
     }
-    template <typename Property, typename D, typename VP, typename EP, 
+    template <typename Property, typename D, typename VP, typename EP,
               typename GP, typename A>
-    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
       Property>::type
     get_dispatch(adjacency_matrix<D,VP,EP,GP,A>&, Property,
                  edge_property_tag)
     {
-      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
         Property>::type PA;
       return PA();
     }
-    template <typename Property, typename D, typename VP, typename EP, 
+    template <typename Property, typename D, typename VP, typename EP,
               typename GP, typename A>
-    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
       Property>::const_type
     get_dispatch(const adjacency_matrix<D,VP,EP,GP,A>& g, Property,
                  vertex_property_tag)
     {
       typedef adjacency_matrix<D,VP,EP,GP,A> Graph;
-      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
         Property>::const_type PA;
       return PA(&g);
     }
-    template <typename Property, typename D, typename VP, typename EP, 
+    template <typename Property, typename D, typename VP, typename EP,
               typename GP, typename A>
-    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+    typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
       Property>::const_type
     get_dispatch(const adjacency_matrix<D,VP,EP,GP,A>&, Property,
                  edge_property_tag)
     {
-      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>, 
+      typedef typename boost::property_map<adjacency_matrix<D,VP,EP,GP,A>,
         Property>::const_type PA;
       return PA();
     }
 
   } // namespace detail
 
-  template <typename Property, typename D, typename VP, typename EP, 
+  template <typename Property, typename D, typename VP, typename EP,
             typename GP, typename A>
   inline
   typename property_map<adjacency_matrix<D,VP,EP,GP,A>, Property>::type
@@ -1180,7 +1258,7 @@ namespace boost {
     return detail::get_dispatch(g, p, Kind());
   }
 
-  template <typename Property, typename D, typename VP, typename EP, 
+  template <typename Property, typename D, typename VP, typename EP,
             typename GP, typename A>
   inline
   typename property_map<adjacency_matrix<D,VP,EP,GP,A>, Property>::const_type
@@ -1190,7 +1268,7 @@ namespace boost {
     return detail::get_dispatch(g, p, Kind());
   }
 
-  template <typename Property, typename D, typename VP, typename EP, 
+  template <typename Property, typename D, typename VP, typename EP,
             typename GP, typename A, typename Key>
   inline
   typename property_traits<
@@ -1202,7 +1280,7 @@ namespace boost {
     return get(get(p, g), key);
   }
 
-  template <typename Property, typename D, typename VP, typename EP, 
+  template <typename Property, typename D, typename VP, typename EP,
             typename GP, typename A, typename Key, typename Value>
   inline void
   put(Property p, adjacency_matrix<D,VP,EP,GP,A>& g,
@@ -1213,11 +1291,11 @@ namespace boost {
     Map pmap = get(p, g);
     put(pmap, key, value);
   }
-  
+
   //=========================================================================
   // Other Functions
 
-  template <typename D, typename VP, typename EP, typename GP, typename A>  
+  template <typename D, typename VP, typename EP, typename GP, typename A>
   typename adjacency_matrix<D,VP,EP,GP,A>::vertex_descriptor
   vertex(typename adjacency_matrix<D,VP,EP,GP,A>::vertices_size_type n,
          const adjacency_matrix<D,VP,EP,GP,A>& g)
@@ -1252,7 +1330,7 @@ namespace boost {
       result_type;
     return result_type(&g, p);
   }
-    
+
   template <typename Directed, typename VertexProperty, typename EdgeProperty, typename GraphProperty,
             typename Allocator, typename T, typename Bundle, typename Key>
   inline T
@@ -1273,6 +1351,17 @@ namespace boost {
 
 #endif
 
+#define ADJMAT_PARAMS \
+    typename D, typename VP, typename EP, typename GP, typename A
+#define ADJMAT adjacency_matrix<D,VP,EP,GP,A>
+template <ADJMAT_PARAMS>
+struct graph_mutability_traits<ADJMAT> {
+    typedef mutable_edge_property_graph_tag category;
+};
+#undef ADJMAT_PARAMS
+#undef ADJMAT
+
+
 } // namespace boost
 
 #endif // BOOST_ADJACENCY_MATRIX_HPP
similarity index 84%
rename from deal.II/contrib/boost/include/boost/graph/astar_search.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/astar_search.hpp
index e1b95c4aaab5999a88001228fab49ee27a753a05..25342e82e6d4d889fb327d5c5055594e81fde023 100644 (file)
 
 
 #include <functional>
+#include <vector>
 #include <boost/limits.hpp>
 #include <boost/graph/named_function_params.hpp>
-#include <boost/pending/mutable_queue.hpp>
 #include <boost/graph/relax.hpp>
-#include <boost/pending/indirect_cmp.hpp>
 #include <boost/graph/exception.hpp>
 #include <boost/graph/breadth_first_search.hpp>
+#include <boost/graph/detail/d_ary_heap.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/vector_property_map.hpp>
 
 
 namespace boost {
 
-  
+
   template <class Heuristic, class Graph>
   struct AStarHeuristicConcept {
     void constraints()
@@ -37,8 +39,8 @@ namespace boost {
     Heuristic h;
     typename graph_traits<Graph>::vertex_descriptor u;
   };
-  
-  
+
+
   template <class Graph, class CostType>
   class astar_heuristic : public std::unary_function<
     typename graph_traits<Graph>::vertex_descriptor, CostType>
@@ -48,9 +50,9 @@ namespace boost {
     astar_heuristic() {}
     CostType operator()(Vertex u) { return static_cast<CostType>(0); }
   };
-  
 
-  
+
+
   template <class Visitor, class Graph>
   struct AStarVisitorConcept {
     void constraints()
@@ -70,22 +72,22 @@ namespace boost {
     typename graph_traits<Graph>::vertex_descriptor u;
     typename graph_traits<Graph>::edge_descriptor e;
   };
-  
-  
+
+
   template <class Visitors = null_visitor>
   class astar_visitor : public bfs_visitor<Visitors> {
   public:
     astar_visitor() {}
     astar_visitor(Visitors vis)
       : bfs_visitor<Visitors>(vis) {}
-  
+
     template <class Edge, class Graph>
     void edge_relaxed(Edge e, Graph& g) {
       invoke_visitors(this->m_vis, e, g, on_edge_relaxed());
     }
     template <class Edge, class Graph>
     void edge_not_relaxed(Edge e, Graph& g) {
-      invoke_visitors(this->m_vis, e, g, on_edge_not_relaxed());      
+      invoke_visitors(this->m_vis, e, g, on_edge_not_relaxed());
     }
   private:
     template <class Edge, class Graph>
@@ -99,10 +101,10 @@ namespace boost {
     return astar_visitor<Visitors>(vis);
   }
   typedef astar_visitor<> default_astar_visitor;
-  
+
 
   namespace detail {
-    
+
     template <class AStarHeuristic, class UniformCostVisitor,
               class UpdatableQueue, class PredecessorMap,
               class CostMap, class DistanceMap, class WeightMap,
@@ -110,12 +112,12 @@ namespace boost {
               class BinaryPredicate>
     struct astar_bfs_visitor
     {
-      
+
       typedef typename property_traits<CostMap>::value_type C;
       typedef typename property_traits<ColorMap>::value_type ColorValue;
       typedef color_traits<ColorValue> Color;
       typedef typename property_traits<DistanceMap>::value_type distance_type;
-      
+
       astar_bfs_visitor(AStarHeuristic h, UniformCostVisitor vis,
                         UpdatableQueue& Q, PredecessorMap p,
                         CostMap c, DistanceMap d, WeightMap w,
@@ -124,8 +126,8 @@ namespace boost {
         : m_h(h), m_vis(vis), m_Q(Q), m_predecessor(p), m_cost(c),
           m_distance(d), m_weight(w), m_color(col),
           m_combine(combine), m_compare(compare), m_zero(zero) {}
-      
-      
+
+
       template <class Vertex, class Graph>
       void initialize_vertex(Vertex u, Graph& g) {
         m_vis.initialize_vertex(u, g);
@@ -143,16 +145,16 @@ namespace boost {
         m_vis.finish_vertex(u, g);
       }
       template <class Edge, class Graph>
-      void examine_edge(Edge e, Graph& g) { 
+      void examine_edge(Edge e, Graph& g) {
         if (m_compare(get(m_weight, e), m_zero))
           throw negative_edge();
         m_vis.examine_edge(e, g);
       }
       template <class Edge, class Graph>
       void non_tree_edge(Edge, Graph&) {}
-      
-      
-      
+
+
+
       template <class Edge, class Graph>
       void tree_edge(Edge e, Graph& g) {
         m_decreased = relax(e, g, m_weight, m_predecessor, m_distance,
@@ -166,24 +168,14 @@ namespace boost {
         } else
           m_vis.edge_not_relaxed(e, g);
       }
-      
-      
+
+
       template <class Edge, class Graph>
       void gray_target(Edge e, Graph& g) {
-        distance_type old_distance = get(m_distance, target(e, g));
-
         m_decreased = relax(e, g, m_weight, m_predecessor, m_distance,
                             m_combine, m_compare);
 
-        /* On x86 Linux with optimization, we sometimes get into a
-           horrible case where m_decreased is true but the distance hasn't
-           actually changed. This occurs when the comparison inside
-           relax() occurs with the 80-bit precision of the x87 floating
-           point unit, but the difference is lost when the resulting
-           values are written back to lower-precision memory (e.g., a
-           double). With the eager Dijkstra's implementation, this results
-           in looping. */
-        if(m_decreased && old_distance != get(m_distance, target(e, g))) {
+        if(m_decreased) {
           put(m_cost, target(e, g),
               m_combine(get(m_distance, target(e, g)),
                         m_h(target(e, g))));
@@ -192,17 +184,14 @@ namespace boost {
         } else
           m_vis.edge_not_relaxed(e, g);
       }
-      
-      
+
+
       template <class Edge, class Graph>
       void black_target(Edge e, Graph& g) {
-        distance_type old_distance = get(m_distance, target(e, g));
-
         m_decreased = relax(e, g, m_weight, m_predecessor, m_distance,
                             m_combine, m_compare);
 
-        /* See comment in gray_target */
-        if(m_decreased && old_distance != get(m_distance, target(e, g))) {
+        if(m_decreased) {
           m_vis.edge_relaxed(e, g);
           put(m_cost, target(e, g),
               m_combine(get(m_distance, target(e, g)),
@@ -213,9 +202,9 @@ namespace boost {
         } else
           m_vis.edge_not_relaxed(e, g);
       }
-      
-      
-      
+
+
+
       AStarHeuristic m_h;
       UniformCostVisitor m_vis;
       UpdatableQueue& m_Q;
@@ -228,13 +217,13 @@ namespace boost {
       BinaryPredicate m_compare;
       bool m_decreased;
       C m_zero;
-      
+
     };
-    
+
   } // namespace detail
 
-  
-  
+
+
   template <typename VertexListGraph, typename AStarHeuristic,
             typename AStarVisitor, typename PredecessorMap,
             typename CostMap, typename DistanceMap,
@@ -253,26 +242,24 @@ namespace boost {
      CompareFunction compare, CombineFunction combine,
      CostInf inf, CostZero zero)
   {
-    typedef indirect_cmp<CostMap, CompareFunction> IndirectCmp;
-    IndirectCmp icmp(cost, compare);
-  
     typedef typename graph_traits<VertexListGraph>::vertex_descriptor
       Vertex;
-    typedef mutable_queue<Vertex, std::vector<Vertex>,
-        IndirectCmp, VertexIndexMap>
+    typedef boost::vector_property_map<std::size_t> IndexInHeapMap;
+    IndexInHeapMap index_in_heap;
+    typedef d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, CostMap, CompareFunction>
       MutableQueue;
-    MutableQueue Q(num_vertices(g), icmp, index_map);
-  
+    MutableQueue Q(cost, index_in_heap, compare);
+
     detail::astar_bfs_visitor<AStarHeuristic, AStarVisitor,
         MutableQueue, PredecessorMap, CostMap, DistanceMap,
         WeightMap, ColorMap, CombineFunction, CompareFunction>
       bfs_vis(h, vis, Q, predecessor, cost, distance, weight,
               color, combine, compare, zero);
-  
+
     breadth_first_visit(g, s, Q, bfs_vis, color);
   }
-  
-  
+
+
   // Non-named parameter interface
   template <typename VertexListGraph, typename AStarHeuristic,
             typename AStarVisitor, typename PredecessorMap,
@@ -292,7 +279,7 @@ namespace boost {
      CompareFunction compare, CombineFunction combine,
      CostInf inf, CostZero zero)
   {
-    
+
     typedef typename property_traits<ColorMap>::value_type ColorValue;
     typedef color_traits<ColorValue> Color;
     typename graph_traits<VertexListGraph>::vertex_iterator ui, ui_end;
@@ -305,15 +292,15 @@ namespace boost {
     }
     put(distance, s, zero);
     put(cost, s, h(s));
-    
+
     astar_search_no_init
       (g, s, h, vis, predecessor, cost, distance, weight,
        color, index_map, compare, combine, inf, zero);
-    
+
   }
-  
-  
-  
+
+
+
   namespace detail {
     template <class VertexListGraph, class AStarHeuristic,
               class CostMap, class DistanceMap, class WeightMap,
@@ -343,7 +330,7 @@ namespace boost {
          choose_param(get_param(params, distance_zero_t()),
                       C()));
     }
-  
+
     template <class VertexListGraph, class AStarHeuristic,
               class CostMap, class DistanceMap, class WeightMap,
               class IndexMap, class ColorMap, class Params>
@@ -356,30 +343,21 @@ namespace boost {
        const Params& params)
     {
       typedef typename property_traits<WeightMap>::value_type D;
-      typename std::vector<D>::size_type
-        n = is_default_param(distance) ? num_vertices(g) : 1;
-      std::vector<D> distance_map(n);
-      n = is_default_param(cost) ? num_vertices(g) : 1;
-      std::vector<D> cost_map(n);
-      std::vector<default_color_type> color_map(num_vertices(g));
-      default_color_type c = white_color;
-  
+      std::vector<D> distance_map;
+      std::vector<D> cost_map;
+      std::vector<default_color_type> color_map;
+
       detail::astar_dispatch2
         (g, s, h,
-         choose_param(cost, make_iterator_property_map
-                      (cost_map.begin(), index_map,
-                       cost_map[0])),
-         choose_param(distance, make_iterator_property_map
-                      (distance_map.begin(), index_map, 
-                       distance_map[0])),
+         choose_param(cost, vector_property_map<D, IndexMap>(index_map)),
+         choose_param(distance, vector_property_map<D, IndexMap>(index_map)),
          weight, index_map,
-         choose_param(color, make_iterator_property_map
-                      (color_map.begin(), index_map, c)),
+         choose_param(color, vector_property_map<default_color_type, IndexMap>(index_map)),
          params);
     }
   } // namespace detail
-  
-  
+
+
   // Named parameter interface
   template <typename VertexListGraph,
             typename AStarHeuristic,
@@ -390,7 +368,7 @@ namespace boost {
      typename graph_traits<VertexListGraph>::vertex_descriptor s,
      AStarHeuristic h, const bgl_named_params<P, T, R>& params)
   {
-    
+
     detail::astar_dispatch1
       (g, s, h,
        get_param(params, vertex_rank),
@@ -399,9 +377,9 @@ namespace boost {
        choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
        get_param(params, vertex_color),
        params);
-    
+
   }
-  
+
 } // namespace boost
 
 #endif // BOOST_GRAPH_ASTAR_SEARCH_HPP
similarity index 94%
rename from deal.II/contrib/boost/include/boost/graph/bc_clustering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/bc_clustering.hpp
index eb438c1425f7b0ec6f6e7a18f3f265423ed0074d..6f4bbf40b81af6d3bbc87601690bd8c547adb6e7 100644 (file)
 
 #include <boost/graph/betweenness_centrality.hpp>
 #include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_utility.hpp>
 #include <boost/pending/indirect_cmp.hpp>
 #include <algorithm>
 #include <vector>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost {
 
@@ -116,7 +117,7 @@ betweenness_centrality_clustering(MutableGraph& g, Done done,
   typedef typename graph_traits<MutableGraph>::vertices_size_type
     vertices_size_type;
 
-  if (edges(g).first == edges(g).second) return;
+  if (has_no_edges(g)) return;
 
   // Function object that compares the centrality of edges
   indirect_cmp<EdgeCentralityMap, std::less<centrality_type> > 
@@ -127,10 +128,11 @@ betweenness_centrality_clustering(MutableGraph& g, Done done,
     brandes_betweenness_centrality(g, 
                                    edge_centrality_map(edge_centrality)
                                    .vertex_index_map(vertex_index));
-    edge_descriptor e = *max_element(edges(g).first, edges(g).second, cmp);
+    std::pair<edge_iterator, edge_iterator> edges_iters = edges(g);
+    edge_descriptor e = *max_element(edges_iters.first, edges_iters.second, cmp);
     is_done = done(get(edge_centrality, e), e, g);
     if (!is_done) remove_edge(e, g);
-  } while (!is_done && edges(g).first != edges(g).second);
+  } while (!is_done && !has_no_edges(g));
 }
 
 /**
similarity index 93%
rename from deal.II/contrib/boost/include/boost/graph/betweenness_centrality.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/betweenness_centrality.hpp
index 0262ad97416f287deb7fdd7226db49c79f93c9e7..06b7be062227ac72d51ea04d06dab22fad4ec14d 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <stack>
 #include <vector>
+#include <boost/graph/overloading.hpp>
 #include <boost/graph/dijkstra_shortest_paths.hpp>
 #include <boost/graph/breadth_first_search.hpp>
 #include <boost/graph/relax.hpp>
@@ -19,7 +20,7 @@
 #include <boost/type_traits/is_convertible.hpp>
 #include <boost/type_traits/is_same.hpp>
 #include <boost/mpl/if.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/named_function_params.hpp>
 #include <algorithm>
 
@@ -369,7 +370,8 @@ brandes_betweenness_centrality(const Graph& g,
                                DistanceMap distance,         // d
                                DependencyMap dependency,     // delta
                                PathCountMap path_count,      // sigma
-                               VertexIndexMap vertex_index)
+                               VertexIndexMap vertex_index
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   detail::graph::brandes_unweighted_shortest_paths shortest_paths;
 
@@ -394,7 +396,8 @@ brandes_betweenness_centrality(const Graph& g,
                                DependencyMap dependency,     // delta
                                PathCountMap path_count,      // sigma
                                VertexIndexMap vertex_index,
-                               WeightMap weight_map)
+                               WeightMap weight_map
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   detail::graph::brandes_dijkstra_shortest_paths<WeightMap>
     shortest_paths(weight_map);
@@ -417,6 +420,7 @@ namespace detail { namespace graph {
                                            WeightMap weight_map,
                                            VertexIndexMap vertex_index)
   {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
     typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
     typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
     typedef typename mpl::if_c<(is_same<CentralityMap, 
@@ -431,7 +435,7 @@ namespace detail { namespace graph {
     std::vector<std::vector<edge_descriptor> > incoming(V);
     std::vector<centrality_type> distance(V);
     std::vector<centrality_type> dependency(V);
-    std::vector<unsigned long long> path_count(V);
+    std::vector<degree_size_type> path_count(V);
 
     brandes_betweenness_centrality(
       g, centrality, edge_centrality_map,
@@ -452,6 +456,7 @@ namespace detail { namespace graph {
                                            EdgeCentralityMap edge_centrality_map,
                                            VertexIndexMap vertex_index)
   {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
     typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
     typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
     typedef typename mpl::if_c<(is_same<CentralityMap, 
@@ -466,7 +471,7 @@ namespace detail { namespace graph {
     std::vector<std::vector<edge_descriptor> > incoming(V);
     std::vector<centrality_type> distance(V);
     std::vector<centrality_type> dependency(V);
-    std::vector<unsigned long long> path_count(V);
+    std::vector<degree_size_type> path_count(V);
 
     brandes_betweenness_centrality(
       g, centrality, edge_centrality_map,
@@ -507,12 +512,23 @@ namespace detail { namespace graph {
     }
   };
 
+  template <typename T>
+  struct is_bgl_named_params {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+  };
+
+  template <typename Param, typename Tag, typename Rest>
+  struct is_bgl_named_params<bgl_named_params<Param, Tag, Rest> > {
+    BOOST_STATIC_CONSTANT(bool, value = true);
+  };
+
 } } // end namespace detail::graph
 
 template<typename Graph, typename Param, typename Tag, typename Rest>
 void 
 brandes_betweenness_centrality(const Graph& g, 
-                               const bgl_named_params<Param,Tag,Rest>& params)
+                               const bgl_named_params<Param,Tag,Rest>& params
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   typedef bgl_named_params<Param,Tag,Rest> named_params;
 
@@ -527,9 +543,13 @@ brandes_betweenness_centrality(const Graph& g,
     get_param(params, edge_weight));
 }
 
+// disable_if is required to work around problem with MSVC 7.1 (it seems to not
+// get partial ordering getween this overload and the previous one correct)
 template<typename Graph, typename CentralityMap>
-void 
-brandes_betweenness_centrality(const Graph& g, CentralityMap centrality)
+typename disable_if<detail::graph::is_bgl_named_params<CentralityMap>,
+                    void>::type
+brandes_betweenness_centrality(const Graph& g, CentralityMap centrality
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   detail::graph::brandes_betweenness_centrality_dispatch2(
     g, centrality, dummy_property_map(), get(vertex_index, g));
@@ -538,7 +558,8 @@ brandes_betweenness_centrality(const Graph& g, CentralityMap centrality)
 template<typename Graph, typename CentralityMap, typename EdgeCentralityMap>
 void 
 brandes_betweenness_centrality(const Graph& g, CentralityMap centrality,
-                               EdgeCentralityMap edge_centrality_map)
+                               EdgeCentralityMap edge_centrality_map
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   detail::graph::brandes_betweenness_centrality_dispatch2(
     g, centrality, edge_centrality_map, get(vertex_index, g));
@@ -568,7 +589,8 @@ relative_betweenness_centrality(const Graph& g, CentralityMap centrality)
 // Compute the central point dominance of a graph.
 template<typename Graph, typename CentralityMap>
 typename property_traits<CentralityMap>::value_type
-central_point_dominance(const Graph& g, CentralityMap centrality)
+central_point_dominance(const Graph& g, CentralityMap centrality
+                        BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
 {
   using std::max;
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/biconnected_components.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/biconnected_components.hpp
index 2d8b271d885a8cdf2f81810f090353768aa61a9c..ac220659d01ac9db8f07e1e61fd68419809730b4 100644 (file)
@@ -17,7 +17,7 @@
 #include <boost/limits.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/graph_concepts.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/depth_first_search.hpp>
 #include <boost/graph/graph_utility.hpp>
 
similarity index 78%
rename from deal.II/contrib/boost/include/boost/graph/breadth_first_search.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/breadth_first_search.hpp
index d8ffd7fed570a1b2f8f5705321fdcf5abe71c214..1cf06cf7e1f3d5459ff7350f05bf13cd5248d7cf 100644 (file)
 #include <boost/graph/graph_concepts.hpp>
 #include <boost/graph/visitors.hpp>
 #include <boost/graph/named_function_params.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/graph_concepts.hpp>
+#include <boost/graph/two_bit_color_map.hpp>
+
+#ifdef BOOST_GRAPH_USE_MPI
+#include <boost/graph/distributed/concepts.hpp>
+#endif // BOOST_GRAPH_USE_MPI
 
 namespace boost {
 
@@ -100,6 +107,8 @@ namespace boost {
     breadth_first_visit(g, s, Q, vis, color);
   }
 
+  namespace graph { struct bfs_visitor_event_not_overridden {}; }
+
 
   template <class Visitors = null_visitor>
   class bfs_visitor {
@@ -108,40 +117,75 @@ namespace boost {
     bfs_visitor(Visitors vis) : m_vis(vis) { }
 
     template <class Vertex, class Graph>
-    void initialize_vertex(Vertex u, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    initialize_vertex(Vertex u, Graph& g)
+    {
       invoke_visitors(m_vis, u, g, ::boost::on_initialize_vertex());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Vertex, class Graph>
-    void discover_vertex(Vertex u, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    discover_vertex(Vertex u, Graph& g)
+    {
       invoke_visitors(m_vis, u, g, ::boost::on_discover_vertex());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Vertex, class Graph>
-    void examine_vertex(Vertex u, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    examine_vertex(Vertex u, Graph& g)
+    {
       invoke_visitors(m_vis, u, g, ::boost::on_examine_vertex());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Edge, class Graph>
-    void examine_edge(Edge e, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    examine_edge(Edge e, Graph& g)
+    {
       invoke_visitors(m_vis, e, g, ::boost::on_examine_edge());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Edge, class Graph>
-    void tree_edge(Edge e, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    tree_edge(Edge e, Graph& g)
+    {
       invoke_visitors(m_vis, e, g, ::boost::on_tree_edge());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Edge, class Graph>
-    void non_tree_edge(Edge e, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    non_tree_edge(Edge e, Graph& g)
+    {
       invoke_visitors(m_vis, e, g, ::boost::on_non_tree_edge());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Edge, class Graph>
-    void gray_target(Edge e, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    gray_target(Edge e, Graph& g)
+    {
       invoke_visitors(m_vis, e, g, ::boost::on_gray_target());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Edge, class Graph>
-    void black_target(Edge e, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    black_target(Edge e, Graph& g)
+    {
       invoke_visitors(m_vis, e, g, ::boost::on_black_target());
+      return graph::bfs_visitor_event_not_overridden();
     }
+
     template <class Vertex, class Graph>
-    void finish_vertex(Vertex u, Graph& g) {
+    graph::bfs_visitor_event_not_overridden
+    finish_vertex(Vertex u, Graph& g)
+    {
       invoke_visitors(m_vis, u, g, ::boost::on_finish_vertex());
+      return graph::bfs_visitor_event_not_overridden();
     }
 
     BOOST_GRAPH_EVENT_STUB(on_initialize_vertex,bfs)
@@ -174,20 +218,34 @@ namespace boost {
        typename graph_traits<VertexListGraph>::vertex_descriptor s,
        ColorMap color,
        BFSVisitor vis,
-       const bgl_named_params<P, T, R>& params)
+       const bgl_named_params<P, T, R>& params,
+       BOOST_GRAPH_ENABLE_IF_MODELS(VertexListGraph, vertex_list_graph_tag,
+                                    void)* = 0)
     {
       typedef graph_traits<VertexListGraph> Traits;
       // Buffer default
       typedef typename Traits::vertex_descriptor Vertex;
       typedef boost::queue<Vertex> queue_t;
       queue_t Q;
-      detail::wrap_ref<queue_t> Qref(Q);
       breadth_first_search
         (g, s,
-         choose_param(get_param(params, buffer_param_t()), Qref).ref,
+         choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
          vis, color);
     }
 
+#ifdef BOOST_GRAPH_USE_MPI
+    template <class DistributedGraph, class ColorMap, class BFSVisitor,
+              class P, class T, class R>
+    void bfs_helper
+      (DistributedGraph& g,
+       typename graph_traits<DistributedGraph>::vertex_descriptor s,
+       ColorMap color,
+       BFSVisitor vis,
+       const bgl_named_params<P, T, R>& params,
+       BOOST_GRAPH_ENABLE_IF_MODELS(DistributedGraph, distributed_graph_tag,
+                                    void)* = 0);
+#endif // BOOST_GRAPH_USE_MPI
+
     //-------------------------------------------------------------------------
     // Choose between default color and color parameters. Using
     // function dispatching so that we don't require vertex index if
@@ -219,16 +277,14 @@ namespace boost {
        const bgl_named_params<P, T, R>& params,
        detail::error_property_not_found)
       {
-        std::vector<default_color_type> color_vec(num_vertices(g));
-        default_color_type c = white_color;
         null_visitor null_vis;
 
         bfs_helper
           (g, s,
-           make_iterator_property_map
-           (color_vec.begin(),
+           make_two_bit_color_map
+           (num_vertices(g),
             choose_const_pmap(get_param(params, vertex_index),
-                              g, vertex_index), c),
+                              g, vertex_index)),
            choose_param(get_param(params, graph_visitor),
                         make_bfs_visitor(null_vis)),
            params);
@@ -276,11 +332,10 @@ namespace boost {
     typedef typename Traits::vertex_descriptor vertex_descriptor;
     typedef boost::queue<vertex_descriptor> queue_t;
     queue_t Q;
-    detail::wrap_ref<queue_t> Qref(Q);
 
     breadth_first_visit
       (ng, s,
-       choose_param(get_param(params, buffer_param_t()), Qref).ref,
+       choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
        choose_param(get_param(params, graph_visitor),
                     make_bfs_visitor(null_visitor())),
        choose_pmap(get_param(params, vertex_color), ng, vertex_color)
@@ -289,5 +344,9 @@ namespace boost {
 
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/breadth_first_search.hpp>
+#endif
+
 #endif // BOOST_GRAPH_BREADTH_FIRST_SEARCH_HPP
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/bron_kerbosch_all_cliques.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/bron_kerbosch_all_cliques.hpp
new file mode 100644 (file)
index 0000000..bf7e3ff
--- /dev/null
@@ -0,0 +1,311 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CLIQUE_HPP
+#define BOOST_GRAPH_CLIQUE_HPP
+
+#include <vector>
+#include <deque>
+#include <boost/config.hpp>
+
+#include <boost/graph/graph_concepts.hpp>
+
+#include <boost/concept/detail/concept_def.hpp>
+namespace boost {
+    namespace concepts {
+        BOOST_concept(CliqueVisitor,(Visitor)(Clique)(Graph))
+        {
+            BOOST_CONCEPT_USAGE(CliqueVisitor)
+            {
+                vis.clique(k, g);
+            }
+        private:
+            Visitor vis;
+            Graph g;
+            Clique k;
+        };
+    } /* namespace concepts */
+using concepts::CliqueVisitorConcept;
+} /* namespace boost */
+#include <boost/concept/detail/concept_undef.hpp>
+
+namespace boost
+{
+// The algorithm implemented in this paper is based on the so-called
+// Algorithm 457, published as:
+//
+//     @article{362367,
+//         author = {Coen Bron and Joep Kerbosch},
+//         title = {Algorithm 457: finding all cliques of an undirected graph},
+//         journal = {Communications of the ACM},
+//         volume = {16},
+//         number = {9},
+//         year = {1973},
+//         issn = {0001-0782},
+//         pages = {575--577},
+//         doi = {http://doi.acm.org/10.1145/362342.362367},
+//             publisher = {ACM Press},
+//             address = {New York, NY, USA},
+//         }
+//
+// Sort of. This implementation is adapted from the 1st version of the
+// algorithm and does not implement the candidate selection optimization
+// described as published - it could, it just doesn't yet.
+//
+// The algorithm is given as proportional to (3.14)^(n/3) power. This is
+// not the same as O(...), but based on time measures and approximation.
+//
+// Unfortunately, this implementation may be less efficient on non-
+// AdjacencyMatrix modeled graphs due to the non-constant implementation
+// of the edge(u,v,g) functions.
+//
+// TODO: It might be worthwhile to provide functionality for passing
+// a connectivity matrix to improve the efficiency of those lookups
+// when needed. This could simply be passed as a BooleanMatrix
+// s.t. edge(u,v,B) returns true or false. This could easily be
+// abstracted for adjacency matricies.
+//
+// The following paper is interesting for a number of reasons. First,
+// it lists a number of other such algorithms and second, it describes
+// a new algorithm (that does not appear to require the edge(u,v,g)
+// function and appears fairly efficient. It is probably worth investigating.
+//
+//      @article{DBLP:journals/tcs/TomitaTT06,
+//          author = {Etsuji Tomita and Akira Tanaka and Haruhisa Takahashi},
+//          title = {The worst-case time complexity for generating all maximal cliques and computational experiments},
+//          journal = {Theor. Comput. Sci.},
+//          volume = {363},
+//          number = {1},
+//          year = {2006},
+//          pages = {28-42}
+//          ee = {http://dx.doi.org/10.1016/j.tcs.2006.06.015}
+//      }
+
+/**
+ * The default clique_visitor supplies an empty visitation function.
+ */
+struct clique_visitor
+{
+    template <typename VertexSet, typename Graph>
+    void clique(const VertexSet&, Graph&)
+    { }
+};
+
+/**
+ * The max_clique_visitor records the size of the maximum clique (but not the
+ * clique itself).
+ */
+struct max_clique_visitor
+{
+    max_clique_visitor(std::size_t& max)
+        : maximum(max)
+    { }
+
+    template <typename Clique, typename Graph>
+    inline void clique(const Clique& p, const Graph& g)
+    {
+        BOOST_USING_STD_MAX();
+        maximum = max BOOST_PREVENT_MACRO_SUBSTITUTION (maximum, p.size());
+    }
+    std::size_t& maximum;
+};
+
+inline max_clique_visitor find_max_clique(std::size_t& max)
+{ return max_clique_visitor(max); }
+
+namespace detail
+{
+    template <typename Graph>
+    inline bool
+    is_connected_to_clique(const Graph& g,
+                            typename graph_traits<Graph>::vertex_descriptor u,
+                            typename graph_traits<Graph>::vertex_descriptor v,
+                            typename graph_traits<Graph>::undirected_category)
+    {
+        function_requires< AdjacencyMatrixConcept<Graph> >();
+
+        return edge(u, v, g).second;
+    }
+
+    template <typename Graph>
+    inline bool
+    is_connected_to_clique(const Graph& g,
+                            typename graph_traits<Graph>::vertex_descriptor u,
+                            typename graph_traits<Graph>::vertex_descriptor v,
+                            typename graph_traits<Graph>::directed_category)
+    {
+        function_requires< AdjacencyMatrixConcept<Graph> >();
+        // Note that this could alternate between using an || to determine
+        // full connectivity. I believe that this should produce strongly
+        // connected components. Note that using && instead of || will
+        // change the results to a fully connected subgraph (i.e., symmetric
+        // edges between all vertices s.t., if a->b, then b->a.
+        return edge(u, v, g).second && edge(v, u, g).second;
+    }
+
+    template <typename Graph, typename Container>
+    inline void
+    filter_unconnected_vertices(const Graph& g,
+                                typename graph_traits<Graph>::vertex_descriptor v,
+                                const Container& in,
+                                Container& out)
+    {
+        function_requires< GraphConcept<Graph> >();
+
+        typename graph_traits<Graph>::directed_category cat;
+        typename Container::const_iterator i, end = in.end();
+        for(i = in.begin(); i != end; ++i) {
+            if(is_connected_to_clique(g, v, *i, cat)) {
+                out.push_back(*i);
+            }
+        }
+    }
+
+    template <
+        typename Graph,
+        typename Clique,        // compsub type
+        typename Container,     // candidates/not type
+        typename Visitor>
+    void extend_clique(const Graph& g,
+                        Clique& clique,
+                        Container& cands,
+                        Container& nots,
+                        Visitor vis,
+                        std::size_t min)
+    {
+        function_requires< GraphConcept<Graph> >();
+        function_requires< CliqueVisitorConcept<Visitor,Clique,Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+        // Is there vertex in nots that is connected to all vertices
+        // in the candidate set? If so, no clique can ever be found.
+        // This could be broken out into a separate function.
+        {
+            typename Container::iterator ni, nend = nots.end();
+            typename Container::iterator ci, cend = cands.end();
+            for(ni = nots.begin(); ni != nend; ++ni) {
+                for(ci = cands.begin(); ci != cend; ++ci) {
+                    // if we don't find an edge, then we're okay.
+                    if(!edge(*ni, *ci, g).second) break;
+                }
+                // if we iterated all the way to the end, then *ni
+                // is connected to all *ci
+                if(ci == cend) break;
+            }
+            // if we broke early, we found *ni connected to all *ci
+            if(ni != nend) return;
+        }
+
+        // TODO: the original algorithm 457 describes an alternative
+        // (albeit really complicated) mechanism for selecting candidates.
+        // The given optimizaiton seeks to bring about the above
+        // condition sooner (i.e., there is a vertex in the not set
+        // that is connected to all candidates). unfortunately, the
+        // method they give for doing this is fairly unclear.
+
+        // basically, for every vertex in not, we should know how many
+        // vertices it is disconnected from in the candidate set. if
+        // we fix some vertex in the not set, then we want to keep
+        // choosing vertices that are not connected to that fixed vertex.
+        // apparently, by selecting fix point with the minimum number
+        // of disconnections (i.e., the maximum number of connections
+        // within the candidate set), then the previous condition wil
+        // be reached sooner.
+
+        // there's some other stuff about using the number of disconnects
+        // as a counter, but i'm jot really sure i followed it.
+
+        // TODO: If we min-sized cliques to visit, then theoretically, we
+        // should be able to stop recursing if the clique falls below that
+        // size - maybe?
+
+        // otherwise, iterate over candidates and and test
+        // for maxmimal cliquiness.
+        typename Container::iterator i, j, end = cands.end();
+        for(i = cands.begin(); i != cands.end(); ) {
+            Vertex candidate = *i;
+
+            // add the candidate to the clique (keeping the iterator!)
+            // typename Clique::iterator ci = clique.insert(clique.end(), candidate);
+            clique.push_back(candidate);
+
+            // remove it from the candidate set
+            i = cands.erase(i);
+
+            // build new candidate and not sets by removing all vertices
+            // that are not connected to the current candidate vertex.
+            // these actually invert the operation, adding them to the new
+            // sets if the vertices are connected. its semantically the same.
+            Container new_cands, new_nots;
+            filter_unconnected_vertices(g, candidate, cands, new_cands);
+            filter_unconnected_vertices(g, candidate, nots, new_nots);
+
+            if(new_cands.empty() && new_nots.empty()) {
+                // our current clique is maximal since there's nothing
+                // that's connected that we haven't already visited. If
+                // the clique is below our radar, then we won't visit it.
+                if(clique.size() >= min) {
+                    vis.clique(clique, g);
+                }
+            }
+            else {
+                // recurse to explore the new candidates
+                extend_clique(g, clique, new_cands, new_nots, vis, min);
+            }
+
+            // we're done with this vertex, so we need to move it
+            // to the nots, and remove the candidate from the clique.
+            nots.push_back(candidate);
+            clique.pop_back();
+        }
+    }
+} /* namespace detail */
+
+template <typename Graph, typename Visitor>
+inline void
+bron_kerbosch_all_cliques(const Graph& g, Visitor vis, std::size_t min)
+{
+    function_requires< IncidenceGraphConcept<Graph> >();
+    function_requires< VertexListGraphConcept<Graph> >();
+    function_requires< VertexIndexGraphConcept<Graph> >();
+    function_requires< AdjacencyMatrixConcept<Graph> >(); // Structural requirement only
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    typedef std::vector<Vertex> VertexSet;
+    typedef std::deque<Vertex> Clique;
+    function_requires< CliqueVisitorConcept<Visitor,Clique,Graph> >();
+
+    // NOTE: We're using a deque to implement the clique, because it provides
+    // constant inserts and removals at the end and also a constant size.
+
+    VertexIterator i, end;
+    tie(i, end) = vertices(g);
+    VertexSet cands(i, end);    // start with all vertices as candidates
+    VertexSet nots;             // start with no vertices visited
+
+    Clique clique;              // the first clique is an empty vertex set
+    detail::extend_clique(g, clique, cands, nots, vis, min);
+}
+
+// NOTE: By default the minimum number of vertices per clique is set at 2
+// because singleton cliques aren't really very interesting.
+template <typename Graph, typename Visitor>
+inline void
+bron_kerbosch_all_cliques(const Graph& g, Visitor vis)
+{ bron_kerbosch_all_cliques(g, vis, 2); }
+
+template <typename Graph>
+inline std::size_t
+bron_kerbosch_clique_number(const Graph& g)
+{
+    std::size_t ret = 0;
+    bron_kerbosch_all_cliques(g, find_max_clique(ret));
+    return ret;
+}
+
+} /* namespace boost */
+
+#endif
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/chrobak_payne_drawing.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/chrobak_payne_drawing.hpp
index 6fb7b56d91a7a755296c7c0015d4cebfd29d8cfd..9e3a2f368e2e941e2ed4f7d71e57f7d5fb58faba 100644 (file)
@@ -14,7 +14,7 @@
 #include <boost/config.hpp>
 #include <boost/utility.hpp>  //for next and prior
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 
 namespace boost
@@ -193,8 +193,8 @@ namespace boost
             delta_p_q += delta_x[temp];
           }
 
-        delta_x[v] = (y[rightmost] - y[leftmost] + delta_p_q)/2;
-        y[v] = (y[rightmost] + y[leftmost] + delta_p_q)/2;
+        delta_x[v] = ((y[rightmost] + delta_p_q) - y[leftmost])/2;
+        y[v] = y[leftmost] + delta_x[v];
         delta_x[rightmost] = delta_p_q - delta_x[v];
         
         bool leftmost_and_rightmost_adjacent = right[leftmost] == rightmost;
similarity index 73%
rename from deal.II/contrib/boost/include/boost/graph/circle_layout.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/circle_layout.hpp
index 26387d14f57bec8b5ae3ebe65fa80e1432b663d4..9c6ca6ef57bdc4a55592bfced82eb20d1983a22a 100644 (file)
@@ -9,8 +9,12 @@
 #ifndef BOOST_GRAPH_CIRCLE_LAYOUT_HPP
 #define BOOST_GRAPH_CIRCLE_LAYOUT_HPP
 #include <boost/config/no_tr1/cmath.hpp>
+#include <boost/math/constants/constants.hpp>
 #include <utility>
 #include <boost/graph/graph_traits.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/topology.hpp>
+#include <boost/static_assert.hpp>
 
 namespace boost {
   /** 
@@ -28,7 +32,8 @@ namespace boost {
   circle_graph_layout(const VertexListGraph& g, PositionMap position,
                       Radius radius)
   {
-    const double pi = 3.14159;
+    BOOST_STATIC_ASSERT (property_traits<PositionMap>::value_type::dimensions >= 2);
+    const double pi = boost::math::constants::pi<double>();
 
 #ifndef BOOST_NO_STDC_NAMESPACE
     using std::sin;
@@ -40,14 +45,12 @@ namespace boost {
 
     vertices_size_type n = num_vertices(g);
     
-    typedef typename graph_traits<VertexListGraph>::vertex_iterator 
-      vertex_iterator;
-
     vertices_size_type i = 0;
-    for(std::pair<vertex_iterator, vertex_iterator> v = vertices(g); 
-        v.first != v.second; ++v.first, ++i) {
-      position[*v.first].x = radius * cos(i * 2 * pi / n);
-      position[*v.first].y = radius * sin(i * 2 * pi / n);
+    double two_pi_over_n = 2. * pi / n;
+    BGL_FORALL_VERTICES_T(v, g, VertexListGraph) {
+      position[v][0] = radius * cos(i * two_pi_over_n);
+      position[v][1] = radius * sin(i * two_pi_over_n);
+      ++i;
     }
   }
 } // end namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/closeness_centrality.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/closeness_centrality.hpp
new file mode 100644 (file)
index 0000000..77cea7b
--- /dev/null
@@ -0,0 +1,157 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
+#define BOOST_GRAPH_CLOSENESS_CENTRALITY_HPP
+
+#include <boost/graph/detail/geodesic.hpp>
+#include <boost/graph/exterior_property.hpp>
+
+namespace boost
+{
+template <typename Graph,
+          typename DistanceType,
+          typename ResultType,
+          typename Reciprocal = detail::reciprocal<ResultType> >
+struct closeness_measure
+    : public geodesic_measure<Graph, DistanceType, ResultType>
+{
+    typedef geodesic_measure< Graph, DistanceType, ResultType> base_type;
+    typedef typename base_type::distance_type distance_type;
+    typedef typename base_type::result_type result_type;
+
+    result_type operator ()(distance_type d, const Graph&)
+    {
+        function_requires< NumericValueConcept<DistanceType> >();
+        function_requires< NumericValueConcept<ResultType> >();
+        function_requires< AdaptableUnaryFunctionConcept<Reciprocal,ResultType,ResultType> >();
+        return (d == base_type::infinite_distance())
+            ? base_type::zero_result()
+            : rec(result_type(d));
+    }
+    Reciprocal rec;
+};
+
+template <typename Graph, typename DistanceMap>
+inline closeness_measure<
+        Graph, typename property_traits<DistanceMap>::value_type, double,
+        detail::reciprocal<double> >
+measure_closeness(const Graph&, DistanceMap)
+{
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    return closeness_measure<Graph, Distance, double, detail::reciprocal<double> >();
+}
+
+template <typename T, typename Graph, typename DistanceMap>
+inline closeness_measure<
+        Graph, typename property_traits<DistanceMap>::value_type, T,
+        detail::reciprocal<T> >
+measure_closeness(const Graph&, DistanceMap)
+{
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    return closeness_measure<Graph, Distance, T, detail::reciprocal<T> >();
+}
+
+template <typename T, typename Graph, typename DistanceMap, typename Reciprocal>
+inline closeness_measure<
+        Graph, typename property_traits<DistanceMap>::value_type, T,
+        Reciprocal>
+measure_closeness(const Graph&, DistanceMap)
+{
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    return closeness_measure<Graph, Distance, T, Reciprocal>();
+}
+
+template <typename Graph,
+          typename DistanceMap,
+          typename Measure,
+          typename Combinator>
+inline typename Measure::result_type
+closeness_centrality(const Graph& g,
+                     DistanceMap dist,
+                     Measure measure,
+                     Combinator combine)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    function_requires< NumericValueConcept<Distance> >();
+    function_requires< DistanceMeasureConcept<Measure,Graph> >();
+
+    Distance n = detail::combine_distances(g, dist, combine, Distance(0));
+    return measure(n, g);
+}
+
+template <typename Graph, typename DistanceMap, typename Measure>
+inline typename Measure::result_type
+closeness_centrality(const Graph& g, DistanceMap dist, Measure measure)
+{
+    function_requires< GraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+
+    return closeness_centrality(g, dist, measure, std::plus<Distance>());
+}
+
+template <typename Graph, typename DistanceMap>
+inline double closeness_centrality(const Graph& g, DistanceMap dist)
+{ return closeness_centrality(g, dist, measure_closeness(g, dist)); }
+
+template <typename T, typename Graph, typename DistanceMap>
+inline T closeness_centrality(const Graph& g, DistanceMap dist)
+{ return closeness_centrality(g, dist, measure_closeness<T>(g, dist)); }
+
+template <typename Graph,
+          typename DistanceMatrixMap,
+          typename CentralityMap,
+          typename Measure>
+inline void
+all_closeness_centralities(const Graph& g,
+                           DistanceMatrixMap dist,
+                           CentralityMap cent,
+                           Measure measure)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> >();
+    typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    function_requires< WritablePropertyMapConcept<CentralityMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    typedef typename property_traits<CentralityMap>::value_type Centrality;
+
+    typename graph_traits<Graph>::vertex_iterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        DistanceMap dm = get(dist, *i);
+        Centrality c = closeness_centrality(g, dm, measure);
+        put(cent, *i, c);
+    }
+}
+
+template <typename Graph,
+          typename DistanceMatrixMap,
+          typename CentralityMap>
+inline void
+all_closeness_centralities(const Graph& g,
+                            DistanceMatrixMap dist,
+                            CentralityMap cent)
+{
+    function_requires< GraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> >();
+    typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    typedef typename property_traits<CentralityMap>::value_type Result;
+
+    all_closeness_centralities(g, dist, cent, measure_closeness<Result>(g, DistanceMap()));
+}
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/clustering_coefficient.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/clustering_coefficient.hpp
new file mode 100644 (file)
index 0000000..c84c480
--- /dev/null
@@ -0,0 +1,157 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CLUSTERING_COEFFICIENT_HPP
+#define BOOST_GRAPH_CLUSTERING_COEFFICIENT_HPP
+
+#include <boost/utility.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_concepts.hpp>
+
+namespace boost
+{
+namespace detail
+{
+    template <class Graph>
+    inline typename graph_traits<Graph>::degree_size_type
+    possible_edges(const Graph& g, std::size_t k, directed_tag)
+    {
+        function_requires< GraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::degree_size_type T;
+        return T(k) * (T(k) - 1);
+    }
+
+    template <class Graph>
+    inline typename graph_traits<Graph>::degree_size_type
+    possible_edges(const Graph& g, size_t k, undirected_tag)
+    {
+        // dirty little trick...
+        return possible_edges(g, k, directed_tag()) / 2;
+    }
+
+    // This template matches directedS and bidirectionalS.
+    template <class Graph>
+    inline typename graph_traits<Graph>::degree_size_type
+    count_edges(const Graph& g,
+                typename Graph::vertex_descriptor u,
+                typename Graph::vertex_descriptor v,
+                directed_tag)
+
+    {
+        function_requires< AdjacencyMatrixConcept<Graph> >();
+        return (edge(u, v, g).second ? 1 : 0) +
+                (edge(v, u, g).second ? 1 : 0);
+    }
+
+    // This template matches undirectedS
+    template <class Graph>
+    inline typename graph_traits<Graph>::degree_size_type
+    count_edges(const Graph& g,
+                typename Graph::vertex_descriptor u,
+                typename Graph::vertex_descriptor v,
+                undirected_tag)
+    {
+        function_requires< AdjacencyMatrixConcept<Graph> >();
+        return edge(u, v, g).second ? 1 : 0;
+    }
+}
+
+template <typename Graph, typename Vertex>
+inline typename graph_traits<Graph>::degree_size_type
+num_paths_through_vertex(const Graph& g, Vertex v)
+{
+    function_requires< AdjacencyGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::directed_category Directed;
+    typedef typename graph_traits<Graph>::adjacency_iterator AdjacencyIterator;
+
+    // TODO: There should actually be a set of neighborhood functions
+    // for things like this (num_neighbors() would be great).
+
+    AdjacencyIterator i, end;
+    tie(i, end) = adjacent_vertices(v, g);
+    std::size_t k = std::distance(i, end);
+    return detail::possible_edges(g, k, Directed());
+}
+
+template <typename Graph, typename Vertex>
+inline typename graph_traits<Graph>::degree_size_type
+num_triangles_on_vertex(const Graph& g, Vertex v)
+{
+    function_requires< IncidenceGraphConcept<Graph> >();
+    function_requires< AdjacencyGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::degree_size_type Degree;
+    typedef typename graph_traits<Graph>::directed_category Directed;
+    typedef typename graph_traits<Graph>::adjacency_iterator AdjacencyIterator;
+
+    // TODO: I might be able to reduce the requirement from adjacency graph
+    // to incidence graph by using out edges.
+
+    Degree count(0);
+    AdjacencyIterator i, j, end;
+    for(tie(i, end) = adjacent_vertices(v, g); i != end; ++i) {
+        for(j = boost::next(i); j != end; ++j) {
+            count += detail::count_edges(g, *i, *j, Directed());
+        }
+    }
+    return count;
+} /* namespace detail */
+
+template <typename T, typename Graph, typename Vertex>
+inline T
+clustering_coefficient(const Graph& g, Vertex v)
+{
+    T zero(0);
+    T routes = T(num_paths_through_vertex(g, v));
+    return (routes > zero) ?
+        T(num_triangles_on_vertex(g, v)) / routes : zero;
+}
+
+template <typename Graph, typename Vertex>
+inline double
+clustering_coefficient(const Graph& g, Vertex v)
+{ return clustering_coefficient<double>(g, v); }
+
+template <typename Graph, typename ClusteringMap>
+inline typename property_traits<ClusteringMap>::value_type
+all_clustering_coefficients(const Graph& g, ClusteringMap cm)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< WritablePropertyMapConcept<ClusteringMap,Vertex> >();
+    typedef typename property_traits<ClusteringMap>::value_type Coefficient;
+
+    Coefficient sum(0);
+    VertexIterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        Coefficient cc = clustering_coefficient<Coefficient>(g, *i);
+        put(cm, *i, cc);
+        sum += cc;
+    }
+    return sum / Coefficient(num_vertices(g));
+}
+
+template <typename Graph, typename ClusteringMap>
+inline typename property_traits<ClusteringMap>::value_type
+mean_clustering_coefficient(const Graph& g, ClusteringMap cm)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< ReadablePropertyMapConcept<ClusteringMap,Vertex> >();
+    typedef typename property_traits<ClusteringMap>::value_type Coefficient;
+
+    Coefficient cc(0);
+    VertexIterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        cc += get(cm, *i);
+    }
+    return cc / Coefficient(num_vertices(g));
+}
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/compressed_sparse_row_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/compressed_sparse_row_graph.hpp
new file mode 100644 (file)
index 0000000..b4f0135
--- /dev/null
@@ -0,0 +1,1680 @@
+// Copyright 2005-2009 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Jeremiah Willcock
+//           Douglas Gregor
+//           Andrew Lumsdaine
+
+// Compressed sparse row graph type
+
+#ifndef BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
+#define BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
+
+#include <vector>
+#include <utility>
+#include <algorithm>
+#include <climits>
+#include <cassert>
+#include <iterator>
+#if 0
+#include <iostream> // For some debugging code below
+#endif
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/graph/filtered_graph.hpp> // For keep_all
+#include <boost/graph/detail/indexed_properties.hpp>
+#include <boost/graph/detail/compressed_sparse_row_struct.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/iterator/reverse_iterator.hpp>
+#include <boost/iterator/zip_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/integer.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/graph/graph_selectors.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/utility.hpp>
+
+#ifdef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+#  error The Compressed Sparse Row graph only supports bundled properties.
+#  error You will need a compiler that conforms better to the C++ standard.
+#endif
+
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+#warning "Using deprecated BGL compressed sparse row graph interface --"
+#warning "please see the documentation for the new interface and then"
+#warning "#define BOOST_GRAPH_USE_NEW_CSR_INTERFACE before including"
+#warning "<boost/graph/compressed_sparse_row_graph.hpp>"
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+#define BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+#endif
+
+namespace boost {
+
+// A tag type indicating that the graph in question is a compressed
+// sparse row graph. This is an internal detail of the BGL.
+struct csr_graph_tag;
+
+// A type (edges_are_sorted_t) and a value (edges_are_sorted) used to indicate
+// that the edge list passed into the CSR graph is already sorted by source
+// vertex.
+enum edges_are_sorted_t {edges_are_sorted};
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+// A type (edges_are_sorted_global_t) and a value (edges_are_sorted_global)
+// used to indicate that the edge list passed into the CSR graph is already
+// sorted by source vertex.
+enum edges_are_sorted_global_t {edges_are_sorted_global};
+
+// A type (edges_are_unsorted_t) and a value (edges_are_unsorted) used to
+// indicate that the edge list passed into the CSR graph is not sorted by
+// source vertex.  This version caches the edge information in memory, and thus
+// requires only a single pass over the input data.
+enum edges_are_unsorted_t {edges_are_unsorted};
+
+// A type (edges_are_unsorted_multi_pass_t) and a value
+// (edges_are_unsorted_multi_pass) used to indicate that the edge list passed
+// into the CSR graph is not sorted by source vertex.  This version uses less
+// memory but requires multi-pass capability on the iterators.
+enum edges_are_unsorted_multi_pass_t {edges_are_unsorted_multi_pass};
+
+// A type (edges_are_unsorted_multi_pass_global_t) and a value
+// (edges_are_unsorted_multi_pass_global) used to indicate that the edge list
+// passed into the CSR graph is not sorted by source vertex.  This version uses
+// less memory but requires multi-pass capability on the iterators.  The
+// global mapping and filtering is done here because it is often faster and it
+// greatly simplifies handling of edge properties.
+enum edges_are_unsorted_multi_pass_global_t {edges_are_unsorted_multi_pass_global};
+
+// A type (construct_inplace_from_sources_and_targets_t) and a value
+// (construct_inplace_from_sources_and_targets) used to indicate that mutable
+// vectors of sources and targets (and possibly edge properties) are being used
+// to construct the CSR graph.  These vectors are sorted in-place and then the
+// targets and properties are swapped into the graph data structure.
+enum construct_inplace_from_sources_and_targets_t {construct_inplace_from_sources_and_targets};
+
+// A type (construct_inplace_from_sources_and_targets_global_t) and a value
+// (construct_inplace_from_sources_and_targets_global) used to indicate that
+// mutable vectors of sources and targets (and possibly edge properties) are
+// being used to construct the CSR graph.  These vectors are sorted in-place
+// and then the targets and properties are swapped into the graph data
+// structure.  It is assumed that global indices (for distributed CSR) are
+// used, and a map is required to convert those to local indices.  This
+// constructor is intended for internal use by the various CSR graphs
+// (sequential and distributed).
+enum construct_inplace_from_sources_and_targets_global_t {construct_inplace_from_sources_and_targets_global};
+
+// A type (edges_are_unsorted_global_t) and a value (edges_are_unsorted_global)
+// used to indicate that the edge list passed into the CSR graph is not sorted
+// by source vertex.  The data is also stored using global vertex indices, and
+// must be filtered to choose only local vertices.  This constructor caches the
+// edge information in memory, and thus requires only a single pass over the
+// input data.  This constructor is intended for internal use by the
+// distributed CSR constructors.
+enum edges_are_unsorted_global_t {edges_are_unsorted_global};
+
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+/****************************************************************************
+ * Local helper macros to reduce typing and clutter later on.               *
+ ****************************************************************************/
+#define BOOST_CSR_GRAPH_TEMPLATE_PARMS                                  \
+  typename Directed, typename VertexProperty, typename EdgeProperty,    \
+  typename GraphProperty, typename Vertex, typename EdgeIndex
+#define BOOST_CSR_GRAPH_TYPE                                            \
+   compressed_sparse_row_graph<Directed, VertexProperty, EdgeProperty,  \
+                               GraphProperty, Vertex, EdgeIndex>
+#define BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS                              \
+  typename VertexProperty, typename EdgeProperty,                       \
+  typename GraphProperty, typename Vertex, typename EdgeIndex
+#define BOOST_DIR_CSR_GRAPH_TYPE                                        \
+   compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty, \
+                               GraphProperty, Vertex, EdgeIndex>
+#define BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS                            \
+  typename VertexProperty, typename EdgeProperty,                       \
+  typename GraphProperty, typename Vertex, typename EdgeIndex
+#define BOOST_BIDIR_CSR_GRAPH_TYPE                                      \
+   compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty, \
+                               GraphProperty, Vertex, EdgeIndex>
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+namespace detail {
+  template <typename T>
+  struct default_construct_iterator: public boost::iterator_facade<default_construct_iterator<T>, T, boost::random_access_traversal_tag, const T&> {
+    typedef boost::iterator_facade<default_construct_iterator<T>, T, std::random_access_iterator_tag, const T&> base_type;
+    T saved_value;
+    const T& dereference() const {return saved_value;}
+    bool equal(default_construct_iterator i) const {return true;}
+    void increment() {}
+    void decrement() {}
+    void advance(typename base_type::difference_type) {}
+    typename base_type::difference_type distance_to(default_construct_iterator) const {return 0;}
+  };
+
+  template <typename Less>
+  struct compare_first {
+    Less less;
+    compare_first(Less less = Less()): less(less) {}
+    template <typename Tuple>
+    bool operator()(const Tuple& a, const Tuple& b) const {
+      return less(a.template get<0>(), b.template get<0>());
+    }
+  };
+
+  template <int N, typename Result>
+  struct my_tuple_get_class {
+    typedef const Result& result_type;
+    template <typename Tuple>
+    result_type operator()(const Tuple& t) const {
+      return t.template get<N>();
+    }
+  };
+}
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+/** Compressed sparse row graph.
+ *
+ * Vertex and EdgeIndex should be unsigned integral types and should
+ * specialize numeric_limits.
+ */
+template<typename Directed = directedS, 
+         typename VertexProperty = no_property,
+         typename EdgeProperty = no_property,
+         typename GraphProperty = no_property,
+         typename Vertex = std::size_t,
+         typename EdgeIndex = Vertex>
+class compressed_sparse_row_graph; // Not defined
+
+template<typename VertexProperty,
+         typename EdgeProperty,
+         typename GraphProperty,
+         typename Vertex,
+         typename EdgeIndex>
+class compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty, GraphProperty, Vertex, EdgeIndex>
+   : public detail::indexed_vertex_properties<BOOST_DIR_CSR_GRAPH_TYPE,
+                                              VertexProperty, Vertex>
+{
+ public:
+  typedef detail::indexed_vertex_properties<compressed_sparse_row_graph,
+                                            VertexProperty, Vertex>
+    inherited_vertex_properties;
+
+ public:
+  // For Property Graph
+  typedef GraphProperty graph_property_type;
+
+  typedef detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
+
+ public:
+  /* At this time, the compressed sparse row graph can only be used to
+   * create directed and bidirectional graphs. In the future, 
+   * undirected CSR graphs will also be supported.
+   */
+  // BOOST_STATIC_ASSERT((is_same<Directed, directedS>::value));
+
+  // Concept requirements:
+  // For Graph
+  typedef Vertex vertex_descriptor;
+  typedef detail::csr_edge_descriptor<Vertex, EdgeIndex> edge_descriptor;
+  typedef directed_tag directed_category;
+  typedef allow_parallel_edge_tag edge_parallel_category;
+
+  class traversal_category: public incidence_graph_tag,
+                            public adjacency_graph_tag,
+                            public vertex_list_graph_tag,
+                            public edge_list_graph_tag {};
+
+  static vertex_descriptor null_vertex() { return vertex_descriptor(-1); }
+
+  // For VertexListGraph
+  typedef counting_iterator<Vertex> vertex_iterator;
+  typedef Vertex vertices_size_type;
+
+  // For EdgeListGraph
+  typedef EdgeIndex edges_size_type;
+
+  // For IncidenceGraph
+  typedef detail::csr_out_edge_iterator<compressed_sparse_row_graph> out_edge_iterator;
+  typedef EdgeIndex degree_size_type;
+
+  // For AdjacencyGraph
+  typedef typename std::vector<Vertex>::const_iterator adjacency_iterator;
+
+  // For EdgeListGraph
+  typedef detail::csr_edge_iterator<compressed_sparse_row_graph> edge_iterator;
+
+  // For BidirectionalGraph (not implemented)
+  typedef void in_edge_iterator;
+
+  // For internal use
+  typedef csr_graph_tag graph_tag;
+
+  typedef typename forward_type::inherited_edge_properties::edge_bundled edge_bundled;
+  typedef typename forward_type::inherited_edge_properties::edge_push_back_type edge_push_back_type;
+  typedef typename forward_type::inherited_edge_properties::edge_property_type edge_property_type;
+
+  // Constructors
+
+  // Default constructor: an empty graph.
+  compressed_sparse_row_graph(): m_property() {}
+
+  //  With numverts vertices
+  compressed_sparse_row_graph(vertices_size_type numverts)
+    : inherited_vertex_properties(numverts), m_forward(numverts) {}
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  //  From number of vertices and unsorted list of edges
+  template <typename MultiPassInputIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, numverts, identity_property_map(), keep_all());
+  }
+
+  //  From number of vertices and unsorted list of edges, plus edge properties
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, ep_iter, numverts, identity_property_map(), keep_all());
+  }
+
+  //  From number of vertices and unsorted list of edges, with filter and
+  //  global-to-local map
+  template <typename MultiPassInputIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_global_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numlocalverts,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, numlocalverts, global_to_local, source_pred);
+  }
+
+  //  From number of vertices and unsorted list of edges, plus edge properties,
+  //  with filter and global-to-local map
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_global_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numlocalverts,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, ep_iter, numlocalverts, global_to_local, source_pred);
+  }
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+
+  //  From number of vertices and sorted list of edges (deprecated
+  //  interface)
+  template<typename InputIterator>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, identity_property_map(), keep_all(), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //  From number of vertices and sorted list of edges (deprecated
+  //  interface)
+  template<typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, ep_iter, identity_property_map(), keep_all(), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+
+  //  From number of vertices and sorted list of edges (new interface)
+  template<typename InputIterator>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, identity_property_map(), keep_all(), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //  From number of vertices and sorted list of edges (new interface)
+  template<typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, ep_iter, identity_property_map(), keep_all(), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  //  From number of vertices and sorted list of edges, filtered and global (new interface)
+  template<typename InputIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_sorted_global_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, global_to_local, source_pred, numverts, 0);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //  From number of vertices and sorted list of edges (new interface)
+  template<typename InputIterator, typename EdgePropertyIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_sorted_global_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : m_property(prop)
+  {
+    m_forward.assign_from_sorted_edges(edge_begin, edge_end, ep_iter, global_to_local, source_pred, numverts, 0);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //  From number of vertices and mutable vectors of sources and targets;
+  //  vectors are returned with unspecified contents but are guaranteed not to
+  //  share storage with the constructed graph.
+  compressed_sparse_row_graph(construct_inplace_from_sources_and_targets_t,
+                              std::vector<vertex_descriptor>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    m_forward.assign_sources_and_targets_global(sources, targets, numverts, boost::identity_property_map());
+  }
+
+  //  From number of vertices and mutable vectors of sources and targets,
+  //  expressed with global vertex indices; vectors are returned with
+  //  unspecified contents but are guaranteed not to share storage with the
+  //  constructed graph.  This constructor should only be used by the
+  //  distributed CSR graph.
+  template <typename GlobalToLocal>
+  compressed_sparse_row_graph(construct_inplace_from_sources_and_targets_global_t,
+                              std::vector<vertex_descriptor>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              vertices_size_type numlocalverts,
+                              GlobalToLocal global_to_local,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_property(prop)
+  {
+    m_forward.assign_sources_and_targets_global(sources, targets, numlocalverts, global_to_local);
+  }
+
+  //  From number of vertices and mutable vectors of sources, targets, and edge
+  //  properties; vectors are returned with unspecified contents but are
+  //  guaranteed not to share storage with the constructed graph.
+  compressed_sparse_row_graph(construct_inplace_from_sources_and_targets_t,
+                              std::vector<vertex_descriptor>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              std::vector<typename forward_type::inherited_edge_properties::edge_bundled>& edge_props,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    m_forward.assign_sources_and_targets_global(sources, targets, edge_props, numverts, boost::identity_property_map());
+  }
+
+  //  From number of vertices and mutable vectors of sources and targets and
+  //  edge properties, expressed with global vertex indices; vectors are
+  //  returned with unspecified contents but are guaranteed not to share
+  //  storage with the constructed graph.  This constructor should only be used
+  //  by the distributed CSR graph.
+  template <typename GlobalToLocal>
+  compressed_sparse_row_graph(construct_inplace_from_sources_and_targets_global_t,
+                              std::vector<vertex_descriptor>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              std::vector<typename forward_type::inherited_edge_properties::edge_bundled>& edge_props,
+                              vertices_size_type numlocalverts,
+                              GlobalToLocal global_to_local,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_property(prop)
+  {
+    m_forward.assign_sources_and_targets_global(sources, targets, edge_props, numlocalverts, global_to_local);
+  }
+
+  //  From number of vertices and single-pass range of unsorted edges.  Data is
+  //  cached in coordinate form before creating the actual graph.
+  template<typename InputIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    std::vector<vertex_descriptor> sources, targets;
+    boost::graph::detail::split_into_separate_coords
+      (edge_begin, edge_end, sources, targets);
+    m_forward.assign_sources_and_targets_global(sources, targets, numverts, boost::identity_property_map());
+  }
+
+  //  From number of vertices and single-pass range of unsorted edges and
+  //  single-pass range of edge properties.  Data is cached in coordinate form
+  //  before creating the actual graph.
+  template<typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    std::vector<vertex_descriptor> sources, targets;
+    boost::graph::detail::split_into_separate_coords
+      (edge_begin, edge_end, sources, targets);
+    size_t numedges = sources.size();
+    std::vector<typename forward_type::inherited_edge_properties::edge_bundled> edge_props(numedges);
+    for (size_t i = 0; i < numedges; ++i) {
+      edge_props[i] = *ep_iter++;
+    }
+    m_forward.assign_sources_and_targets_global(sources, targets, edge_props, numverts, boost::identity_property_map());
+  }
+
+  //  From number of vertices and single-pass range of unsorted edges.  Data is
+  //  cached in coordinate form before creating the actual graph.  Edges are
+  //  filtered and transformed for use in a distributed graph.
+  template<typename InputIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_global_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numlocalverts,
+                              GlobalToLocal global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_property(prop)
+  {
+    std::vector<vertex_descriptor> sources, targets;
+    boost::graph::detail::split_into_separate_coords_filtered
+      (edge_begin, edge_end, sources, targets, source_pred);
+    m_forward.assign_sources_and_targets_global(sources, targets, numlocalverts, global_to_local);
+  }
+
+  //  From number of vertices and single-pass range of unsorted edges and
+  //  single-pass range of edge properties.  Data is cached in coordinate form
+  //  before creating the actual graph.  Edges are filtered and transformed for
+  //  use in a distributed graph.
+  template<typename InputIterator, typename EdgePropertyIterator,
+           typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_global_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numlocalverts,
+                              GlobalToLocal global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_property(prop)
+  {
+    std::vector<vertex_descriptor> sources, targets;
+    std::vector<edge_bundled> edge_props;
+    boost::graph::detail::split_into_separate_coords_filtered
+      (edge_begin, edge_end, ep_iter, sources, targets, edge_props, source_pred);
+    m_forward.assign_sources_and_targets_global(sources, targets, edge_props, numlocalverts, global_to_local);
+  }
+
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+
+  //   Requires IncidenceGraph and a vertex index map
+  template<typename Graph, typename VertexIndexMap>
+  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi,
+                              vertices_size_type numverts,
+                              edges_size_type numedges)
+    : m_property()
+  {
+    assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //   Requires VertexListGraph and EdgeListGraph
+  template<typename Graph, typename VertexIndexMap>
+  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi)
+    : m_property()
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires vertex index map plus requirements of previous constructor
+  template<typename Graph>
+  explicit compressed_sparse_row_graph(const Graph& g)
+    : m_property()
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    assign(g, get(vertex_index, g), num_vertices(g), numedges);
+  }
+
+  // From any graph (slow and uses a lot of memory)
+  //   Requires IncidenceGraph and a vertex index map
+  //   Internal helper function
+  //   Note that numedges must be doubled for undirected source graphs
+  template<typename Graph, typename VertexIndexMap>
+  void
+  assign(const Graph& g, const VertexIndexMap& vi,
+         vertices_size_type numverts, edges_size_type numedges)
+  {
+    m_forward.assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires the above, plus VertexListGraph and EdgeListGraph
+  template<typename Graph, typename VertexIndexMap>
+  void assign(const Graph& g, const VertexIndexMap& vi)
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    m_forward.assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires the above, plus a vertex_index map.
+  template<typename Graph>
+  void assign(const Graph& g)
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    m_forward.assign(g, get(vertex_index, g), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  // Add edges from a sorted (smallest sources first) range of pairs and edge
+  // properties
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig,
+            typename GlobalToLocal>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
+  }
+
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted)  {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, identity_property_map());
+  }
+
+  // Add edges from a sorted (smallest sources first) range of pairs
+  template <typename BidirectionalIteratorOrig>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>());
+  }
+
+  template <typename BidirectionalIteratorOrig, typename GlobalToLocal>
+  void
+  add_edges_sorted_internal_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>(), global_to_local);
+  }
+
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig, 
+            typename GlobalToLocal>
+  void
+  add_edges_sorted_internal_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs that are unsorted
+  template <typename InputIterator, typename GlobalToLocal>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last, 
+                     const GlobalToLocal& global_to_local) {
+    typedef compressed_sparse_row_graph Graph;
+    typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
+    typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
+    typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
+    typedef std::vector<std::pair<vertex_t, vertex_t> > edge_vector_t;
+    edge_vector_t new_edges(first, last);
+    if (new_edges.empty()) return;
+    std::sort(new_edges.begin(), new_edges.end());
+    this->add_edges_sorted_internal_global(new_edges.begin(), new_edges.end(), global_to_local);
+  }
+
+  template <typename InputIterator>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last) {
+    this->add_edges_internal(first, last, identity_property_map());
+  }
+
+  // Add edges from a range of (source, target) pairs and edge properties that
+  // are unsorted
+  template <typename InputIterator, typename EPIterator, typename GlobalToLocal>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last,
+                     EPIterator ep_iter, EPIterator ep_iter_end,
+                     const GlobalToLocal& global_to_local) {
+    typedef compressed_sparse_row_graph Graph;
+    typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
+    typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
+    typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
+    typedef std::pair<vertex_t, vertex_t> vertex_pair;
+    typedef std::vector<
+              boost::tuple<vertex_pair,
+                           edge_bundled> >
+      edge_vector_t;
+    edge_vector_t new_edges
+      (boost::make_zip_iterator(boost::make_tuple(first, ep_iter)),
+       boost::make_zip_iterator(boost::make_tuple(last, ep_iter_end)));
+    if (new_edges.empty()) return;
+    std::sort(new_edges.begin(), new_edges.end(),
+              boost::detail::compare_first<
+                std::less<vertex_pair> >());
+    m_forward.add_edges_sorted_internal
+      (boost::make_transform_iterator(
+         new_edges.begin(),
+         boost::detail::my_tuple_get_class<0, vertex_pair>()),
+       boost::make_transform_iterator(
+         new_edges.end(),
+         boost::detail::my_tuple_get_class<0, vertex_pair>()),
+       boost::make_transform_iterator(
+         new_edges.begin(),
+         boost::detail::my_tuple_get_class
+           <1, edge_bundled>()),
+       global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs and edge properties that
+  // are unsorted
+  template <typename InputIterator, typename EPIterator>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last,
+                     EPIterator ep_iter, EPIterator ep_iter_end) {
+    this->add_edges_internal(first, last, ep_iter, ep_iter_end, identity_property_map());
+  }
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+  using inherited_vertex_properties::operator[];
+
+  // Directly access a edge or edge bundle
+  edge_push_back_type& operator[](const edge_descriptor& v)
+  { return m_forward.m_edge_properties[get(edge_index, *this, v)]; }
+
+  const edge_push_back_type& operator[](const edge_descriptor& v) const
+  { return m_forward.m_edge_properties[get(edge_index, *this, v)]; }
+
+  // private: non-portable, requires friend templates
+  inherited_vertex_properties&       vertex_properties()       {return *this;}
+  const inherited_vertex_properties& vertex_properties() const {return *this;}
+  typename forward_type::inherited_edge_properties&       edge_properties()       { return m_forward; }
+  const typename forward_type::inherited_edge_properties& edge_properties() const { return m_forward; }
+
+  forward_type m_forward;
+  GraphProperty m_property;
+};
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+// Bidir is only supported in this mode
+template<typename VertexProperty,
+         typename EdgeProperty,
+         typename GraphProperty,
+         typename Vertex,
+         typename EdgeIndex>
+class compressed_sparse_row_graph<bidirectionalS, VertexProperty, EdgeProperty, GraphProperty, Vertex, EdgeIndex>
+   : public detail::indexed_vertex_properties<BOOST_BIDIR_CSR_GRAPH_TYPE,
+                                              VertexProperty, Vertex>
+{
+ public:
+  typedef detail::indexed_vertex_properties<compressed_sparse_row_graph,
+                                            VertexProperty, Vertex>
+    inherited_vertex_properties;
+
+ public:
+  // For Property Graph
+  typedef GraphProperty graph_property_type;
+
+  typedef detail::compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex> forward_type;
+  typedef EdgeIndex /* typename boost::mpl::if_c<boost::is_same<EdgeProperty, boost::no_property>, boost::no_property, EdgeIndex> */ backward_edge_property;
+  typedef detail::compressed_sparse_row_structure<backward_edge_property, Vertex, EdgeIndex> backward_type;
+
+ public:
+  // Concept requirements:
+  // For Graph
+  typedef Vertex vertex_descriptor;
+  typedef detail::csr_edge_descriptor<Vertex, EdgeIndex> edge_descriptor;
+  typedef bidirectional_tag directed_category;
+  typedef allow_parallel_edge_tag edge_parallel_category;
+
+  class traversal_category: public bidirectional_graph_tag,
+                            public adjacency_graph_tag,
+                            public vertex_list_graph_tag,
+                            public edge_list_graph_tag {};
+
+  static vertex_descriptor null_vertex() { return vertex_descriptor(-1); }
+
+  // For VertexListGraph
+  typedef counting_iterator<Vertex> vertex_iterator;
+  typedef Vertex vertices_size_type;
+
+  // For EdgeListGraph
+  typedef EdgeIndex edges_size_type;
+
+  // For IncidenceGraph
+  typedef detail::csr_out_edge_iterator<compressed_sparse_row_graph> out_edge_iterator;
+  typedef EdgeIndex degree_size_type;
+
+  // For AdjacencyGraph
+  typedef typename std::vector<Vertex>::const_iterator adjacency_iterator;
+
+  // For EdgeListGraph
+  typedef detail::csr_edge_iterator<compressed_sparse_row_graph> edge_iterator;
+
+  // For BidirectionalGraph (not implemented)
+  typedef detail::csr_in_edge_iterator<compressed_sparse_row_graph> in_edge_iterator;
+
+  // For internal use
+  typedef csr_graph_tag graph_tag;
+
+  typedef typename forward_type::inherited_edge_properties::edge_bundled edge_bundled;
+  typedef typename forward_type::inherited_edge_properties::edge_push_back_type edge_push_back_type;
+  typedef typename forward_type::inherited_edge_properties::edge_property_type edge_property_type;
+
+  // Constructors
+
+  // Default constructor: an empty graph.
+  compressed_sparse_row_graph(): m_property() {}
+
+  //  With numverts vertices
+  compressed_sparse_row_graph(vertices_size_type numverts)
+    : inherited_vertex_properties(numverts),
+      m_forward(numverts), m_backward(numverts) {}
+
+  private:
+
+  void set_up_backward_property_links() {
+    std::pair<edge_iterator, edge_iterator> e = edges(*this);
+    m_backward.assign_unsorted_multi_pass_edges
+      (detail::transpose_edges(
+         detail::make_edge_to_index_pair_iter
+           (*this, get(vertex_index, *this), e.first)),
+       detail::transpose_edges(
+         detail::make_edge_to_index_pair_iter
+           (*this, get(vertex_index, *this), e.second)),
+       boost::counting_iterator<EdgeIndex>(0),
+       m_forward.m_rowstart.size() - 1,
+       identity_property_map(),
+       keep_all());
+  }
+
+  public:
+
+  //  From number of vertices and unsorted list of edges
+  template <typename MultiPassInputIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, numverts, identity_property_map(), keep_all());
+    set_up_backward_property_links();
+  }
+
+  //  From number of vertices and unsorted list of edges, plus edge properties
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, ep_iter, numverts, identity_property_map(), keep_all());
+    set_up_backward_property_links();
+  }
+
+  //  From number of vertices and unsorted list of edges, with filter and
+  //  global-to-local map
+  template <typename MultiPassInputIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_global_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numlocalverts,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, numlocalverts, global_to_local, source_pred);
+    set_up_backward_property_links();
+  }
+
+  //  From number of vertices and unsorted list of edges, plus edge properties,
+  //  with filter and global-to-local map
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator, typename GlobalToLocal, typename SourcePred>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_global_t,
+                              MultiPassInputIterator edge_begin,
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numlocalverts,
+                              const GlobalToLocal& global_to_local,
+                              const SourcePred& source_pred,
+                              const GraphProperty& prop = GraphProperty())
+    : inherited_vertex_properties(numlocalverts), m_forward(), m_property(prop)
+  {
+    m_forward.assign_unsorted_multi_pass_edges(edge_begin, edge_end, ep_iter, numlocalverts, global_to_local, source_pred);
+    set_up_backward_property_links();
+  }
+
+  //   Requires IncidenceGraph and a vertex index map
+  template<typename Graph, typename VertexIndexMap>
+  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi,
+                              vertices_size_type numverts,
+                              edges_size_type numedges)
+    : m_property()
+  {
+    assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  //   Requires VertexListGraph and EdgeListGraph
+  template<typename Graph, typename VertexIndexMap>
+  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi)
+    : m_property()
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires vertex index map plus requirements of previous constructor
+  template<typename Graph>
+  explicit compressed_sparse_row_graph(const Graph& g)
+    : m_property()
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    assign(g, get(vertex_index, g), num_vertices(g), numedges);
+  }
+
+  // From any graph (slow and uses a lot of memory)
+  //   Requires IncidenceGraph and a vertex index map
+  //   Internal helper function
+  //   Note that numedges must be doubled for undirected source graphs
+  template<typename Graph, typename VertexIndexMap>
+  void
+  assign(const Graph& g, const VertexIndexMap& vi,
+         vertices_size_type numverts, edges_size_type numedges)
+  {
+    m_forward.assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires the above, plus VertexListGraph and EdgeListGraph
+  template<typename Graph, typename VertexIndexMap>
+  void assign(const Graph& g, const VertexIndexMap& vi)
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    m_forward.assign(g, vi, numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Requires the above, plus a vertex_index map.
+  template<typename Graph>
+  void assign(const Graph& g)
+  {
+    typename graph_traits<Graph>::edges_size_type numedges = num_edges(g);
+    if (is_same<typename graph_traits<Graph>::directed_category, undirectedS>::value) {
+      numedges *= 2; // Double each edge (actual doubling done by out_edges function)
+    }
+    vertices_size_type numverts = num_vertices(g);
+    m_forward.assign(g, get(vertex_index, g), numverts, numedges);
+    inherited_vertex_properties::resize(numverts);
+  }
+
+  // Add edges from a sorted (smallest sources first) range of pairs and edge
+  // properties
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig,
+            typename GlobalToLocal>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
+  }
+
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted)  {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, identity_property_map());
+  }
+
+  // Add edges from a sorted (smallest sources first) range of pairs
+  template <typename BidirectionalIteratorOrig>
+  void
+  add_edges_sorted_internal(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>());
+  }
+
+  template <typename BidirectionalIteratorOrig, typename GlobalToLocal>
+  void
+  add_edges_sorted_internal_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, detail::default_construct_iterator<edge_bundled>(), global_to_local);
+  }
+
+  template <typename BidirectionalIteratorOrig, typename EPIterOrig, 
+            typename GlobalToLocal>
+  void
+  add_edges_sorted_internal_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      const GlobalToLocal& global_to_local) {
+    m_forward.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted, global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs that are unsorted
+  template <typename InputIterator, typename GlobalToLocal>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last, 
+                     const GlobalToLocal& global_to_local) {
+    typedef compressed_sparse_row_graph Graph;
+    typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
+    typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
+    typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
+    typedef std::vector<std::pair<vertex_t, vertex_t> > edge_vector_t;
+    edge_vector_t new_edges(first, last);
+    if (new_edges.empty()) return;
+    std::sort(new_edges.begin(), new_edges.end());
+    this->add_edges_sorted_internal_global(new_edges.begin(), new_edges.end(), global_to_local);
+  }
+
+  template <typename InputIterator>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last) {
+    this->add_edges_internal(first, last, identity_property_map());
+  }
+
+  // Add edges from a range of (source, target) pairs and edge properties that
+  // are unsorted
+  template <typename InputIterator, typename EPIterator, typename GlobalToLocal>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last,
+                     EPIterator ep_iter, EPIterator ep_iter_end,
+                     const GlobalToLocal& global_to_local) {
+    typedef compressed_sparse_row_graph Graph;
+    typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_t;
+    typedef typename boost::graph_traits<Graph>::vertices_size_type vertex_num;
+    typedef typename boost::graph_traits<Graph>::edges_size_type edge_num;
+    typedef std::pair<vertex_t, vertex_t> vertex_pair;
+    typedef std::vector<
+              boost::tuple<vertex_pair,
+                           edge_bundled> >
+      edge_vector_t;
+    edge_vector_t new_edges
+      (boost::make_zip_iterator(boost::make_tuple(first, ep_iter)),
+       boost::make_zip_iterator(boost::make_tuple(last, ep_iter_end)));
+    if (new_edges.empty()) return;
+    std::sort(new_edges.begin(), new_edges.end(),
+              boost::detail::compare_first<
+                std::less<vertex_pair> >());
+    m_forward.add_edges_sorted_internal
+      (boost::make_transform_iterator(
+         new_edges.begin(),
+         boost::detail::my_tuple_get_class<0, vertex_pair>()),
+       boost::make_transform_iterator(
+         new_edges.end(),
+         boost::detail::my_tuple_get_class<0, vertex_pair>()),
+       boost::make_transform_iterator(
+         new_edges.begin(),
+         boost::detail::my_tuple_get_class
+           <1, edge_bundled>()),
+       global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs and edge properties that
+  // are unsorted
+  template <typename InputIterator, typename EPIterator>
+  inline void
+  add_edges_internal(InputIterator first, InputIterator last,
+                     EPIterator ep_iter, EPIterator ep_iter_end) {
+    this->add_edges_internal(first, last, ep_iter, ep_iter_end, identity_property_map());
+  }
+
+  using inherited_vertex_properties::operator[];
+
+  // Directly access a edge or edge bundle
+  edge_push_back_type& operator[](const edge_descriptor& v)
+  { return m_forward.m_edge_properties[get(edge_index, *this, v)]; }
+
+  const edge_push_back_type& operator[](const edge_descriptor& v) const
+  { return m_forward.m_edge_properties[get(edge_index, *this, v)]; }
+
+  // private: non-portable, requires friend templates
+  inherited_vertex_properties&       vertex_properties()       {return *this;}
+  const inherited_vertex_properties& vertex_properties() const {return *this;}
+  typename forward_type::inherited_edge_properties&       edge_properties()       { return m_forward; }
+  const typename forward_type::inherited_edge_properties& edge_properties() const { return m_forward; }
+
+  forward_type m_forward;
+  backward_type m_backward;
+  GraphProperty m_property;
+};
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+// Construction functions
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+add_vertex(BOOST_CSR_GRAPH_TYPE& g) {
+  add_vertex(g, typename BOOST_CSR_GRAPH_TYPE::vertex_bundled());
+}
+
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+add_vertex(BOOST_DIR_CSR_GRAPH_TYPE& g, 
+           typename BOOST_DIR_CSR_GRAPH_TYPE::vertex_bundled const& p) {
+  Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
+  g.m_forward.m_rowstart.push_back(g.m_forward.m_rowstart.back());
+  g.vertex_properties().push_back(p);
+  return old_num_verts_plus_one - 1;
+}
+
+template<BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+add_vertex(BOOST_BIDIR_CSR_GRAPH_TYPE& g, 
+           typename BOOST_BIDIR_CSR_GRAPH_TYPE::vertex_bundled const& p) {
+  Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
+  g.m_forward.m_rowstart.push_back(g.m_forward.m_rowstart.back());
+  g.m_backward.m_rowstart.push_back(g.m_backward.m_rowstart.back());
+  g.vertex_properties().push_back(p);
+  return old_num_verts_plus_one - 1;
+}
+
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+add_vertices(typename BOOST_DIR_CSR_GRAPH_TYPE::vertices_size_type count, BOOST_DIR_CSR_GRAPH_TYPE& g) {
+  Vertex old_num_verts_plus_one = g.m_forward.m_rowstart.size();
+  EdgeIndex numedges = g.m_forward.m_rowstart.back();
+  g.m_forward.m_rowstart.resize(old_num_verts_plus_one + count, numedges);
+  g.m_backward.m_rowstart.resize(old_num_verts_plus_one + count, numedges);
+  g.vertex_properties().resize(num_vertices(g));
+  return old_num_verts_plus_one - 1;
+}
+
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+// This function requires that (src, tgt) be lexicographically at least as
+// large as the largest edge in the graph so far
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor
+add_edge(Vertex src, Vertex tgt, BOOST_DIR_CSR_GRAPH_TYPE& g) {
+  assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
+          src < num_vertices(g));
+  EdgeIndex num_edges_orig = g.m_forward.m_column.size();
+  for (; g.m_last_source <= src; ++g.m_last_source)
+    g.m_forward.m_rowstart[g.m_last_source] = num_edges_orig;
+  g.m_forward.m_rowstart[src + 1] = num_edges_orig + 1;
+  g.m_forward.m_column.push_back(tgt);
+  typedef typename BOOST_DIR_CSR_GRAPH_TYPE::edge_push_back_type push_back_type;
+  g.edge_properties().push_back(push_back_type());
+  return typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
+}
+
+// This function requires that src be at least as large as the largest source
+// in the graph so far
+template<BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor
+add_edge(Vertex src, Vertex tgt,
+         typename BOOST_DIR_CSR_GRAPH_TYPE::edge_bundled const& p,
+         BOOST_DIR_CSR_GRAPH_TYPE& g) {
+  assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
+          src < num_vertices(g));
+  EdgeIndex num_edges_orig = g.m_forward.m_column.size();
+  for (; g.m_last_source <= src; ++g.m_last_source)
+    g.m_forward.m_rowstart[g.m_last_source] = num_edges_orig;
+  g.m_forward.m_rowstart[src + 1] = num_edges_orig + 1;
+  g.m_forward.m_column.push_back(tgt);
+  g.edge_properties().push_back(p);
+  return typename BOOST_DIR_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
+}
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  // Add edges from a sorted (smallest sources first) range of pairs and edge
+  // properties
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+            typename EPIterOrig>
+  void
+  add_edges_sorted(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_sorted_internal(first_sorted, last_sorted, ep_iter_sorted);
+  }
+
+  // Add edges from a sorted (smallest sources first) range of pairs
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig>
+  void
+  add_edges_sorted(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_sorted_internal(first_sorted, last_sorted);
+  }
+
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+            typename EPIterOrig, typename GlobalToLocal>
+  void
+  add_edges_sorted_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      EPIterOrig ep_iter_sorted,
+      const GlobalToLocal& global_to_local,
+      BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_sorted_internal_global(first_sorted, last_sorted, ep_iter_sorted, 
+                                       global_to_local);
+  }
+
+  // Add edges from a sorted (smallest sources first) range of pairs
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename BidirectionalIteratorOrig,
+            typename GlobalToLocal>
+  void
+  add_edges_sorted_global(
+      BidirectionalIteratorOrig first_sorted,
+      BidirectionalIteratorOrig last_sorted,
+      const GlobalToLocal& global_to_local,
+      BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_sorted_internal_global(first_sorted, last_sorted, global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs that are unsorted
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator,
+            typename GlobalToLocal>
+  inline void
+  add_edges_global(InputIterator first, InputIterator last, 
+                   const GlobalToLocal& global_to_local, BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_internal(first, last, global_to_local);
+  }
+
+  // Add edges from a range of (source, target) pairs that are unsorted
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator>
+  inline void
+  add_edges(InputIterator first, InputIterator last, BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_internal(first, last);
+  }
+
+  // Add edges from a range of (source, target) pairs and edge properties that
+  // are unsorted
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS,
+            typename InputIterator, typename EPIterator>
+  inline void
+  add_edges(InputIterator first, InputIterator last,
+            EPIterator ep_iter, EPIterator ep_iter_end,
+            BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_internal(first, last, ep_iter, ep_iter_end);
+  }
+
+  template <BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS,
+            typename InputIterator, typename EPIterator, typename GlobalToLocal>
+  inline void
+  add_edges_global(InputIterator first, InputIterator last,
+            EPIterator ep_iter, EPIterator ep_iter_end,
+            const GlobalToLocal& global_to_local,
+            BOOST_DIR_CSR_GRAPH_TYPE& g) {
+    g.add_edges_internal(first, last, ep_iter, ep_iter_end, global_to_local);
+  }
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+// From VertexListGraph
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+num_vertices(const BOOST_CSR_GRAPH_TYPE& g) {
+  return g.m_forward.m_rowstart.size() - 1;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+std::pair<counting_iterator<Vertex>, counting_iterator<Vertex> >
+inline vertices(const BOOST_CSR_GRAPH_TYPE& g) {
+  return std::make_pair(counting_iterator<Vertex>(0),
+                        counting_iterator<Vertex>(num_vertices(g)));
+}
+
+// From IncidenceGraph
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+source(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e,
+       const BOOST_CSR_GRAPH_TYPE&)
+{
+  return e.src;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+target(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e,
+       const BOOST_CSR_GRAPH_TYPE& g)
+{
+  return g.m_forward.m_column[e.idx];
+}
+
+namespace detail {
+  template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+  inline EdgeIndex get_actual_row_start
+    (const BOOST_CSR_GRAPH_TYPE& g,
+     EdgeIndex rowstart_i_minus_1, EdgeIndex rowstart_i)
+  {
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+    return rowstart_i;
+#else
+  // Special case to allow incremental construction
+    return (std::max)(rowstart_i_minus_1, rowstart_i);
+#endif
+  }
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
+                 typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator>
+out_edges(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor ed;
+  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator it;
+  EdgeIndex v_row_start = g.m_forward.m_rowstart[v];
+  EdgeIndex next_row_start = g.m_forward.m_rowstart[v + 1];
+  return std::make_pair(it(ed(v, v_row_start)),
+                        it(ed(v, detail::get_actual_row_start
+                                   (g, v_row_start, next_row_start))));
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline EdgeIndex
+out_degree(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  EdgeIndex v_row_start = g.m_forward.m_rowstart[v];
+  EdgeIndex next_row_start = g.m_forward.m_rowstart[v + 1];
+  return detail::get_actual_row_start(g, v_row_start, next_row_start) - v_row_start;
+}
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+template<BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_BIDIR_CSR_GRAPH_TYPE::in_edge_iterator,
+                 typename BOOST_BIDIR_CSR_GRAPH_TYPE::in_edge_iterator>
+in_edges(Vertex v, const BOOST_BIDIR_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_BIDIR_CSR_GRAPH_TYPE::edge_descriptor ed;
+  typedef typename BOOST_BIDIR_CSR_GRAPH_TYPE::in_edge_iterator it;
+  EdgeIndex v_row_start = g.m_backward.m_rowstart[v];
+  EdgeIndex next_row_start = g.m_backward.m_rowstart[v + 1];
+  return std::make_pair(it(ed(v, v_row_start)),
+                        it(ed(v, next_row_start)));
+}
+
+template<BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS>
+inline EdgeIndex
+in_degree(Vertex v, const BOOST_BIDIR_CSR_GRAPH_TYPE& g)
+{
+  EdgeIndex v_row_start = g.m_backward.m_rowstart[v];
+  EdgeIndex next_row_start = g.m_backward.m_rowstart[v + 1];
+  return next_row_start - v_row_start;
+}
+
+#endif // BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+// From AdjacencyGraph
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_CSR_GRAPH_TYPE::adjacency_iterator,
+                 typename BOOST_CSR_GRAPH_TYPE::adjacency_iterator>
+adjacent_vertices(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  EdgeIndex v_row_start = g.m_forward.m_rowstart[v];
+  EdgeIndex next_row_start = g.m_forward.m_rowstart[v + 1];
+  return std::make_pair(g.m_forward.m_column.begin() + v_row_start,
+                        g.m_forward.m_column.begin() +
+                          detail::get_actual_row_start
+                            (g, v_row_start, next_row_start));
+}
+
+// Extra, common functions
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor
+vertex(typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor i, 
+       const BOOST_CSR_GRAPH_TYPE&)
+{
+  return i;
+}
+
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+// These require that the out edges from a vertex are sorted, which is only
+// guaranteed by the old interface
+
+// Unlike for an adjacency_matrix, edge_range and edge take lg(out_degree(i))
+// time
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
+                 typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator>
+edge_range(Vertex i, Vertex j, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename std::vector<Vertex>::const_iterator adj_iter;
+  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
+  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor edge_desc;
+  std::pair<adj_iter, adj_iter> raw_adjacencies = adjacent_vertices(i, g);
+  std::pair<adj_iter, adj_iter> adjacencies =
+    std::equal_range(raw_adjacencies.first, raw_adjacencies.second, j);
+  EdgeIndex idx_begin = adjacencies.first - g.m_forward.m_column.begin();
+  EdgeIndex idx_end = adjacencies.second - g.m_forward.m_column.begin();
+  return std::make_pair(out_edge_iter(edge_desc(i, idx_begin)),
+                        out_edge_iter(edge_desc(i, idx_end)));
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_CSR_GRAPH_TYPE::edge_descriptor, bool>
+edge(Vertex i, Vertex j, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
+  std::pair<out_edge_iter, out_edge_iter> range = edge_range(i, j, g);
+  if (range.first == range.second)
+    return std::make_pair(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(),
+                          false);
+  else
+    return std::make_pair(*range.first, true);
+}
+
+#else // !BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+// edge() can be provided in linear time for the new interface
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_CSR_GRAPH_TYPE::edge_descriptor, bool>
+edge(Vertex i, Vertex j, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
+  std::pair<out_edge_iter, out_edge_iter> range = out_edges(i, g);
+  for (; range.first != range.second; ++range.first) {
+    if (target(*range.first) == j)
+      return std::make_pair(*range.first, true);
+  }
+  return std::make_pair(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(),
+                        false);
+}
+
+#endif // !BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+
+// Find an edge given its index in the graph
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
+edge_from_index(EdgeIndex idx, const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename std::vector<EdgeIndex>::const_iterator row_start_iter;
+  assert (idx < num_edges(g));
+  row_start_iter src_plus_1 =
+    std::upper_bound(g.m_forward.m_rowstart.begin(),
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+                     // This handles the case where there are some vertices
+                     // with rowstart 0 after the last provided vertex; this
+                     // case does not happen with the new interface
+                     g.m_forward.m_rowstart.begin() + g.m_last_source + 1,
+#else // !BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+                     g.m_forward.m_rowstart.end(),
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+                     idx);
+    // Get last source whose rowstart is at most idx
+    // upper_bound returns this position plus 1
+  Vertex src = (src_plus_1 - g.m_forward.m_rowstart.begin()) - 1;
+  return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, idx);
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline EdgeIndex
+num_edges(const BOOST_CSR_GRAPH_TYPE& g)
+{
+  return g.m_forward.m_column.size();
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+std::pair<typename BOOST_CSR_GRAPH_TYPE::edge_iterator,
+          typename BOOST_CSR_GRAPH_TYPE::edge_iterator>
+edges(const BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_CSR_GRAPH_TYPE::edge_iterator ei;
+  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor edgedesc;
+  if (g.m_forward.m_rowstart.size() == 1 || g.m_forward.m_column.empty()) {
+    return std::make_pair(ei(), ei());
+  } else {
+    // Find the first vertex that has outgoing edges
+    Vertex src = 0;
+    while (g.m_forward.m_rowstart[src + 1] == 0) ++src;
+    return std::make_pair(ei(g, edgedesc(src, 0), g.m_forward.m_rowstart[src + 1]),
+                          ei(g, edgedesc(num_vertices(g), g.m_forward.m_column.size()), 0));
+  }
+}
+
+// For Property Graph
+
+// Graph properties
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag, class Value>
+inline void
+set_property(BOOST_CSR_GRAPH_TYPE& g, Tag, const Value& value)
+{
+  get_property_value(g.m_property, Tag()) = value;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag>
+inline
+typename graph_property<BOOST_CSR_GRAPH_TYPE, Tag>::type&
+get_property(BOOST_CSR_GRAPH_TYPE& g, Tag)
+{
+  return get_property_value(g.m_property, Tag());
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag>
+inline
+const
+typename graph_property<BOOST_CSR_GRAPH_TYPE, Tag>::type&
+get_property(const BOOST_CSR_GRAPH_TYPE& g, Tag)
+{
+  return get_property_value(g.m_property, Tag());
+}
+
+// Add edge_index property map
+template<typename Index, typename Descriptor>
+struct csr_edge_index_map
+{
+  typedef Index                     value_type;
+  typedef Index                     reference;
+  typedef Descriptor                key_type;
+  typedef readable_property_map_tag category;
+};
+
+template<typename Index, typename Descriptor>
+inline Index
+get(const csr_edge_index_map<Index, Descriptor>&,
+    const typename csr_edge_index_map<Index, Descriptor>::key_type& key)
+{
+  return key.idx;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+struct property_map<BOOST_CSR_GRAPH_TYPE, vertex_index_t>
+{
+  typedef identity_property_map type;
+  typedef type const_type;
+};
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+struct property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>
+{
+private:
+  typedef typename graph_traits<BOOST_CSR_GRAPH_TYPE>::edge_descriptor
+    edge_descriptor;
+  typedef csr_edge_index_map<EdgeIndex, edge_descriptor> edge_index_type;
+
+public:
+  typedef edge_index_type type;
+  typedef type const_type;
+};
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline identity_property_map
+get(vertex_index_t, const BOOST_CSR_GRAPH_TYPE&)
+{
+  return identity_property_map();
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline Vertex
+get(vertex_index_t,
+    const BOOST_CSR_GRAPH_TYPE&, Vertex v)
+{
+  return v;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
+get(edge_index_t, const BOOST_CSR_GRAPH_TYPE&)
+{
+  typedef typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
+    result_type;
+  return result_type();
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
+inline EdgeIndex
+get(edge_index_t, const BOOST_CSR_GRAPH_TYPE&,
+    typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e)
+{
+  return e.idx;
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
+inline
+typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::type
+get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
+                                T Bundle::*>::type
+    result_type;
+  return result_type(&g, p);
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
+inline
+typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::const_type
+get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g)
+{
+  typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
+                                T Bundle::*>::const_type
+    result_type;
+  return result_type(&g, p);
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
+         typename Key>
+inline T
+get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g,
+    const Key& key)
+{
+  return get(get(p, g), key);
+}
+
+template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
+         typename Key>
+inline void
+put(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g,
+    const Key& key, const T& value)
+{
+  put(get(p, g), key, value);
+}
+
+#undef BOOST_CSR_GRAPH_TYPE
+#undef BOOST_CSR_GRAPH_TEMPLATE_PARMS
+#undef BOOST_DIR_CSR_GRAPH_TYPE
+#undef BOOST_DIR_CSR_GRAPH_TEMPLATE_PARMS
+#undef BOOST_BIDIR_CSR_GRAPH_TYPE
+#undef BOOST_BIDIR_CSR_GRAPH_TEMPLATE_PARMS
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
similarity index 87%
rename from deal.II/contrib/boost/include/boost/graph/connected_components.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/connected_components.hpp
index df9084ce360266fbc6d4df3fec2d044ebe72ac5a..90015e6703d833838b09e1768945da0bac56eabf 100644 (file)
@@ -15,7 +15,7 @@
 #include <boost/graph/depth_first_search.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/graph_concepts.hpp>
-
+#include <boost/graph/overloading.hpp>
 #include <boost/static_assert.hpp>
 
 namespace boost {
@@ -58,7 +58,8 @@ namespace boost {
   template <class Graph, class ComponentMap, class P, class T, class R>
   inline typename property_traits<ComponentMap>::value_type
   connected_components(const Graph& g, ComponentMap c, 
-                       const bgl_named_params<P, T, R>& params)
+                       const bgl_named_params<P, T, R>& params
+                       BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, vertex_list_graph_tag))
   {
     if (num_vertices(g) == 0) return 0;
 
@@ -77,14 +78,15 @@ namespace boost {
 
   template <class Graph, class ComponentMap>
   inline typename property_traits<ComponentMap>::value_type
-  connected_components(const Graph& g, ComponentMap c)
+  connected_components(const Graph& g, ComponentMap c
+                       BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, vertex_list_graph_tag))
   {
     if (num_vertices(g) == 0) return 0;
 
     typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
     function_requires< WritablePropertyMapConcept<ComponentMap, Vertex> >();
     typedef typename boost::graph_traits<Graph>::directed_category directed;
-    BOOST_STATIC_ASSERT((boost::is_same<directed, undirected_tag>::value));
+    // BOOST_STATIC_ASSERT((boost::is_same<directed, undirected_tag>::value));
 
     typedef typename property_traits<ComponentMap>::value_type comp_type;
     // c_count initialized to "nil" (with nil represented by (max)())
@@ -97,5 +99,8 @@ namespace boost {
   
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/connected_components.hpp>
+#endif
 
 #endif // BOOST_GRAPH_CONNECTED_COMPONENTS_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/copy.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/copy.hpp
index fd98a426a42a292e7f82e34ed388d822db10e4b5..c566503af0b4fe538a97091fb748e4b6f119e789 100644 (file)
@@ -44,7 +44,7 @@
 #include <boost/config.hpp>
 #include <vector>
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/named_function_params.hpp>
 #include <boost/graph/breadth_first_search.hpp>
 #include <boost/type_traits/conversion_traits.hpp>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/core_numbers.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/core_numbers.hpp
new file mode 100644 (file)
index 0000000..743c81f
--- /dev/null
@@ -0,0 +1,350 @@
+//
+//=======================================================================
+// Copyright 2007 Stanford University
+// Authors: David Gleich
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+//
+#ifndef BOOST_GRAPH_CORE_NUMBERS_HPP
+#define BOOST_GRAPH_CORE_NUMBERS_HPP
+
+#include <boost/pending/mutable_queue.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/breadth_first_search.hpp>
+#include <boost/iterator/reverse_iterator.hpp>
+
+/*
+ * core_numbers
+ *
+ * Requirement: IncidenceGraph
+ */
+
+// History
+//
+// 30 July 2007
+// Added visitors to the implementation
+//
+// 8 February 2008
+// Fixed headers and missing typename
+
+namespace boost {
+
+    // A linear time O(m) algorithm to compute the indegree core number
+    // of a graph for unweighted graphs.
+    //
+    // and a O((n+m) log n) algorithm to compute the in-edge-weight core
+    // numbers of a weighted graph.
+    //
+    // The linear algorithm comes from:
+    // Vladimir Batagelj and Matjaz Zaversnik, "An O(m) Algorithm for Cores
+    // Decomposition of Networks."  Sept. 1 2002.
+
+    template <typename Visitor, typename Graph>
+    struct CoreNumbersVisitorConcept {
+        void constraints()
+        {
+            function_requires< CopyConstructibleConcept<Visitor> >();
+            vis.examine_vertex(u,g);
+            vis.finish_vertex(u,g);
+            vis.examine_edge(e,g);
+        }
+        Visitor vis;
+        Graph g;
+        typename graph_traits<Graph>::vertex_descriptor u;
+        typename graph_traits<Graph>::edge_descriptor e;
+    };
+
+    template <class Visitors = null_visitor>
+    class core_numbers_visitor : public bfs_visitor<Visitors> {
+        public:
+        core_numbers_visitor() {}
+        core_numbers_visitor(Visitors vis)
+            : bfs_visitor<Visitors>(vis) {}
+
+        private:
+        template <class Vertex, class Graph>
+        void initialize_vertex(Vertex, Graph&) {}
+
+        template <class Vertex, class Graph>
+        void discover_vertex(Vertex , Graph&) {}
+
+        template <class Vertex, class Graph>
+        void gray_target(Vertex, Graph&) {}
+
+        template <class Vertex, class Graph>
+        void black_target(Vertex, Graph&) {}
+
+        template <class Edge, class Graph>
+        void tree_edge(Edge, Graph&) {}
+
+        template <class Edge, class Graph>
+        void non_tree_edge(Edge, Graph&) {}
+    };
+
+    template <class Visitors>
+    core_numbers_visitor<Visitors> make_core_numbers_visitor(Visitors vis)
+    { return core_numbers_visitor<Visitors>(vis); };
+
+    typedef core_numbers_visitor<> default_core_numbers_visitor;
+
+    namespace detail {
+
+        // implement a constant_property_map to simplify compute_in_degree
+        // for the weighted and unweighted case
+        // this is based on dummy property map
+        template <typename ValueType>
+        class constant_value_property_map
+          : public boost::put_get_helper<ValueType,
+              constant_value_property_map<ValueType>  >
+        {
+        public:
+            typedef void key_type;
+            typedef ValueType value_type;
+            typedef const ValueType& reference;
+            typedef boost::readable_property_map_tag category;
+            inline constant_value_property_map(ValueType cc) : c(cc) { }
+            inline constant_value_property_map(const constant_value_property_map<ValueType>& x)
+              : c(x.c) { }
+            template <class Vertex>
+            inline reference operator[](Vertex) const { return c; }
+        protected:
+            ValueType c;
+        };
+
+
+        // the core numbers start as the indegree or inweight.  This function
+        // will initialize these values
+        template <typename Graph, typename CoreMap, typename EdgeWeightMap>
+        void compute_in_degree_map(Graph& g, CoreMap d, EdgeWeightMap wm)
+        {
+            typename graph_traits<Graph>::vertex_iterator vi,vi_end;
+            typename graph_traits<Graph>::out_edge_iterator ei,ei_end;
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                put(d,*vi,0);
+            }
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                for (tie(ei,ei_end) = out_edges(*vi,g); ei!=ei_end; ++ei) {
+                    put(d,target(*ei,g),get(d,target(*ei,g))+get(wm,*ei));
+                }
+            }
+        }
+
+        // the version for weighted graphs is a little different
+        template <typename Graph, typename CoreMap,
+            typename EdgeWeightMap, typename MutableQueue,
+            typename Visitor>
+        typename property_traits<CoreMap>::value_type
+        core_numbers_impl(Graph& g, CoreMap c, EdgeWeightMap wm,
+            MutableQueue& Q, Visitor vis)
+        {
+            typename property_traits<CoreMap>::value_type v_cn = 0;
+            typedef typename graph_traits<Graph>::vertex_descriptor vertex;
+            while (!Q.empty())
+            {
+                // remove v from the Q, and then decrease the core numbers
+                // of its successors
+                vertex v = Q.top();
+                vis.examine_vertex(v,g);
+                Q.pop();
+                v_cn = get(c,v);
+                typename graph_traits<Graph>::out_edge_iterator oi,oi_end;
+                for (tie(oi,oi_end) = out_edges(v,g); oi!=oi_end; ++oi) {
+                    vis.examine_edge(*oi,g);
+                    vertex u = target(*oi,g);
+                    // if c[u] > c[v], then u is still in the graph,
+                    if (get(c,u) > v_cn) {
+                        // remove the edge
+                        put(c,u,get(c,u)-get(wm,*oi));
+                        Q.update(u);
+                    }
+                }
+                vis.finish_vertex(v,g);
+            }
+            return (v_cn);
+        }
+
+        template <typename Graph, typename CoreMap, typename EdgeWeightMap,
+            typename IndexMap, typename CoreNumVisitor>
+        typename property_traits<CoreMap>::value_type
+        core_numbers_dispatch(Graph&g, CoreMap c, EdgeWeightMap wm,
+            IndexMap im, CoreNumVisitor vis)
+        {
+            typedef typename property_traits<CoreMap>::value_type D;
+            typedef std::less<D> Cmp;
+            typedef indirect_cmp<CoreMap,Cmp > IndirectCmp;
+            IndirectCmp icmp(c, Cmp());
+            // build the mutable queue
+            typedef typename graph_traits<Graph>::vertex_descriptor vertex;
+            typedef mutable_queue<vertex, std::vector<vertex>, IndirectCmp,
+                IndexMap> MutableQueue;
+            MutableQueue Q(num_vertices(g), icmp, im);
+            typename graph_traits<Graph>::vertex_iterator vi,vi_end;
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                Q.push(*vi);
+            }
+            return core_numbers_impl(g, c, wm, Q, vis);
+        }
+
+        // the version for the unweighted case
+        // for this functions CoreMap must be initialized
+        // with the in degree of each vertex
+        template <typename Graph, typename CoreMap, typename PositionMap,
+            typename Visitor>
+        typename property_traits<CoreMap>::value_type
+        core_numbers_impl(Graph& g, CoreMap c, PositionMap pos, Visitor vis)
+        {
+            typedef typename graph_traits<Graph>::vertices_size_type size_type;
+            typedef typename graph_traits<Graph>::degree_size_type degree_type;
+            typedef typename graph_traits<Graph>::vertex_descriptor vertex;
+            typename graph_traits<Graph>::vertex_iterator vi,vi_end;
+
+            // store the vertex core numbers
+            typename property_traits<CoreMap>::value_type v_cn = 0;
+
+            // compute the maximum degree (degrees are in the coremap)
+            typename graph_traits<Graph>::degree_size_type max_deg = 0;
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                max_deg = (std::max<typename graph_traits<Graph>::degree_size_type>)(max_deg, get(c,*vi));
+            }
+
+            // store the vertices in bins by their degree
+            // allocate two extra locations to ease boundary cases
+            std::vector<size_type> bin(max_deg+2);
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                ++bin[get(c,*vi)];
+            }
+
+            // this loop sets bin[d] to the starting position of vertices
+            // with degree d in the vert array for the bucket sort
+            size_type cur_pos = 0;
+            for (degree_type cur_deg = 0; cur_deg < max_deg+2; ++cur_deg) {
+                degree_type tmp = bin[cur_deg];
+                bin[cur_deg] = cur_pos;
+                cur_pos += tmp;
+            }
+
+            // perform the bucket sort with pos and vert so that
+            // pos[0] is the vertex of smallest degree
+            std::vector<vertex> vert(num_vertices(g));
+            for (tie(vi,vi_end) = vertices(g); vi!=vi_end; ++vi) {
+                vertex v=*vi;
+                size_type p=bin[get(c,v)];
+                put(pos,v,p);
+                vert[p]=v;
+                ++bin[get(c,v)];
+            }
+            // we ``abused'' bin while placing the vertices, now,
+            // we need to restore it
+            std::copy(boost::make_reverse_iterator(bin.end()-2),
+                boost::make_reverse_iterator(bin.begin()),
+                boost::make_reverse_iterator(bin.end()-1));
+            // now simulate removing the vertices
+            for (size_type i=0; i < num_vertices(g); ++i) {
+                vertex v = vert[i];
+                vis.examine_vertex(v,g);
+                v_cn = get(c,v);
+                typename graph_traits<Graph>::out_edge_iterator oi,oi_end;
+                for (tie(oi,oi_end) = out_edges(v,g); oi!=oi_end; ++oi) {
+                    vis.examine_edge(*oi,g);
+                    vertex u = target(*oi,g);
+                    // if c[u] > c[v], then u is still in the graph,
+                    if (get(c,u) > v_cn) {
+                        degree_type deg_u = get(c,u);
+                        degree_type pos_u = get(pos,u);
+                        // w is the first vertex with the same degree as u
+                        // (this is the resort operation!)
+                        degree_type pos_w = bin[deg_u];
+                        vertex w = vert[pos_w];
+                        if (u!=v) {
+                            // swap u and w
+                            put(pos,u,pos_w);
+                            put(pos,w,pos_u);
+                            vert[pos_w] = u;
+                            vert[pos_u] = w;
+                        }
+                        // now, the vertices array is sorted assuming
+                        // we perform the following step
+                        // start the set of vertices with degree of u
+                        // one into the future (this now points at vertex
+                        // w which we swapped with u).
+                        ++bin[deg_u];
+                        // we are removing v from the graph, so u's degree
+                        // decreases
+                        put(c,u,get(c,u)-1);
+                    }
+                }
+                vis.finish_vertex(v,g);
+            }
+            return v_cn;
+        }
+
+    } // namespace detail
+
+    // non-named parameter version for the unweighted case
+    template <typename Graph, typename CoreMap, typename CoreNumVisitor>
+    typename property_traits<CoreMap>::value_type
+    core_numbers(Graph& g, CoreMap c, CoreNumVisitor vis)
+    {
+        typedef typename graph_traits<Graph>::vertices_size_type size_type;
+        detail::compute_in_degree_map(g,c,
+            detail::constant_value_property_map<
+                typename property_traits<CoreMap>::value_type>(1) );
+        return detail::core_numbers_impl(g,c,
+            make_iterator_property_map(
+                std::vector<size_type>(num_vertices(g)).begin(),get(vertex_index, g)),
+            vis
+        );
+    }
+
+    // non-named paramter version for the unweighted case
+    template <typename Graph, typename CoreMap>
+    typename property_traits<CoreMap>::value_type
+    core_numbers(Graph& g, CoreMap c)
+    {
+        return core_numbers(g, c, make_core_numbers_visitor(null_visitor()));
+    }
+
+    // non-named parameter version for the weighted case
+    template <typename Graph, typename CoreMap, typename EdgeWeightMap,
+        typename VertexIndexMap, typename CoreNumVisitor>
+    typename property_traits<CoreMap>::value_type
+    core_numbers(Graph& g, CoreMap c, EdgeWeightMap wm, VertexIndexMap vim,
+        CoreNumVisitor vis)
+    {
+        typedef typename graph_traits<Graph>::vertices_size_type size_type;
+        detail::compute_in_degree_map(g,c,wm);
+        return detail::core_numbers_dispatch(g,c,wm,vim,vis);
+    }
+
+    // non-named parameter version for the weighted case
+//    template <typename Graph, typename CoreMap, typename EdgeWeightMap>
+//    typename property_traits<CoreMap>::value_type
+//    core_numbers(Graph& g, CoreMap c, EdgeWeightMap wm)
+//    {
+//        typedef typename graph_traits<Graph>::vertices_size_type size_type;
+//        detail::compute_in_degree_map(g,c,wm);
+//        return detail::core_numbers_dispatch(g,c,wm,get(vertex_index,g),
+//            make_core_numbers_visitor(null_visitor()));
+//    }
+
+    template <typename Graph, typename CoreMap>
+    typename property_traits<CoreMap>::value_type
+    weighted_core_numbers(Graph& g, CoreMap c)
+    {
+        return weighted_core_numbers(
+            g,c, make_core_numbers_visitor(null_visitor())
+        );
+    }
+
+    template <typename Graph, typename CoreMap, typename CoreNumVisitor>
+    typename property_traits<CoreMap>::value_type
+    weighted_core_numbers(Graph& g, CoreMap c, CoreNumVisitor vis)
+    { return core_numbers(g,c,get(edge_weight,g),get(vertex_index,g),vis); }
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_CORE_NUMBERS_HPP
+
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/create_condensation_graph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/create_condensation_graph.hpp
index f3d1113a3dc2c35985eb8b12a7fc741b404dc5bf..4f3316f6a13c3d967f5fe7cc7270027cfdbf2ffd 100644 (file)
@@ -11,7 +11,7 @@
 #define BOOST_CREATE_CONDENSATION_GRAPH_HPP
 
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost {
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/cuthill_mckee_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/cuthill_mckee_ordering.hpp
index 61336ab1770d9a5369167f12be7d3fd3aacfa18c..c930bab3eeeb3a0a36d0aa63e585af6f9250f3ac 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <boost/config.hpp>
 #include <boost/graph/detail/sparse_ordering.hpp>
+#include <boost/graph/graph_utility.hpp>
 #include <algorithm>
 
 
@@ -132,7 +133,7 @@ namespace boost {
   cuthill_mckee_ordering(const Graph& G, OutputIterator permutation, 
                          ColorMap color, DegreeMap degree)
   {
-    if (vertices(G).first == vertices(G).second)
+    if (boost::graph::has_no_vertices(G))
       return permutation;
 
     typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
@@ -168,7 +169,7 @@ namespace boost {
   cuthill_mckee_ordering(const Graph& G, OutputIterator permutation, 
                          VertexIndexMap index_map)
   {
-    if (vertices(G).first == vertices(G).second)
+    if (boost::graph::has_no_vertices(G))
       return permutation;
     
     typedef out_degree_property_map<Graph> DegreeMap;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/degree_centrality.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/degree_centrality.hpp
new file mode 100644 (file)
index 0000000..24ecb6c
--- /dev/null
@@ -0,0 +1,130 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_DEGREE_CENTRALITY_HPP
+#define BOOST_GRAPH_DEGREE_CENTRALITY_HPP
+
+#include <boost/graph/graph_concepts.hpp>
+
+namespace boost {
+
+template <typename Graph>
+struct degree_centrality_measure
+{
+    typedef typename graph_traits<Graph>::degree_size_type degree_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
+};
+
+template <typename Graph>
+struct influence_measure
+    : public degree_centrality_measure<Graph>
+{
+    typedef degree_centrality_measure<Graph> base_type;
+    typedef typename base_type::degree_type degree_type;
+    typedef typename base_type::vertex_type vertex_type;
+
+    inline degree_type operator ()(vertex_type v, const Graph& g)
+    {
+        function_requires< IncidenceGraphConcept<Graph> >();
+        return out_degree(v, g);
+    }
+};
+
+template <typename Graph>
+inline influence_measure<Graph>
+measure_influence(const Graph&)
+{ return influence_measure<Graph>(); }
+
+
+template <typename Graph>
+struct prestige_measure
+    : public degree_centrality_measure<Graph>
+{
+    typedef degree_centrality_measure<Graph> base_type;
+    typedef typename base_type::degree_type degree_type;
+    typedef typename base_type::vertex_type vertex_type;
+
+    inline degree_type operator ()(vertex_type v, const Graph& g)
+    {
+        function_requires< BidirectionalGraphConcept<Graph> >();
+        return in_degree(v, g);
+    }
+};
+
+template <typename Graph>
+inline prestige_measure<Graph>
+measure_prestige(const Graph&)
+{ return prestige_measure<Graph>(); }
+
+
+template <typename Graph, typename Vertex, typename Measure>
+inline typename Measure::degree_type
+degree_centrality(const Graph& g, Vertex v, Measure measure)
+{
+    function_requires< DegreeMeasureConcept<Measure, Graph> >();
+    return measure(v, g);
+}
+
+template <typename Graph, typename Vertex>
+inline typename graph_traits<Graph>::degree_size_type
+degree_centrality(const Graph& g, Vertex v)
+{
+    return degree_centrality(g, v, measure_influence(g));
+}
+
+
+// These are alias functions, intended to provide a more expressive interface.
+
+template <typename Graph, typename Vertex>
+inline typename graph_traits<Graph>::degree_size_type
+influence(const Graph& g, Vertex v)
+{ return degree_centrality(g, v, measure_influence(g)); }
+
+
+template <typename Graph, typename Vertex>
+inline typename graph_traits<Graph>::degree_size_type
+prestige(const Graph& g, Vertex v)
+{ return degree_centrality(g, v, measure_prestige(g)); }
+
+
+template <typename Graph, typename CentralityMap, typename Measure>
+inline void
+all_degree_centralities(const Graph& g, CentralityMap cent, Measure measure)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< WritablePropertyMapConcept<CentralityMap,Vertex> >();
+    typedef typename property_traits<CentralityMap>::value_type Centrality;
+
+    VertexIterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        Centrality c = degree_centrality(g, *i, measure);
+        put(cent, *i, c);
+    }
+}
+
+template <typename Graph, typename CentralityMap>
+inline void all_degree_centralities(const Graph& g, CentralityMap cent)
+{ all_degree_centralities(g, cent, measure_influence(g)); }
+
+// More helper functions for computing influence and prestige.
+// I hate the names of these functions, but influence and prestige
+// don't pluralize too well.
+
+template <typename Graph, typename CentralityMap>
+inline void all_influence_values(const Graph& g, CentralityMap cent)
+{ all_degree_centralities(g, cent, measure_influence(g)); }
+
+template <typename Graph, typename CentralityMap>
+inline void all_prestige_values(const Graph& g, CentralityMap cent)
+{ all_degree_centralities(g, cent, measure_prestige(g)); }
+
+} /* namespace boost */
+
+#endif
+
+
similarity index 86%
rename from deal.II/contrib/boost/include/boost/graph/depth_first_search.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/depth_first_search.hpp
index 6a0abb9a6a9fc5f35bc54dfc1aca8c434dae47e3..1bf066711363c1a74f3c6cc2e6c3afb60f3a7ef7 100644 (file)
@@ -19,7 +19,6 @@
 #include <boost/graph/properties.hpp>
 #include <boost/graph/visitors.hpp>
 #include <boost/graph/named_function_params.hpp>
-
 #include <boost/ref.hpp>
 #include <boost/implicit_cast.hpp>
 
@@ -214,49 +213,14 @@ namespace boost {
   void
   depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color)
   {
-    if (vertices(g).first == vertices(g).second)
+    typedef typename boost::graph_traits<VertexListGraph>::vertex_iterator vi;
+    std::pair<vi, vi> verts = vertices(g);
+    if (verts.first == verts.second)
       return;
 
-    depth_first_search(g, vis, color, *vertices(g).first);
+    depth_first_search(g, vis, color, *verts.first);
   }
 
-  namespace detail {
-    template <class ColorMap>
-    struct dfs_dispatch {
-
-      template <class VertexListGraph, class Vertex, class DFSVisitor,
-                class P, class T, class R>
-      static void
-      apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
-            const bgl_named_params<P, T, R>&,
-            ColorMap color)
-      {
-        depth_first_search(g, vis, color, start_vertex);
-      }
-    };
-
-    template <>
-    struct dfs_dispatch<detail::error_property_not_found> {
-      template <class VertexListGraph, class Vertex, class DFSVisitor,
-                class P, class T, class R>
-      static void
-      apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
-            const bgl_named_params<P, T, R>& params,
-            detail::error_property_not_found)
-      {
-        std::vector<default_color_type> color_vec(num_vertices(g));
-        default_color_type c = white_color; // avoid warning about un-init
-        depth_first_search
-          (g, vis, make_iterator_property_map
-           (color_vec.begin(),
-            choose_const_pmap(get_param(params, vertex_index),
-                              g, vertex_index), c),
-           start_vertex);
-      }
-    };
-  } // namespace detail
-
-
   template <class Visitors = null_visitor>
   class dfs_visitor {
   public:
@@ -315,26 +279,25 @@ namespace boost {
   }
   typedef dfs_visitor<> default_dfs_visitor;
 
-
   // Named Parameter Variant
   template <class VertexListGraph, class P, class T, class R>
   void
   depth_first_search(const VertexListGraph& g,
                      const bgl_named_params<P, T, R>& params)
   {
-    typedef typename property_value< bgl_named_params<P, T, R>,
-      vertex_color_t>::type C;
-    if (vertices(g).first == vertices(g).second)
+    typedef typename boost::graph_traits<VertexListGraph>::vertex_iterator vi;
+    std::pair<vi, vi> verts = vertices(g);
+    if (verts.first == verts.second)
       return;
-    detail::dfs_dispatch<C>::apply
+    using namespace boost::graph::keywords;
+    typedef bgl_named_params<P, T, R> params_type;
+    BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(params_type, params)
+    depth_first_search
       (g,
-       choose_param(get_param(params, graph_visitor),
-                    make_dfs_visitor(null_visitor())),
-       choose_param(get_param(params, root_vertex_t()),
-                    *vertices(g).first),
-       params,
-       get_param(params, vertex_color)
-       );
+       arg_pack[_visitor | make_dfs_visitor(null_visitor())],
+       boost::detail::color_map_maker<VertexListGraph, arg_pack_type>::make_map(g, arg_pack),
+       arg_pack[_root_vertex | *vertices(g).first]
+      );
   }
 
   template <class IncidenceGraph, class DFSVisitor, class ColorMap>
@@ -357,9 +320,10 @@ namespace boost {
     vis.start_vertex(u, g);
     detail::depth_first_visit_impl(g, u, vis, color, func);
   }
-
-
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/depth_first_search.hpp>
+#endif
 
 #endif
similarity index 92%
rename from deal.II/contrib/boost/include/boost/graph/detail/adjacency_list.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/adjacency_list.hpp
index 0839dc0fadc3f26e2328e5754f1e333df204e659..c02a310b84da5dac894fab875b5579558febc688 100644 (file)
@@ -15,7 +15,7 @@
 #include <boost/config.hpp>
 #include <boost/detail/workaround.hpp>
 #include <boost/operators.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/pending/integer_range.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <memory>
@@ -140,7 +140,7 @@ namespace boost {
         , EdgeDescriptor
         , Difference
       > super_t;
-        
+
       inline out_edge_iter() { }
         inline out_edge_iter(const BaseIter& i, const VertexDescriptor& src)
           : super_t(i), m_src(src) { }
@@ -148,12 +148,12 @@ namespace boost {
       inline EdgeDescriptor
       dereference() const
       {
-        return EdgeDescriptor(m_src, (*this->base()).get_target(), 
+        return EdgeDescriptor(m_src, (*this->base()).get_target(),
                               &(*this->base()).get_property());
       }
       VertexDescriptor m_src;
     };
-  
+
     template <class BaseIter, class VertexDescriptor, class EdgeDescriptor, class Difference>
     struct in_edge_iter
       : iterator_adaptor<
@@ -173,9 +173,9 @@ namespace boost {
         , EdgeDescriptor
         , Difference
       > super_t;
-        
+
       inline in_edge_iter() { }
-      inline in_edge_iter(const BaseIter& i, const VertexDescriptor& src) 
+      inline in_edge_iter(const BaseIter& i, const VertexDescriptor& src)
         : super_t(i), m_src(src) { }
 
       inline EdgeDescriptor
@@ -211,10 +211,10 @@ namespace boost {
       > super_t;
 
       undirected_edge_iter() {}
-        
+
       explicit undirected_edge_iter(EdgeIter i)
           : super_t(i) {}
-        
+
       inline EdgeDescriptor
       dereference() const {
         return EdgeDescriptor(
@@ -268,11 +268,11 @@ namespace boost {
       inline stored_edge_property(Vertex target,
                                   const Property& p = Property())
         : stored_edge<Vertex>(target), m_property(new Property(p)) { }
-      stored_edge_property(const self& x) 
+      stored_edge_property(const self& x)
         : Base(x), m_property(const_cast<self&>(x).m_property) { }
       self& operator=(const self& x) {
         Base::operator=(x);
-        m_property = const_cast<self&>(x).m_property; 
+        m_property = const_cast<self&>(x).m_property;
         return *this;
       }
       inline Property& get_property() { return *m_property; }
@@ -298,7 +298,7 @@ namespace boost {
       inline stored_edge_iter(Vertex v, Iter i, void* = 0)
         : stored_edge<Vertex>(v), m_iter(i) { }
       inline Property& get_property() { return m_iter->get_property(); }
-      inline const Property& get_property() const { 
+      inline const Property& get_property() const {
         return m_iter->get_property();
       }
       inline Iter get_iter() const { return m_iter; }
@@ -317,11 +317,11 @@ namespace boost {
     public:
       typedef Property property_type;
       inline stored_ra_edge_iter() { }
-      inline stored_ra_edge_iter(Vertex v, Iter i = Iter(), 
+      inline stored_ra_edge_iter(Vertex v, Iter i = Iter(),
                                  EdgeVec* edge_vec = 0)
         : stored_edge<Vertex>(v), m_i(i - edge_vec->begin()), m_vec(edge_vec){ }
       inline Property& get_property() { return (*m_vec)[m_i].get_property(); }
-      inline const Property& get_property() const { 
+      inline const Property& get_property() const {
         return (*m_vec)[m_i].get_property();
       }
       inline Iter get_iter() const { return m_vec->begin() + m_i; }
@@ -331,7 +331,7 @@ namespace boost {
     };
 
   } // namespace detail
-    
+
   template <class Tag, class Vertex, class Property>
   const typename property_value<Property,Tag>::type&
   get(Tag property_tag,
@@ -355,7 +355,7 @@ namespace boost {
   {
     return get_property_value(e.get_property(), property_tag);
   }
-    
+
     //=========================================================================
     // Directed Edges Helper Class
 
@@ -378,7 +378,7 @@ namespace boost {
       template <class incidence_iterator, class EdgeList, class Predicate>
       inline void
       remove_directed_edge_if_dispatch(incidence_iterator first,
-                                       incidence_iterator last, 
+                                       incidence_iterator last,
                                        EdgeList& el, Predicate pred,
                                        boost::allow_parallel_edge_tag)
       {
@@ -387,7 +387,7 @@ namespace boost {
           ++first;
         incidence_iterator i = first;
         if (first != last)
-          for (; i != last; ++i)
+          for (++i; i != last; ++i)
             if (!pred(*i)) {
               *first.base() = *i.base();
               ++first;
@@ -397,8 +397,8 @@ namespace boost {
       template <class incidence_iterator, class EdgeList, class Predicate>
       inline void
       remove_directed_edge_if_dispatch(incidence_iterator first,
-                                       incidence_iterator last, 
-                                       EdgeList& el, 
+                                       incidence_iterator last,
+                                       EdgeList& el,
                                        Predicate pred,
                                        boost::disallow_parallel_edge_tag)
       {
@@ -410,12 +410,12 @@ namespace boost {
         }
       }
 
-      template <class PropT, class Graph, class incidence_iterator, 
+      template <class PropT, class Graph, class incidence_iterator,
                 class EdgeList, class Predicate>
       inline void
-      undirected_remove_out_edge_if_dispatch(Graph& g, 
+      undirected_remove_out_edge_if_dispatch(Graph& g,
                                              incidence_iterator first,
-                                             incidence_iterator last, 
+                                             incidence_iterator last,
                                              EdgeList& el, Predicate pred,
                                              boost::allow_parallel_edge_tag)
       {
@@ -444,8 +444,8 @@ namespace boost {
               else {
                 // Remove the edge from the target
                 detail::remove_directed_edge_dispatch
-                  (*i, 
-                   g.out_edge_list(target(*i, g)), 
+                  (*i,
+                   g.out_edge_list(target(*i, g)),
                    *(PropT*)(*i).get_property());
               }
 
@@ -455,13 +455,13 @@ namespace boost {
           }
         el.erase(first.base(), el.end());
       }
-      template <class PropT, class Graph, class incidence_iterator, 
+      template <class PropT, class Graph, class incidence_iterator,
                 class EdgeList, class Predicate>
       inline void
-      undirected_remove_out_edge_if_dispatch(Graph& g, 
+      undirected_remove_out_edge_if_dispatch(Graph& g,
                                              incidence_iterator first,
-                                             incidence_iterator last, 
-                                             EdgeList& el, 
+                                             incidence_iterator last,
+                                             EdgeList& el,
                                              Predicate pred,
                                              boost::disallow_parallel_edge_tag)
       {
@@ -475,8 +475,8 @@ namespace boost {
             if (source(*first, g) != target(*first, g)) {
               // Remove the edge from the target
               detail::remove_directed_edge_dispatch
-                (*first, 
-                 g.out_edge_list(target(*first, g)), 
+                (*first,
+                 g.out_edge_list(target(*first, g)),
                  *(PropT*)(*first).get_property());
             }
 
@@ -510,7 +510,7 @@ namespace boost {
 
       // Placement of these overloaded remove_edge() functions
       // inside the class avoids a VC++ bug.
-      
+
       // O(E/V)
       inline void
       remove_edge(typename Config::edge_descriptor e)
@@ -538,7 +538,7 @@ namespace boost {
 
     // O(1)
     template <class Config>
-    inline std::pair<typename Config::edge_iterator, 
+    inline std::pair<typename Config::edge_iterator,
                      typename Config::edge_iterator>
     edges(const directed_edges_helper<Config>& g_)
     {
@@ -546,8 +546,8 @@ namespace boost {
       typedef typename Config::edge_iterator edge_iterator;
       const graph_type& cg = static_cast<const graph_type&>(g_);
       graph_type& g = const_cast<graph_type&>(cg);
-      return std::make_pair( edge_iterator(g.vertex_set().begin(), 
-                                           g.vertex_set().begin(), 
+      return std::make_pair( edge_iterator(g.vertex_set().begin(),
+                                           g.vertex_set().begin(),
                                            g.vertex_set().end(), g),
                              edge_iterator(g.vertex_set().begin(),
                                            g.vertex_set().end(),
@@ -565,7 +565,7 @@ namespace boost {
 
     template <class Config>
     struct directed_graph_helper
-      : public directed_edges_helper<Config> { 
+      : public directed_edges_helper<Config> {
       typedef typename Config::edge_descriptor edge_descriptor;
       typedef adj_list_dir_traversal_tag traversal_category;
     };
@@ -607,7 +607,7 @@ namespace boost {
       typename Config::vertex_iterator vi, vi_end;
       for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
         remove_out_edge_if(*vi, pred, g);
-    }    
+    }
 
     template <class EdgeOrIter, class Config>
     inline void
@@ -619,7 +619,7 @@ namespace boost {
     // O(V + E) for allow_parallel_edges
     // O(V * log(E/V)) for disallow_parallel_edges
     template <class Config>
-    inline void 
+    inline void
     clear_vertex(typename Config::vertex_descriptor u,
                  directed_graph_helper<Config>& g_)
     {
@@ -635,7 +635,7 @@ namespace boost {
     }
 
     template <class Config>
-    inline void 
+    inline void
     clear_out_edges(typename Config::vertex_descriptor u,
                     directed_graph_helper<Config>& g_)
     {
@@ -664,27 +664,27 @@ namespace boost {
     // O(log(E/V)) for disallow_parallel_edge_tag
     template <class Config>
     inline std::pair<typename directed_graph_helper<Config>::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
+    add_edge(typename Config::vertex_descriptor u,
              typename Config::vertex_descriptor v,
-             const typename Config::edge_property_type& p, 
+             const typename Config::edge_property_type& p,
              directed_graph_helper<Config>& g_)
     {
       typedef typename Config::edge_descriptor edge_descriptor;
       typedef typename Config::graph_type graph_type;
       typedef typename Config::StoredEdge StoredEdge;
       graph_type& g = static_cast<graph_type&>(g_);
-      typename Config::OutEdgeList::iterator i; 
+      typename Config::OutEdgeList::iterator i;
       bool inserted;
-      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u), 
+      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u),
                                             StoredEdge(v, p));
-      return std::make_pair(edge_descriptor(u, v, &(*i).get_property()), 
+      return std::make_pair(edge_descriptor(u, v, &(*i).get_property()),
                             inserted);
     }
     // Did not use default argument here because that
     // causes Visual C++ to get confused.
     template <class Config>
     inline std::pair<typename Config::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
+    add_edge(typename Config::vertex_descriptor u,
              typename Config::vertex_descriptor v,
              directed_graph_helper<Config>& g_)
     {
@@ -697,7 +697,7 @@ namespace boost {
     template <class Config>
     struct undirected_graph_helper;
 
-    struct undir_adj_list_traversal_tag : 
+    struct undir_adj_list_traversal_tag :
       public virtual vertex_list_graph_tag,
       public virtual incidence_graph_tag,
       public virtual adjacency_graph_tag,
@@ -713,8 +713,8 @@ namespace boost {
         // O(E/V)
         template <class edge_descriptor, class Config>
         static void
-        apply(edge_descriptor e, 
-              undirected_graph_helper<Config>& g_, 
+        apply(edge_descriptor e,
+              undirected_graph_helper<Config>& g_,
               StoredProperty& p)
         {
           typedef typename Config::global_edgelist_selector EdgeListS;
@@ -722,7 +722,7 @@ namespace boost {
 
           typedef typename Config::graph_type graph_type;
           graph_type& g = static_cast<graph_type&>(g_);
-          
+
           typename Config::OutEdgeList& out_el = g.out_edge_list(source(e, g));
           typename Config::OutEdgeList::iterator out_i = out_el.begin();
           for (; out_i != out_el.end(); ++out_i)
@@ -777,7 +777,7 @@ namespace boost {
       // O(E/V)
       template <class Graph, class EdgeList, class Vertex>
       inline void
-      remove_edge_and_property(Graph& g, EdgeList& el, Vertex v, 
+      remove_edge_and_property(Graph& g, EdgeList& el, Vertex v,
                                boost::allow_parallel_edge_tag cat)
       {
         typedef typename Graph::global_edgelist_selector EdgeListS;
@@ -785,15 +785,23 @@ namespace boost {
 
         typedef typename EdgeList::value_type StoredEdge;
         typename EdgeList::iterator i = el.begin(), end = el.end();
-        for (; i != end; ++i)
-          if ((*i).get_target() == v)
+        for (; i != end; ++i) {
+          if ((*i).get_target() == v) {
+            // NOTE: Wihtout this skip, this loop will double-delete properties
+            // of loop edges. This solution is based on the observation that
+            // the incidence edges of a vertex with a loop are adjacent in the
+            // out edge list. This *may* actually hold for multisets also.
+            bool skip = (boost::next(i) != end && i->get_iter() == boost::next(i)->get_iter());
             g.m_edges.erase((*i).get_iter());
+            if (skip) ++i;
+          }
+        }
         detail::erase_from_incidence_list(el, v, cat);
       }
       // O(log(E/V))
       template <class Graph, class EdgeList, class Vertex>
       inline void
-      remove_edge_and_property(Graph& g, EdgeList& el, Vertex v, 
+      remove_edge_and_property(Graph& g, EdgeList& el, Vertex v,
                                boost::disallow_parallel_edge_tag)
       {
         typedef typename Graph::global_edgelist_selector EdgeListS;
@@ -857,15 +865,15 @@ namespace boost {
     // Had to make these non-members to avoid accidental instantiation
     // on SGI MIPSpro C++
     template <class C>
-    inline typename C::InEdgeList& 
-    in_edge_list(undirected_graph_helper<C>&, 
+    inline typename C::InEdgeList&
+    in_edge_list(undirected_graph_helper<C>&,
                  typename C::vertex_descriptor v)
     {
       typename C::stored_vertex* sv = (typename C::stored_vertex*)v;
       return sv->m_out_edges;
     }
     template <class C>
-    inline const typename C::InEdgeList& 
+    inline const typename C::InEdgeList&
     in_edge_list(const undirected_graph_helper<C>&,
                  typename C::vertex_descriptor v) {
       typename C::stored_vertex* sv = (typename C::stored_vertex*)v;
@@ -886,8 +894,8 @@ namespace boost {
     // O(E/V) or O(log(E/V))
     template <class Config>
     void
-    remove_edge(typename Config::vertex_descriptor u, 
-                typename Config::vertex_descriptor v, 
+    remove_edge(typename Config::vertex_descriptor u,
+                typename Config::vertex_descriptor v,
                 undirected_graph_helper<Config>& g_)
     {
       typedef typename Config::global_edgelist_selector EdgeListS;
@@ -899,7 +907,7 @@ namespace boost {
       detail::remove_edge_and_property(g, g.out_edge_list(u), v, Cat());
       detail::erase_from_incidence_list(g.out_edge_list(v), u, Cat());
     }
-  
+
     template <class Config, class Predicate>
     void
     remove_out_edge_if(typename Config::vertex_descriptor u, Predicate pred,
@@ -907,7 +915,7 @@ namespace boost {
     {
       typedef typename Config::global_edgelist_selector EdgeListS;
       BOOST_STATIC_ASSERT((!is_same<EdgeListS, vecS>::value));
-        
+
       typedef typename Config::graph_type graph_type;
       typedef typename Config::OutEdgeList::value_type::property_type PropT;
       graph_type& g = static_cast<graph_type&>(g_);
@@ -949,7 +957,7 @@ namespace boost {
 
     // O(1)
     template <class Config>
-    inline std::pair<typename Config::edge_iterator, 
+    inline std::pair<typename Config::edge_iterator,
                      typename Config::edge_iterator>
     edges(const undirected_graph_helper<Config>& g_)
     {
@@ -963,7 +971,7 @@ namespace boost {
     // O(1)
     template <class Config>
     inline typename Config::edges_size_type
-    num_edges(const undirected_graph_helper<Config>& g_) 
+    num_edges(const undirected_graph_helper<Config>& g_)
     {
       typedef typename Config::graph_type graph_type;
       const graph_type& g = static_cast<const graph_type&>(g_);
@@ -971,7 +979,7 @@ namespace boost {
     }
     // O(E/V * E/V)
     template <class Config>
-    inline void 
+    inline void
     clear_vertex(typename Config::vertex_descriptor u,
                  undirected_graph_helper<Config>& g_)
     {
@@ -982,7 +990,7 @@ namespace boost {
       typedef typename Config::edge_parallel_category Cat;
       graph_type& g = static_cast<graph_type&>(g_);
       typename Config::OutEdgeList& el = g.out_edge_list(u);
-      typename Config::OutEdgeList::iterator 
+      typename Config::OutEdgeList::iterator
         ei = el.begin(), ei_end = el.end();
       for (; ei != ei_end; ++ei) {
         detail::erase_from_incidence_list
@@ -995,8 +1003,8 @@ namespace boost {
     // O(log(E/V)) for disallow_parallel_edge_tag
     template <class Config>
     inline std::pair<typename Config::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
-             typename Config::vertex_descriptor v, 
+    add_edge(typename Config::vertex_descriptor u,
+             typename Config::vertex_descriptor v,
              const typename Config::edge_property_type& p,
              undirected_graph_helper<Config>& g_)
     {
@@ -1007,11 +1015,11 @@ namespace boost {
 
       bool inserted;
       typename Config::EdgeContainer::value_type e(u, v, p);
-      typename Config::EdgeContainer::iterator p_iter 
+      typename Config::EdgeContainer::iterator p_iter
         = graph_detail::push(g.m_edges, e).first;
 
       typename Config::OutEdgeList::iterator i;
-      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u), 
+      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u),
                                     StoredEdge(v, p_iter, &g.m_edges));
       if (inserted) {
         boost::graph_detail::push(g.out_edge_list(v), StoredEdge(u, p_iter, &g.m_edges));
@@ -1025,8 +1033,8 @@ namespace boost {
     }
     template <class Config>
     inline std::pair<typename Config::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
-             typename Config::vertex_descriptor v, 
+    add_edge(typename Config::vertex_descriptor u,
+             typename Config::vertex_descriptor v,
              undirected_graph_helper<Config>& g_)
     {
       typename Config::edge_property_type p;
@@ -1036,7 +1044,7 @@ namespace boost {
     // O(1)
     template <class Config>
     inline typename Config::degree_size_type
-    degree(typename Config::vertex_descriptor u, 
+    degree(typename Config::vertex_descriptor u,
            const undirected_graph_helper<Config>& g_)
     {
       typedef typename Config::graph_type Graph;
@@ -1045,9 +1053,9 @@ namespace boost {
     }
 
     template <class Config>
-    inline std::pair<typename Config::in_edge_iterator, 
+    inline std::pair<typename Config::in_edge_iterator,
                      typename Config::in_edge_iterator>
-    in_edges(typename Config::vertex_descriptor u, 
+    in_edges(typename Config::vertex_descriptor u,
              const undirected_graph_helper<Config>& g_)
     {
       typedef typename Config::graph_type Graph;
@@ -1068,7 +1076,7 @@ namespace boost {
     //=========================================================================
     // Bidirectional Graph Helper Class
 
-    struct bidir_adj_list_traversal_tag : 
+    struct bidir_adj_list_traversal_tag :
       public virtual vertex_list_graph_tag,
       public virtual incidence_graph_tag,
       public virtual adjacency_graph_tag,
@@ -1084,15 +1092,15 @@ namespace boost {
     // Had to make these non-members to avoid accidental instantiation
     // on SGI MIPSpro C++
     template <class C>
-    inline typename C::InEdgeList& 
-    in_edge_list(bidirectional_graph_helper<C>&, 
+    inline typename C::InEdgeList&
+    in_edge_list(bidirectional_graph_helper<C>&,
                  typename C::vertex_descriptor v)
     {
       typename C::stored_vertex* sv = (typename C::stored_vertex*)v;
       return sv->m_in_edges;
     }
     template <class C>
-    inline const typename C::InEdgeList& 
+    inline const typename C::InEdgeList&
     in_edge_list(const bidirectional_graph_helper<C>&,
                  typename C::vertex_descriptor v) {
       typename C::stored_vertex* sv = (typename C::stored_vertex*)v;
@@ -1118,9 +1126,9 @@ namespace boost {
     }
 
     template <class Config>
-    inline std::pair<typename Config::in_edge_iterator, 
+    inline std::pair<typename Config::in_edge_iterator,
                      typename Config::in_edge_iterator>
-    in_edges(typename Config::vertex_descriptor u, 
+    in_edges(typename Config::vertex_descriptor u,
              const bidirectional_graph_helper<Config>& g_)
     {
       typedef typename Config::graph_type graph_type;
@@ -1134,7 +1142,7 @@ namespace boost {
 
     // O(1)
     template <class Config>
-    inline std::pair<typename Config::edge_iterator, 
+    inline std::pair<typename Config::edge_iterator,
                      typename Config::edge_iterator>
     edges(const bidirectional_graph_helper<Config>& g_)
     {
@@ -1156,7 +1164,7 @@ namespace boost {
     {
       typedef typename Config::graph_type graph_type;
       typedef typename Config::out_edge_iterator out_edge_iterator;
-      
+
       std::pair<out_edge_iterator, out_edge_iterator>
       get_parallel_edge_sublist(typename Config::edge_descriptor e,
                                 const graph_type& g,
@@ -1197,7 +1205,7 @@ namespace boost {
 
         typedef typename Config::edgelist_selector OutEdgeListS;
 
-        std::pair<out_edge_iterator, out_edge_iterator> rng = 
+        std::pair<out_edge_iterator, out_edge_iterator> rng =
           get_parallel_edge_sublist(e, g, (OutEdgeListS*)(0));
         rng.first = std::find(rng.first, rng.second, e);
         assert(rng.first != rng.second);
@@ -1227,8 +1235,8 @@ namespace boost {
     // O(log(E/V)) for disallow_parallel_edge_tag
     template <class Config>
     inline void
-    remove_edge(typename Config::vertex_descriptor u, 
-                typename Config::vertex_descriptor v, 
+    remove_edge(typename Config::vertex_descriptor u,
+                typename Config::vertex_descriptor v,
                 bidirectional_graph_helper_with_property<Config>& g_)
     {
       typedef typename Config::global_edgelist_selector EdgeListS;
@@ -1264,7 +1272,7 @@ namespace boost {
       typedef typename Config::graph_type graph_type;
       typedef typename Config::OutEdgeList::value_type::property_type PropT;
       graph_type& g = static_cast<graph_type&>(g_);
-      
+
       typedef typename Config::EdgeIter EdgeIter;
       typedef std::vector<EdgeIter> Garbage;
       Garbage garbage;
@@ -1338,7 +1346,7 @@ namespace boost {
     // O(1)
     template <class Config>
     inline typename Config::edges_size_type
-    num_edges(const bidirectional_graph_helper_with_property<Config>& g_) 
+    num_edges(const bidirectional_graph_helper_with_property<Config>& g_)
     {
       typedef typename Config::graph_type graph_type;
       const graph_type& g = static_cast<const graph_type&>(g_);
@@ -1358,20 +1366,20 @@ namespace boost {
       typedef typename Config::edge_parallel_category Cat;
       graph_type& g = static_cast<graph_type&>(g_);
       typename Config::OutEdgeList& el = g.out_edge_list(u);
-      typename Config::OutEdgeList::iterator 
+      typename Config::OutEdgeList::iterator
         ei = el.begin(), ei_end = el.end();
       for (; ei != ei_end; ++ei) {
         detail::erase_from_incidence_list
           (in_edge_list(g, (*ei).get_target()), u, Cat());
         g.m_edges.erase((*ei).get_iter());
-      }      
+      }
       typename Config::InEdgeList& in_el = in_edge_list(g, u);
-      typename Config::InEdgeList::iterator 
+      typename Config::InEdgeList::iterator
         in_ei = in_el.begin(), in_ei_end = in_el.end();
       for (; in_ei != in_ei_end; ++in_ei) {
         detail::erase_from_incidence_list
           (g.out_edge_list((*in_ei).get_target()), u, Cat());
-        g.m_edges.erase((*in_ei).get_iter());   
+        g.m_edges.erase((*in_ei).get_iter());
       }
       g.out_edge_list(u).clear();
       in_edge_list(g, u).clear();
@@ -1389,13 +1397,13 @@ namespace boost {
       typedef typename Config::edge_parallel_category Cat;
       graph_type& g = static_cast<graph_type&>(g_);
       typename Config::OutEdgeList& el = g.out_edge_list(u);
-      typename Config::OutEdgeList::iterator 
+      typename Config::OutEdgeList::iterator
         ei = el.begin(), ei_end = el.end();
       for (; ei != ei_end; ++ei) {
         detail::erase_from_incidence_list
           (in_edge_list(g, (*ei).get_target()), u, Cat());
         g.m_edges.erase((*ei).get_iter());
-      }      
+      }
       g.out_edge_list(u).clear();
     }
 
@@ -1411,12 +1419,12 @@ namespace boost {
       typedef typename Config::edge_parallel_category Cat;
       graph_type& g = static_cast<graph_type&>(g_);
       typename Config::InEdgeList& in_el = in_edge_list(g, u);
-      typename Config::InEdgeList::iterator 
+      typename Config::InEdgeList::iterator
         in_ei = in_el.begin(), in_ei_end = in_el.end();
       for (; in_ei != in_ei_end; ++in_ei) {
         detail::erase_from_incidence_list
           (g.out_edge_list((*in_ei).get_target()), u, Cat());
-        g.m_edges.erase((*in_ei).get_iter());   
+        g.m_edges.erase((*in_ei).get_iter());
       }
       in_edge_list(g, u).clear();
     }
@@ -1426,7 +1434,7 @@ namespace boost {
     template <class Config>
     inline std::pair<typename Config::edge_descriptor, bool>
     add_edge(typename Config::vertex_descriptor u,
-             typename Config::vertex_descriptor v, 
+             typename Config::vertex_descriptor v,
              const typename Config::edge_property_type& p,
              bidirectional_graph_helper_with_property<Config>& g_)
     {
@@ -1436,19 +1444,19 @@ namespace boost {
       typedef typename Config::StoredEdge StoredEdge;
       bool inserted;
       typename Config::EdgeContainer::value_type e(u, v, p);
-      typename Config::EdgeContainer::iterator p_iter 
+      typename Config::EdgeContainer::iterator p_iter
         = graph_detail::push(g.m_edges, e).first;
       typename Config::OutEdgeList::iterator i;
-      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u), 
+      boost::tie(i, inserted) = boost::graph_detail::push(g.out_edge_list(u),
                                         StoredEdge(v, p_iter, &g.m_edges));
       if (inserted) {
         boost::graph_detail::push(in_edge_list(g, v), StoredEdge(u, p_iter, &g.m_edges));
-        return std::make_pair(edge_descriptor(u, v, &p_iter->m_property), 
+        return std::make_pair(edge_descriptor(u, v, &p_iter->m_property),
                               true);
       } else {
         g.m_edges.erase(p_iter);
-        return std::make_pair(edge_descriptor(u, v, 
-                                     &i->get_iter()->get_property()), 
+        return std::make_pair(edge_descriptor(u, v,
+                                     &i->get_iter()->get_property()),
                               false);
       }
     }
@@ -1465,7 +1473,7 @@ namespace boost {
     // O(1)
     template <class Config>
     inline typename Config::degree_size_type
-    degree(typename Config::vertex_descriptor u, 
+    degree(typename Config::vertex_descriptor u,
            const bidirectional_graph_helper_with_property<Config>& g_)
     {
       typedef typename Config::graph_type graph_type;
@@ -1505,15 +1513,15 @@ namespace boost {
       // Borland gets confused about constness.
 
       // O(E/V)
-      inline std::pair<edge_descriptor,bool>      
-      edge_dispatch(const AdjList& g, 
-                    vertex_descriptor u, vertex_descriptor v, 
+      inline std::pair<edge_descriptor,bool>
+      edge_dispatch(const AdjList& g,
+                    vertex_descriptor u, vertex_descriptor v,
                     boost::allow_parallel_edge_tag) const
       {
         bool found;
         const typename Config::OutEdgeList& el = g.out_edge_list(u);
-        typename Config::OutEdgeList::const_iterator 
-          i = std::find_if(el.begin(), el.end(), 
+        typename Config::OutEdgeList::const_iterator
+          i = std::find_if(el.begin(), el.end(),
                            detail::target_is<vertex_descriptor>(v));
         found = (i != g.out_edge_list(u).end());
         if (found)
@@ -1523,9 +1531,9 @@ namespace boost {
           return std::make_pair(edge_descriptor(u, v, 0), false);
       }
       // O(log(E/V))
-      inline std::pair<edge_descriptor,bool>      
-      edge_dispatch(const AdjList& g, 
-                    vertex_descriptor u, vertex_descriptor v, 
+      inline std::pair<edge_descriptor,bool>
+      edge_dispatch(const AdjList& g,
+                    vertex_descriptor u, vertex_descriptor v,
                     boost::disallow_parallel_edge_tag) const
       {
         bool found;
@@ -1533,7 +1541,7 @@ namespace boost {
            but the VC++ std::set::find() const returns const_iterator.
            And since iterator should be convertible to const_iterator, the
            following should work everywhere. -Jeremy */
-        typename Config::OutEdgeList::const_iterator 
+        typename Config::OutEdgeList::const_iterator
           i = g.out_edge_list(u).find(StoredEdge(v)),
           end = g.out_edge_list(u).end();
         found = (i != end);
@@ -1546,9 +1554,9 @@ namespace boost {
     };
 
     template <class Config, class Base>
-    inline std::pair<typename Config::adjacency_iterator, 
+    inline std::pair<typename Config::adjacency_iterator,
                      typename Config::adjacency_iterator>
-    adjacent_vertices(typename Config::vertex_descriptor u, 
+    adjacent_vertices(typename Config::vertex_descriptor u,
                       const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type AdjList;
@@ -1561,9 +1569,9 @@ namespace boost {
                             adjacency_iterator(last, &g));
     }
     template <class Config, class Base>
-    inline std::pair<typename Config::inv_adjacency_iterator, 
+    inline std::pair<typename Config::inv_adjacency_iterator,
                      typename Config::inv_adjacency_iterator>
-    inv_adjacent_vertices(typename Config::vertex_descriptor u, 
+    inv_adjacent_vertices(typename Config::vertex_descriptor u,
                           const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type AdjList;
@@ -1576,9 +1584,9 @@ namespace boost {
                             inv_adjacency_iterator(last, &g));
     }
     template <class Config, class Base>
-    inline std::pair<typename Config::out_edge_iterator, 
+    inline std::pair<typename Config::out_edge_iterator,
                      typename Config::out_edge_iterator>
-    out_edges(typename Config::vertex_descriptor u, 
+    out_edges(typename Config::vertex_descriptor u,
               const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type AdjList;
@@ -1590,7 +1598,7 @@ namespace boost {
                        out_edge_iterator(g.out_edge_list(u).end(), u));
     }
     template <class Config, class Base>
-    inline std::pair<typename Config::vertex_iterator, 
+    inline std::pair<typename Config::vertex_iterator,
                      typename Config::vertex_iterator>
     vertices(const adj_list_helper<Config, Base>& g_)
     {
@@ -1609,7 +1617,7 @@ namespace boost {
     }
     template <class Config, class Base>
     inline typename Config::degree_size_type
-    out_degree(typename Config::vertex_descriptor u, 
+    out_degree(typename Config::vertex_descriptor u,
                const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type AdjList;
@@ -1618,8 +1626,8 @@ namespace boost {
     }
     template <class Config, class Base>
     inline std::pair<typename Config::edge_descriptor, bool>
-    edge(typename Config::vertex_descriptor u, 
-         typename Config::vertex_descriptor v, 
+    edge(typename Config::vertex_descriptor u,
+         typename Config::vertex_descriptor v,
          const adj_list_helper<Config, Base>& g_)
     {
       typedef typename Config::graph_type Graph;
@@ -1642,8 +1650,8 @@ namespace boost {
       typename Config::OutEdgeList& el = g.out_edge_list(u);
       typename Config::OutEdgeList::iterator first, last;
       typename Config::EdgeContainer fake_edge_container;
-      tie(first, last) = 
-        std::equal_range(el.begin(), el.end(), 
+      tie(first, last) =
+        std::equal_range(el.begin(), el.end(),
                          StoredEdge(v, fake_edge_container.end(),
                                     &fake_edge_container));
       return std::make_pair(out_edge_iterator(first, u),
@@ -1652,7 +1660,7 @@ namespace boost {
 
     template <class Config>
     inline typename Config::degree_size_type
-    in_degree(typename Config::vertex_descriptor u, 
+    in_degree(typename Config::vertex_descriptor u,
               const directed_edges_helper<Config>& g_)
     {
       typedef typename Config::graph_type Graph;
@@ -1666,7 +1674,7 @@ namespace boost {
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::type
-      get_dispatch(adj_list_helper<Config,Base>&, Property, 
+      get_dispatch(adj_list_helper<Config,Base>&, Property,
                    boost::edge_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::type PA;
@@ -1674,9 +1682,9 @@ namespace boost {
       }
       template <class Config, class Base, class Property>
       inline
-      typename boost::property_map<typename Config::graph_type, 
+      typename boost::property_map<typename Config::graph_type,
         Property>::const_type
-      get_dispatch(const adj_list_helper<Config,Base>&, Property, 
+      get_dispatch(const adj_list_helper<Config,Base>&, Property,
                    boost::edge_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::const_type PA;
@@ -1685,9 +1693,9 @@ namespace boost {
 
       template <class Config, class Base, class Property>
       inline
-      typename boost::property_map<typename Config::graph_type, 
+      typename boost::property_map<typename Config::graph_type,
         Property>::type
-      get_dispatch(adj_list_helper<Config,Base>& g, Property, 
+      get_dispatch(adj_list_helper<Config,Base>& g, Property,
                    boost::vertex_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::type PA;
@@ -1697,7 +1705,7 @@ namespace boost {
       inline
       typename boost::property_map<typename Config::graph_type,
         Property>::const_type
-      get_dispatch(const adj_list_helper<Config, Base>& g, Property, 
+      get_dispatch(const adj_list_helper<Config, Base>& g, Property,
                    boost::vertex_property_tag) {
         typedef typename Config::graph_type Graph;
         typedef typename boost::property_map<Graph, Property>::const_type PA;
@@ -1717,7 +1725,7 @@ namespace boost {
     }
     template <class Config, class Base, class Property>
     inline
-    typename boost::property_map<typename Config::graph_type, 
+    typename boost::property_map<typename Config::graph_type,
       Property>::const_type
     get(Property p, const adj_list_helper<Config, Base>& g) {
       typedef typename property_kind<Property>::type Kind;
@@ -1727,7 +1735,7 @@ namespace boost {
     template <class Config, class Base, class Property, class Key>
     inline
     typename boost::property_traits<
-      typename boost::property_map<typename Config::graph_type, 
+      typename boost::property_map<typename Config::graph_type,
         Property>::type
     >::reference
     get(Property p, adj_list_helper<Config, Base>& g, const Key& key) {
@@ -1737,7 +1745,7 @@ namespace boost {
     template <class Config, class Base, class Property, class Key>
     inline
     typename boost::property_traits<
-      typename boost::property_map<typename Config::graph_type, 
+      typename boost::property_map<typename Config::graph_type,
         Property>::const_type
     >::reference
     get(Property p, const adj_list_helper<Config, Base>& g, const Key& key) {
@@ -1746,7 +1754,7 @@ namespace boost {
 
     template <class Config, class Base, class Property, class Key,class Value>
     inline void
-    put(Property p, adj_list_helper<Config, Base>& g, 
+    put(Property p, adj_list_helper<Config, Base>& g,
         const Key& key, const Value& value)
     {
       typedef typename Config::graph_type Graph;
@@ -1786,7 +1794,7 @@ namespace boost {
       {
         return 0;
       }
-      
+
       inline adj_list_impl() { }
 
       inline adj_list_impl(const adj_list_impl& x) {
@@ -1855,7 +1863,7 @@ namespace boost {
       inline StoredVertexList& vertex_set() { return m_vertices; }
       inline const StoredVertexList& vertex_set() const { return m_vertices; }
 
-      inline void copy_impl(const adj_list_impl& x_) 
+      inline void copy_impl(const adj_list_impl& x_)
       {
         const Derived& x = static_cast<const Derived&>(x_);
 
@@ -1876,9 +1884,9 @@ namespace boost {
         edge_iterator ei, ei_end;
         for (tie(ei, ei_end) = edges(x); ei != ei_end; ++ei) {
           edge_descriptor e;
-          bool inserted; 
+          bool inserted;
           vertex_descriptor s = source(*ei,x), t = target(*ei,x);
-          tie(e, inserted) = add_edge(vertex_map[(stored_vertex*)s], 
+          tie(e, inserted) = add_edge(vertex_map[(stored_vertex*)s],
                                       vertex_map[(stored_vertex*)t], *this);
           *((edge_property_type*)e.m_eproperty)
             = *((edge_property_type*)(*ei).m_eproperty);
@@ -1902,6 +1910,7 @@ namespace boost {
       bool inserted;
       boost::tie(pos,inserted) = boost::graph_detail::push(g.m_vertices, v);
       v->m_position = pos;
+      g.added_vertex(v);
       return v;
     }
     // O(1)
@@ -1910,13 +1919,19 @@ namespace boost {
     add_vertex(const typename Config::vertex_property_type& p,
                adj_list_impl<Derived, Config, Base>& g_)
     {
+      typedef typename Config::vertex_descriptor vertex_descriptor;
       Derived& g = static_cast<Derived&>(g_);
+      if (optional<vertex_descriptor> v
+            = g.vertex_by_property(get_property_value(p, vertex_bundle)))
+        return *v;
+
       typedef typename Config::stored_vertex stored_vertex;
       stored_vertex* v = new stored_vertex(p);
       typename Config::StoredVertexList::iterator pos;
       bool inserted;
       boost::tie(pos,inserted) = boost::graph_detail::push(g.m_vertices, v);
       v->m_position = pos;
+      g.added_vertex(v);
       return v;
     }
     // O(1)
@@ -1926,6 +1941,7 @@ namespace boost {
     {
       typedef typename Config::stored_vertex stored_vertex;
       Derived& g = static_cast<Derived&>(g_);
+      g.removing_vertex(u);
       stored_vertex* su = (stored_vertex*)u;
       g.m_vertices.erase(su->m_position);
       delete su;
@@ -1933,7 +1949,7 @@ namespace boost {
     // O(V)
     template <class Derived, class Config, class Base>
     inline typename Config::vertex_descriptor
-    vertex(typename Config::vertices_size_type n, 
+    vertex(typename Config::vertices_size_type n,
            const adj_list_impl<Derived, Config, Base>& g_)
     {
       const Derived& g = static_cast<const Derived&>(g_);
@@ -1948,8 +1964,8 @@ namespace boost {
     namespace detail {
 
       template <class Graph, class vertex_descriptor>
-      inline void 
-      remove_vertex_dispatch(Graph& g, vertex_descriptor u, 
+      inline void
+      remove_vertex_dispatch(Graph& g, vertex_descriptor u,
                              boost::directed_tag)
       {
         typedef typename Graph::edge_parallel_category edge_parallel_category;
@@ -1962,8 +1978,8 @@ namespace boost {
       }
 
       template <class Graph, class vertex_descriptor>
-      inline void 
-      remove_vertex_dispatch(Graph& g, vertex_descriptor u, 
+      inline void
+      remove_vertex_dispatch(Graph& g, vertex_descriptor u,
                              boost::undirected_tag)
       {
         typedef typename Graph::global_edgelist_selector EdgeListS;
@@ -1973,7 +1989,7 @@ namespace boost {
         g.m_vertices.erase(g.m_vertices.begin() + u);
         vertex_descriptor V = num_vertices(g);
         for (vertex_descriptor v = 0; v < V; ++v)
-          reindex_edge_list(g.out_edge_list(v), u, 
+          reindex_edge_list(g.out_edge_list(v), u,
                             edge_parallel_category());
         typedef typename Graph::EdgeContainer Container;
         typedef typename Container::iterator Iter;
@@ -1986,8 +2002,8 @@ namespace boost {
         }
       }
       template <class Graph, class vertex_descriptor>
-      inline void 
-      remove_vertex_dispatch(Graph& g, vertex_descriptor u, 
+      inline void
+      remove_vertex_dispatch(Graph& g, vertex_descriptor u,
                              boost::bidirectional_tag)
       {
         typedef typename Graph::global_edgelist_selector EdgeListS;
@@ -1999,10 +2015,10 @@ namespace boost {
         vertex_descriptor v;
         if (u != V) {
           for (v = 0; v < V; ++v)
-            reindex_edge_list(g.out_edge_list(v), u, 
+            reindex_edge_list(g.out_edge_list(v), u,
                               edge_parallel_category());
           for (v = 0; v < V; ++v)
-            reindex_edge_list(in_edge_list(g, v), u, 
+            reindex_edge_list(in_edge_list(g, v), u,
                               edge_parallel_category());
 
           typedef typename Graph::EdgeContainer Container;
@@ -2019,7 +2035,7 @@ namespace boost {
 
       template <class EdgeList, class vertex_descriptor>
       inline void
-      reindex_edge_list(EdgeList& el, vertex_descriptor u, 
+      reindex_edge_list(EdgeList& el, vertex_descriptor u,
                         boost::allow_parallel_edge_tag)
       {
         typename EdgeList::iterator ei = el.begin(), e_end = el.end();
@@ -2029,7 +2045,7 @@ namespace boost {
       }
       template <class EdgeList, class vertex_descriptor>
       inline void
-      reindex_edge_list(EdgeList& el, vertex_descriptor u, 
+      reindex_edge_list(EdgeList& el, vertex_descriptor u,
                         boost::disallow_parallel_edge_tag)
       {
         typename EdgeList::iterator ei = el.begin(), e_end = el.end();
@@ -2046,14 +2062,14 @@ namespace boost {
     } // namespace detail
 
     struct vec_adj_list_tag { };
-    
+
     template <class Graph, class Config, class Base>
     class vec_adj_list_impl
       : public adj_list_helper<Config, Base>
     {
       typedef typename Config::OutEdgeList OutEdgeList;
       typedef typename Config::InEdgeList InEdgeList;
-      typedef typename Config::StoredVertexList StoredVertexList; 
+      typedef typename Config::StoredVertexList StoredVertexList;
     public:
       typedef typename Config::vertex_descriptor vertex_descriptor;
       typedef typename Config::edge_descriptor edge_descriptor;
@@ -2073,7 +2089,7 @@ namespace boost {
       {
         return (std::numeric_limits<vertex_descriptor>::max)();
       }
-      
+
       inline vec_adj_list_impl() { }
 
       inline vec_adj_list_impl(const vec_adj_list_impl& x) {
@@ -2098,7 +2114,7 @@ namespace boost {
         : m_vertices(num_vertices)
       {
         while (first != last) {
-          add_edge((*first).first, (*first).second, 
+          add_edge((*first).first, (*first).second,
                    static_cast<Graph&>(*this));
           ++first;
         }
@@ -2110,7 +2126,7 @@ namespace boost {
         : m_vertices(num_vertices)
       {
         while (first != last) {
-          add_edge((*first).first, (*first).second, *ep_iter, 
+          add_edge((*first).first, (*first).second, *ep_iter,
                    static_cast<Graph&>(*this));
           ++first;
           ++ep_iter;
@@ -2127,7 +2143,7 @@ namespace boost {
       inline const OutEdgeList& out_edge_list(vertex_descriptor v) const {
         return m_vertices[v].m_out_edges;
       }
-      inline void copy_impl(const vec_adj_list_impl& x_) 
+      inline void copy_impl(const vec_adj_list_impl& x_)
       {
         const Graph& x = static_cast<const Graph&>(x_);
         // Copy the stored vertex objects by adding each vertex
@@ -2141,7 +2157,7 @@ namespace boost {
         edge_iterator ei, ei_end;
         for (tie(ei, ei_end) = edges(x); ei != ei_end; ++ei) {
           edge_descriptor e;
-          bool inserted; 
+          bool inserted;
           tie(e, inserted) = add_edge(source(*ei,x), target(*ei,x) , *this);
           *((edge_property_type*)e.m_eproperty)
             = *((edge_property_type*)(*ei).m_eproperty);
@@ -2153,14 +2169,14 @@ namespace boost {
     // Had to make these non-members to avoid accidental instantiation
     // on SGI MIPSpro C++
     template <class G, class C, class B>
-    inline typename C::InEdgeList& 
-    in_edge_list(vec_adj_list_impl<G,C,B>& g, 
+    inline typename C::InEdgeList&
+    in_edge_list(vec_adj_list_impl<G,C,B>& g,
                  typename C::vertex_descriptor v) {
       return g.m_vertices[v].m_in_edges;
     }
     template <class G, class C, class B>
-    inline const typename C::InEdgeList& 
-    in_edge_list(const vec_adj_list_impl<G,C,B>& g, 
+    inline const typename C::InEdgeList&
+    in_edge_list(const vec_adj_list_impl<G,C,B>& g,
                  typename C::vertex_descriptor v) {
       return g.m_vertices[v].m_in_edges;
     }
@@ -2171,6 +2187,7 @@ namespace boost {
     add_vertex(vec_adj_list_impl<Graph, Config, Base>& g_) {
       Graph& g = static_cast<Graph&>(g_);
       g.m_vertices.resize(g.m_vertices.size() + 1);
+      g.added_vertex(g.m_vertices.size() - 1);
       return g.m_vertices.size() - 1;
     }
 
@@ -2178,9 +2195,14 @@ namespace boost {
     inline typename Config::vertex_descriptor
     add_vertex(const typename Config::vertex_property_type& p,
                vec_adj_list_impl<Graph, Config, Base>& g_) {
+      typedef typename Config::vertex_descriptor vertex_descriptor;
       Graph& g = static_cast<Graph&>(g_);
+      if (optional<vertex_descriptor> v
+            = g.vertex_by_property(get_property_value(p, vertex_bundle)))
+        return *v;
       typedef typename Config::stored_vertex stored_vertex;
       g.m_vertices.push_back(stored_vertex(p));
+      g.added_vertex(g.m_vertices.size() - 1);
       return g.m_vertices.size() - 1;
     }
 
@@ -2189,7 +2211,7 @@ namespace boost {
     // either u or v is greater than the number of vertices.
     template <class Graph, class Config, class Base>
     inline std::pair<typename Config::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
+    add_edge(typename Config::vertex_descriptor u,
              typename Config::vertex_descriptor v,
              const typename Config::edge_property_type& p,
              vec_adj_list_impl<Graph, Config, Base>& g_)
@@ -2203,7 +2225,7 @@ namespace boost {
     }
     template <class Graph, class Config, class Base>
     inline std::pair<typename Config::edge_descriptor, bool>
-    add_edge(typename Config::vertex_descriptor u, 
+    add_edge(typename Config::vertex_descriptor u,
              typename Config::vertex_descriptor v,
              vec_adj_list_impl<Graph, Config, Base>& g_)
     {
@@ -2219,12 +2241,13 @@ namespace boost {
     {
       typedef typename Config::directed_category Cat;
       Graph& g = static_cast<Graph&>(g_);
+      g.removing_vertex(v);
       detail::remove_vertex_dispatch(g, v, Cat());
     }
     // O(1)
     template <class Graph, class Config, class Base>
-    inline typename Config::vertex_descriptor 
-    vertex(typename Config::vertices_size_type n, 
+    inline typename Config::vertex_descriptor
+    vertex(typename Config::vertices_size_type n,
            const vec_adj_list_impl<Graph, Config, Base>&)
     {
       return n;
@@ -2237,13 +2260,13 @@ namespace boost {
     // Adjacency List Generator
 
     template <class Graph, class VertexListS, class OutEdgeListS,
-              class DirectedS, class VertexProperty, class EdgeProperty, 
+              class DirectedS, class VertexProperty, class EdgeProperty,
               class GraphProperty, class EdgeListS>
     struct adj_list_gen
     {
-      typedef typename detail::is_random_access<VertexListS>::type 
+      typedef typename detail::is_random_access<VertexListS>::type
         is_rand_access;
-      typedef typename has_property<EdgeProperty>::type has_edge_property; 
+      typedef typename has_property<EdgeProperty>::type has_edge_property;
       typedef typename DirectedS::is_directed_t DirectedT;
       typedef typename DirectedS::is_bidir_t BidirectionalT;
 
@@ -2258,7 +2281,7 @@ namespace boost {
         typedef GraphProperty graph_property_type;
         typedef std::size_t vertices_size_type;
 
-        typedef adjacency_list_traits<OutEdgeListS, VertexListS, DirectedS> 
+        typedef adjacency_list_traits<OutEdgeListS, VertexListS, DirectedS>
            Traits;
 
         typedef typename Traits::directed_category directed_category;
@@ -2266,15 +2289,15 @@ namespace boost {
         typedef typename Traits::vertex_descriptor vertex_descriptor;
         typedef typename Traits::edge_descriptor edge_descriptor;
 
-        typedef void* vertex_ptr; 
+        typedef void* vertex_ptr;
 
         // need to reorganize this to avoid instantiating stuff
         // that doesn't get used -JGS
 
         // VertexList and vertex_iterator
-        typedef typename container_gen<VertexListS, 
+        typedef typename container_gen<VertexListS,
           vertex_ptr>::type SeqVertexList;
-        typedef boost::integer_range<std::size_t> RandVertexList;
+        typedef boost::integer_range<vertices_size_type> RandVertexList;
         typedef typename mpl::if_<is_rand_access,
           RandVertexList, SeqVertexList>::type VertexList;
 
@@ -2282,10 +2305,10 @@ namespace boost {
 
         // EdgeContainer and StoredEdge
 
-        typedef typename container_gen<EdgeListS, 
+        typedef typename container_gen<EdgeListS,
           list_edge<vertex_descriptor, EdgeProperty> >::type EdgeContainer;
 
-        typedef typename mpl::and_<DirectedT, 
+        typedef typename mpl::and_<DirectedT,
              typename mpl::not_<BidirectionalT>::type >::type on_edge_storage;
 
         typedef typename mpl::if_<on_edge_storage,
@@ -2306,7 +2329,7 @@ namespace boost {
 
         // Adjacency Types
 
-        typedef typename container_gen<OutEdgeListS, StoredEdge>::type 
+        typedef typename container_gen<OutEdgeListS, StoredEdge>::type
           OutEdgeList;
         typedef typename OutEdgeList::size_type degree_size_type;
         typedef typename OutEdgeList::iterator OutEdgeIter;
@@ -2343,10 +2366,10 @@ namespace boost {
         typedef undirected_edge_iter<
             EdgeIter
           , edge_descriptor
-          , EdgeIterDiff          
+          , EdgeIterDiff
         > UndirectedEdgeIter; // also used for bidirectional
 
-        typedef adj_list_edge_iterator<vertex_iterator, out_edge_iterator, 
+        typedef adj_list_edge_iterator<vertex_iterator, out_edge_iterator,
            graph_type> DirectedEdgeIter;
 
         typedef typename mpl::if_<on_edge_storage,
@@ -2622,16 +2645,16 @@ namespace boost {
       typedef typename Bind::const_type const_type;
     };
   } // namespace detail
-    
+
     //=========================================================================
     // Edge Property Map
 
     template <class Directed, class Value, class Ref, class Vertex,
               class Property, class Tag>
     struct adj_list_edge_property_map
-      : public put_get_helper< 
+      : public put_get_helper<
           Ref,
-          adj_list_edge_property_map<Directed, Value, Ref, Vertex, Property, 
+          adj_list_edge_property_map<Directed, Value, Ref, Vertex, Property,
             Tag>
         >
     {
@@ -2652,7 +2675,7 @@ namespace boost {
       class Vertex>
     struct adj_list_edge_all_properties_map
       : public put_get_helper<PropRef,
-          adj_list_edge_all_properties_map<Directed, Property, PropRef, 
+          adj_list_edge_all_properties_map<Directed, Property, PropRef,
             PropPtr, Vertex>
         >
     {
@@ -2677,12 +2700,12 @@ namespace boost {
         typedef typename property_value<Property,Tag>::type value_type;
         typedef value_type& reference;
         typedef const value_type& const_reference;
-        
+
         typedef adj_list_edge_property_map
-           <typename Graph::directed_category, value_type, reference, 
+           <typename Graph::directed_category, value_type, reference,
             typename Graph::vertex_descriptor,Property,Tag> type;
         typedef adj_list_edge_property_map
-           <typename Graph::directed_category, value_type, const_reference, 
+           <typename Graph::directed_category, value_type, const_reference,
             typename Graph::vertex_descriptor,const Property, Tag> const_type;
       };
     };
@@ -2693,7 +2716,7 @@ namespace boost {
         <typename Graph::directed_category, Property, Property&, Property*,
             typename Graph::vertex_descriptor> type;
         typedef adj_list_edge_all_properties_map
-        <typename Graph::directed_category, Property, const Property&, 
+        <typename Graph::directed_category, Property, const Property&,
             const Property*, typename Graph::vertex_descriptor> const_type;
       };
     };
@@ -2723,11 +2746,11 @@ namespace boost {
     };
   } // namespace detail
 
-  template <>  
+  template <>
   struct edge_property_selector<adj_list_tag> {
     typedef detail::adj_list_edge_property_selector type;
   };
-  template <>  
+  template <>
   struct edge_property_selector<vec_adj_list_tag> {
     typedef detail::adj_list_edge_property_selector type;
   };
@@ -2742,7 +2765,7 @@ namespace boost {
       typedef typename Choice::const_type const_type;
     };
   };
-  template <>  
+  template <>
   struct vertex_property_selector<adj_list_tag> {
     typedef adj_list_vertex_property_selector type;
   };
@@ -2755,7 +2778,7 @@ namespace boost {
       typedef typename Choice::const_type const_type;
     };
   };
-  template <>  
+  template <>
   struct vertex_property_selector<vec_adj_list_tag> {
     typedef vec_adj_list_vertex_property_selector type;
   };
@@ -2777,7 +2800,7 @@ namespace BOOST_STD_EXTENSION_NAMESPACE {
   #endif
 
   template <typename V>
-  struct hash< boost::detail::stored_edge<V> > 
+  struct hash< boost::detail::stored_edge<V> >
   {
     std::size_t
     operator()(const boost::detail::stored_edge<V>& e) const
@@ -2787,7 +2810,7 @@ namespace BOOST_STD_EXTENSION_NAMESPACE {
   };
 
   template <typename V, typename P>
-  struct hash< boost::detail::stored_edge_property <V,P> > 
+  struct hash< boost::detail::stored_edge_property <V,P> >
   {
     std::size_t
     operator()(const boost::detail::stored_edge_property<V,P>& e) const
@@ -2797,7 +2820,7 @@ namespace BOOST_STD_EXTENSION_NAMESPACE {
   };
 
   template <typename V, typename I, typename P>
-  struct hash< boost::detail::stored_edge_iter<V,I, P> > 
+  struct hash< boost::detail::stored_edge_iter<V,I, P> >
   {
     std::size_t
     operator()(const boost::detail::stored_edge_iter<V,I,P>& e) const
@@ -2823,17 +2846,17 @@ namespace BOOST_STD_EXTENSION_NAMESPACE {
 
 /*
   Implementation Notes:
-  
+
   Many of the public interface functions in this file would have been
   more conveniently implemented as inline friend functions.
   However there are a few compiler bugs that make that approach
   non-portable.
+
   1. g++ inline friend in namespace bug
   2. g++ using clause doesn't work with inline friends
   3. VC++ doesn't have Koenig lookup
 
-  For these reasons, the functions were all written as non-inline free 
+  For these reasons, the functions were all written as non-inline free
   functions, and static cast was used to convert from the helper
   class to the adjacency_list derived class.
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/compressed_sparse_row_struct.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/compressed_sparse_row_struct.hpp
new file mode 100644 (file)
index 0000000..1146c77
--- /dev/null
@@ -0,0 +1,649 @@
+// Copyright 2005-2009 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Jeremiah Willcock
+//           Douglas Gregor
+//           Andrew Lumsdaine
+
+// Compressed sparse row graph type internal structure
+
+#ifndef BOOST_GRAPH_COMPRESSED_SPARSE_ROW_STRUCT_HPP
+#define BOOST_GRAPH_COMPRESSED_SPARSE_ROW_STRUCT_HPP
+
+#ifndef BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
+#error This file should only be included from boost/graph/compressed_sparse_row_graph.hpp
+#endif
+
+#include <vector>
+#include <utility>
+#include <algorithm>
+#include <climits>
+#include <cassert>
+#include <iterator>
+#if 0
+#include <iostream> // For some debugging code below
+#endif
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/graph/filtered_graph.hpp> // For keep_all
+#include <boost/graph/detail/indexed_properties.hpp>
+#include <boost/graph/detail/histogram_sort.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/iterator/reverse_iterator.hpp>
+#include <boost/iterator/zip_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/integer.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/graph/graph_selectors.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/utility.hpp>
+
+namespace boost {
+
+namespace detail {
+  // Forward declaration of CSR edge descriptor type, needed to pass to
+  // indexed_edge_properties.
+  template<typename Vertex, typename EdgeIndex>
+  class csr_edge_descriptor;
+
+  /** Compressed sparse row graph internal structure.
+   *
+   * Vertex and EdgeIndex should be unsigned integral types and should
+   * specialize numeric_limits.
+   */
+  template <typename EdgeProperty,
+            typename Vertex = std::size_t, typename EdgeIndex = Vertex>
+  class compressed_sparse_row_structure :
+    public detail::indexed_edge_properties<
+             compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex>,
+             EdgeProperty,
+             csr_edge_descriptor<Vertex, EdgeIndex> > {
+    public:
+    typedef detail::indexed_edge_properties<
+              compressed_sparse_row_structure<EdgeProperty, Vertex, EdgeIndex>,
+              EdgeProperty,
+              csr_edge_descriptor<Vertex, EdgeIndex> >
+      inherited_edge_properties;
+
+    typedef Vertex vertices_size_type;
+    typedef Vertex vertex_descriptor;
+    typedef EdgeIndex edges_size_type;
+
+    static vertex_descriptor null_vertex() { return vertex_descriptor(-1); }
+
+    std::vector<EdgeIndex> m_rowstart;
+    std::vector<Vertex> m_column;
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+    // This member is only needed to support add_edge(), which is not provided by
+    // the new interface
+    Vertex m_last_source; // Last source of added edge, plus one
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+
+    compressed_sparse_row_structure(Vertex numverts = 0)
+      : m_rowstart(numverts + 1, EdgeIndex(0)), m_column()
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+        , m_last_source(numverts)
+#endif
+      {}
+    
+    //  Rebuild graph from number of vertices and multi-pass unsorted list of
+    //  edges (filtered using source_pred and mapped using global_to_local)
+    template <typename MultiPassInputIterator, typename GlobalToLocal, typename SourcePred>
+    void
+    assign_unsorted_multi_pass_edges(MultiPassInputIterator edge_begin,
+                                     MultiPassInputIterator edge_end,
+                                     vertices_size_type numlocalverts,
+                                     const GlobalToLocal& global_to_local,
+                                     const SourcePred& source_pred) {
+      m_rowstart.clear();
+      m_rowstart.resize(numlocalverts + 1, 0);
+      typedef std::pair<vertices_size_type, vertices_size_type> edge_type;
+      typedef boost::transform_iterator<boost::graph::detail::project1st<edge_type>, MultiPassInputIterator> source_iterator;
+      typedef boost::transform_iterator<boost::graph::detail::project2nd<edge_type>, MultiPassInputIterator> target_iterator;
+      source_iterator sources_begin(edge_begin, boost::graph::detail::project1st<edge_type>());
+      source_iterator sources_end(edge_end, boost::graph::detail::project1st<edge_type>());
+      target_iterator targets_begin(edge_begin, boost::graph::detail::project2nd<edge_type>());
+      target_iterator targets_end(edge_end, boost::graph::detail::project2nd<edge_type>());
+
+      boost::graph::detail::count_starts
+        (sources_begin, sources_end, m_rowstart.begin(), numlocalverts,
+         source_pred, boost::make_property_map_function(global_to_local));
+
+      m_column.resize(m_rowstart.back());
+
+      boost::graph::detail::histogram_sort
+        (sources_begin, sources_end, m_rowstart.begin(), numlocalverts,
+         targets_begin, m_column.begin(),
+         source_pred, boost::make_property_map_function(global_to_local));
+    }
+
+    //  Rebuild graph from number of vertices and multi-pass unsorted list of
+    //  edges and their properties (filtered using source_pred and mapped using
+    //  global_to_local)
+    template <typename MultiPassInputIterator, typename EdgePropertyIterator, typename GlobalToLocal, typename SourcePred>
+    void
+    assign_unsorted_multi_pass_edges(MultiPassInputIterator edge_begin,
+                                     MultiPassInputIterator edge_end,
+                                     EdgePropertyIterator ep_iter,
+                                     vertices_size_type numlocalverts,
+                                     const GlobalToLocal& global_to_local,
+                                     const SourcePred& source_pred) {
+      m_rowstart.clear();
+      m_rowstart.resize(numlocalverts + 1, 0);
+      typedef std::pair<vertices_size_type, vertices_size_type> edge_type;
+      typedef boost::transform_iterator<boost::graph::detail::project1st<edge_type>, MultiPassInputIterator> source_iterator;
+      typedef boost::transform_iterator<boost::graph::detail::project2nd<edge_type>, MultiPassInputIterator> target_iterator;
+      source_iterator sources_begin(edge_begin, boost::graph::detail::project1st<edge_type>());
+      source_iterator sources_end(edge_end, boost::graph::detail::project1st<edge_type>());
+      target_iterator targets_begin(edge_begin, boost::graph::detail::project2nd<edge_type>());
+      target_iterator targets_end(edge_end, boost::graph::detail::project2nd<edge_type>());
+
+      boost::graph::detail::count_starts
+        (sources_begin, sources_end, m_rowstart.begin(), numlocalverts,
+         source_pred, boost::make_property_map_function(global_to_local));
+
+      m_column.resize(m_rowstart.back());
+      inherited_edge_properties::resize(m_rowstart.back());
+
+      boost::graph::detail::histogram_sort
+        (sources_begin, sources_end, m_rowstart.begin(), numlocalverts,
+         targets_begin, m_column.begin(),
+         ep_iter, inherited_edge_properties::begin(),
+         source_pred, boost::make_property_map_function(global_to_local));
+    }
+
+    //  Assign from number of vertices and sorted list of edges
+    template<typename InputIterator, typename GlobalToLocal, typename SourcePred>
+    void assign_from_sorted_edges(
+           InputIterator edge_begin, InputIterator edge_end,
+           const GlobalToLocal& global_to_local,
+           const SourcePred& source_pred,
+           vertices_size_type numlocalverts,
+           edges_size_type numedges_or_zero) {
+      m_column.clear();
+      m_column.reserve(numedges_or_zero);
+      m_rowstart.resize(numlocalverts + 1);
+      EdgeIndex current_edge = 0;
+      Vertex current_vertex_plus_one = 1;
+      m_rowstart[0] = 0;
+      for (InputIterator ei = edge_begin; ei != edge_end; ++ei) {
+        if (!source_pred(ei->first)) continue;
+        Vertex src = get(global_to_local, ei->first);
+        Vertex tgt = ei->second;
+        for (; current_vertex_plus_one != src + 1; ++current_vertex_plus_one)
+          m_rowstart[current_vertex_plus_one] = current_edge;
+        m_column.push_back(tgt);
+        ++current_edge;
+      }
+
+      // The remaining vertices have no edges
+      for (; current_vertex_plus_one != numlocalverts + 1; ++current_vertex_plus_one)
+        m_rowstart[current_vertex_plus_one] = current_edge;
+
+      // Default-construct properties for edges
+      inherited_edge_properties::resize(m_column.size());
+    }
+
+    //  Assign from number of vertices and sorted list of edges
+    template<typename InputIterator, typename EdgePropertyIterator, typename GlobalToLocal, typename SourcePred>
+    void assign_from_sorted_edges(
+           InputIterator edge_begin, InputIterator edge_end,
+           EdgePropertyIterator ep_iter,
+           const GlobalToLocal& global_to_local,
+           const SourcePred& source_pred,
+           vertices_size_type numlocalverts,
+           edges_size_type numedges_or_zero) {
+      // Reserving storage in advance can save us lots of time and
+      // memory, but it can only be done if we have forward iterators or
+      // the user has supplied the number of edges.
+      edges_size_type numedges = numedges_or_zero;
+      if (numedges == 0) {
+        typedef typename std::iterator_traits<InputIterator>::iterator_category
+          category;
+        numedges = boost::graph::detail::reserve_count_for_single_pass(edge_begin, edge_end);
+      }
+      m_column.clear();
+      m_column.reserve(numedges_or_zero);
+      inherited_edge_properties::clear();
+      inherited_edge_properties::reserve(numedges_or_zero);
+      m_rowstart.resize(numlocalverts + 1);
+      EdgeIndex current_edge = 0;
+      Vertex current_vertex_plus_one = 1;
+      m_rowstart[0] = 0;
+      for (InputIterator ei = edge_begin; ei != edge_end; ++ei, ++ep_iter) {
+        if (!source_pred(ei->first)) continue;
+        Vertex src = get(global_to_local, ei->first);
+        Vertex tgt = ei->second;
+        for (; current_vertex_plus_one != src + 1; ++current_vertex_plus_one)
+          m_rowstart[current_vertex_plus_one] = current_edge;
+        m_column.push_back(tgt);
+        inherited_edge_properties::push_back(*ep_iter);
+        ++current_edge;
+      }
+
+      // The remaining vertices have no edges
+      for (; current_vertex_plus_one != numlocalverts + 1; ++current_vertex_plus_one)
+        m_rowstart[current_vertex_plus_one] = current_edge;
+    }
+
+    // Replace graph with sources and targets given, sorting them in-place, and
+    // using the given global-to-local property map to get local indices from
+    // global ones in the two arrays.
+    template <typename GlobalToLocal>
+    void assign_sources_and_targets_global(std::vector<vertex_descriptor>& sources,
+                                           std::vector<vertex_descriptor>& targets,
+                                           vertices_size_type numverts,
+                                           GlobalToLocal global_to_local) {
+      assert (sources.size() == targets.size());
+      // Do an in-place histogram sort (at least that's what I think it is) to
+      // sort sources and targets
+      m_rowstart.clear();
+      m_rowstart.resize(numverts + 1);
+      boost::graph::detail::count_starts
+        (sources.begin(), sources.end(), m_rowstart.begin(), numverts,
+         keep_all(), boost::make_property_map_function(global_to_local));
+      boost::graph::detail::histogram_sort_inplace
+        (sources.begin(), sources.end(), m_rowstart.begin(), numverts,
+         targets.begin(), boost::make_property_map_function(global_to_local));
+      // Now targets is the correct vector (properly sorted by source) for
+      // m_column
+      m_column.swap(targets);
+    }
+
+    // Replace graph with sources and targets and edge properties given, sorting
+    // them in-place, and using the given global-to-local property map to get
+    // local indices from global ones in the two arrays.
+    template <typename GlobalToLocal>
+    void assign_sources_and_targets_global(std::vector<vertex_descriptor>& sources,
+                                           std::vector<vertex_descriptor>& targets,
+                                           std::vector<typename inherited_edge_properties::edge_bundled>& edge_props,
+                                           vertices_size_type numverts,
+                                           GlobalToLocal global_to_local) {
+      assert (sources.size() == targets.size());
+      assert (sources.size() == edge_props.size());
+      // Do an in-place histogram sort (at least that's what I think it is) to
+      // sort sources and targets
+      m_rowstart.clear();
+      m_rowstart.resize(numverts + 1);
+      boost::graph::detail::count_starts
+        (sources.begin(), sources.end(), m_rowstart.begin(), numverts,
+         keep_all(), boost::make_property_map_function(global_to_local));
+      boost::graph::detail::histogram_sort_inplace
+        (sources.begin(), sources.end(), m_rowstart.begin(), numverts,
+         targets.begin(), edge_props.begin(),
+         boost::make_property_map_function(global_to_local));
+      // Now targets is the correct vector (properly sorted by source) for
+      // m_column, and edge_props for m_edge_properties
+      m_column.swap(targets);
+      this->m_edge_properties.swap(edge_props);
+    }
+
+    // From any graph (slow and uses a lot of memory)
+    //   Requires IncidenceGraph and a vertex index map
+    //   Internal helper function
+    //   Note that numedges must be doubled for undirected source graphs
+    template<typename Graph, typename VertexIndexMap>
+    void
+    assign(const Graph& g, const VertexIndexMap& vi,
+           vertices_size_type numverts, edges_size_type numedges)
+    {
+      m_rowstart.resize(numverts + 1);
+      m_column.resize(numedges);
+      EdgeIndex current_edge = 0;
+      typedef typename boost::graph_traits<Graph>::vertex_descriptor g_vertex;
+      typedef typename boost::graph_traits<Graph>::edge_descriptor g_edge;
+      typedef typename boost::graph_traits<Graph>::out_edge_iterator
+        g_out_edge_iter;
+
+      std::vector<g_vertex> ordered_verts_of_g(numverts);
+      BGL_FORALL_VERTICES_T(v, g, Graph) {
+        ordered_verts_of_g[get(vertex_index, g, v)] = v;
+      }
+      for (Vertex i = 0; i != numverts; ++i) {
+        m_rowstart[i] = current_edge;
+        g_vertex v = ordered_verts_of_g[i];
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+        // Out edges in a single vertex are only sorted for the old interface
+        EdgeIndex num_edges_before_this_vertex = current_edge;
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+        g_out_edge_iter ei, ei_end;
+        for (tie(ei, ei_end) = out_edges(v, g); ei != ei_end; ++ei) {
+          m_column[current_edge++] = get(vi, target(*ei, g));
+        }
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+        // Out edges in a single vertex are only sorted for the old interface
+        std::sort(m_column.begin() + num_edges_before_this_vertex,
+                  m_column.begin() + current_edge);
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+      }
+      m_rowstart[numverts] = current_edge;
+#ifdef BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+      m_last_source = numverts;
+#endif // BOOST_GRAPH_USE_OLD_CSR_INTERFACE
+    }
+
+    // Add edges from a sorted (smallest sources first) range of pairs and edge
+    // properties
+    template <typename BidirectionalIteratorOrig, typename EPIterOrig,
+              typename GlobalToLocal>
+    void
+    add_edges_sorted_internal(
+        BidirectionalIteratorOrig first_sorted,
+        BidirectionalIteratorOrig last_sorted,
+        EPIterOrig ep_iter_sorted,
+        const GlobalToLocal& global_to_local) {
+      typedef boost::reverse_iterator<BidirectionalIteratorOrig> BidirectionalIterator;
+      typedef boost::reverse_iterator<EPIterOrig> EPIter;
+      // Flip sequence
+      BidirectionalIterator first(last_sorted);
+      BidirectionalIterator last(first_sorted);
+      typedef Vertex vertex_t;
+      typedef Vertex vertex_num;
+      typedef EdgeIndex edge_num;
+      edge_num new_edge_count = std::distance(first, last);
+
+      EPIter ep_iter(ep_iter_sorted);
+      std::advance(ep_iter, -(std::ptrdiff_t)new_edge_count);
+      edge_num edges_added_before_i = new_edge_count; // Count increment to add to rowstarts
+      m_column.resize(m_column.size() + new_edge_count);
+      inherited_edge_properties::resize(inherited_edge_properties::size() + new_edge_count);
+      BidirectionalIterator current_new_edge = first, prev_new_edge = first;
+      EPIter current_new_edge_prop = ep_iter;
+      for (vertex_num i_plus_1 = m_rowstart.size() - 1; i_plus_1 > 0; --i_plus_1) {
+        vertex_num i = i_plus_1 - 1;
+        prev_new_edge = current_new_edge;
+        // edges_added_to_this_vertex = #mbrs of new_edges with first == i
+        edge_num edges_added_to_this_vertex = 0;
+        while (current_new_edge != last) {
+          if (get(global_to_local, current_new_edge->first) != i) break;
+          ++current_new_edge;
+          ++current_new_edge_prop;
+          ++edges_added_to_this_vertex;
+        }
+        edges_added_before_i -= edges_added_to_this_vertex;
+        // Invariant: edges_added_before_i = #mbrs of new_edges with first < i
+        edge_num old_rowstart = m_rowstart[i];
+        edge_num new_rowstart = m_rowstart[i] + edges_added_before_i;
+        edge_num old_degree = m_rowstart[i + 1] - m_rowstart[i];
+        edge_num new_degree = old_degree + edges_added_to_this_vertex;
+        // Move old edges forward (by #new_edges before this i) to make room
+        // new_rowstart > old_rowstart, so use copy_backwards
+        if (old_rowstart != new_rowstart) {
+          std::copy_backward(m_column.begin() + old_rowstart,
+                             m_column.begin() + old_rowstart + old_degree,
+                             m_column.begin() + new_rowstart + old_degree);
+          inherited_edge_properties::move_range(old_rowstart, old_rowstart + old_degree, new_rowstart);
+        }
+        // Add new edges (reversed because current_new_edge is a
+        // const_reverse_iterator)
+        BidirectionalIterator temp = current_new_edge;
+        EPIter temp_prop = current_new_edge_prop;
+        for (; temp != prev_new_edge; ++old_degree) {
+          --temp;
+          --temp_prop;
+          m_column[new_rowstart + old_degree] = temp->second;
+          inherited_edge_properties::write_by_index(new_rowstart + old_degree, *temp_prop);
+        }
+        m_rowstart[i + 1] = new_rowstart + new_degree;
+        if (edges_added_before_i == 0) break; // No more edges inserted before this point
+        // m_rowstart[i] will be fixed up on the next iteration (to avoid
+        // changing the degree of vertex i - 1); the last iteration never changes
+        // it (either because of the condition of the break or because
+        // m_rowstart[0] is always 0)
+      }
+    }
+
+  };
+
+  template<typename Vertex, typename EdgeIndex>
+  class csr_edge_descriptor
+  {
+   public:
+    Vertex src;
+    EdgeIndex idx;
+
+    csr_edge_descriptor(Vertex src, EdgeIndex idx): src(src), idx(idx) {}
+    csr_edge_descriptor(): src(0), idx(0) {}
+
+    bool operator==(const csr_edge_descriptor& e) const {return idx == e.idx;}
+    bool operator!=(const csr_edge_descriptor& e) const {return idx != e.idx;}
+    bool operator<(const csr_edge_descriptor& e) const {return idx < e.idx;}
+    bool operator>(const csr_edge_descriptor& e) const {return idx > e.idx;}
+    bool operator<=(const csr_edge_descriptor& e) const {return idx <= e.idx;}
+    bool operator>=(const csr_edge_descriptor& e) const {return idx >= e.idx;}
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned int /*version*/)
+    {
+      ar & src & idx;
+    }
+  };
+
+  // Common out edge and edge iterators
+  template<typename CSRGraph>
+  class csr_out_edge_iterator
+    : public iterator_facade<csr_out_edge_iterator<CSRGraph>,
+                             typename CSRGraph::edge_descriptor,
+                             std::random_access_iterator_tag,
+                             const typename CSRGraph::edge_descriptor&,
+                             typename int_t<CHAR_BIT * sizeof(typename CSRGraph::edges_size_type)>::fast>
+  {
+   public:
+    typedef typename CSRGraph::edges_size_type EdgeIndex;
+    typedef typename CSRGraph::edge_descriptor edge_descriptor;
+    typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
+
+    csr_out_edge_iterator() {}
+    // Implicit copy constructor OK
+    explicit csr_out_edge_iterator(edge_descriptor edge) : m_edge(edge) { }
+
+   public: // GCC 4.2.1 doesn't like the private-and-friend thing
+    // iterator_facade requirements
+    const edge_descriptor& dereference() const { return m_edge; }
+
+    bool equal(const csr_out_edge_iterator& other) const
+    { return m_edge == other.m_edge; }
+
+    void increment() { ++m_edge.idx; }
+    void decrement() { --m_edge.idx; }
+    void advance(difference_type n) { m_edge.idx += n; }
+
+    difference_type distance_to(const csr_out_edge_iterator& other) const
+    { return other.m_edge.idx - m_edge.idx; }
+
+    edge_descriptor m_edge;
+
+    friend class iterator_core_access;
+  };
+
+  template<typename CSRGraph>
+  class csr_edge_iterator
+    : public iterator_facade<csr_edge_iterator<CSRGraph>,
+                             typename CSRGraph::edge_descriptor,
+                             boost::forward_traversal_tag,
+                             typename CSRGraph::edge_descriptor>
+  {
+   private:
+    typedef typename CSRGraph::edge_descriptor edge_descriptor;
+    typedef typename CSRGraph::edges_size_type EdgeIndex;
+
+   public:
+    csr_edge_iterator() : rowstart_array(0), current_edge(), end_of_this_vertex(0), total_num_edges(0) {}
+
+    csr_edge_iterator(const CSRGraph& graph,
+                      edge_descriptor current_edge,
+                      EdgeIndex end_of_this_vertex)
+      : rowstart_array(&graph.m_forward.m_rowstart[0]),
+        current_edge(current_edge),
+        end_of_this_vertex(end_of_this_vertex),
+        total_num_edges(num_edges(graph)) {}
+
+   public: // See above
+    friend class boost::iterator_core_access;
+
+    edge_descriptor dereference() const {return current_edge;}
+
+    bool equal(const csr_edge_iterator& o) const {
+      return current_edge == o.current_edge;
+    }
+
+    void increment() {
+      ++current_edge.idx;
+      if (current_edge.idx == total_num_edges) return;
+      while (current_edge.idx == end_of_this_vertex) {
+        ++current_edge.src;
+        end_of_this_vertex = rowstart_array[current_edge.src + 1];
+      }
+    }
+
+    const EdgeIndex* rowstart_array;
+    edge_descriptor current_edge;
+    EdgeIndex end_of_this_vertex;
+    EdgeIndex total_num_edges;
+  };
+
+  // Only for bidirectional graphs
+  template<typename CSRGraph>
+  class csr_in_edge_iterator
+    : public iterator_facade<csr_in_edge_iterator<CSRGraph>,
+                             typename CSRGraph::edge_descriptor,
+                             boost::forward_traversal_tag,
+                             typename CSRGraph::edge_descriptor>
+  {
+   public:
+    typedef typename CSRGraph::edges_size_type EdgeIndex;
+    typedef typename CSRGraph::edge_descriptor edge_descriptor;
+
+    csr_in_edge_iterator() {}
+    // Implicit copy constructor OK
+    csr_in_edge_iterator(const CSRGraph& graph,
+                         EdgeIndex index_in_backward_graph)
+      : m_graph(graph), m_index_in_backward_graph(index_in_backward_graph) {}
+
+   public: // See above
+    // iterator_facade requirements
+    edge_descriptor dereference() const {
+      return edge_descriptor(
+               m_graph.m_backward.m_column[m_index_in_backward_graph],
+               m_graph.m_backward.m_edge_properties[m_index_in_backward_graph]);
+    }
+
+    bool equal(const csr_in_edge_iterator& other) const
+    { return m_index_in_backward_graph == other.m_index_in_backward_graph; }
+
+    void increment() { ++m_index_in_backward_graph; }
+    void decrement() { --m_index_in_backward_graph; }
+    void advance(std::ptrdiff_t n) { m_index_in_backward_graph += n; }
+
+    std::ptrdiff_t distance_to(const csr_in_edge_iterator& other) const
+    { return other.m_index_in_backward_graph - m_index_in_backward_graph; }
+
+    EdgeIndex m_index_in_backward_graph;
+    const CSRGraph& m_graph;
+
+    friend class iterator_core_access;
+  };
+
+  template <typename A, typename B>
+  struct transpose_pair {
+    typedef std::pair<B, A> result_type;
+    result_type operator()(const std::pair<A, B>& p) const {
+      return result_type(p.second, p.first);
+    }
+  };
+
+  template <typename Iter>
+  struct transpose_iterator_gen {
+    typedef typename std::iterator_traits<Iter>::value_type vt;
+    typedef typename vt::first_type first_type;
+    typedef typename vt::second_type second_type;
+    typedef transpose_pair<first_type, second_type> transpose;
+    typedef boost::transform_iterator<transpose, Iter> type;
+    static type make(Iter it) {
+      return type(it, transpose());
+    }
+  };
+
+  template <typename Iter>
+  typename transpose_iterator_gen<Iter>::type transpose_edges(Iter i) {
+    return transpose_iterator_gen<Iter>::make(i);
+  }
+
+  template<typename GraphT, typename VertexIndexMap>
+  class edge_to_index_pair
+  {
+    typedef typename boost::graph_traits<GraphT>::vertices_size_type
+      vertices_size_type;
+    typedef typename boost::graph_traits<GraphT>::edge_descriptor edge_descriptor;
+
+   public:
+    typedef std::pair<vertices_size_type, vertices_size_type> result_type;
+
+    edge_to_index_pair() : g(0), index() { }
+    edge_to_index_pair(const GraphT& g, const VertexIndexMap& index)
+      : g(&g), index(index)
+    { }
+
+    result_type operator()(edge_descriptor e) const
+    {
+      return result_type(get(index, source(e, *g)), get(index, target(e, *g)));
+    }
+
+   private:
+    const GraphT* g;
+    VertexIndexMap index;
+  };
+
+  template<typename GraphT, typename VertexIndexMap>
+  edge_to_index_pair<GraphT, VertexIndexMap>
+  make_edge_to_index_pair(const GraphT& g, const VertexIndexMap& index)
+  {
+    return edge_to_index_pair<GraphT, VertexIndexMap>(g, index);
+  }
+
+  template<typename GraphT>
+  edge_to_index_pair
+    <GraphT,
+     typename boost::property_map<GraphT,boost::vertex_index_t>::const_type>
+  make_edge_to_index_pair(const GraphT& g)
+  {
+    typedef typename boost::property_map<GraphT,
+                                         boost::vertex_index_t>::const_type
+      VertexIndexMap;
+    return edge_to_index_pair<GraphT, VertexIndexMap>(g,
+                                                     get(boost::vertex_index,
+                                                         g));
+  }
+
+  template<typename GraphT, typename VertexIndexMap, typename Iter>
+  boost::transform_iterator<edge_to_index_pair<GraphT, VertexIndexMap>, Iter>
+  make_edge_to_index_pair_iter(const GraphT& g, const VertexIndexMap& index,
+                               Iter it) {
+    return boost::transform_iterator<edge_to_index_pair<GraphT, VertexIndexMap>, Iter>(it, edge_to_index_pair<GraphT, VertexIndexMap>(g, index));
+  }
+
+} // namespace detail
+
+  template<typename Vertex, typename EdgeIndex>
+  struct hash<detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+  {
+    std::size_t operator()
+                  (detail::csr_edge_descriptor<Vertex, EdgeIndex> const& x) const
+    {
+      std::size_t hash = hash_value(x.src);
+      hash_combine(hash, x.idx);
+      return hash;
+    }
+  };
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_COMPRESSED_SPARSE_ROW_STRUCT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/d_ary_heap.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/d_ary_heap.hpp
new file mode 100644 (file)
index 0000000..2ec716d
--- /dev/null
@@ -0,0 +1,305 @@
+//
+//=======================================================================
+// Copyright 2009 Trustees of Indiana University
+// Authors: Jeremiah J. Willcock, Andrew Lumsdaine
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+//
+#ifndef BOOST_D_ARY_HEAP_HPP
+#define BOOST_D_ARY_HEAP_HPP
+
+#include <vector>
+#include <cstddef>
+#include <algorithm>
+#include <utility>
+#include <cassert>
+#include <boost/static_assert.hpp>
+#include <boost/shared_array.hpp>
+#include <boost/property_map/property_map.hpp>
+
+namespace boost {
+
+  // Swap two elements in a property map without assuming they model
+  // LvaluePropertyMap -- currently not used
+  template <typename PropMap>
+  inline void property_map_swap(
+         PropMap prop_map,
+         const typename boost::property_traits<PropMap>::key_type& ka, 
+         const typename boost::property_traits<PropMap>::key_type& kb) {
+    typename boost::property_traits<PropMap>::value_type va = get(prop_map, ka);
+    put(prop_map, ka, get(prop_map, kb));
+    put(prop_map, kb, va);
+  }
+
+  namespace detail {
+    template <typename Value>
+    class fixed_max_size_vector {
+      boost::shared_array<Value> m_data;
+      std::size_t m_size;
+
+      public:
+      typedef std::size_t size_type;
+      fixed_max_size_vector(std::size_t max_size)
+        : m_data(new Value[max_size]), m_size(0) {}
+      std::size_t size() const {return m_size;}
+      bool empty() const {return m_size == 0;}
+      Value& operator[](std::size_t i) {return m_data[i];}
+      const Value& operator[](std::size_t i) const {return m_data[i];}
+      void push_back(Value v) {m_data[m_size++] = v;}
+      void pop_back() {--m_size;}
+      Value& back() {return m_data[m_size - 1];}
+      const Value& back() const {return m_data[m_size - 1];}
+    };
+  }
+
+  // D-ary heap using an indirect compare operator (use identity_property_map
+  // as DistanceMap to get a direct compare operator).  This heap appears to be
+  // commonly used for Dijkstra's algorithm for its good practical performance
+  // on some platforms; asymptotically, it has an O(lg N) decrease-key
+  // operation while that can be done in constant time on a relaxed heap.  The
+  // implementation is mostly based on the binary heap page on Wikipedia and
+  // online sources that state that the operations are the same for d-ary
+  // heaps.  This code is not based on the old Boost d-ary heap code.
+  //
+  // - d_ary_heap_indirect is a model of UpdatableQueue as is needed for
+  //   dijkstra_shortest_paths.
+  //
+  // - Value must model Assignable.
+  // - Arity must be at least 2 (optimal value appears to be 4, both in my and
+  //   third-party experiments).
+  // - IndexInHeapMap must be a ReadWritePropertyMap from Value to
+  //   Container::size_type (to store the index of each stored value within the
+  //   heap for decrease-key aka update).
+  // - DistanceMap must be a ReadablePropertyMap from Value to something
+  //   (typedef'ed as distance_type).
+  // - Compare must be a BinaryPredicate used as a less-than operator on
+  //   distance_type.
+  // - Container must be a random-access, contiguous container (in practice,
+  //   the operations used probably require that it is std::vector<Value>).
+  //
+  template <typename Value,
+            std::size_t Arity,
+            typename IndexInHeapPropertyMap,
+            typename DistanceMap,
+            typename Compare = std::less<Value>,
+            typename Container = std::vector<Value> >
+  class d_ary_heap_indirect {
+    BOOST_STATIC_ASSERT (Arity >= 2);
+
+    public:
+    typedef typename Container::size_type size_type;
+    typedef Value value_type;
+
+    d_ary_heap_indirect(DistanceMap distance,
+                        IndexInHeapPropertyMap index_in_heap,
+                        const Compare& compare = Compare(),
+                        const Container& data = Container())
+      : compare(compare), data(data), distance(distance),
+        index_in_heap(index_in_heap) {}
+    /* Implicit copy constructor */
+    /* Implicit assignment operator */
+
+    size_type size() const {
+      return data.size();
+    }
+
+    bool empty() const {
+      return data.empty();
+    }
+
+    void push(const Value& v) {
+      size_type index = data.size();
+      data.push_back(v);
+      put(index_in_heap, v, index);
+      preserve_heap_property_up(index);
+      verify_heap();
+    }
+
+    Value& top() {
+      return data[0];
+    }
+
+    const Value& top() const {
+      return data[0];
+    }
+
+    void pop() {
+      put(index_in_heap, data[0], (size_type)(-1));
+      if (data.size() != 1) {
+        data[0] = data.back();
+        put(index_in_heap, data[0], 0);
+        data.pop_back();
+        preserve_heap_property_down();
+        verify_heap();
+      } else {
+        data.pop_back();
+      }
+    }
+
+    // This function assumes the key has been updated (using an external write
+    // to the distance map or such)
+    // See http://coding.derkeiler.com/Archive/General/comp.theory/2007-05/msg00043.html
+    void update(const Value& v) { /* decrease-key */
+      size_type index = get(index_in_heap, v);
+      preserve_heap_property_up(index);
+      verify_heap();
+    }
+
+    bool contains(const Value& v) const {
+      size_type index = get(index_in_heap, v);
+      return (index != (size_type)(-1));
+    }
+
+    void push_or_update(const Value& v) { /* insert if not present, else update */
+      size_type index = get(index_in_heap, v);
+      if (index == (size_type)(-1)) {
+        index = data.size();
+        data.push_back(v);
+        put(index_in_heap, v, index);
+      }
+      preserve_heap_property_up(index);
+      verify_heap();
+    }
+
+    private:
+    Compare compare;
+    Container data;
+    DistanceMap distance;
+    IndexInHeapPropertyMap index_in_heap;
+
+    // The distances being compared using compare and that are stored in the
+    // distance map
+    typedef typename boost::property_traits<DistanceMap>::value_type distance_type;
+
+    // Get the parent of a given node in the heap
+    static size_type parent(size_type index) {
+      return (index - 1) / Arity;
+    }
+
+    // Get the child_idx'th child of a given node; 0 <= child_idx < Arity
+    static size_type child(size_type index, std::size_t child_idx) {
+      return index * Arity + child_idx + 1;
+    }
+
+    // Swap two elements in the heap by index, updating index_in_heap
+    void swap_heap_elements(size_type index_a, size_type index_b) {
+      using std::swap;
+      Value value_a = data[index_a];
+      Value value_b = data[index_b];
+      data[index_a] = value_b;
+      data[index_b] = value_a;
+      put(index_in_heap, value_a, index_b);
+      put(index_in_heap, value_b, index_a);
+    }
+
+    // Emulate the indirect_cmp that is now folded into this heap class
+    bool compare_indirect(const Value& a, const Value& b) const {
+      return compare(get(distance, a), get(distance, b));
+    }
+
+    // Verify that the array forms a heap; commented out by default
+    void verify_heap() const {
+      // This is a very expensive test so it should be disabled even when
+      // NDEBUG is not defined
+#if 0
+      for (size_t i = 1; i < data.size(); ++i) {
+        if (compare_indirect(data[i], data[parent(i)])) {
+          assert (!"Element is smaller than its parent");
+        }
+      }
+#endif
+    }
+
+    // Starting at a node, move up the tree swapping elements to preserve the
+    // heap property
+    void preserve_heap_property_up(size_type index) {
+      size_type orig_index = index;
+      size_type num_levels_moved = 0;
+      // The first loop just saves swaps that need to be done in order to avoid
+      // aliasing issues in its search; there is a second loop that does the
+      // necessary swap operations
+      if (index == 0) return; // Do nothing on root
+      Value currently_being_moved = data[index];
+      distance_type currently_being_moved_dist =
+        get(distance, currently_being_moved);
+      for (;;) {
+        if (index == 0) break; // Stop at root
+        size_type parent_index = parent(index);
+        Value parent_value = data[parent_index];
+        if (compare(currently_being_moved_dist, get(distance, parent_value))) {
+          ++num_levels_moved;
+          index = parent_index;
+          continue;
+        } else {
+          break; // Heap property satisfied
+        }
+      }
+      // Actually do the moves -- move num_levels_moved elements down in the
+      // tree, then put currently_being_moved at the top
+      index = orig_index;
+      for (size_type i = 0; i < num_levels_moved; ++i) {
+        size_type parent_index = parent(index);
+        Value parent_value = data[parent_index];
+        put(index_in_heap, parent_value, index);
+        data[index] = parent_value;
+        index = parent_index;
+      }
+      data[index] = currently_being_moved;
+      put(index_in_heap, currently_being_moved, index);
+      verify_heap();
+    }
+
+    // From the root, swap elements (each one with its smallest child) if there
+    // are any parent-child pairs that violate the heap property
+    void preserve_heap_property_down() {
+      if (data.empty()) return;
+      size_type index = 0;
+      Value currently_being_moved = data[0];
+      distance_type currently_being_moved_dist =
+        get(distance, currently_being_moved);
+      size_type heap_size = data.size();
+      Value* data_ptr = &data[0];
+      for (;;) {
+        size_type first_child_index = child(index, 0);
+        if (first_child_index >= heap_size) break; /* No children */
+        Value* child_base_ptr = data_ptr + first_child_index;
+        size_type smallest_child_index = 0;
+        distance_type smallest_child_dist = get(distance, child_base_ptr[smallest_child_index]);
+        if (first_child_index + Arity <= heap_size) {
+          // Special case for a statically known loop count (common case)
+          for (size_t i = 1; i < Arity; ++i) {
+            Value i_value = child_base_ptr[i];
+            distance_type i_dist = get(distance, i_value);
+            if (compare(i_dist, smallest_child_dist)) {
+              smallest_child_index = i;
+              smallest_child_dist = i_dist;
+            }
+          }
+        } else {
+          for (size_t i = 1; i < heap_size - first_child_index; ++i) {
+            distance_type i_dist = get(distance, child_base_ptr[i]);
+            if (compare(i_dist, smallest_child_dist)) {
+              smallest_child_index = i;
+              smallest_child_dist = i_dist;
+            }
+          }
+        }
+        if (compare(smallest_child_dist, currently_being_moved_dist)) {
+          swap_heap_elements(smallest_child_index + first_child_index, index);
+          index = smallest_child_index + first_child_index;
+          continue;
+        } else {
+          break; // Heap property satisfied
+        }
+      }
+      verify_heap();
+    }
+
+  };
+
+} // namespace boost
+
+#endif // BOOST_D_ARY_HEAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/geodesic.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/geodesic.hpp
new file mode 100644 (file)
index 0000000..99edaf9
--- /dev/null
@@ -0,0 +1,130 @@
+// (C) Copyright 2007 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_DETAIL_GEODESIC_HPP
+#define BOOST_GRAPH_DETAIL_GEODESIC_HPP
+
+#include <functional>
+#include <boost/config.hpp>
+#include <boost/graph/graph_concepts.hpp>
+#include <boost/graph/numeric_values.hpp>
+
+// TODO: Should this really be in detail?
+
+namespace boost
+{
+// This is a very good discussion on centrality measures. While I can't
+// say that this has been the motivating factor for the design and
+// implementation of ths centrality framework, it does provide a single
+// point of reference for defining things like degree and closeness
+// centrality. Plus, the bibliography seems fairly complete.
+//
+//     @article{citeulike:1144245,
+//         author = {Borgatti, Stephen  P. and Everett, Martin  G.},
+//         citeulike-article-id = {1144245},
+//         doi = {10.1016/j.socnet.2005.11.005},
+//         journal = {Social Networks},
+//         month = {October},
+//         number = {4},
+//         pages = {466--484},
+//         priority = {0},
+//         title = {A Graph-theoretic perspective on centrality},
+//         url = {http://dx.doi.org/10.1016/j.socnet.2005.11.005},
+//             volume = {28},
+//             year = {2006}
+//         }
+//     }
+
+namespace detail {
+    // Note that this assumes T == property_traits<DistanceMap>::value_type
+    // and that the args and return of combine are also T.
+    template <typename Graph,
+                typename DistanceMap,
+                typename Combinator,
+                typename Distance>
+    inline Distance
+    combine_distances(const Graph& g,
+                        DistanceMap dist,
+                        Combinator combine,
+                        Distance init)
+    {
+        function_requires< VertexListGraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+        function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+        function_requires< NumericValueConcept<Distance> >();
+        typedef numeric_values<Distance> DistanceNumbers;
+        function_requires< AdaptableBinaryFunction<Combinator,Distance,Distance,Distance> >();
+
+        // If there's ever an infinite distance, then we simply return
+        // infinity. Note that this /will/ include the a non-zero
+        // distance-to-self in the combined values. However, this is usually
+        // zero, so it shouldn't be too problematic.
+        Distance ret = init;
+        VertexIterator i, end;
+        for(tie(i, end) = vertices(g); i != end; ++i) {
+            Vertex v = *i;
+            if(get(dist, v) != DistanceNumbers::infinity()) {
+                ret = combine(ret, get(dist, v));
+            }
+            else {
+                ret = DistanceNumbers::infinity();
+                break;
+            }
+        }
+        return ret;
+    }
+
+    // Similar to std::plus<T>, but maximizes parameters
+    // rather than adding them.
+    template <typename T>
+    struct maximize : public std::binary_function<T, T, T>
+    {
+        T operator ()(T x, T y) const
+        { BOOST_USING_STD_MAX(); return max BOOST_PREVENT_MACRO_SUBSTITUTION (x, y); }
+    };
+
+    // Another helper, like maximize() to help abstract functional
+    // concepts. This is trivially instantiated for builtin numeric
+    // types, but should be specialized for those types that have
+    // discrete notions of reciprocals.
+    template <typename T>
+    struct reciprocal : public std::unary_function<T, T>
+    {
+        typedef std::unary_function<T, T> function_type;
+        typedef typename function_type::result_type result_type;
+        typedef typename function_type::argument_type argument_type;
+        T operator ()(T t)
+        { return T(1) / t; }
+    };
+} /* namespace detail */
+
+// This type defines the basic facilities used for computing values
+// based on the geodesic distances between vertices. Examples include
+// closeness centrality and mean geodesic distance.
+template <typename Graph, typename DistanceType, typename ResultType>
+struct geodesic_measure
+{
+    typedef DistanceType distance_type;
+    typedef ResultType result_type;
+    typedef typename graph_traits<Graph>::vertices_size_type size_type;
+
+    typedef numeric_values<distance_type> distance_values;
+    typedef numeric_values<result_type> result_values;
+
+    static inline distance_type infinite_distance()
+    { return distance_values::infinity(); }
+
+    static inline result_type infinite_result()
+    { return result_values::infinity(); }
+
+    static inline result_type zero_result()
+    { return result_values::zero(); }
+};
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/histogram_sort.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/histogram_sort.hpp
new file mode 100644 (file)
index 0000000..9706d25
--- /dev/null
@@ -0,0 +1,286 @@
+// Copyright 2009 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Jeremiah Willcock
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_DETAIL_HISTOGRAM_SORT_HPP
+#define BOOST_GRAPH_DETAIL_HISTOGRAM_SORT_HPP
+
+namespace boost {
+  namespace graph {
+    namespace detail {
+
+template<typename InputIterator>
+size_t
+reserve_count_for_single_pass_helper(InputIterator, InputIterator,
+                                     std::input_iterator_tag)
+{
+  // Do nothing: we have no idea how much storage to reserve.
+  return 0;
+}
+
+template<typename InputIterator>
+size_t
+reserve_count_for_single_pass_helper(InputIterator first, InputIterator last,
+                                     std::random_access_iterator_tag)
+{
+  using std::distance;
+  typename std::iterator_traits<InputIterator>::difference_type n =
+    distance(first, last);
+  return (size_t)n;
+}
+
+template<typename InputIterator>
+size_t
+reserve_count_for_single_pass(InputIterator first, InputIterator last) {
+  typedef typename std::iterator_traits<InputIterator>::iterator_category
+    category;
+  return reserve_count_for_single_pass_helper(first, last, category());
+}
+
+template <typename KeyIterator, typename RowstartIterator,
+          typename VerticesSize, typename KeyFilter, typename KeyTransform>
+void
+count_starts
+  (KeyIterator begin, KeyIterator end,
+   RowstartIterator starts, // Must support numverts + 1 elements
+   VerticesSize numkeys,
+   KeyFilter key_filter,
+   KeyTransform key_transform) {
+
+  typedef VerticesSize vertices_size_type;
+  typedef typename std::iterator_traits<RowstartIterator>::value_type EdgeIndex;
+
+  // Put the degree of each vertex v into m_rowstart[v + 1]
+  for (KeyIterator i = begin; i != end; ++i) {
+    if (key_filter(*i)) {
+      ++starts[key_transform(*i) + 1];
+    }
+  }
+
+  // Compute the partial sum of the degrees to get the actual values of
+  // m_rowstart
+  EdgeIndex start_of_this_row = 0;
+  starts[0] = start_of_this_row;
+  for (vertices_size_type i = 1; i <= numkeys; ++i) {
+    start_of_this_row += starts[i];
+    starts[i] = start_of_this_row;
+  }
+}
+
+template <typename KeyIterator, typename RowstartIterator,
+          typename NumKeys,
+          typename Value1InputIter,
+          typename Value1OutputIter, typename KeyFilter, typename KeyTransform>
+void
+histogram_sort(KeyIterator key_begin, KeyIterator key_end,
+               RowstartIterator rowstart, // Must support numkeys + 1 elements and be precomputed
+               NumKeys numkeys,
+               Value1InputIter values1_begin,
+               Value1OutputIter values1_out,
+               KeyFilter key_filter,
+               KeyTransform key_transform) {
+
+  typedef NumKeys vertices_size_type;
+  typedef typename std::iterator_traits<RowstartIterator>::value_type EdgeIndex;
+
+  // Histogram sort the edges by their source vertices, putting the targets
+  // into m_column.  The index current_insert_positions[v] contains the next
+  // location to insert out edges for vertex v.
+  std::vector<EdgeIndex>
+    current_insert_positions(rowstart, rowstart + numkeys);
+  Value1InputIter v1i = values1_begin;
+  for (KeyIterator i = key_begin; i != key_end; ++i, ++v1i) {
+    if (key_filter(*i)) {
+      vertices_size_type source = key_transform(*i);
+      EdgeIndex insert_pos = current_insert_positions[source];
+      ++current_insert_positions[source];
+      values1_out[insert_pos] = *v1i;
+    }
+  }
+}
+
+template <typename KeyIterator, typename RowstartIterator,
+          typename NumKeys,
+          typename Value1InputIter,
+          typename Value1OutputIter,
+          typename Value2InputIter,
+          typename Value2OutputIter,
+          typename KeyFilter, typename KeyTransform>
+void
+histogram_sort(KeyIterator key_begin, KeyIterator key_end,
+               RowstartIterator rowstart, // Must support numkeys + 1 elements and be precomputed
+               NumKeys numkeys,
+               Value1InputIter values1_begin,
+               Value1OutputIter values1_out,
+               Value2InputIter values2_begin,
+               Value2OutputIter values2_out,
+               KeyFilter key_filter,
+               KeyTransform key_transform) {
+
+  typedef NumKeys vertices_size_type;
+  typedef typename std::iterator_traits<RowstartIterator>::value_type EdgeIndex;
+
+  // Histogram sort the edges by their source vertices, putting the targets
+  // into m_column.  The index current_insert_positions[v] contains the next
+  // location to insert out edges for vertex v.
+  std::vector<EdgeIndex>
+    current_insert_positions(rowstart, rowstart + numkeys);
+  Value1InputIter v1i = values1_begin;
+  Value2InputIter v2i = values2_begin;
+  for (KeyIterator i = key_begin; i != key_end; ++i, ++v1i, ++v2i) {
+    if (key_filter(*i)) {
+      vertices_size_type source = key_transform(*i);
+      EdgeIndex insert_pos = current_insert_positions[source];
+      ++current_insert_positions[source];
+      values1_out[insert_pos] = *v1i;
+      values2_out[insert_pos] = *v2i;
+    }
+  }
+}
+
+template <typename KeyIterator, typename RowstartIterator,
+          typename NumKeys,
+          typename Value1Iter,
+          typename KeyTransform>
+void
+histogram_sort_inplace(KeyIterator key_begin, KeyIterator key_end,
+                       RowstartIterator rowstart, // Must support numkeys + 1 elements and be precomputed
+                       NumKeys numkeys,
+                       Value1Iter values1,
+                       KeyTransform key_transform) {
+
+  typedef NumKeys vertices_size_type;
+  typedef typename std::iterator_traits<RowstartIterator>::value_type EdgeIndex;
+
+  // 1. Copy m_rowstart (except last element) to get insert positions
+  std::vector<EdgeIndex> insert_positions(rowstart, rowstart + numkeys);
+  // 2. Swap the sources and targets into place
+  for (size_t i = 0; i < rowstart[numkeys]; ++i) {
+    // While edge i is not in the right bucket:
+    while (!(i >= rowstart[key_transform(key_begin[i])] && i < insert_positions[key_transform(key_begin[i])])) {
+      // Add a slot in the right bucket
+      size_t target_pos = insert_positions[key_transform(key_begin[i])]++;
+      assert (target_pos < rowstart[key_transform(key_begin[i]) + 1]);
+      if (target_pos == i) continue;
+      // Swap this edge into place
+      using std::swap;
+      swap(key_begin[i], key_begin[target_pos]);
+      swap(values1[i], values1[target_pos]);
+    }
+  }
+}
+
+template <typename KeyIterator, typename RowstartIterator,
+          typename NumKeys,
+          typename Value1Iter,
+          typename Value2Iter,
+          typename KeyTransform>
+void
+histogram_sort_inplace(KeyIterator key_begin, KeyIterator key_end,
+                       RowstartIterator rowstart, // Must support numkeys + 1 elements and be precomputed
+                       NumKeys numkeys,
+                       Value1Iter values1,
+                       Value2Iter values2,
+                       KeyTransform key_transform) {
+
+  typedef NumKeys vertices_size_type;
+  typedef typename std::iterator_traits<RowstartIterator>::value_type EdgeIndex;
+
+  // 1. Copy m_rowstart (except last element) to get insert positions
+  std::vector<EdgeIndex> insert_positions(rowstart, rowstart + numkeys);
+  // 2. Swap the sources and targets into place
+  for (size_t i = 0; i < rowstart[numkeys]; ++i) {
+    // While edge i is not in the right bucket:
+    while (!(i >= rowstart[key_transform(key_begin[i])] && i < insert_positions[key_transform(key_begin[i])])) {
+      // Add a slot in the right bucket
+      size_t target_pos = insert_positions[key_transform(key_begin[i])]++;
+      assert (target_pos < rowstart[key_transform(key_begin[i]) + 1]);
+      if (target_pos == i) continue;
+      // Swap this edge into place
+      using std::swap;
+      swap(key_begin[i], key_begin[target_pos]);
+      swap(values1[i], values1[target_pos]);
+      swap(values2[i], values2[target_pos]);
+    }
+  }
+}
+
+template <typename InputIterator, typename VerticesSize>
+void split_into_separate_coords(InputIterator begin, InputIterator end,
+                                std::vector<VerticesSize>& firsts,
+                                std::vector<VerticesSize>& seconds) {
+  firsts.clear();
+  seconds.clear();
+  size_t reserve_size
+    = detail::reserve_count_for_single_pass(begin, end);
+  firsts.reserve(reserve_size);
+  seconds.reserve(reserve_size);
+  for (; begin != end; ++begin) {
+    std::pair<VerticesSize, VerticesSize> edge = *begin;
+    firsts.push_back(edge.first);
+    seconds.push_back(edge.second);
+  }
+}
+
+template <typename InputIterator, typename VerticesSize, typename SourceFilter>
+void split_into_separate_coords_filtered
+  (InputIterator begin, InputIterator end,
+   std::vector<VerticesSize>& firsts,
+   std::vector<VerticesSize>& seconds,
+   const SourceFilter& filter) {
+  firsts.clear();
+  seconds.clear();
+  for (; begin != end; ++begin) {
+    std::pair<VerticesSize, VerticesSize> edge = *begin;
+    if (filter(edge.first)) {
+      firsts.push_back(edge.first);
+      seconds.push_back(edge.second);
+    }
+  }
+}
+
+template <typename InputIterator, typename PropInputIterator,
+          typename VerticesSize, typename PropType, typename SourceFilter>
+void split_into_separate_coords_filtered
+  (InputIterator begin, InputIterator end,
+   PropInputIterator props,
+   std::vector<VerticesSize>& firsts,
+   std::vector<VerticesSize>& seconds,
+   std::vector<PropType>& props_out,
+   const SourceFilter& filter) {
+  firsts.clear();
+  seconds.clear();
+  props_out.clear();
+  for (; begin != end; ++begin) {
+    std::pair<VerticesSize, VerticesSize> edge = *begin;
+    if (filter(edge.first)) {
+      firsts.push_back(edge.first);
+      seconds.push_back(edge.second);
+      props_out.push_back(*props);
+    }
+    ++props;
+  }
+}
+
+template <typename Pair>
+struct project1st {
+  typedef typename Pair::first_type result_type;
+  const result_type& operator()(const Pair& p) const {return p.first;}
+};
+
+template <typename Pair>
+struct project2nd {
+  typedef typename Pair::second_type result_type;
+  const result_type& operator()(const Pair& p) const {return p.second;}
+};
+
+    }
+  }
+}
+
+#endif // BOOST_GRAPH_DETAIL_HISTOGRAM_SORT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/incremental_components.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/incremental_components.hpp
new file mode 100644 (file)
index 0000000..b13b93d
--- /dev/null
@@ -0,0 +1,77 @@
+//=======================================================================
+// Copyright 2002 Indiana University.
+// Copyright 2009 Trustees of Indiana University.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
+#define BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
+
+#include <boost/operators.hpp>
+
+namespace boost {
+
+  namespace detail {
+
+    // Iterator for a component index linked list.  The contents of
+    // each array element represent the next index in the list.  A
+    // special value (the maximum index + 1) is used to terminate a
+    // list.
+    template <typename IndexRandomAccessIterator> 
+    class component_index_iterator :
+      boost::forward_iterator_helper<component_index_iterator<IndexRandomAccessIterator>,
+                                     typename std::iterator_traits<IndexRandomAccessIterator>::value_type,
+                                     typename std::iterator_traits<IndexRandomAccessIterator>::difference_type,
+                                     typename std::iterator_traits<IndexRandomAccessIterator>::pointer,
+                                     typename std::iterator_traits<IndexRandomAccessIterator>::reference> {
+
+    private:
+      typedef component_index_iterator<IndexRandomAccessIterator> self;
+
+    public:
+      typedef std::forward_iterator_tag iterator_category;
+      typedef typename std::iterator_traits<IndexRandomAccessIterator>::value_type value_type;
+      typedef typename std::iterator_traits<IndexRandomAccessIterator>::difference_type reference;
+      typedef typename std::iterator_traits<IndexRandomAccessIterator>::pointer pointer;
+      typedef typename std::iterator_traits<IndexRandomAccessIterator>::reference difference_type;
+
+      // Constructor for "begin" iterator
+      component_index_iterator(IndexRandomAccessIterator index_iterator,
+                               value_type begin_index) :
+        m_index_iterator(index_iterator),
+        m_current_index(begin_index) { }
+
+      // Constructor for "end" iterator (end_index should be the linked
+      // list terminator).
+      component_index_iterator(value_type end_index) :
+        m_current_index(end_index) { }
+
+      inline value_type operator*() const {
+        return (m_current_index);
+      }
+    
+      self& operator++() {
+        // Move to the next element in the linked list
+        m_current_index = m_index_iterator[m_current_index];
+        return (*this);
+      }
+
+      bool operator==(self& other_iterator) {
+        return (m_current_index == *other_iterator);
+      }
+
+    protected:
+      IndexRandomAccessIterator m_index_iterator;
+      value_type m_current_index;
+
+    }; // class component_index_iterator
+
+  } // namespace detail
+  
+} // namespace detail
+
+#endif // BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/index.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/index.hpp
new file mode 100644 (file)
index 0000000..db1152f
--- /dev/null
@@ -0,0 +1,74 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_DETAIL_INDEX_HPP
+#define BOOST_GRAPH_DETAIL_INDEX_HPP
+
+#include <boost/graph/graph_traits.hpp>
+
+// The structures in this module are responsible for selecting and defining
+// types for accessing a builting index map. Note that the selection of these
+// types requires the Graph parameter to model either VertexIndexGraph or
+// EdgeIndexGraph.
+
+namespace boost
+{
+    namespace detail
+    {
+        template <typename Graph>
+        struct vertex_indexer
+        {
+            typedef vertex_index_t index_type;
+            typedef typename property_map<Graph, vertex_index_t>::type map_type;
+            typedef typename property_map<Graph, vertex_index_t>::const_type const_map_type;
+            typedef typename property_traits<map_type>::value_type value_type;
+            typedef typename graph_traits<Graph>::vertex_descriptor key_type;
+
+            static const_map_type index_map(const Graph& g)
+            { return get(vertex_index, g); }
+
+            static map_type index_map(Graph& g)
+            { return get(vertex_index, g); }
+
+            static value_type index(key_type k, const Graph& g)
+            { return get(vertex_index, g, k); }
+        };
+
+        template <typename Graph>
+        struct edge_indexer
+        {
+            typedef edge_index_t index_type;
+            typedef typename property_map<Graph, edge_index_t>::type map_type;
+            typedef typename property_map<Graph, edge_index_t>::const_type const_map_type;
+            typedef typename property_traits<map_type>::value_type value_type;
+            typedef typename graph_traits<Graph>::edge_descriptor key_type;
+
+            static const_map_type index_map(const Graph& g)
+            { return get(edge_index, g); }
+
+            static map_type index_map(Graph& g)
+            { return get(edge_index, g); }
+
+            static value_type index(key_type k, const Graph& g)
+            { return get(edge_index, g, k); }
+        };
+
+        // NOTE: The Graph parameter MUST be a model of VertexIndexGraph or
+        // VertexEdgeGraph - whichever type Key is selecting.
+        template <typename Graph, typename Key>
+        struct choose_indexer
+        {
+            typedef typename mpl::if_<
+                    is_same<Key, typename graph_traits<Graph>::vertex_descriptor>,
+                    vertex_indexer<Graph>,
+                    edge_indexer<Graph>
+                >::type indexer_type;
+            typedef typename indexer_type::index_type index_type;
+        };
+    }
+}
+
+#endif
similarity index 70%
rename from deal.II/contrib/boost/include/boost/graph/detail/indexed_properties.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/indexed_properties.hpp
index 17bbdad1a4143823322942d33e7f6da72162426a..7fa1548e240831a79e9b6d7b7cadf5d534dcb91d 100644 (file)
@@ -50,6 +50,12 @@ protected:
   indexed_vertex_properties(std::size_t n) : m_vertex_properties(n) { }
 
 public:
+  // Clear the properties vector
+  void clear()
+  {
+    m_vertex_properties.clear();
+  }
+
   // Resize the properties vector
   void resize(std::size_t n)
   {
@@ -68,6 +74,12 @@ public:
     m_vertex_properties.push_back(prop);
   }
 
+  // Write an element by raw index
+  void write_by_index(std::size_t idx, const Property& prop)
+  {
+    m_vertex_properties[idx] = prop;
+  }
+
   // Access to the derived object
   Derived& derived() { return *static_cast<Derived*>(this); }
 
@@ -95,6 +107,7 @@ class indexed_vertex_properties<Derived, void, Descriptor>
   indexed_vertex_properties(std::size_t) { }
 
 public:
+  void clear() { }
   void resize(std::size_t) { }
   void reserve(std::size_t) { }
 };
@@ -121,6 +134,18 @@ protected:
   // Initialize with n default-constructed property values
   indexed_edge_properties(std::size_t n) : m_edge_properties(n) { }
 
+  // Get the size of the properties vector
+  std::size_t size() const
+  {
+    return m_edge_properties.size();
+  }
+
+  // Clear the properties vector
+  void clear()
+  {
+    m_edge_properties.clear();
+  }
+
   // Resize the properties vector
   void resize(std::size_t n)
   {
@@ -133,6 +158,12 @@ protected:
     m_edge_properties.reserve(n);
   }
 
+  // Write an element by raw index
+  void write_by_index(std::size_t idx, const Property& prop)
+  {
+    m_edge_properties[idx] = prop;
+  }
+
  public:
   // Add a new property value to the back
   void push_back(const Property& prop)
@@ -140,6 +171,18 @@ protected:
     m_edge_properties.push_back(prop);
   }
 
+  // Move range of properties backwards
+  void move_range(std::size_t src_begin, std::size_t src_end, std::size_t dest_begin) {
+    std::copy_backward(
+        m_edge_properties.begin() + src_begin,
+        m_edge_properties.begin() + src_end,
+        m_edge_properties.begin() + dest_begin + (src_end - src_begin));
+  }
+
+  typedef typename std::vector<Property>::iterator iterator;
+  iterator begin() {return m_edge_properties.begin();}
+  iterator end() {return m_edge_properties.end();}
+
  private:
   // Access to the derived object
   Derived& derived() { return *static_cast<Derived*>(this); }
@@ -151,6 +194,17 @@ public: // should be private, but friend templates not portable
   std::vector<Property> m_edge_properties;
 };
 
+struct dummy_no_property_iterator
+: public boost::iterator_facade<dummy_no_property_iterator, no_property, std::random_access_iterator_tag> {
+  mutable no_property prop;
+  no_property& dereference() const {return prop;}
+  bool equal(const dummy_no_property_iterator&) const {return true;}
+  void increment() {}
+  void decrement() {}
+  void advance(std::ptrdiff_t) {}
+  std::ptrdiff_t distance_to(const dummy_no_property_iterator) const {return 0;}
+};
+
 template<typename Derived, typename Descriptor>
 class indexed_edge_properties<Derived, void, Descriptor>
 {
@@ -162,16 +216,25 @@ class indexed_edge_properties<Derived, void, Descriptor>
   typedef void* edge_push_back_type;
 
   secret operator[](secret) { return secret(); }
+  void write_by_index(std::size_t idx, const no_property& prop) {}
 
  protected:
   // All operations do nothing.
   indexed_edge_properties() { }
   indexed_edge_properties(std::size_t) { }
+  std::size_t size() const {return 0;}
+  void clear() { }
   void resize(std::size_t) { }
   void reserve(std::size_t) { }
 
  public:
   void push_back(const edge_push_back_type&) { }
+  void move_range(std::size_t src_begin, std::size_t src_end, std::size_t dest_begin) {}
+
+  typedef dummy_no_property_iterator iterator;
+  iterator begin() {return dummy_no_property_iterator();}
+  iterator end() {return dummy_no_property_iterator();}
+
 };
 
 }
similarity index 72%
rename from deal.II/contrib/boost/include/boost/graph/detail/is_same.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/is_same.hpp
index 8027a47a7702e1c13642177c7cc511a4496abbf4..07330d301e980b707466786d25ddec43881e5402 100644 (file)
@@ -9,6 +9,14 @@
 #ifndef BOOST_GRAPH_DETAIL_IS_SAME_HPP
 #define BOOST_GRAPH_DETAIL_IS_SAME_HPP
 
+// Deprecate the use of this header.
+// TODO: Remove this file from trunk/release in 1.41/1.42.
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/type_traits/is_same.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/type_traits/is_same.hpp"
+#endif
+
 #include <boost/mpl/if.hpp>
 
 namespace boost {
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/labeled_graph_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/labeled_graph_traits.hpp
new file mode 100644 (file)
index 0000000..f61c24a
--- /dev/null
@@ -0,0 +1,237 @@
+// Copyright (C) 2009 Andrew Sutton
+
+// 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)
+
+#ifndef BOOST_GRAPH_LABELED_GRAPH_TRAITS_HPP
+#define BOOST_GRAPH_LABELED_GRAPH_TRAITS_HPP
+
+#include <boost/graph/graph_mutability_traits.hpp>
+
+namespace boost {
+
+// Extend the graph mutability traits (and metafunctions) to include options
+// for labeled graphs.
+
+// NOTE: the label_vertex tag denotes the fact that you can basically assign
+// arbitrary labels to vertices without modifying the actual graph.
+
+// TODO: We might also overlay the uniqueness/multiplicity of labels in this
+// hierarchy also. For now, we just assumed that labels are unique.
+
+struct label_vertex_tag { };
+struct labeled_add_vertex_tag : virtual label_vertex_tag { };
+struct labeled_add_vertex_property_tag : virtual labeled_add_vertex_tag { };
+struct labeled_remove_vertex_tag { };
+struct labeled_add_edge_tag : virtual label_vertex_tag { };
+struct labeled_add_edge_property_tag : virtual labeled_add_edge_tag{ };
+struct labeled_remove_edge_tag { };
+
+struct labeled_mutable_vertex_graph_tag
+    : virtual labeled_add_vertex_tag, virtual labeled_remove_vertex_tag
+{ };
+struct labeled_mutable_vertex_property_graph_tag
+    : virtual labeled_add_vertex_property_tag, virtual labeled_remove_vertex_tag
+{ };
+struct labeled_mutable_edge_graph_tag
+    : virtual labeled_add_edge_tag, virtual labeled_remove_edge_tag
+{ };
+struct labeled_mutable_edge_property_graph_tag
+    : virtual labeled_add_edge_property_tag, virtual labeled_remove_edge_tag
+{ };
+
+struct labeled_graph_tag
+    : virtual label_vertex_tag
+{ };
+struct labeled_mutable_graph_tag
+    : virtual labeled_mutable_vertex_graph_tag
+    , virtual labeled_mutable_edge_graph_tag
+{ };
+struct labeled_mutable_property_graph_tag
+    : virtual labeled_mutable_vertex_property_graph_tag
+    , virtual labeled_mutable_edge_property_graph_tag
+{ };
+struct labeled_add_only_property_graph_tag
+    : virtual labeled_add_vertex_property_tag
+    , virtual labeled_mutable_edge_property_graph_tag
+{ };
+
+// Metafunctions
+
+template <typename Graph>
+struct graph_has_add_vertex_by_label
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_add_vertex_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_vertex_by_label_with_property
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_add_vertex_property_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_remove_vertex_by_label
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_remove_vertex_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_edge_by_label
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_add_edge_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_edge_by_label_with_property
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_add_edge_property_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_remove_edge_by_label
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_remove_edge_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_vertex_graph
+    : mpl::and_<
+        graph_has_add_vertex_by_label<Graph>,
+        graph_has_remove_vertex_by_label<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_vertex_property_graph
+    : mpl::and_<
+        graph_has_add_vertex_by_label<Graph>,
+        graph_has_remove_vertex_by_label<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_edge_graph
+    : mpl::and_<
+        graph_has_add_edge_by_label<Graph>,
+        graph_has_remove_edge_by_label<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_edge_property_graph
+    : mpl::and_<
+        graph_has_add_edge_by_label<Graph>,
+        graph_has_remove_edge_by_label<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_graph
+    : mpl::and_<
+        is_labeled_mutable_vertex_graph<Graph>,
+        is_labeled_mutable_edge_graph<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_mutable_property_graph
+    : mpl::and_<
+        is_labeled_mutable_vertex_property_graph<Graph>,
+        is_labeled_mutable_edge_property_graph<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_add_only_property_graph
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            labeled_add_only_property_graph_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct is_labeled_graph
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            label_vertex_tag
+        >::value
+    >
+{ };
+
+template <typename> class graph_mutability_traits;
+
+namespace graph_detail {
+    // The determine mutability metafunction computes a labeled mutability tag
+    // based on the mutability of the given graph type. This is used by the
+    // graph_mutability_traits specialization below.
+    template <typename Graph>
+    struct determine_mutability {
+        typedef typename mpl::if_<
+            is_add_only_property_graph<Graph>,
+            labeled_add_only_property_graph_tag,
+            typename mpl::if_<
+                is_mutable_property_graph<Graph>,
+                labeled_mutable_property_graph_tag,
+                typename mpl::if_<
+                    is_mutable_graph<Graph>,
+                    labeled_mutable_graph_tag,
+                    typename mpl::if_<
+                        is_mutable_edge_graph<Graph>,
+                        labeled_graph_tag,
+                        typename graph_mutability_traits<Graph>::category
+                    >::type
+                >::type
+            >::type
+        >::type type;
+    };
+} // namespace graph_detail
+
+#define LABELED_GRAPH_PARAMS typename G, typename L, typename S
+#define LABELED_GRAPH labeled_graph<G,L,S>
+
+// Specialize mutability traits for for the labeled graph.
+// This specialization depends on the mutability of the underlying graph type.
+// If the underlying graph is fully mutable, this this is also fully mutable.
+// Otherwise, it's different.
+template <LABELED_GRAPH_PARAMS>
+struct graph_mutability_traits< LABELED_GRAPH > {
+    typedef typename graph_detail::determine_mutability<
+        typename LABELED_GRAPH::graph_type
+    >::type category;
+};
+
+#undef LABELED_GRAPH_PARAMS
+#undef LABELED_GRAPH
+
+} // namespace boost
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/read_graphviz_new.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/detail/read_graphviz_new.hpp
new file mode 100644 (file)
index 0000000..215f9ef
--- /dev/null
@@ -0,0 +1,116 @@
+// Copyright 2004-9 Trustees of Indiana University
+
+// 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)
+
+//
+// read_graphviz_new.hpp - 
+//   Initialize a model of the BGL's MutableGraph concept and an associated
+//  collection of property maps using a graph expressed in the GraphViz
+// DOT Language.  
+//
+//   Based on the grammar found at:
+//   http://www.graphviz.org/cvs/doc/info/lang.html
+//
+//   Jeremiah rewrite used grammar found at:
+//   http://www.graphviz.org/doc/info/lang.html
+//   and page 34 or http://www.graphviz.org/pdf/dotguide.pdf
+//
+//   See documentation for this code at: 
+//     http://www.boost.org/libs/graph/doc/read-graphviz.html
+//
+
+// Author: Jeremiah Willcock
+//         Ronald Garcia
+//
+
+#ifndef BOOST_READ_GRAPHVIZ_NEW_HPP
+#define BOOST_READ_GRAPHVIZ_NEW_HPP
+
+#include <boost/ref.hpp>
+#include <boost/property_map/dynamic_property_map.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/detail/workaround.hpp>
+#include <algorithm>
+#include <string>
+#include <vector>
+#include <set>
+#include <utility>
+#include <map>
+#include <iostream>
+#include <cstdlib>
+
+namespace boost {
+
+namespace read_graphviz_detail {
+  typedef std::string node_name;
+  typedef std::string subgraph_name;
+
+  typedef std::map<std::string, std::string> properties;
+
+  struct node_and_port {
+    node_name name;
+    std::string angle; // Or empty if no angle
+    std::vector<std::string> location; // Up to two identifiers
+
+    friend inline bool operator==(const node_and_port& a, const node_and_port& b) {
+      return a.name == b.name &&
+             a.angle == b.angle &&
+             a.location == b.location;
+    }
+
+    friend inline bool operator<(const node_and_port& a, const node_and_port& b) {
+      if (a.name != b.name) return a.name < b.name;
+      if (a.angle != b.angle) return a.angle < b.angle;
+      return a.location < b.location;
+    }
+  };
+
+  struct edge_info {
+    node_and_port source;
+    node_and_port target;
+    properties props;
+  };
+
+  struct parser_result {
+    bool graph_is_directed;
+    bool graph_is_strict;
+    std::map<node_name, properties> nodes; // Global set
+    std::vector<edge_info> edges;
+    std::map<subgraph_name, properties> graph_props; // Root and subgraphs
+  };
+
+  // The actual parser, from libs/graph/src/read_graphviz_new.cpp
+  void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed);
+
+  // Translate from those results to a graph
+  void translate_results_to_graph(const parser_result& r, ::boost::detail::graph::mutate_graph* mg);
+
+} // namespace read_graphviz_detail
+
+// This is also in boost/graph/graphviz.hpp
+namespace detail {
+  namespace graph {
+    BOOST_GRAPH_DECL bool read_graphviz(const std::string& str, boost::detail::graph::mutate_graph* mg);
+  } // end namespace graph
+} // end namespace detail
+
+template <typename MutableGraph>
+bool read_graphviz(const std::string& str,
+                   MutableGraph& graph, boost::dynamic_properties& dp,
+                   std::string const& node_id = "node_id") {
+  boost::detail::graph::mutate_graph_impl<MutableGraph> mg(graph, dp, node_id);
+  return detail::graph::read_graphviz(str, &mg);
+}
+
+template <typename InputIter, typename MutableGraph>
+bool read_graphviz(InputIter begin, InputIter end,
+                   MutableGraph& graph, boost::dynamic_properties& dp,
+                   std::string const& node_id = "node_id") {
+  return read_graphviz(std::string(begin, end), graph, dp, node_id);
+}
+
+} // namespace boost
+
+#endif // BOOST_READ_GRAPHVIZ_NEW_HPP
similarity index 89%
rename from deal.II/contrib/boost/include/boost/graph/detail/read_graphviz_spirit.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/read_graphviz_spirit.hpp
index 16224c23928292ef9f238a82aee683e1d543ee5d..815befe91f3be476881285d4755bafc480c7fe5f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2004-5 Trustees of Indiana University
+// Copyright 2004-9 Trustees of Indiana University
 
 // Distributed under the Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt or copy at
 #define BOOST_SPIRIT_CLOSURE_LIMIT 6
 
 
-#include <boost/spirit/iterator/multi_pass.hpp>
-#include <boost/spirit/core.hpp>
-#include <boost/spirit/utility/confix.hpp>
-#include <boost/spirit/utility/distinct.hpp>
-#include <boost/spirit/utility/lists.hpp>
-#include <boost/spirit/utility/escape_char.hpp>
-#include <boost/spirit/attribute.hpp>
-#include <boost/spirit/dynamic.hpp>
-#include <boost/spirit/actor.hpp>
-#include <boost/spirit/phoenix.hpp>
-#include <boost/spirit/phoenix/binders.hpp>
+#include <boost/spirit/include/classic_multi_pass.hpp>
+#include <boost/spirit/include/classic_core.hpp>
+#include <boost/spirit/include/classic_confix.hpp>
+#include <boost/spirit/include/classic_distinct.hpp>
+#include <boost/spirit/include/classic_lists.hpp>
+#include <boost/spirit/include/classic_escape_char.hpp>
+#include <boost/spirit/include/classic_attribute.hpp>
+#include <boost/spirit/include/classic_dynamic.hpp>
+#include <boost/spirit/include/classic_actor.hpp>
+#include <boost/spirit/include/classic_closure.hpp>
+#include <boost/spirit/include/phoenix1.hpp>
+#include <boost/spirit/include/phoenix1_binders.hpp>
 #include <boost/ref.hpp>
 #include <boost/function/function2.hpp>
 #include <boost/type_traits/is_same.hpp>
-#include <boost/dynamic_property_map.hpp>
+#include <boost/property_map/dynamic_property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/detail/workaround.hpp>
 #include <algorithm>
@@ -93,25 +94,25 @@ typedef std::map<id_t,edges_t> subgraph_edges_t;
 /////////////////////////////////////////////////////////////////////////////
 // Stack frames used by semantic actions
 /////////////////////////////////////////////////////////////////////////////
-struct id_closure : boost::spirit::closure<id_closure, node_t> {
+struct id_closure : boost::spirit::classic::closure<id_closure, node_t> {
   member1 name;
 };
 
 
-struct node_id_closure : boost::spirit::closure<node_id_closure, node_t> {
+struct node_id_closure : boost::spirit::classic::closure<node_id_closure, node_t> {
   member1 name;
 };
 
-struct attr_list_closure : boost::spirit::closure<attr_list_closure, actor_t> {
+struct attr_list_closure : boost::spirit::classic::closure<attr_list_closure, actor_t> {
   member1 prop_actor;
 };
 
-struct property_closure : boost::spirit::closure<property_closure, id_t, id_t> {
+struct property_closure : boost::spirit::classic::closure<property_closure, id_t, id_t> {
   member1 key;
   member2 value;
 };
 
-struct data_stmt_closure : boost::spirit::closure<data_stmt_closure,
+struct data_stmt_closure : boost::spirit::classic::closure<data_stmt_closure,
                            nodes_t,nodes_t,edge_stack_t,bool,node_t> {
   member1 sources;
   member2 dests;
@@ -120,7 +121,7 @@ struct data_stmt_closure : boost::spirit::closure<data_stmt_closure,
   member5 active_node;
 };
 
-struct subgraph_closure : boost::spirit::closure<subgraph_closure,
+struct subgraph_closure : boost::spirit::classic::closure<subgraph_closure,
                           nodes_t, edges_t, node_t> {
   member1 nodes;
   member2 edges;
@@ -132,7 +133,7 @@ struct subgraph_closure : boost::spirit::closure<subgraph_closure,
 /////////////////////////////////////////////////////////////////////////////
 
 // Grammar for a dot file.
-struct dot_grammar : public boost::spirit::grammar<dot_grammar> { 
+struct dot_grammar : public boost::spirit::classic::grammar<dot_grammar> { 
   mutate_graph& graph_;
   explicit dot_grammar(mutate_graph& graph) : graph_(graph) { }
 
@@ -141,7 +142,7 @@ struct dot_grammar : public boost::spirit::grammar<dot_grammar> {
    
     definition(dot_grammar const& self) : self(self), subgraph_depth(0),
     keyword_p("0-9a-zA-Z_") {
-      using namespace boost::spirit;
+      using namespace boost::spirit::classic;
       using namespace phoenix;
       
       // RG - Future Work
@@ -282,7 +283,7 @@ struct dot_grammar : public boost::spirit::grammar<dot_grammar> {
 
     } // definition()
 
-    typedef boost::spirit::rule<ScannerT> rule_t;
+    typedef boost::spirit::classic::rule<ScannerT> rule_t;
 
     rule_t const& start() const { return the_grammar; }
 
@@ -492,21 +493,21 @@ struct dot_grammar : public boost::spirit::grammar<dot_grammar> {
     int subgraph_depth; 
 
     // Keywords;
-    const boost::spirit::distinct_parser<> keyword_p;
+    const boost::spirit::classic::distinct_parser<> keyword_p;
     //
     // rules that make up the grammar
     //
-    boost::spirit::rule<ScannerT,id_closure::context_t> ID;
-    boost::spirit::rule<ScannerT,property_closure::context_t> a_list;
-    boost::spirit::rule<ScannerT,attr_list_closure::context_t> attr_list;
+    boost::spirit::classic::rule<ScannerT,id_closure::context_t> ID;
+    boost::spirit::classic::rule<ScannerT,property_closure::context_t> a_list;
+    boost::spirit::classic::rule<ScannerT,attr_list_closure::context_t> attr_list;
     rule_t port_location;
     rule_t port_angle;
     rule_t port;
-    boost::spirit::rule<ScannerT,node_id_closure::context_t> node_id;
-    boost::spirit::rule<ScannerT,property_closure::context_t> graph_stmt;
+    boost::spirit::classic::rule<ScannerT,node_id_closure::context_t> node_id;
+    boost::spirit::classic::rule<ScannerT,property_closure::context_t> graph_stmt;
     rule_t attr_stmt;
-    boost::spirit::rule<ScannerT,data_stmt_closure::context_t> data_stmt;
-    boost::spirit::rule<ScannerT,subgraph_closure::context_t> subgraph;
+    boost::spirit::classic::rule<ScannerT,data_stmt_closure::context_t> data_stmt;
+    boost::spirit::classic::rule<ScannerT,subgraph_closure::context_t> subgraph;
     rule_t edgeop;
     rule_t edgeRHS;
     rule_t stmt;
@@ -544,7 +545,7 @@ struct dot_grammar : public boost::spirit::grammar<dot_grammar> {
 //
 // dot_skipper - GraphViz whitespace and comment skipper
 //
-struct dot_skipper : public boost::spirit::grammar<dot_skipper>
+struct dot_skipper : public boost::spirit::classic::grammar<dot_skipper>
 {
     dot_skipper() {}
 
@@ -552,7 +553,7 @@ struct dot_skipper : public boost::spirit::grammar<dot_skipper>
     struct definition
     {
         definition(dot_skipper const& /*self*/)  {
-          using namespace boost::spirit;
+          using namespace boost::spirit::classic;
           using namespace phoenix;
           // comment forms
           skip = eol_p >> comment_p("#")  
@@ -570,8 +571,8 @@ struct dot_skipper : public boost::spirit::grammar<dot_skipper>
 #endif
         }
 
-      boost::spirit::rule<ScannerT>  skip;
-      boost::spirit::rule<ScannerT> const&
+      boost::spirit::classic::rule<ScannerT>  skip;
+      boost::spirit::classic::rule<ScannerT> const&
       start() const { return skip; }
     }; // definition
 }; // dot_skipper
@@ -584,7 +585,7 @@ bool read_graphviz(MultiPassIterator begin, MultiPassIterator end,
                    MutableGraph& graph, dynamic_properties& dp,
                    std::string const& node_id = "node_id") {
   using namespace boost;
-  using namespace boost::spirit;
+  using namespace boost::spirit::classic;
 
   typedef MultiPassIterator iterator_t;
   typedef skip_parser_iteration_policy< boost::detail::graph::dot_skipper>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/detail/self_avoiding_walk.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/self_avoiding_walk.hpp
index def0c6eef2a02a4e0744e13e0c227e137105b9f3..c171897f22860b5bd14ed93dc53e23987a10b74e 100644 (file)
@@ -29,7 +29,7 @@
 #include <utility>
 #include <boost/config.hpp>
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 #define SAW_SENTINAL -1
 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/detail/sparse_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/detail/sparse_ordering.hpp
index cf4bbb0beeec2a070335f362f3244eff8d6933e8..593d8c857921192eb39b87fd05187f7e83fc6fdb 100644 (file)
@@ -20,7 +20,7 @@
 #include <boost/graph/breadth_first_search.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/pending/indirect_cmp.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/bind.hpp>
 #include <boost/graph/iteration_macros.hpp>
 #include <boost/graph/depth_first_search.hpp>
@@ -128,7 +128,7 @@ namespace boost {
   //
   template <class Graph, class Vertex, class ColorMap, class DegreeMap>
   Vertex 
-  pseudo_peripheral_pair(Graph& G, const Vertex& u, int& ecc,
+  pseudo_peripheral_pair(Graph const& G, const Vertex& u, int& ecc,
                          ColorMap color, DegreeMap degree)
   {
     typedef typename property_traits<ColorMap>::value_type ColorValue;
@@ -152,7 +152,7 @@ namespace boost {
   // of the ordering generated by RCM.
   //
   template <class Graph, class Vertex, class Color, class Degree> 
-  Vertex find_starting_node(Graph& G, Vertex r, Color color, Degree degree)
+  Vertex find_starting_node(Graph const& G, Vertex r, Color color, Degree degree)
   {
     Vertex x, y;
     int eccen_r, eccen_x;
similarity index 60%
rename from deal.II/contrib/boost/include/boost/graph/dijkstra_shortest_paths.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/dijkstra_shortest_paths.hpp
index 243b17f752bca872f08e5b23fe67c799698a5f98..d7456734ea86ea4263ef57f9051fc3701e31841e 100644 (file)
@@ -6,6 +6,12 @@
 // accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 //=======================================================================
+//
+//
+// Revision History:
+//   04 April 2001: Added named parameter variant. (Jeremy Siek)
+//   01 April 2001: Modified to use new <boost/limits.hpp> header. (JMaddock)
+//
 #ifndef BOOST_GRAPH_DIJKSTRA_HPP
 #define BOOST_GRAPH_DIJKSTRA_HPP
 
 #include <boost/pending/indirect_cmp.hpp>
 #include <boost/graph/exception.hpp>
 #include <boost/pending/relaxed_heap.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/smart_ptr.hpp>
+#include <boost/graph/detail/d_ary_heap.hpp>
+#include <boost/graph/two_bit_color_map.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/vector_property_map.hpp>
+#include <boost/type_traits.hpp>
 
 #ifdef BOOST_GRAPH_DIJKSTRA_TESTING
 #  include <boost/pending/mutable_queue.hpp>
 
 namespace boost {
 
+  /**
+   * @brief Updates a particular value in a queue used by Dijkstra's
+   * algorithm.
+   *
+   * This routine is called by Dijkstra's algorithm after it has
+   * decreased the distance from the source vertex to the given @p
+   * vertex. By default, this routine will just call @c
+   * Q.update(vertex). However, other queues may provide more
+   * specialized versions of this routine.
+   *
+   * @param Q             the queue that will be updated.
+   * @param vertex        the vertex whose distance has been updated
+   * @param old_distance  the previous distance to @p vertex
+   */
+  template<typename Buffer, typename Vertex, typename DistanceType>
+  inline void 
+  dijkstra_queue_update(Buffer& Q, Vertex vertex, DistanceType old_distance)
+  {
+    (void)old_distance;
+    Q.update(vertex);
+  }
+
 #ifdef BOOST_GRAPH_DIJKSTRA_TESTING
+  // This is a misnomer now: it now just refers to the "default heap", which is
+  // currently d-ary (d=4) but can be changed by a #define.
   static bool dijkstra_relaxed_heap = true;
 #endif
 
@@ -90,26 +127,29 @@ namespace boost {
 
       template <class Edge, class Graph>
       void tree_edge(Edge e, Graph& g) {
-        m_decreased = relax(e, g, m_weight, m_predecessor, m_distance,
-                            m_combine, m_compare);
-        if (m_decreased)
+        bool decreased = relax(e, g, m_weight, m_predecessor, m_distance,
+                               m_combine, m_compare);
+        if (decreased)
           m_vis.edge_relaxed(e, g);
         else
           m_vis.edge_not_relaxed(e, g);
       }
       template <class Edge, class Graph>
       void gray_target(Edge e, Graph& g) {
-        m_decreased = relax(e, g, m_weight, m_predecessor, m_distance,
-                            m_combine, m_compare);
-        if (m_decreased) {
-          m_Q.update(target(e, g));
+        D old_distance = get(m_distance, target(e, g));
+
+        bool decreased = relax(e, g, m_weight, m_predecessor, m_distance,
+                               m_combine, m_compare);
+        if (decreased) {
+          dijkstra_queue_update(m_Q, target(e, g), old_distance);
           m_vis.edge_relaxed(e, g);
         } else
           m_vis.edge_not_relaxed(e, g);
       }
 
       template <class Vertex, class Graph>
-      void initialize_vertex(Vertex /*u*/, Graph& /*g*/) { }
+      void initialize_vertex(Vertex u, Graph& g)
+        { m_vis.initialize_vertex(u, g); }
       template <class Edge, class Graph>
       void non_tree_edge(Edge, Graph&) { }
       template <class Vertex, class Graph>
@@ -119,7 +159,7 @@ namespace boost {
       template <class Edge, class Graph>
       void examine_edge(Edge e, Graph& g) {
         if (m_compare(get(m_weight, e), m_zero))
-          throw negative_edge();
+            boost::throw_exception(negative_edge());
         m_vis.examine_edge(e, g);
       }
       template <class Edge, class Graph>
@@ -134,42 +174,116 @@ namespace boost {
       DistanceMap m_distance;
       BinaryFunction m_combine;
       BinaryPredicate m_compare;
-      bool m_decreased;
       D m_zero;
     };
 
   } // namespace detail
 
+  namespace detail {
+    template <class Graph, class IndexMap, class Value, bool KnownNumVertices>
+    struct vertex_property_map_generator_helper {};
+
+    template <class Graph, class IndexMap, class Value>
+    struct vertex_property_map_generator_helper<Graph, IndexMap, Value, true> {
+      typedef boost::iterator_property_map<Value*, IndexMap> type;
+      static type build(const Graph& g, const IndexMap& index, boost::scoped_array<Value>& array_holder) {
+        array_holder.reset(new Value[num_vertices(g)]);
+        std::fill(array_holder.get(), array_holder.get() + num_vertices(g), Value());
+        return make_iterator_property_map(array_holder.get(), index);
+      }
+    };
+
+    template <class Graph, class IndexMap, class Value>
+    struct vertex_property_map_generator_helper<Graph, IndexMap, Value, false> {
+      typedef boost::vector_property_map<Value, IndexMap> type;
+      static type build(const Graph& g, const IndexMap& index, boost::scoped_array<Value>& array_holder) {
+        return boost::make_vector_property_map<Value>(index);
+      }
+    };
+
+    template <class Graph, class IndexMap, class Value>
+    struct vertex_property_map_generator {
+      typedef boost::is_base_and_derived<
+                boost::vertex_list_graph_tag,
+                typename boost::graph_traits<Graph>::traversal_category>
+              known_num_vertices;
+      typedef vertex_property_map_generator_helper<Graph, IndexMap, Value, known_num_vertices::value> helper;
+      typedef typename helper::type type;
+      static type build(const Graph& g, const IndexMap& index, boost::scoped_array<Value>& array_holder) {
+        return helper::build(g, index, array_holder);
+      }
+    };
+  }
+
+  namespace detail {
+    template <class Graph, class IndexMap, bool KnownNumVertices>
+    struct default_color_map_generator_helper {};
+
+    template <class Graph, class IndexMap>
+    struct default_color_map_generator_helper<Graph, IndexMap, true> {
+      typedef boost::two_bit_color_map<IndexMap> type;
+      static type build(const Graph& g, const IndexMap& index) {
+        size_t nv = num_vertices(g);
+        return boost::two_bit_color_map<IndexMap>(nv, index);
+      }
+    };
+
+    template <class Graph, class IndexMap>
+    struct default_color_map_generator_helper<Graph, IndexMap, false> {
+      typedef boost::vector_property_map<boost::two_bit_color_type, IndexMap> type;
+      static type build(const Graph& g, const IndexMap& index) {
+        return boost::make_vector_property_map<boost::two_bit_color_type>(index);
+      }
+    };
+
+    template <class Graph, class IndexMap>
+    struct default_color_map_generator {
+      typedef boost::is_base_and_derived<
+                boost::vertex_list_graph_tag,
+                typename boost::graph_traits<Graph>::traversal_category>
+              known_num_vertices;
+      typedef default_color_map_generator_helper<Graph, IndexMap, known_num_vertices::value> helper;
+      typedef typename helper::type type;
+      static type build(const Graph& g, const IndexMap& index) {
+        return helper::build(g, index);
+      }
+    };
+  }
+
   // Call breadth first search with default color map.
-  template <class VertexListGraph, class DijkstraVisitor,
+  template <class Graph, class DijkstraVisitor,
             class PredecessorMap, class DistanceMap,
             class WeightMap, class IndexMap, class Compare, class Combine,
             class DistZero>
   inline void
   dijkstra_shortest_paths_no_init
-    (const VertexListGraph& g,
-     typename graph_traits<VertexListGraph>::vertex_descriptor s,
+    (const Graph& g,
+     typename graph_traits<Graph>::vertex_descriptor s,
      PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
      IndexMap index_map,
      Compare compare, Combine combine, DistZero zero,
      DijkstraVisitor vis)
   {
-    std::vector<default_color_type> color(num_vertices(g));
-    default_color_type c = white_color;
+    typedef
+      detail::default_color_map_generator<Graph, IndexMap>
+      ColorMapHelper;
+    typedef typename ColorMapHelper::type ColorMap;
+    ColorMap color =
+      ColorMapHelper::build(g, index_map);
     dijkstra_shortest_paths_no_init( g, s, predecessor, distance, weight,
       index_map, compare, combine, zero, vis,
-        make_iterator_property_map(&color[0], index_map, c));
+        color);
   }
 
   // Call breadth first search
-  template <class VertexListGraph, class DijkstraVisitor,
+  template <class Graph, class DijkstraVisitor,
             class PredecessorMap, class DistanceMap,
             class WeightMap, class IndexMap, class Compare, class Combine,
             class DistZero, class ColorMap>
   inline void
   dijkstra_shortest_paths_no_init
-    (const VertexListGraph& g,
-     typename graph_traits<VertexListGraph>::vertex_descriptor s,
+    (const Graph& g,
+     typename graph_traits<Graph>::vertex_descriptor s,
      PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
      IndexMap index_map,
      Compare compare, Combine combine, DistZero zero,
@@ -178,7 +292,7 @@ namespace boost {
     typedef indirect_cmp<DistanceMap, Compare> IndirectCmp;
     IndirectCmp icmp(distance, compare);
 
-    typedef typename graph_traits<VertexListGraph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
 
 #ifdef BOOST_GRAPH_DIJKSTRA_TESTING
     if (!dijkstra_relaxed_heap) {
@@ -186,7 +300,6 @@ namespace boost {
         MutableQueue;
 
       MutableQueue Q(num_vertices(g), icmp, index_map);
-
       detail::dijkstra_bfs_visitor<DijkstraVisitor, MutableQueue, WeightMap,
         PredecessorMap, DistanceMap, Combine, Compare>
       bfs_vis(vis, Q, weight, predecessor, distance, combine, compare, zero);
@@ -196,9 +309,21 @@ namespace boost {
     }
 #endif // BOOST_GRAPH_DIJKSTRA_TESTING
 
+#ifdef BOOST_GRAPH_DIJKSTRA_USE_RELAXED_HEAP
     typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue;
-
     MutableQueue Q(num_vertices(g), icmp, index_map);
+#else // Now the default: use a d-ary heap
+      boost::scoped_array<std::size_t> index_in_heap_map_holder;
+      typedef
+        detail::vertex_property_map_generator<Graph, IndexMap, std::size_t>
+        IndexInHeapMapHelper;
+      typedef typename IndexInHeapMapHelper::type IndexInHeapMap;
+      IndexInHeapMap index_in_heap =
+        IndexInHeapMapHelper::build(g, index_map, index_in_heap_map_holder);
+      typedef d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, DistanceMap, Compare>
+        MutableQueue;
+      MutableQueue Q(distance, index_in_heap, compare);
+#endif // Relaxed heap
 
     detail::dijkstra_bfs_visitor<DijkstraVisitor, MutableQueue, WeightMap,
       PredecessorMap, DistanceMap, Combine, Compare>
@@ -211,7 +336,8 @@ namespace boost {
   template <class VertexListGraph, class DijkstraVisitor,
             class PredecessorMap, class DistanceMap,
             class WeightMap, class IndexMap, class Compare, class Combine,
-            class DistInf, class DistZero>
+            class DistInf, class DistZero, typename T, typename Tag, 
+            typename Base>
   inline void
   dijkstra_shortest_paths
     (const VertexListGraph& g,
@@ -219,14 +345,14 @@ namespace boost {
      PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
      IndexMap index_map,
      Compare compare, Combine combine, DistInf inf, DistZero zero,
-     DijkstraVisitor vis)
+     DijkstraVisitor vis,
+     const bgl_named_params<T, Tag, Base>&
+     BOOST_GRAPH_ENABLE_IF_MODELS_PARM(VertexListGraph,vertex_list_graph_tag))
   {
-    std::vector<default_color_type> color(num_vertices(g));
-    default_color_type c = white_color;
+    boost::two_bit_color_map<IndexMap> color(num_vertices(g), index_map);
     dijkstra_shortest_paths(g, s, predecessor, distance, weight, index_map,
                             compare, combine, inf, zero, vis,
-                            make_iterator_property_map(&color[0], index_map,
-                                                       c));
+                            color);
   }
 
   // Initialize distances and call breadth first search
@@ -258,18 +384,37 @@ namespace boost {
                             index_map, compare, combine, zero, vis, color);
   }
 
+  // Initialize distances and call breadth first search
+  template <class VertexListGraph, class DijkstraVisitor,
+            class PredecessorMap, class DistanceMap,
+            class WeightMap, class IndexMap, class Compare, class Combine,
+            class DistInf, class DistZero>
+  inline void
+  dijkstra_shortest_paths
+    (const VertexListGraph& g,
+     typename graph_traits<VertexListGraph>::vertex_descriptor s,
+     PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
+     IndexMap index_map,
+     Compare compare, Combine combine, DistInf inf, DistZero zero,
+     DijkstraVisitor vis)
+  {
+    dijkstra_shortest_paths(g, s, predecessor, distance, weight, index_map,
+                            compare, combine, inf, zero, vis,
+                            no_named_parameters());
+  }
+
   namespace detail {
 
     // Handle defaults for PredecessorMap and
     // Distance Compare, Combine, Inf and Zero
     template <class VertexListGraph, class DistanceMap, class WeightMap,
-              class IndexMap, class Params, class ColorMap>
+              class IndexMap, class Params>
     inline void
     dijkstra_dispatch2
       (const VertexListGraph& g,
        typename graph_traits<VertexListGraph>::vertex_descriptor s,
        DistanceMap distance, WeightMap weight, IndexMap index_map,
-       const Params& params, ColorMap color)
+       const Params& params)
     {
       // Default for predecessor map
       dummy_property_map p_map;
@@ -289,17 +434,17 @@ namespace boost {
                       D()),
          choose_param(get_param(params, graph_visitor),
                       make_dijkstra_visitor(null_visitor())),
-         color);
+         params);
     }
 
     template <class VertexListGraph, class DistanceMap, class WeightMap,
-              class IndexMap, class Params, class ColorMap>
+              class IndexMap, class Params>
     inline void
     dijkstra_dispatch1
       (const VertexListGraph& g,
        typename graph_traits<VertexListGraph>::vertex_descriptor s,
        DistanceMap distance, WeightMap weight, IndexMap index_map,
-       const Params& params, ColorMap color)
+       const Params& params)
     {
       // Default for distance map
       typedef typename property_traits<WeightMap>::value_type D;
@@ -307,19 +452,11 @@ namespace boost {
         n = is_default_param(distance) ? num_vertices(g) : 1;
       std::vector<D> distance_map(n);
 
-      // Default for color map
-      typename std::vector<default_color_type>::size_type
-        m = is_default_param(color) ? num_vertices(g) : 1;
-      std::vector<default_color_type> color_map(m);
-
       detail::dijkstra_dispatch2
         (g, s, choose_param(distance, make_iterator_property_map
                             (distance_map.begin(), index_map,
                              distance_map[0])),
-         weight, index_map, params,
-         choose_param(color, make_iterator_property_map
-                      (color_map.begin(), index_map,
-                       color_map[0])));
+         weight, index_map, params);
     }
   } // namespace detail
 
@@ -338,10 +475,13 @@ namespace boost {
        get_param(params, vertex_distance),
        choose_const_pmap(get_param(params, edge_weight), g, edge_weight),
        choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
-       params,
-       get_param(params, vertex_color));
+       params);
   }
 
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/dijkstra_shortest_paths.hpp>
+#endif
+
 #endif // BOOST_GRAPH_DIJKSTRA_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/dijkstra_shortest_paths_no_color_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/dijkstra_shortest_paths_no_color_map.hpp
new file mode 100644 (file)
index 0000000..443984f
--- /dev/null
@@ -0,0 +1,249 @@
+//=======================================================================
+// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
+// Copyright 2009 Trustees of Indiana University.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_DIJKSTRA_NO_COLOR_MAP_HPP
+#define BOOST_GRAPH_DIJKSTRA_NO_COLOR_MAP_HPP
+
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/relax.hpp>
+#include <boost/pending/relaxed_heap.hpp>
+#include <boost/graph/detail/d_ary_heap.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/iteration_macros.hpp>
+
+namespace boost {
+
+  // No init version
+  template <typename Graph, typename DijkstraVisitor,
+            typename PredecessorMap, typename DistanceMap,
+            typename WeightMap, typename VertexIndexMap,
+            typename DistanceCompare, typename DistanceWeightCombine,
+            typename DistanceInfinity, typename DistanceZero>
+  void dijkstra_shortest_paths_no_color_map_no_init
+    (const Graph& graph,
+     typename graph_traits<Graph>::vertex_descriptor start_vertex,
+     PredecessorMap predecessor_map,
+     DistanceMap distance_map,
+     WeightMap weight_map,
+     VertexIndexMap index_map,
+     DistanceCompare distance_compare,
+     DistanceWeightCombine distance_weight_combine,
+     DistanceInfinity distance_infinity,
+     DistanceZero distance_zero,
+     DijkstraVisitor visitor)
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+    typedef typename property_traits<WeightMap>::value_type Weight;
+    
+    typedef indirect_cmp<DistanceMap, DistanceCompare> DistanceIndirectCompare;
+    DistanceIndirectCompare
+      distance_indirect_compare(distance_map, distance_compare);
+  
+    // Choose vertex queue type
+#if BOOST_GRAPH_DIJKSTRA_USE_RELAXED_HEAP
+    typedef relaxed_heap<Vertex, DistanceIndirectCompare, VertexIndexMap>
+      VertexQueue;
+    VertexQueue vertex_queue(num_vertices(graph),
+                             distance_indirect_compare,
+                             index_map);
+#else
+    // Default - use d-ary heap (d = 4)
+    typedef
+      detail::vertex_property_map_generator<Graph, VertexIndexMap, std::size_t>
+      IndexInHeapMapHelper;
+    typedef typename IndexInHeapMapHelper::type IndexInHeapMap;
+    typedef
+      d_ary_heap_indirect<Vertex, 4, IndexInHeapMap, DistanceMap, DistanceCompare>
+      VertexQueue;
+  
+    boost::scoped_array<std::size_t> index_in_heap_map_holder;
+    IndexInHeapMap index_in_heap =
+      IndexInHeapMapHelper::build(graph, index_map,
+                                  index_in_heap_map_holder);  
+    VertexQueue vertex_queue(distance_map, index_in_heap, distance_compare);
+#endif
+  
+    // Add vertex to the queue
+    vertex_queue.push(start_vertex);
+  
+    // Starting vertex will always be the first discovered vertex
+    visitor.discover_vertex(start_vertex, graph);
+  
+    while (!vertex_queue.empty()) {
+      Vertex min_vertex = vertex_queue.top();
+      vertex_queue.pop();
+      
+      visitor.examine_vertex(min_vertex, graph);
+  
+      // Check if any other vertices can be reached
+      Distance min_vertex_distance = get(distance_map, min_vertex);
+      
+      if (!distance_compare(min_vertex_distance, distance_infinity)) {
+        // This is the minimum vertex, so all other vertices are unreachable
+        return;
+      }
+  
+      // Examine neighbors of min_vertex
+      typedef typename graph_traits<Graph>::edge_descriptor Edge;
+      BGL_FORALL_OUTEDGES_T(min_vertex, current_edge, graph, Graph) {
+        visitor.examine_edge(current_edge, graph);
+        
+        // Check if the edge has a negative weight
+        if (distance_compare(get(weight_map, current_edge), distance_zero)) {
+          boost::throw_exception(negative_edge());
+        }
+  
+        // Extract the neighboring vertex and get its distance
+        Vertex neighbor_vertex = target(current_edge, graph);
+        Distance neighbor_vertex_distance = get(distance_map, neighbor_vertex);
+        bool is_neighbor_undiscovered = 
+          !distance_compare(neighbor_vertex_distance, distance_infinity);
+
+        // Attempt to relax the edge
+        bool was_edge_relaxed = relax(current_edge, graph, weight_map,
+          predecessor_map, distance_map,
+          distance_weight_combine, distance_compare);
+  
+        if (was_edge_relaxed) {
+          vertex_queue.update(neighbor_vertex);
+          visitor.edge_relaxed(current_edge, graph);
+        } else {
+          visitor.edge_not_relaxed(current_edge, graph);
+        }
+  
+        if (is_neighbor_undiscovered) {
+          visitor.discover_vertex(neighbor_vertex, graph);
+          vertex_queue.push(neighbor_vertex);
+        }
+      } // end out edge iteration
+  
+      visitor.finish_vertex(min_vertex, graph);
+    } // end while queue not empty
+  }
+
+  // Full init version
+  template <typename Graph, typename DijkstraVisitor,
+            typename PredecessorMap, typename DistanceMap,
+            typename WeightMap, typename VertexIndexMap,
+            typename DistanceCompare, typename DistanceWeightCombine,
+            typename DistanceInfinity, typename DistanceZero>
+  void dijkstra_shortest_paths_no_color_map
+    (const Graph& graph,
+     typename graph_traits<Graph>::vertex_descriptor start_vertex,
+     PredecessorMap predecessor_map,
+     DistanceMap distance_map,
+     WeightMap weight_map,
+     VertexIndexMap index_map,
+     DistanceCompare distance_compare,
+     DistanceWeightCombine distance_weight_combine,
+     DistanceInfinity distance_infinity,
+     DistanceZero distance_zero,
+     DijkstraVisitor visitor)
+  {
+    // Initialize vertices
+    BGL_FORALL_VERTICES_T(current_vertex, graph, Graph) {
+      visitor.initialize_vertex(current_vertex, graph);
+      
+      // Default all distances to infinity
+      put(distance_map, current_vertex, distance_infinity);
+  
+      // Default all vertex predecessors to the vertex itself
+      put(predecessor_map, current_vertex, current_vertex);
+    }
+  
+    // Set distance for start_vertex to zero
+    put(distance_map, start_vertex, distance_zero);
+  
+    // Pass everything on to the no_init version
+    dijkstra_shortest_paths_no_color_map_no_init(graph,
+      start_vertex, predecessor_map, distance_map, weight_map,
+      index_map, distance_compare, distance_weight_combine,
+      distance_infinity, distance_zero, visitor);
+  }
+
+  namespace detail {
+
+    // Handle defaults for PredecessorMap, DistanceCompare,
+    // DistanceWeightCombine, DistanceInfinity and DistanceZero
+    template <typename Graph, typename DistanceMap, typename WeightMap,
+              typename VertexIndexMap, typename Params>
+    inline void
+    dijkstra_no_color_map_dispatch2
+      (const Graph& graph,
+       typename graph_traits<Graph>::vertex_descriptor start_vertex,
+       DistanceMap distance_map, WeightMap weight_map,
+       VertexIndexMap index_map, const Params& params)
+    {
+      // Default for predecessor map
+      dummy_property_map predecessor_map;
+
+      typedef typename property_traits<DistanceMap>::value_type DistanceType;
+      dijkstra_shortest_paths_no_color_map
+        (graph, start_vertex,
+         choose_param(get_param(params, vertex_predecessor), predecessor_map),
+         distance_map, weight_map, index_map,
+         choose_param(get_param(params, distance_compare_t()),
+                      std::less<DistanceType>()),
+         choose_param(get_param(params, distance_combine_t()),
+                      closed_plus<DistanceType>()),
+         choose_param(get_param(params, distance_inf_t()),
+                      (std::numeric_limits<DistanceType>::max)()),
+         choose_param(get_param(params, distance_zero_t()),
+                      DistanceType()),
+         choose_param(get_param(params, graph_visitor),
+                      make_dijkstra_visitor(null_visitor())));
+    }
+
+    template <typename Graph, typename DistanceMap, typename WeightMap,
+              typename IndexMap, typename Params>
+    inline void
+    dijkstra_no_color_map_dispatch1
+      (const Graph& graph,
+       typename graph_traits<Graph>::vertex_descriptor start_vertex,
+       DistanceMap distance_map, WeightMap weight_map,
+       IndexMap index_map, const Params& params)
+    {
+      // Default for distance map
+      typedef typename property_traits<WeightMap>::value_type DistanceType;
+      typename std::vector<DistanceType>::size_type
+        vertex_count = is_default_param(distance_map) ? num_vertices(graph) : 1;
+        
+      std::vector<DistanceType> default_distance_map(vertex_count);
+
+      detail::dijkstra_no_color_map_dispatch2
+        (graph, start_vertex, choose_param(distance_map,
+         make_iterator_property_map(default_distance_map.begin(), index_map,
+                                    default_distance_map[0])),
+         weight_map, index_map, params);
+    }
+  } // namespace detail
+
+  // Named parameter version
+  template <typename Graph, typename Param, typename Tag, typename Rest>
+  inline void
+  dijkstra_shortest_paths_no_color_map
+    (const Graph& graph,
+     typename graph_traits<Graph>::vertex_descriptor start_vertex,
+     const bgl_named_params<Param, Tag, Rest>& params)
+  {
+    // Default for edge weight and vertex index map is to ask for them
+    // from the graph. Default for the visitor is null_visitor.
+    detail::dijkstra_no_color_map_dispatch1
+      (graph, start_vertex,
+       get_param(params, vertex_distance),
+       choose_const_pmap(get_param(params, edge_weight), graph, edge_weight),
+       choose_const_pmap(get_param(params, vertex_index), graph, vertex_index),
+       params);
+  }
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_DIJKSTRA_NO_COLOR_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/dimacs.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/dimacs.hpp
new file mode 100644 (file)
index 0000000..195ad3b
--- /dev/null
@@ -0,0 +1,309 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Alex Breuer
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DIMACS_HPP
+#define BOOST_GRAPH_DIMACS_HPP
+
+#include <string>
+#include <sstream>
+#include <iostream>
+#include <fstream>
+#include <iterator>
+#include <exception>
+#include <vector>
+#include <queue>
+
+namespace boost { namespace graph {
+
+class dimacs_exception : public std::exception {};
+
+class dimacs_basic_reader {
+public:
+  typedef std::size_t vertices_size_type;
+  typedef std::size_t edges_size_type;
+  typedef double vertex_weight_type;
+  typedef double edge_weight_type;
+  typedef std::pair<vertices_size_type,
+                    vertices_size_type> edge_type;
+  enum incr_mode {edge, edge_weight};
+
+  dimacs_basic_reader( std::istream& in, bool want_weights = true ) : 
+      inpt( in ), seen_edges( 0 ), want_weights(want_weights)
+    {
+    while( getline( inpt, buf ) && !buf.empty() && buf[0] == 'c' );
+    
+    if( buf[0] != 'p' ) {
+        boost::throw_exception(dimacs_exception());
+    }
+    
+    std::stringstream instr( buf );
+    std::string junk;
+
+    instr >> junk >> junk >> num_vertices >> num_edges;
+    read_edge_weights.push( -1 );
+    incr( edge_weight );
+  }
+
+  //for a past the end iterator
+  dimacs_basic_reader() : inpt( std::cin ), num_vertices( 0 ), 
+                          num_edges( 0 ), seen_edges( 0 ), want_weights(false) {}
+
+  edge_type edge_deref() {
+    assert( !read_edges.empty() );
+    return read_edges.front();
+   }
+
+  inline edge_type* edge_ref() {
+    assert( !read_edges.empty() );
+    return &read_edges.front();
+  }
+
+  inline edge_weight_type edge_weight_deref() {
+    assert( !read_edge_weights.empty() );
+    return read_edge_weights.front();
+  }
+
+  inline dimacs_basic_reader incr( incr_mode mode ) {
+    if( mode == edge ) {
+      assert( !read_edges.empty() );
+      read_edges.pop();
+    }
+    else if( mode == edge_weight ) {
+      assert( !read_edge_weights.empty() );
+      read_edge_weights.pop();
+    }
+
+    if( (mode == edge && read_edges.empty()) ||
+        (mode == edge_weight && read_edge_weights.empty() )) {
+
+      if( seen_edges > num_edges ) {
+          boost::throw_exception(dimacs_exception());
+      }
+
+      while( getline( inpt, buf ) && !buf.empty() && buf[0] == 'c' );
+      
+      if( !inpt.eof() ) {
+          int source, dest, weight;
+          read_edge_line((char*) buf.c_str(), source, dest, weight);
+
+          seen_edges++;
+          source--;
+          dest--;
+        
+          read_edges.push( edge_type( source, dest ) );
+          if (want_weights) {
+              read_edge_weights.push( weight );
+          }
+      }
+      assert( read_edges.size() < 100 );
+      assert( read_edge_weights.size() < 100 );
+    }
+
+    // the 1000000 just happens to be about how many edges can be read in 
+    // 10s
+//     if( !(seen_edges % 1000000) && !process_id( pg ) && mode == edge ) {
+//       std::cout << "read " << seen_edges << " edges" << std::endl;
+//     }
+    return *this;
+  }
+
+  inline bool done_edges() {
+    return inpt.eof() && read_edges.size() == 0;
+  }
+
+  inline bool done_edge_weights() {
+    return inpt.eof() && read_edge_weights.size() == 0;
+  }
+
+  inline vertices_size_type n_vertices() {
+    return num_vertices;
+  }
+  
+  inline vertices_size_type processed_edges() {
+    return seen_edges - read_edges.size();
+  }
+
+  inline vertices_size_type processed_edge_weights() {
+    return seen_edges - read_edge_weights.size();
+  }
+
+  inline vertices_size_type n_edges() {
+    return num_edges;
+  }
+
+protected:
+    bool read_edge_line(char *linebuf, int &from, int &to, int &weight)
+    {
+        char *fs = NULL, *ts = NULL, *ws = NULL;
+        char *tmp = linebuf + 2;
+
+        fs = tmp;
+        if ('e' == linebuf[0]) {
+            while (*tmp != '\n' && *tmp != '\0') {
+                if (*tmp == ' ') { 
+                    *tmp = '\0';
+                    ts = ++tmp;
+                    break;
+                }
+                tmp++;
+            }
+            *tmp = '\0';
+            if (NULL == fs || NULL == ts) return false;
+            from = atoi(fs); to = atoi(ts); weight = 0;
+
+        } else if ('a' == linebuf[0]) {
+            while (*tmp != '\n' && *tmp != '\0') {
+                if (*tmp == ' ') { 
+                    *tmp = '\0';
+                    ts = ++tmp;
+                    break;
+                }
+                tmp++;
+            } 
+            while (*tmp != '\n' && *tmp != '\0') {
+                if (*tmp == ' ') { 
+                    *tmp = '\0';
+                    ws = ++tmp;
+                    break;
+                }
+                tmp++;
+            }
+            while (*tmp != '\n' && *tmp != '\0') tmp++;
+            *tmp = '\0';
+            if (fs == NULL || ts == NULL || ws == NULL) return false;
+            from = atoi(fs); to = atoi(ts) ; 
+            if (want_weights) weight = atoi(ws); else weight = 0;
+
+        } else {
+            return false;
+        }
+
+        return true;
+    }
+
+  std::queue<edge_type> read_edges;
+  std::queue<edge_weight_type> read_edge_weights;
+
+  std::istream& inpt;
+  std::string buf;
+  vertices_size_type num_vertices, num_edges, seen_edges;
+  bool want_weights;
+};
+
+template<typename T>
+class dimacs_edge_iterator {
+public:
+  typedef dimacs_basic_reader::edge_type edge_type;
+  typedef dimacs_basic_reader::incr_mode incr_mode;
+
+  typedef std::input_iterator_tag iterator_category;
+  typedef edge_type               value_type;
+  typedef value_type              reference;
+  typedef edge_type*              pointer;
+  typedef std::ptrdiff_t          difference_type;
+
+  dimacs_edge_iterator( T& reader ) :
+    reader( reader ) {}
+
+  inline dimacs_edge_iterator& operator++() {
+    reader.incr( dimacs_basic_reader::edge );
+    return *this;
+  }
+
+  inline edge_type operator*() {
+    return reader.edge_deref();
+  }
+
+  inline edge_type* operator->() {
+    return reader.edge_ref();
+  }
+
+  // don't expect this to do the right thing if you're not comparing against a
+  // general past-the-end-iterator made with the default constructor for 
+  // dimacs_basic_reader
+  inline bool operator==( dimacs_edge_iterator arg ) {
+    if( reader.n_vertices() == 0 ) {
+      return arg.reader.done_edges();
+    }
+    else if( arg.reader.n_vertices() == 0 ) {
+      return reader.done_edges();
+    }
+    else {
+      return false;
+    }
+    return false;
+  }
+
+  inline bool operator!=( dimacs_edge_iterator arg ) {
+    if( reader.n_vertices() == 0 ) {
+      return !arg.reader.done_edges();
+    }
+    else if( arg.reader.n_vertices() == 0 ) {
+      return !reader.done_edges();
+    }
+    else {
+      return true;
+    }
+    return true;
+  }
+
+private:
+  T& reader;
+};
+
+template<typename T>
+class dimacs_edge_weight_iterator {
+public:
+  typedef dimacs_basic_reader::edge_weight_type edge_weight_type;
+  typedef dimacs_basic_reader::incr_mode incr_mode;
+
+  dimacs_edge_weight_iterator( T& reader ) : reader( reader ) {}
+
+  inline dimacs_edge_weight_iterator& operator++() {
+    reader.incr( dimacs_basic_reader::edge_weight );
+    return *this;
+  }
+
+  inline edge_weight_type operator*() {
+    return reader.edge_weight_deref();
+  }
+
+  // don't expect this to do the right thing if you're not comparing against a
+  // general past-the-end-iterator made with the default constructor for 
+  // dimacs_basic_reader
+  inline bool operator==( dimacs_edge_weight_iterator arg ) {
+    if( reader.n_vertices() == 0 ) {
+      return arg.reader.done_edge_weights();
+    }
+    else if( arg.reader.n_vertices() == 0 ) {
+      return reader.done_edge_weights();
+    }
+    else {
+      return false;
+    }
+    return false;
+  }
+
+  inline bool operator!=( dimacs_edge_weight_iterator arg ) {
+    if( reader.n_vertices() == 0 ) {
+      return !arg.reader.done_edge_weights();
+    }
+    else if( arg.reader.n_vertices() == 0 ) {
+      return !reader.done_edge_weights();
+    }
+    else {
+      return true;
+    }
+    return true;
+  }
+private:
+  T& reader;
+};
+
+} } // end namespace boost::graph
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/directed_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/directed_graph.hpp
new file mode 100644 (file)
index 0000000..28b085d
--- /dev/null
@@ -0,0 +1,678 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_DIRECTED_GRAPH_HPP
+#define BOOST_GRAPH_DIRECTED_GRAPH_HPP
+
+#include <boost/utility.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/properties.hpp>
+
+namespace boost
+{
+struct directed_graph_tag { };
+
+/**
+ * The directed_graph class template is a simplified version of the BGL
+ * adjacency list. This class is provided for ease of use, but may not
+ * perform as well as custom-defined adjacency list classes. Instances of
+ * this template model the BidirectionalGraph, VertexIndexGraph, and
+ * EdgeIndexGraph concepts. The graph is also fully mutable, supporting
+ * both insertions and removals of vertices and edges.
+ *
+ * @note Special care must be taken when removing vertices or edges since
+ * those operations can invalidate the numbering of vertices.
+ */
+template <
+    typename VertexProp = no_property,
+    typename EdgeProp= no_property,
+    typename GraphProp= no_property>
+class directed_graph
+{
+public:
+    typedef typename graph_detail::vertex_prop<VertexProp>::type vertex_property_type;
+    typedef typename graph_detail::vertex_prop<VertexProp>::bundle vertex_bundled;
+    typedef typename graph_detail::edge_prop<EdgeProp>::type edge_property_type;
+    typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
+
+private:
+    // Wrap the user-specified properties with an index.
+    typedef property<vertex_index_t, unsigned, vertex_property_type> vertex_property;
+    typedef property<edge_index_t, unsigned, edge_property_type> edge_property;
+
+public:
+    typedef adjacency_list<
+        listS, listS, bidirectionalS,
+        vertex_property, edge_property, GraphProp,
+        listS
+    > graph_type;
+
+private:
+    // storage selectors
+    typedef typename graph_type::vertex_list_selector vertex_list_selector;
+    typedef typename graph_type::edge_list_selector edge_list_selector;
+    typedef typename graph_type::out_edge_list_selector out_edge_list_selector;
+    typedef typename graph_type::directed_selector directed_selector;
+
+public:
+    typedef directed_graph_tag graph_tag;
+    typedef typename graph_type::graph_property_type graph_property_type;
+
+    // more commonly used graph types
+    typedef typename graph_type::stored_vertex stored_vertex;
+    typedef typename graph_type::vertices_size_type vertices_size_type;
+    typedef typename graph_type::edges_size_type edges_size_type;
+    typedef typename graph_type::degree_size_type degree_size_type;
+    typedef typename graph_type::vertex_descriptor vertex_descriptor;
+    typedef typename graph_type::edge_descriptor edge_descriptor;
+
+    // iterator types
+    typedef typename graph_type::vertex_iterator vertex_iterator;
+    typedef typename graph_type::edge_iterator edge_iterator;
+    typedef typename graph_type::out_edge_iterator out_edge_iterator;
+    typedef typename graph_type::in_edge_iterator in_edge_iterator;
+    typedef typename graph_type::adjacency_iterator adjacency_iterator;
+
+    // miscellaneous types
+    typedef typename graph_type::directed_category directed_category;
+    typedef typename graph_type::edge_parallel_category edge_parallel_category;
+    typedef typename graph_type::traversal_category traversal_category;
+
+    typedef unsigned vertex_index_type;
+    typedef unsigned edge_index_type;
+
+    directed_graph(GraphProp const& p = GraphProp())
+        : m_graph(p), m_num_vertices(0), m_num_edges(0), m_max_vertex_index(0)
+        , m_max_edge_index(0)
+    { }
+
+    directed_graph(directed_graph const& x)
+        : m_graph(x), m_num_vertices(x.m_num_vertices), m_num_edges(x.m_num_edges)
+        , m_max_vertex_index(x.m_max_vertex_index), m_max_edge_index(x.m_max_edge_index)
+    { }
+
+    directed_graph(vertices_size_type n, GraphProp const& p = GraphProp())
+        : m_graph(n, p), m_num_vertices(n), m_num_edges(0), m_max_vertex_index(n)
+        , m_max_edge_index(0)
+    { renumber_vertex_indices(); }
+
+    template <typename EdgeIterator>
+    directed_graph(EdgeIterator f,
+                   EdgeIterator l,
+                   vertices_size_type n,
+                   edges_size_type m = 0,
+                   GraphProp const& p = GraphProp())
+        : m_graph(f, l, n, m, p), m_num_vertices(n), m_num_edges(0)
+        , m_max_vertex_index(n), m_max_edge_index(0)
+    {
+        // Unfortunately, we have to renumber the entire graph.
+        renumber_indices();
+
+        // Can't always guarantee that the number of edges is actually
+        // m if distance(f, l) != m (or is undefined).
+        m_num_edges = m_max_edge_index = boost::num_edges(m_graph);
+    }
+
+    directed_graph& operator=(directed_graph const& g) {
+        if(&g != this) {
+            m_graph = g.m_graph;
+            m_num_vertices = g.m_num_vertices;
+            m_num_edges = g.m_num_edges;
+            m_max_vertex_index = g.m_max_vertex_index;
+            m_max_edge_index = g.m_max_edge_index;
+        }
+        return *this;
+    }
+
+    // The impl_() methods are not part of the public interface.
+    graph_type& impl()
+    { return m_graph; }
+
+    graph_type const& impl() const
+    { return m_graph; }
+
+    // The following methods are not part of the public interface
+    vertices_size_type num_vertices() const
+    { return m_num_vertices; }
+
+private:
+    // This helper function manages the attribution of vertex indices.
+    vertex_descriptor make_index(vertex_descriptor v) {
+        boost::put(vertex_index, m_graph, v, m_max_vertex_index);
+        m_num_vertices++;
+        m_max_vertex_index++;
+        return v;
+    }
+public:
+    vertex_descriptor add_vertex()
+    { return make_index(boost::add_vertex(m_graph)); }
+
+    vertex_descriptor add_vertex(vertex_property_type const& p)
+    { return make_index(boost::add_vertex(vertex_property(0u, p), m_graph)); }
+
+    void clear_vertex(vertex_descriptor v)
+    {
+        m_num_edges -= boost::degree(v, m_graph);
+        boost::clear_vertex(v, m_graph);
+    }
+
+    void remove_vertex(vertex_descriptor v)
+    {
+        boost::remove_vertex(v, m_graph);
+        --m_num_vertices;
+    }
+
+    edges_size_type num_edges() const
+    { return m_num_edges; }
+
+private:
+    // A helper fucntion for managing edge index attributes.
+    std::pair<edge_descriptor, bool> const&
+    make_index(std::pair<edge_descriptor, bool> const& x)
+    {
+        if(x.second) {
+            boost::put(edge_index, m_graph, x.first, m_max_edge_index);
+            ++m_num_edges;
+            ++m_max_edge_index;
+        }
+        return x;
+    }
+public:
+    std::pair<edge_descriptor, bool>
+    add_edge(vertex_descriptor u, vertex_descriptor v)
+    { return make_index(boost::add_edge(u, v, m_graph)); }
+
+    std::pair<edge_descriptor, bool>
+    add_edge(vertex_descriptor u, vertex_descriptor v, edge_property_type const& p)
+    { return make_index(boost::add_edge(u, v, edge_property(0u, p), m_graph)); }
+
+    void remove_edge(vertex_descriptor u, vertex_descriptor v)
+    {
+        // find all edges, (u, v)
+        std::vector<edge_descriptor> edges;
+        out_edge_iterator i, i_end;
+        for(tie(i, i_end) = boost::out_edges(u, m_graph); i != i_end; ++i) {
+            if(boost::target(*i, m_graph) == v) {
+                edges.push_back(*i);
+            }
+        }
+        // remove all edges, (u, v)
+        typename std::vector<edge_descriptor>::iterator
+        j = edges.begin(), j_end = edges.end();
+        for( ; j != j_end; ++j) {
+            remove_edge(*j);
+        }
+    }
+
+    void remove_edge(edge_iterator i)
+    {
+        remove_edge(*i);
+    }
+
+    void remove_edge(edge_descriptor e)
+    {
+        boost::remove_edge(e, m_graph);
+        --m_num_edges;
+    }
+
+    vertex_index_type max_vertex_index() const
+    { return m_max_vertex_index; }
+
+    void
+    renumber_vertex_indices()
+    {
+        vertex_iterator i, end;
+        tie(i, end) = vertices(m_graph);
+        m_max_vertex_index = renumber_vertex_indices(i, end, 0);
+    }
+
+    void
+    remove_vertex_and_renumber_indices(vertex_iterator i)
+    {
+        vertex_iterator j = next(i), end = vertices(m_graph).second;
+        vertex_index_type n = get(vertex_index, m_graph, *i);
+
+        // remove the offending vertex and renumber everything after
+        remove_vertex(*i);
+        m_max_vertex_index = renumber_vertex_indices(j, end, n);
+    }
+
+    edge_index_type
+    max_edge_index() const
+    { return m_max_edge_index; }
+
+    void
+    renumber_edge_indices()
+    {
+        edge_iterator i, end;
+        tie(i, end) = edges(m_graph);
+        m_max_edge_index = renumber_edge_indices(i, end, 0);
+    }
+
+    void
+    remove_edge_and_renumber_indices(edge_iterator i)
+    {
+        edge_iterator j = next(i), end = edges(m_graph).second;
+        edge_index_type n = get(edge_index, m_graph, *i);
+
+        // remove the offending edge and renumber everything after
+        remove_edge(*i);
+        m_max_edge_index = renumber_edge_indices(j, end, n);
+    }
+
+    void
+    renumber_indices()
+    {
+        renumber_vertex_indices();
+        renumber_edge_indices();
+    }
+
+    // bundled property support
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+    vertex_bundled& operator[](vertex_descriptor v)
+    { return m_graph[v]; }
+
+    vertex_bundled const& operator[](vertex_descriptor v) const
+    { return m_graph[v]; }
+
+    edge_bundled& operator[](edge_descriptor e)
+    { return m_graph[e]; }
+
+    edge_bundled const& operator[](edge_descriptor e) const
+    { return m_graph[e]; }
+#endif
+
+    // Graph concepts
+    static vertex_descriptor null_vertex()
+    { return graph_type::null_vertex(); }
+
+    void clear()
+    {
+        m_graph.clear();
+        m_num_vertices = m_max_vertex_index = 0;
+        m_num_edges = m_max_edge_index = 0;
+    }
+
+    void swap(directed_graph& g)
+    {
+        m_graph.swap(g);
+        std::swap(m_num_vertices, g.m_num_vertices);
+        std::swap(m_max_vertex_index, g.m_max_vertex_index);
+        std::swap(m_num_edges, g.m_num_edges);
+        std::swap(m_max_edge_index, g.m_max_edge_index);
+    }
+
+private:
+    vertices_size_type
+    renumber_vertex_indices(vertex_iterator i,
+                            vertex_iterator end,
+                            vertices_size_type n)
+    {
+        typedef typename property_map<graph_type, vertex_index_t>::type IndexMap;
+        IndexMap indices = get(vertex_index, m_graph);
+        for( ; i != end; ++i) {
+            indices[*i] = n++;
+        }
+        return n;
+    }
+
+    vertices_size_type
+    renumber_edge_indices(edge_iterator i,
+                        edge_iterator end,
+                        vertices_size_type n)
+    {
+        typedef typename property_map<graph_type, edge_index_t>::type IndexMap;
+        IndexMap indices = get(edge_index, m_graph);
+        for( ; i != end; ++i) {
+            indices[*i] = n++;
+        }
+        return n;
+    }
+
+    graph_type m_graph;
+    vertices_size_type m_num_vertices;
+    edges_size_type m_num_edges;
+    vertex_index_type m_max_vertex_index;
+    edge_index_type m_max_edge_index;
+};
+
+#define DIRECTED_GRAPH_PARAMS typename VP, typename EP, typename GP
+#define DIRECTED_GRAPH directed_graph<VP,EP,GP>
+
+// IncidenceGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertex_descriptor
+source(typename DIRECTED_GRAPH::edge_descriptor e,
+    DIRECTED_GRAPH const& g)
+{ return source(e, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertex_descriptor
+target(typename DIRECTED_GRAPH::edge_descriptor e,
+    DIRECTED_GRAPH const& g)
+{ return target(e, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::degree_size_type
+out_degree(typename DIRECTED_GRAPH::vertex_descriptor v, DIRECTED_GRAPH const& g)
+{ return out_degree(v, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename DIRECTED_GRAPH::out_edge_iterator,
+    typename DIRECTED_GRAPH::out_edge_iterator
+>
+out_edges(typename DIRECTED_GRAPH::vertex_descriptor v,
+        DIRECTED_GRAPH const& g)
+{ return out_edges(v, g.impl()); }
+
+// BidirectionalGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::degree_size_type
+in_degree(typename DIRECTED_GRAPH::vertex_descriptor v, DIRECTED_GRAPH const& g)
+{ return in_degree(v, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename DIRECTED_GRAPH::in_edge_iterator,
+    typename DIRECTED_GRAPH::in_edge_iterator
+>
+in_edges(typename DIRECTED_GRAPH::vertex_descriptor v,
+        DIRECTED_GRAPH const& g)
+{ return in_edges(v, g.impl()); }
+
+
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::degree_size_type
+degree(typename DIRECTED_GRAPH::vertex_descriptor v, DIRECTED_GRAPH const& g)
+{ return degree(v, g.impl()); }
+
+// AdjacencyGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename DIRECTED_GRAPH::adjacency_iterator,
+    typename DIRECTED_GRAPH::adjacency_iterator
+    >
+adjacent_vertices(typename DIRECTED_GRAPH::vertex_descriptor v,
+                  DIRECTED_GRAPH const& g)
+{ return adjacent_vertices(v, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+typename DIRECTED_GRAPH::vertex_descriptor
+vertex(typename DIRECTED_GRAPH::vertices_size_type n,
+       DIRECTED_GRAPH const& g)
+{ return vertex(g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS>
+std::pair<typename DIRECTED_GRAPH::edge_descriptor, bool>
+edge(typename DIRECTED_GRAPH::vertex_descriptor u,
+     typename DIRECTED_GRAPH::vertex_descriptor v,
+     DIRECTED_GRAPH const& g)
+{ return edge(u, v, g.impl()); }
+
+// VertexListGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertices_size_type
+num_vertices(DIRECTED_GRAPH const& g)
+{ return g.num_vertices(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename DIRECTED_GRAPH::vertex_iterator,
+    typename DIRECTED_GRAPH::vertex_iterator
+>
+vertices(DIRECTED_GRAPH const& g)
+{ return vertices(g.impl()); }
+
+// EdgeListGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::edges_size_type
+num_edges(DIRECTED_GRAPH const& g)
+{ return g.num_edges(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename DIRECTED_GRAPH::edge_iterator,
+    typename DIRECTED_GRAPH::edge_iterator
+>
+edges(DIRECTED_GRAPH const& g)
+{ return edges(g.impl()); }
+
+// MutableGraph concepts
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertex_descriptor
+add_vertex(DIRECTED_GRAPH& g)
+{ return g.add_vertex(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertex_descriptor
+add_vertex(typename DIRECTED_GRAPH::vertex_property_type const& p,
+           DIRECTED_GRAPH& g)
+{ return g.add_vertex(p); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+clear_vertex(typename DIRECTED_GRAPH::vertex_descriptor v,
+DIRECTED_GRAPH& g)
+{ return g.clear_vertex(v); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+remove_vertex(typename DIRECTED_GRAPH::vertex_descriptor v,
+              DIRECTED_GRAPH& g)
+{ return g.remove_vertex(v); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<typename DIRECTED_GRAPH::edge_descriptor, bool>
+add_edge(typename DIRECTED_GRAPH::vertex_descriptor u,
+         typename DIRECTED_GRAPH::vertex_descriptor v,
+         DIRECTED_GRAPH& g)
+{ return g.add_edge(u, v); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline std::pair<typename DIRECTED_GRAPH::edge_descriptor, bool>
+add_edge(typename DIRECTED_GRAPH::vertex_descriptor u,
+         typename DIRECTED_GRAPH::vertex_descriptor v,
+         typename DIRECTED_GRAPH::edge_property_type const& p,
+         DIRECTED_GRAPH& g)
+{ return g.add_edge(u, v, p); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void remove_edge(typename DIRECTED_GRAPH::vertex_descriptor u,
+                        typename DIRECTED_GRAPH::vertex_descriptor v,
+                        DIRECTED_GRAPH& g)
+{ return g.remove_edge(u, v); }
+
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void remove_edge(typename DIRECTED_GRAPH::edge_descriptor e, DIRECTED_GRAPH& g)
+{ return g.remove_edge(e); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void remove_edge(typename DIRECTED_GRAPH::edge_iterator i, DIRECTED_GRAPH& g)
+{ return g.remove_edge(i); }
+
+template <DIRECTED_GRAPH_PARAMS, class Predicate>
+inline void remove_edge_if(Predicate pred, DIRECTED_GRAPH& g)
+{ return remove_edge_if(pred, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS, class Predicate>
+inline void
+remove_out_edge_if(typename DIRECTED_GRAPH::vertex_descriptor v,
+                   Predicate pred,
+                   DIRECTED_GRAPH& g)
+{ return remove_out_edge_if(v, pred, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS, class Predicate>
+inline void
+remove_in_edge_if(typename DIRECTED_GRAPH::vertex_descriptor v,
+                Predicate pred,
+                DIRECTED_GRAPH& g)
+{ return remove_in_edge_if(v, pred, g.impl()); }
+
+// Helper code for working with property maps
+namespace detail
+{
+    struct directed_graph_vertex_property_selector {
+        template <class DirectedGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename DirectedGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+
+    struct directed_graph_edge_property_selector {
+        template <class DirectedGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename DirectedGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+}
+
+template <>
+struct vertex_property_selector<directed_graph_tag>
+{ typedef detail::directed_graph_vertex_property_selector type; };
+
+template <>
+struct edge_property_selector<directed_graph_tag>
+{ typedef detail::directed_graph_edge_property_selector type; };
+
+// PropertyGraph concepts
+template <DIRECTED_GRAPH_PARAMS, typename Property>
+inline typename property_map<DIRECTED_GRAPH, Property>::type
+get(Property p, DIRECTED_GRAPH& g)
+{ return get(p, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS, typename Property>
+inline typename property_map<DIRECTED_GRAPH, Property>::const_type
+get(Property p, DIRECTED_GRAPH const& g)
+{ return get(p, g.impl()); }
+
+template <DIRECTED_GRAPH_PARAMS, typename Property, typename Key>
+inline typename property_traits<
+    typename property_map<
+        typename DIRECTED_GRAPH::graph_type, Property
+    >::const_type
+>::value_type
+get(Property p, DIRECTED_GRAPH const& g, Key const& k)
+{ return get(p, g.impl(), k); }
+
+template <DIRECTED_GRAPH_PARAMS, typename Property, typename Key, typename Value>
+inline void put(Property p, DIRECTED_GRAPH& g, Key const& k, Value const& v)
+{ put(p, g.impl(), k, v); }
+
+template <DIRECTED_GRAPH_PARAMS, class Property>
+typename graph_property<DIRECTED_GRAPH, Property>::type&
+get_property(DIRECTED_GRAPH& g, Property p)
+{ return get_property(g.impl(), p); }
+
+template <DIRECTED_GRAPH_PARAMS, class Property>
+typename graph_property<DIRECTED_GRAPH, Property>::type const&
+get_property(DIRECTED_GRAPH const& g, Property p)
+{ return get_property(g.impl(), p); }
+
+template <DIRECTED_GRAPH_PARAMS, class Property, class Value>
+void
+set_property(DIRECTED_GRAPH& g, Property p, Value v)
+{ return set_property(g.impl(), p, v); }
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+
+template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
+inline typename property_map<DIRECTED_GRAPH, Type Bundle::*>::type
+get(Type Bundle::* p, DIRECTED_GRAPH& g) {
+    typedef typename property_map<
+        DIRECTED_GRAPH, Type Bundle::*
+    >::type return_type;
+    return return_type(&g, p);
+}
+
+template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
+inline typename property_map<DIRECTED_GRAPH, Type Bundle::*>::const_type
+get(Type Bundle::* p, DIRECTED_GRAPH const& g) {
+    typedef typename property_map<
+        DIRECTED_GRAPH, Type Bundle::*
+    >::const_type return_type;
+    return return_type(&g, p);
+}
+
+template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key>
+inline Type get(Type Bundle::* p, DIRECTED_GRAPH const& g, Key const& k)
+{ return get(p, g.impl(), k); }
+
+template <DIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key, typename Value>
+inline void put(Type Bundle::* p, DIRECTED_GRAPH& g, Key const& k, Value const& v)
+{ put(p, g.impl(), k, v); }
+#endif
+
+// Vertex index management
+
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::vertex_index_type
+get_vertex_index(typename DIRECTED_GRAPH::vertex_descriptor v,
+                DIRECTED_GRAPH const& g)
+{ return get(vertex_index, g, v); }
+
+template <DIRECTED_GRAPH_PARAMS>
+typename DIRECTED_GRAPH::vertex_index_type
+max_vertex_index(DIRECTED_GRAPH const& g)
+{ return g.max_vertex_index(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+renumber_vertex_indices(DIRECTED_GRAPH& g)
+{ g.renumber_vertex_indices(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+remove_vertex_and_renumber_indices(typename DIRECTED_GRAPH::vertex_iterator i,
+                                DIRECTED_GRAPH& g)
+{ g.remove_vertex_and_renumber_indices(i); }
+
+// Edge index management
+template <DIRECTED_GRAPH_PARAMS>
+inline typename DIRECTED_GRAPH::edge_index_type
+get_edge_index(typename DIRECTED_GRAPH::edge_descriptor v, DIRECTED_GRAPH const& g)
+{ return get(edge_index, g, v); }
+
+template <DIRECTED_GRAPH_PARAMS>
+typename DIRECTED_GRAPH::edge_index_type
+max_edge_index(DIRECTED_GRAPH const& g)
+{ return g.max_edge_index(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void renumber_edge_indices(DIRECTED_GRAPH& g)
+{ g.renumber_edge_indices(); }
+
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+remove_edge_and_renumber_indices(typename DIRECTED_GRAPH::edge_iterator i,
+                                 DIRECTED_GRAPH& g)
+{ g.remove_edge_and_renumber_indices(i); }
+
+// Index management
+template <DIRECTED_GRAPH_PARAMS>
+inline void
+renumber_indices(DIRECTED_GRAPH& g)
+{ g.renumber_indices(); }
+
+// Mutability Traits
+template <DIRECTED_GRAPH_PARAMS>
+struct graph_mutability_traits<DIRECTED_GRAPH> {
+    typedef mutable_property_graph_tag category;
+};
+
+#undef DIRECTED_GRAPH_PARAMS
+#undef DIRECTED_GRAPH
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjacency_list.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjacency_list.hpp
new file mode 100644 (file)
index 0000000..f7dde1c
--- /dev/null
@@ -0,0 +1,3963 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+// Copyright (C) 2007 Douglas Gregor 
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_ADJACENCY_LIST_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ADJACENCY_LIST_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/adjacency_iterator.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+#include <boost/graph/parallel/detail/property_holders.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <cassert>
+#include <list>
+#include <algorithm>
+#include <boost/limits.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/parallel/distribution.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/distributed/selector.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+
+// Callbacks
+#include <boost/function/function2.hpp>
+
+// Serialization
+#include <boost/serialization/base_object.hpp>
+#include <boost/mpi/datatype.hpp>
+#include <boost/pending/property_serialize.hpp>
+#include <boost/graph/distributed/unsafe_serialize.hpp>
+
+// Named vertices
+#include <boost/graph/distributed/named_graph.hpp>
+
+#include <boost/graph/distributed/shuffled_distribution.hpp>
+
+namespace boost {
+
+  /// The type used to store an identifier that uniquely names a processor.
+  // NGE: I doubt we'll be running on more than 32768 procs for the time being
+  typedef /*int*/ short processor_id_type;
+
+  // Tell which processor the target of an edge resides on (for
+  // directed graphs) or which processor the other end point of the
+  // edge resides on (for undirected graphs).
+  enum edge_target_processor_id_t { edge_target_processor_id };
+  BOOST_INSTALL_PROPERTY(edge, target_processor_id);
+
+  // For undirected graphs, tells whether the edge is locally owned.
+  enum edge_locally_owned_t { edge_locally_owned };
+  BOOST_INSTALL_PROPERTY(edge, locally_owned);
+
+  // For bidirectional graphs, stores the incoming edges.
+  enum vertex_in_edges_t { vertex_in_edges };
+  BOOST_INSTALL_PROPERTY(vertex, in_edges);
+
+  /// Tag class for directed, distributed adjacency list
+  struct directed_distributed_adj_list_tag
+    : public virtual distributed_graph_tag,
+      public virtual distributed_vertex_list_graph_tag,
+      public virtual distributed_edge_list_graph_tag,
+      public virtual incidence_graph_tag,
+      public virtual adjacency_graph_tag {};
+
+  /// Tag class for bidirectional, distributed adjacency list
+  struct bidirectional_distributed_adj_list_tag
+    : public virtual distributed_graph_tag,
+      public virtual distributed_vertex_list_graph_tag,
+      public virtual distributed_edge_list_graph_tag,
+      public virtual incidence_graph_tag,
+      public virtual adjacency_graph_tag,
+      public virtual bidirectional_graph_tag {};
+
+  /// Tag class for undirected, distributed adjacency list
+  struct undirected_distributed_adj_list_tag
+    : public virtual distributed_graph_tag,
+      public virtual distributed_vertex_list_graph_tag,
+      public virtual distributed_edge_list_graph_tag,
+      public virtual incidence_graph_tag,
+      public virtual adjacency_graph_tag,
+      public virtual bidirectional_graph_tag {};
+
+  namespace detail {
+    template<typename Archiver, typename Directed, typename Vertex>
+    void
+    serialize(Archiver& ar, edge_base<Directed, Vertex>& e,
+              const unsigned int /*version*/)
+    {
+      ar & unsafe_serialize(e.m_source)
+         & unsafe_serialize(e.m_target);
+    }
+
+    template<typename Archiver, typename Directed, typename Vertex>
+    void
+    serialize(Archiver& ar, edge_desc_impl<Directed, Vertex>& e,
+              const unsigned int /*version*/)
+    {
+      ar & boost::serialization::base_object<edge_base<Directed, Vertex> >(e)
+         & unsafe_serialize(e.m_eproperty);
+    }
+  }
+
+  namespace detail { namespace parallel {
+  
+    /**
+     * A distributed vertex descriptor. These descriptors contain both
+     * the ID of the processor that owns the vertex and a local vertex
+     * descriptor that identifies the particular vertex for that
+     * processor.
+     */
+    template<typename LocalDescriptor>
+    struct global_descriptor
+    {
+      typedef LocalDescriptor local_descriptor_type;
+
+      global_descriptor() : owner(), local() { }
+
+      global_descriptor(processor_id_type owner, LocalDescriptor local)
+        : owner(owner), local(local) { }
+
+      processor_id_type owner;
+      LocalDescriptor local;
+
+      /**
+       * A function object that, given a processor ID, generates
+       * distributed vertex descriptors from local vertex
+       * descriptors. This function object is used by the
+       * vertex_iterator of the distributed adjacency list.
+       */
+      struct generator
+      {
+        typedef global_descriptor<LocalDescriptor> result_type;
+        typedef LocalDescriptor argument_type;
+
+        generator() {}
+        generator(processor_id_type owner) : owner(owner) {}
+
+        result_type operator()(argument_type v) const
+        { return result_type(owner, v); }
+
+      private:
+        processor_id_type owner;
+      };
+
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & owner & unsafe_serialize(local);
+      }
+    };
+
+    /// Determine the process that owns the given descriptor
+    template<typename LocalDescriptor>
+    inline processor_id_type owner(const global_descriptor<LocalDescriptor>& v)
+    { return v.owner; }
+
+    /// Determine the local portion of the given descriptor
+    template<typename LocalDescriptor>
+    inline LocalDescriptor local(const global_descriptor<LocalDescriptor>& v)
+    { return v.local; }
+
+    /// Compare distributed vertex descriptors for equality
+    template<typename LocalDescriptor>
+    inline bool
+    operator==(const global_descriptor<LocalDescriptor>& u,
+               const global_descriptor<LocalDescriptor>& v)
+    {
+      return u.owner == v.owner && u.local == v.local;
+    }
+
+    /// Compare distributed vertex descriptors for inequality
+    template<typename LocalDescriptor>
+    inline bool
+    operator!=(const global_descriptor<LocalDescriptor>& u,
+               const global_descriptor<LocalDescriptor>& v)
+    { return !(u == v); }
+
+    template<typename LocalDescriptor>
+    inline bool
+    operator<(const global_descriptor<LocalDescriptor>& u,
+              const global_descriptor<LocalDescriptor>& v)
+    {
+      return (u.owner) < v.owner || (u.owner == v.owner && (u.local) < v.local);
+    }
+
+    template<typename LocalDescriptor>
+    inline bool
+    operator<=(const global_descriptor<LocalDescriptor>& u,
+               const global_descriptor<LocalDescriptor>& v)
+    {
+      return u.owner <= v.owner || (u.owner == v.owner && u.local <= v.local);
+    }
+
+    template<typename LocalDescriptor>
+    inline bool
+    operator>(const global_descriptor<LocalDescriptor>& u,
+              const global_descriptor<LocalDescriptor>& v)
+    {
+      return v < u;
+    }
+
+    template<typename LocalDescriptor>
+    inline bool
+    operator>=(const global_descriptor<LocalDescriptor>& u,
+               const global_descriptor<LocalDescriptor>& v)
+    {
+      return v <= u;
+    }
+
+    // DPG TBD: Add <, <=, >=, > for global descriptors
+
+    /**
+     * A Readable Property Map that extracts a global descriptor pair
+     * from a global_descriptor.
+     */
+    template<typename LocalDescriptor>
+    struct global_descriptor_property_map
+    {
+      typedef std::pair<processor_id_type, LocalDescriptor> value_type;
+      typedef value_type reference;
+      typedef global_descriptor<LocalDescriptor> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename LocalDescriptor>
+    inline std::pair<processor_id_type, LocalDescriptor>
+    get(global_descriptor_property_map<LocalDescriptor>,
+        global_descriptor<LocalDescriptor> x)
+    {
+      return std::pair<processor_id_type, LocalDescriptor>(x.owner, x.local);
+    }
+
+    /**
+     * A Readable Property Map that extracts the owner of a global
+     * descriptor.
+     */
+    template<typename LocalDescriptor>
+    struct owner_property_map
+    {
+      typedef processor_id_type value_type;
+      typedef value_type reference;
+      typedef global_descriptor<LocalDescriptor> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename LocalDescriptor>
+    inline processor_id_type
+    get(owner_property_map<LocalDescriptor>,
+        global_descriptor<LocalDescriptor> x)
+    {
+      return x.owner;
+    }
+
+    /**
+     * A Readable Property Map that extracts the local descriptor from
+     * a global descriptor.
+     */
+    template<typename LocalDescriptor>
+    struct local_descriptor_property_map
+    {
+      typedef LocalDescriptor value_type;
+      typedef value_type reference;
+      typedef global_descriptor<LocalDescriptor> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename LocalDescriptor>
+    inline LocalDescriptor
+    get(local_descriptor_property_map<LocalDescriptor>,
+        global_descriptor<LocalDescriptor> x)
+    {
+      return x.local;
+    }
+
+    /**
+     * Stores an incoming edge for a bidirectional distributed
+     * adjacency list. The user does not see this type directly,
+     * because it is just an implementation detail.
+     */
+    template<typename Edge>
+    struct stored_in_edge
+    {
+      stored_in_edge(processor_id_type sp, Edge e)
+        : source_processor(sp), e(e) {}
+
+      processor_id_type source_processor;
+      Edge e;
+    };
+
+    /**
+     * A distributed edge descriptor. These descriptors contain the
+     * underlying edge descriptor, the processor IDs for both the
+     * source and the target of the edge, and a boolean flag that
+     * indicates which of the processors actually owns the edge.
+     */
+    template<typename Edge>
+    struct edge_descriptor
+    {
+      edge_descriptor(processor_id_type sp = processor_id_type(),
+                      processor_id_type tp = processor_id_type(),
+                      bool owns = false, Edge ld = Edge())
+        : source_processor(sp), target_processor(tp),
+          source_owns_edge(owns), local(ld) {}
+
+      processor_id_type owner() const
+      {
+        return source_owns_edge? source_processor : target_processor;
+      }
+
+      /// The processor that the source vertex resides on
+      processor_id_type source_processor;
+
+      /// The processor that the target vertex resides on
+      processor_id_type target_processor;
+
+      /// True when the source processor owns the edge, false when the
+      /// target processor owns the edge.
+      bool source_owns_edge;
+
+      /// The local edge descriptor.
+      Edge local;
+
+      /**
+       * Function object that generates edge descriptors for the
+       * out_edge_iterator of the given distributed adjacency list
+       * from the edge descriptors of the underlying adjacency list.
+       */
+      template<typename Graph>
+      class out_generator
+      {
+        typedef typename Graph::directed_selector directed_selector;
+
+      public:
+        typedef edge_descriptor<Edge> result_type;
+        typedef Edge argument_type;
+
+        out_generator() : g(0) {}
+        explicit out_generator(const Graph& g) : g(&g) {}
+
+        result_type operator()(argument_type e) const
+        { return map(e, directed_selector()); }
+
+      private:
+        result_type map(argument_type e, directedS) const
+        {
+          return result_type(g->processor(),
+                             get(edge_target_processor_id, g->base(), e),
+                             true, e);
+        }
+
+        result_type map(argument_type e, bidirectionalS) const
+        {
+          return result_type(g->processor(),
+                             get(edge_target_processor_id, g->base(), e),
+                             true, e);
+        }
+
+        result_type map(argument_type e, undirectedS) const
+        {
+          return result_type(g->processor(),
+                             get(edge_target_processor_id, g->base(), e),
+                             get(edge_locally_owned, g->base(), e),
+                             e);
+        }
+
+        const Graph* g;
+      };
+
+      /**
+       * Function object that generates edge descriptors for the
+       * in_edge_iterator of the given distributed adjacency list
+       * from the edge descriptors of the underlying adjacency list.
+       */
+      template<typename Graph>
+      class in_generator
+      {
+        typedef typename Graph::directed_selector DirectedS;
+
+      public:
+        typedef typename ct_if<(is_same<DirectedS, bidirectionalS>::value),
+                               stored_in_edge<Edge>,
+                               Edge>::type argument_type;
+        typedef edge_descriptor<Edge> result_type;
+
+        in_generator() : g(0) {}
+        explicit in_generator(const Graph& g) : g(&g) {}
+
+        result_type operator()(argument_type e) const
+        { return map(e, DirectedS()); }
+
+      private:
+        /**
+         * For a bidirectional graph, we just generate the appropriate
+         * edge. No tricks.
+         */
+        result_type map(argument_type e, bidirectionalS) const
+        {
+          return result_type(e.source_processor,
+                             g->processor(),
+                             true,
+                             e.e);
+        }
+
+        /**
+         * For an undirected graph, we generate descriptors for the
+         * incoming edges by swapping the source/target of the
+         * underlying edge descriptor (a hack). The target processor
+         * ID on the edge is actually the source processor for this
+         * edge, and our processor is the target processor. If the
+         * edge is locally owned, then it is owned by the target (us);
+         * otherwise it is owned by the source.
+         */
+        result_type map(argument_type e, undirectedS) const
+        {
+          typename Graph::local_edge_descriptor local_edge(e);
+          // TBD: This is a very, VERY lame hack that takes advantage
+          // of our knowledge of the internals of the BGL
+          // adjacency_list. There should be a cleaner way to handle
+          // this...
+          using std::swap;
+          swap(local_edge.m_source, local_edge.m_target);
+          return result_type(get(edge_target_processor_id, g->base(), e),
+                             g->processor(),
+                             !get(edge_locally_owned, g->base(), e),
+                             local_edge);
+        }
+
+        const Graph* g;
+      };
+
+    private:
+      friend class boost::serialization::access;
+
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar
+          & source_processor
+          & target_processor
+          & source_owns_edge
+          & local;
+      }
+    };
+
+    /// Determine the process that owns this edge
+    template<typename Edge>
+    inline processor_id_type
+    owner(const edge_descriptor<Edge>& e)
+    { return e.source_owns_edge? e.source_processor : e.target_processor; }
+
+    /// Determine the local descriptor for this edge.
+    template<typename Edge>
+    inline Edge
+    local(const edge_descriptor<Edge>& e)
+    { return e.local; }
+
+    /**
+     * A Readable Property Map that extracts the owner and local
+     * descriptor of an edge descriptor.
+     */
+    template<typename Edge>
+    struct edge_global_property_map
+    {
+      typedef std::pair<processor_id_type, Edge> value_type;
+      typedef value_type reference;
+      typedef edge_descriptor<Edge> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename Edge>
+    inline std::pair<processor_id_type, Edge>
+    get(edge_global_property_map<Edge>, const edge_descriptor<Edge>& e)
+    {
+      typedef std::pair<processor_id_type, Edge> result_type;
+      return result_type(e.source_owns_edge? e.source_processor
+                         /* target owns edge*/: e.target_processor,
+                         e.local);
+    }
+
+    /**
+     * A Readable Property Map that extracts the owner of an edge
+     * descriptor.
+     */
+    template<typename Edge>
+    struct edge_owner_property_map
+    {
+      typedef processor_id_type value_type;
+      typedef value_type reference;
+      typedef edge_descriptor<Edge> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename Edge>
+    inline processor_id_type
+    get(edge_owner_property_map<Edge>, const edge_descriptor<Edge>& e)
+    {
+      return e.source_owns_edge? e.source_processor : e.target_processor;
+    }
+
+    /**
+     * A Readable Property Map that extracts the local descriptor from
+     * an edge descriptor.
+     */
+    template<typename Edge>
+    struct edge_local_property_map
+    {
+      typedef Edge value_type;
+      typedef value_type reference;
+      typedef edge_descriptor<Edge> key_type;
+      typedef readable_property_map_tag category;
+    };
+
+    template<typename Edge>
+    inline Edge
+    get(edge_local_property_map<Edge>,
+        const edge_descriptor<Edge>& e)
+    {
+      return e.local;
+    }
+
+    /** Compare distributed edge descriptors for equality.
+     *
+     * \todo need edge_descriptor to know if it is undirected so we
+     * can compare both ways.
+     */
+    template<typename Edge>
+    inline bool
+    operator==(const edge_descriptor<Edge>& e1,
+               const edge_descriptor<Edge>& e2)
+    {
+      return (e1.source_processor == e2.source_processor
+              && e1.target_processor == e2.target_processor
+              && e1.local == e2.local);
+    }
+
+    /// Compare distributed edge descriptors for inequality.
+    template<typename Edge>
+    inline bool
+    operator!=(const edge_descriptor<Edge>& e1,
+               const edge_descriptor<Edge>& e2)
+    { return !(e1 == e2); }
+
+    /**
+     * Configuration for the distributed adjacency list. We use this
+     * parameter to store all of the configuration details for the
+     * implementation of the distributed adjacency list, which allows us to
+     * get at the distribution type in the maybe_named_graph.
+     */
+    template<typename OutEdgeListS, typename ProcessGroup,
+             typename InVertexListS, typename InDistribution,
+             typename DirectedS, typename VertexProperty, 
+             typename EdgeProperty, typename GraphProperty, 
+             typename EdgeListS>
+    struct adjacency_list_config
+    {
+      typedef typename mpl::if_<is_same<InVertexListS, defaultS>, 
+                                vecS, InVertexListS>::type 
+        VertexListS;
+
+      /// Introduce the target processor ID property for each edge
+      typedef property<edge_target_processor_id_t, processor_id_type,
+                       EdgeProperty> edge_property_with_id;
+
+      /// For undirected graphs, introduce the locally-owned property for edges
+      typedef typename ct_if<(is_same<DirectedS, undirectedS>::value),
+                             property<edge_locally_owned_t, bool,
+                                      edge_property_with_id>,
+                             edge_property_with_id>::type
+        base_edge_property_type;
+
+      /// The edge descriptor type for the local subgraph
+      typedef typename adjacency_list_traits<OutEdgeListS,
+                                             VertexListS,
+                                             directedS>::edge_descriptor
+        local_edge_descriptor;
+
+      /// For bidirectional graphs, the type of an incoming stored edge
+      typedef stored_in_edge<local_edge_descriptor> bidir_stored_edge;
+
+      /// The container type that will store incoming edges for a
+      /// bidirectional graph.
+      typedef typename container_gen<EdgeListS, bidir_stored_edge>::type
+        in_edge_list_type;
+
+      // Bidirectional graphs have an extra vertex property to store
+      // the incoming edges.
+      typedef typename ct_if<(is_same<DirectedS, bidirectionalS>::value),
+                             property<vertex_in_edges_t, in_edge_list_type,
+                                      VertexProperty>,
+                             VertexProperty>::type 
+        base_vertex_property_type;
+
+      // The type of the distributed adjacency list
+      typedef adjacency_list<OutEdgeListS,
+                             distributedS<ProcessGroup, 
+                                          VertexListS, 
+                                          InDistribution>,
+                             DirectedS, VertexProperty, EdgeProperty,
+                             GraphProperty, EdgeListS> 
+        graph_type;
+
+      // The type of the underlying adjacency list implementation
+      typedef adjacency_list<OutEdgeListS, VertexListS, directedS,
+                             base_vertex_property_type,
+                             base_edge_property_type,
+                             GraphProperty,
+                             EdgeListS> 
+        inherited;
+      
+      typedef InDistribution in_distribution_type;
+      typedef typename inherited::vertices_size_type vertices_size_type;
+
+          typedef typename ::boost::graph::distributed::select_distribution<
+              in_distribution_type, VertexProperty, vertices_size_type, 
+              ProcessGroup>::type 
+        base_distribution_type;
+
+          typedef ::boost::graph::distributed::shuffled_distribution<
+          base_distribution_type> distribution_type;
+
+      typedef VertexProperty vertex_property_type;
+      typedef EdgeProperty edge_property_type;
+      typedef ProcessGroup process_group_type;
+
+      typedef VertexListS vertex_list_selector;
+      typedef OutEdgeListS out_edge_list_selector;
+      typedef DirectedS directed_selector;
+      typedef GraphProperty graph_property_type;
+      typedef EdgeListS edge_list_selector;
+    };
+
+    // Maybe initialize the indices of each vertex
+    template<typename IteratorPair, typename VertexIndexMap>
+    void
+    maybe_initialize_vertex_indices(IteratorPair p, VertexIndexMap to_index,
+                                    read_write_property_map_tag)
+    {
+      typedef typename property_traits<VertexIndexMap>::value_type index_t;
+      index_t next_index = 0;
+      while (p.first != p.second)
+        put(to_index, *p.first++, next_index++);
+    }
+
+    template<typename IteratorPair, typename VertexIndexMap>
+    inline void
+    maybe_initialize_vertex_indices(IteratorPair p, VertexIndexMap to_index,
+                                    readable_property_map_tag)
+    {
+      // Do nothing
+    }
+
+    template<typename IteratorPair, typename VertexIndexMap>
+    inline void
+    maybe_initialize_vertex_indices(IteratorPair p, VertexIndexMap to_index)
+    {
+      typedef typename property_traits<VertexIndexMap>::category category;
+      maybe_initialize_vertex_indices(p, to_index, category());
+    }
+
+    template<typename IteratorPair>
+    inline void
+    maybe_initialize_vertex_indices(IteratorPair p,
+                                    ::boost::detail::error_property_not_found)
+    { }
+
+    /***********************************************************************
+     * Message Payloads                                                    *
+     ***********************************************************************/
+
+    /**
+     * Data stored with a msg_add_edge message, which requests the
+     * remote addition of an edge.
+     */
+    template<typename Vertex, typename LocalVertex>
+    struct msg_add_edge_data
+    {
+      msg_add_edge_data() { }
+
+      msg_add_edge_data(Vertex source, Vertex target)
+        : source(source.local), target(target) { }
+
+      /// The source of the edge; the processor will be the
+      /// receiving processor.
+      LocalVertex source;
+        
+      /// The target of the edge.
+      Vertex target;
+        
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & unsafe_serialize(source) & target;
+      }
+    };
+
+    /**
+     * Like @c msg_add_edge_data, but also includes a user-specified
+     * property value to be attached to the edge.
+     */
+    template<typename Vertex, typename LocalVertex, typename EdgeProperty>
+    struct msg_add_edge_with_property_data
+      : msg_add_edge_data<Vertex, LocalVertex>, 
+        maybe_store_property<EdgeProperty>
+    {
+    private:
+      typedef msg_add_edge_data<Vertex, LocalVertex> inherited_data;
+      typedef maybe_store_property<EdgeProperty> inherited_property;
+
+    public:
+      msg_add_edge_with_property_data() { }
+
+      msg_add_edge_with_property_data(Vertex source, 
+                                      Vertex target,
+                                      const EdgeProperty& property)
+        : inherited_data(source, target),
+          inherited_property(property) { }
+      
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & boost::serialization::base_object<inherited_data>(*this) 
+           & boost::serialization::base_object<inherited_property>(*this);
+      }
+    };
+
+    //------------------------------------------------------------------------
+    // Distributed adjacency list property map details
+    /**
+     * Metafunction that extracts the given property from the given
+     * distributed adjacency list type. This could be implemented much
+     * more cleanly, but even newer versions of GCC (e.g., 3.2.3)
+     * cannot properly handle partial specializations involving
+     * enumerator types.
+     */
+    template<typename Property>
+    struct get_adj_list_pmap
+    {
+      template<typename Graph>
+      struct apply
+      {
+        typedef Graph graph_type;
+        typedef typename graph_type::process_group_type process_group_type;
+        typedef typename graph_type::inherited base_graph_type;
+        typedef typename property_map<base_graph_type, Property>::type
+          local_pmap;
+        typedef typename property_map<base_graph_type, Property>::const_type
+          local_const_pmap;
+
+        typedef graph_traits<graph_type> traits;
+        typedef typename graph_type::local_vertex_descriptor local_vertex;
+        typedef typename property_traits<local_pmap>::key_type local_key_type;
+
+        typedef typename property_traits<local_pmap>::value_type value_type;
+
+        typedef typename property_map<Graph, vertex_global_t>::const_type
+          vertex_global_map;
+        typedef typename property_map<Graph, edge_global_t>::const_type
+          edge_global_map;
+
+        typedef typename mpl::if_c<(is_same<local_key_type,
+                                            local_vertex>::value),
+                                   vertex_global_map, edge_global_map>::type
+          global_map;
+
+      public:
+        typedef ::boost::parallel::distributed_property_map<
+                  process_group_type, global_map, local_pmap> type;
+
+        typedef ::boost::parallel::distributed_property_map<
+                  process_group_type, global_map, local_const_pmap> const_type;
+      };
+    };
+
+    /**
+     * The local vertex index property map is actually a mapping from
+     * the local vertex descriptors to vertex indices.
+     */
+    template<>
+    struct get_adj_list_pmap<vertex_local_index_t>
+    {
+      template<typename Graph>
+      struct apply
+        : ::boost::property_map<typename Graph::inherited, vertex_index_t>
+      { };
+    };
+
+    /**
+     * The vertex index property map maps from global descriptors
+     * (e.g., the vertex descriptor of a distributed adjacency list)
+     * to the underlying local index. It is not valid to use this
+     * property map with nonlocal descriptors.
+     */
+    template<>
+    struct get_adj_list_pmap<vertex_index_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename property_map<Graph, vertex_global_t>::const_type
+          global_map;
+
+        typedef property_map<typename Graph::inherited, vertex_index_t> local;
+
+      public:
+        typedef local_property_map<typename Graph::process_group_type,
+                                   global_map,
+                                   typename local::type> type;
+        typedef local_property_map<typename Graph::process_group_type,
+                                   global_map,
+                                   typename local::const_type> const_type;
+      };
+    };
+
+    /**
+     * The vertex owner property map maps from vertex descriptors to
+     * the processor that owns the vertex.
+     */
+    template<>
+    struct get_adj_list_pmap<vertex_global_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_vertex_descriptor
+          local_vertex_descriptor;
+      public:
+        typedef global_descriptor_property_map<local_vertex_descriptor> type;
+        typedef type const_type;
+      };
+    };
+
+    /**
+     * The vertex owner property map maps from vertex descriptors to
+     * the processor that owns the vertex.
+     */
+    template<>
+    struct get_adj_list_pmap<vertex_owner_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_vertex_descriptor
+          local_vertex_descriptor;
+      public:
+        typedef owner_property_map<local_vertex_descriptor> type;
+        typedef type const_type;
+      };
+    };
+
+    /**
+     * The vertex local property map maps from vertex descriptors to
+     * the local descriptor for that vertex.
+     */
+    template<>
+    struct get_adj_list_pmap<vertex_local_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_vertex_descriptor
+          local_vertex_descriptor;
+      public:
+        typedef local_descriptor_property_map<local_vertex_descriptor> type;
+        typedef type const_type;
+      };
+    };
+
+    /**
+     * The edge global property map maps from edge descriptors to
+     * a pair of the owning processor and local descriptor.
+     */
+    template<>
+    struct get_adj_list_pmap<edge_global_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_edge_descriptor
+          local_edge_descriptor;
+      public:
+        typedef edge_global_property_map<local_edge_descriptor> type;
+        typedef type const_type;
+      };
+    };
+
+    /**
+     * The edge owner property map maps from edge descriptors to
+     * the processor that owns the edge.
+     */
+    template<>
+    struct get_adj_list_pmap<edge_owner_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_edge_descriptor
+          local_edge_descriptor;
+      public:
+        typedef edge_owner_property_map<local_edge_descriptor> type;
+        typedef type const_type;
+      };
+    };
+
+    /**
+     * The edge local property map maps from edge descriptors to
+     * the local descriptor for that edge.
+     */
+    template<>
+    struct get_adj_list_pmap<edge_local_t>
+    {
+      template<typename Graph>
+      struct apply
+      {
+      private:
+        typedef typename Graph::local_edge_descriptor
+          local_edge_descriptor;
+      public:
+        typedef edge_local_property_map<local_edge_descriptor> type;
+        typedef type const_type;
+      };
+    };
+    //------------------------------------------------------------------------
+
+    // Directed graphs do not have in edges, so this is a no-op
+    template<typename Graph>
+    inline void
+    remove_in_edge(typename Graph::edge_descriptor, Graph&, directedS)
+    { }
+
+    // Bidirectional graphs have in edges stored in the
+    // vertex_in_edges property.
+    template<typename Graph>
+    inline void
+    remove_in_edge(typename Graph::edge_descriptor e, Graph& g, bidirectionalS)
+    {
+      typedef typename Graph::in_edge_list_type in_edge_list_type;
+      in_edge_list_type& in_edges =
+        get(vertex_in_edges, g.base())[target(e, g).local];
+      typename in_edge_list_type::iterator i = in_edges.begin();
+      while (i != in_edges.end()
+             && !(i->source_processor == source(e, g).owner)
+             && i->e == e.local)
+        ++i;
+
+      assert(i != in_edges.end());
+      in_edges.erase(i);
+    }
+
+    // Undirected graphs have in edges stored as normal edges.
+    template<typename Graph>
+    inline void
+    remove_in_edge(typename Graph::edge_descriptor e, Graph& g, undirectedS)
+    {
+      typedef typename Graph::inherited base_type;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+      // TBD: can we make this more efficient?
+      // Removing edge (v, u). v is local
+      base_type& bg = g.base();
+      vertex_descriptor u = source(e, g);
+      vertex_descriptor v = target(e, g);
+      if (v.owner != process_id(g.process_group())) {
+        using std::swap;
+        swap(u, v);
+      }
+
+      typename graph_traits<base_type>::out_edge_iterator ei, ei_end;
+      for (tie(ei, ei_end) = out_edges(v.local, bg); ei != ei_end; ++ei)
+      {
+        if (target(*ei, g.base()) == u.local
+            // TBD: deal with parallel edges properly && *ei == e
+            && get(edge_target_processor_id, bg, *ei) == u.owner) {
+          remove_edge(ei, bg);
+          return;
+        }
+      }
+
+      if (v.owner == process_id(g.process_group())) {
+
+      }
+    }
+
+    //------------------------------------------------------------------------
+    // Lazy addition of edges
+
+    // Work around the fact that an adjacency_list with vecS vertex
+    // storage automatically adds edges when the descriptor is
+    // out-of-range.
+    template <class Graph, class Config, class Base>
+    inline std::pair<typename Config::edge_descriptor, bool>
+    add_local_edge(typename Config::vertex_descriptor u,
+                   typename Config::vertex_descriptor v,
+                   const typename Config::edge_property_type& p,
+                   vec_adj_list_impl<Graph, Config, Base>& g_)
+    {
+      adj_list_helper<Config, Base>& g = g_;
+      return add_edge(u, v, p, g);
+    }
+
+    template <class Graph, class Config, class Base>
+    inline std::pair<typename Config::edge_descriptor, bool>
+    add_local_edge(typename Config::vertex_descriptor u,
+                   typename Config::vertex_descriptor v,
+                   const typename Config::edge_property_type& p,
+                   boost::adj_list_impl<Graph, Config, Base>& g)
+    {
+      return add_edge(u, v, p, g);
+    }
+
+    template <class EdgeProperty,class EdgeDescriptor>
+    struct msg_nonlocal_edge_data
+      : public detail::parallel::maybe_store_property<EdgeProperty>
+    {
+      typedef EdgeProperty edge_property_type;
+      typedef EdgeDescriptor local_edge_descriptor;
+      typedef detail::parallel::maybe_store_property<edge_property_type> 
+        inherited;
+
+      msg_nonlocal_edge_data() {}
+      msg_nonlocal_edge_data(local_edge_descriptor e,
+                             const edge_property_type& p)
+        : inherited(p), e(e) { }
+
+      local_edge_descriptor e;
+
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & boost::serialization::base_object<inherited>(*this) & e;
+      }
+    };
+
+    template <class EdgeDescriptor>
+    struct msg_remove_edge_data
+    {
+      typedef EdgeDescriptor edge_descriptor;
+      msg_remove_edge_data() {}
+      explicit msg_remove_edge_data(edge_descriptor e) : e(e) {}
+
+      edge_descriptor e;
+
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & e;
+      }
+    };
+
+  } } // end namespace detail::parallel
+
+  /**
+   * Adjacency list traits for a distributed adjacency list. Contains
+   * the vertex and edge descriptors, the directed-ness, and the
+   * parallel edges typedefs.
+   */
+  template<typename OutEdgeListS, typename ProcessGroup,
+           typename InVertexListS, typename InDistribution, typename DirectedS>
+  struct adjacency_list_traits<OutEdgeListS,
+                               distributedS<ProcessGroup, 
+                                            InVertexListS,
+                                            InDistribution>,
+                               DirectedS>
+  {
+  private:
+    typedef typename mpl::if_<is_same<InVertexListS, defaultS>,
+                              vecS,
+                              InVertexListS>::type VertexListS;
+
+    typedef adjacency_list_traits<OutEdgeListS, VertexListS, directedS>
+      base_type;
+
+  public:
+    typedef typename base_type::vertex_descriptor local_vertex_descriptor;
+    typedef typename base_type::edge_descriptor   local_edge_descriptor;
+
+    typedef typename boost::ct_if_t<typename DirectedS::is_bidir_t,
+      bidirectional_tag,
+      typename boost::ct_if_t<typename DirectedS::is_directed_t,
+        directed_tag, undirected_tag
+      >::type
+    >::type directed_category;
+
+    typedef typename parallel_edge_traits<OutEdgeListS>::type
+      edge_parallel_category;
+
+    typedef detail::parallel::global_descriptor<local_vertex_descriptor>
+      vertex_descriptor;
+
+    typedef detail::parallel::edge_descriptor<local_edge_descriptor>
+      edge_descriptor;
+  };
+
+#define PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS                                    \
+  typename OutEdgeListS, typename ProcessGroup, typename InVertexListS,        \
+  typename InDistribution, typename DirectedS, typename VertexProperty,        \
+  typename EdgeProperty,  typename GraphProperty, typename EdgeListS
+
+#define PBGL_DISTRIB_ADJLIST_TYPE                                              \
+  adjacency_list<OutEdgeListS,                                                 \
+                 distributedS<ProcessGroup, InVertexListS, InDistribution>,    \
+                 DirectedS, VertexProperty, EdgeProperty, GraphProperty,       \
+                 EdgeListS>
+
+#define PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG                             \
+  typename OutEdgeListS, typename ProcessGroup, typename InVertexListS,        \
+  typename InDistribution, typename VertexProperty,                            \
+  typename EdgeProperty,  typename GraphProperty, typename EdgeListS
+  
+#define PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directed)                             \
+  adjacency_list<OutEdgeListS,                                                 \
+                 distributedS<ProcessGroup, InVertexListS, InDistribution>,    \
+                 directed, VertexProperty, EdgeProperty, GraphProperty,        \
+                 EdgeListS>
+                 
+  /** A distributed adjacency list.
+   *
+   * This class template partial specialization defines a distributed
+   * (or "partitioned") adjacency list graph. The distributed
+   * adjacency list is similar to the standard Boost Graph Library
+   * adjacency list, which stores a list of vertices and for each
+   * verted the list of edges outgoing from the vertex (and, in some
+   * cases, also the edges incoming to the vertex). The distributed
+   * adjacency list differs in that it partitions the graph into
+   * several subgraphs that are then divided among different
+   * processors (or nodes within a cluster). The distributed adjacency
+   * list attempts to maintain a high degree of compatibility with the
+   * standard, non-distributed adjacency list.
+   *
+   * The graph is partitioned by vertex, with each processor storing
+   * all of the required information for a particular subset of the
+   * vertices, including vertex properties, outgoing edges, and (for
+   * bidirectional graphs) incoming edges. This information is
+   * accessible only on the processor that owns the vertex: for
+   * instance, if processor 0 owns vertex @c v, no other processor can
+   * directly access the properties of @c v or enumerate its outgoing
+   * edges.
+   *
+   * Edges in a graph may be entirely local (connecting two local
+   * vertices), but more often it is the case that edges are
+   * non-local, meaning that the two vertices they connect reside in
+   * different processes. Edge properties are stored with the
+   * originating vertex for directed and bidirectional graphs, and are
+   * therefore only accessible from the processor that owns the
+   * originating vertex. Other processors may query the source and
+   * target of the edge, but cannot access its properties. This is
+   * particularly interesting when accessing the incoming edges of a
+   * bidirectional graph, which are not guaranteed to be stored on the
+   * processor that is able to perform the iteration. For undirected
+   * graphs the situation is more complicated, since no vertex clearly
+   * owns the edges: the list of edges incident to a vertex may
+   * contain a mix of local and non-local edges.
+   *
+   * The distributed adjacency list is able to model several of the
+   * existing Graph concepts. It models the Graph concept because it
+   * exposes vertex and edge descriptors in the normal way; these
+   * descriptors model the GlobalDescriptor concept (because they have
+   * an owner and a local descriptor), and as such the distributed
+   * adjacency list models the DistributedGraph concept. The adjacency
+   * list also models the IncidenceGraph and AdjacencyGraph concepts,
+   * although this is only true so long as the domain of the valid
+   * expression arguments are restricted to vertices and edges stored
+   * locally. Likewise, bidirectional and undirected distributed
+   * adjacency lists model the BidirectionalGraph concept (vertex and
+   * edge domains must be respectived) and the distributed adjacency
+   * list models the MutableGraph concept (vertices and edges can only
+   * be added or removed locally). T he distributed adjacency list
+   * does not, however, model the VertexListGraph or EdgeListGraph
+   * concepts, because we can not efficiently enumerate all vertices
+   * or edges in the graph. Instead, the local subsets of vertices and
+   * edges can be enumerated (with the same syntax): the distributed
+   * adjacency list therefore models the DistributedVertexListGraph
+   * and DistributedEdgeListGraph concepts, because concurrent
+   * iteration over all of the vertices or edges stored on each
+   * processor will visit each vertex or edge.
+   *
+   * The distributed adjacency list is distinguished from the
+   * non-distributed version by the vertex list descriptor, which will
+   * be @c distributedS<ProcessGroup,VertexListS>. Here,
+   * the VertexListS type plays the same role as the VertexListS type
+   * in the non-distributed adjacency list: it allows one to select
+   * the data structure that will be used to store the local
+   * vertices. The ProcessGroup type, on the other hand, is unique to
+   * distributed data structures: it is the type that abstracts a
+   * group of cooperating processes, and it used for process
+   * identification, communication, and synchronization, among other
+   * things. Different process group types represent different
+   * communication mediums (e.g., MPI, PVM, TCP) or different models
+   * of communication (LogP, CGM, BSP, synchronous, etc.). This
+   * distributed adjacency list assumes a model based on non-blocking
+   * sends.
+   *
+   * Distribution of vertices across different processors is
+   * accomplished in two different ways. When initially constructing
+   * the graph, the user may provide a distribution object (that
+   * models the Distribution concept), which will determine the
+   * distribution of vertices to each process. Additionally, the @c
+   * add_vertex and @c add_edge operations add vertices or edges
+   * stored on the local processor. For @c add_edge, this is
+   * accomplished by requiring that the source vertex of the new edge
+   * be local to the process executing @c add_edge.
+   *
+   * Internal properties of a distributed adjacency list are
+   * accessible in the same manner as internal properties for a
+   * non-distributed adjacency list for local vertices or
+   * edges. Access to properties for remote vertices or edges occurs
+   * with the same syntax, but involve communication with the owner of
+   * the information: for more information, refer to class template
+   * @ref distributed_property_map, which manages distributed
+   * property maps. Note that the distributed property maps created
+   * for internal properties determine their reduction operation via
+   * the metafunction @ref property_reduce, which for the vast
+   * majority of uses is correct behavior.
+   *
+   * Communication among the processes coordinating on a particular
+   * distributed graph relies on non-blocking message passing along
+   * with synchronization. Local portions of the distributed graph may
+   * be modified concurrently, including the introduction of non-local
+   * edges, but prior to accessing the graph it is recommended that
+   * the @c synchronize free function be invoked on the graph to clear
+   * up any pending interprocess communication and modifications. All
+   * processes will then be released from the synchronization barrier
+   * concurrently.
+   *
+   * \todo Determine precisely what we should do with nonlocal edges
+   * in undirected graphs. Our parallelization of certain algorithms
+   * relies on the ability to access edge property maps immediately
+   * (e.g., edge_weight_t), so it may be necessary to duplicate the
+   * edge properties in both processes (but then we need some form of
+   * coherence protocol).
+   *
+   * \todo What does the user do if @c property_reduce doesn't do the
+   * right thing?
+   */
+  template<typename OutEdgeListS, typename ProcessGroup,
+           typename InVertexListS, typename InDistribution, typename DirectedS,
+           typename VertexProperty, typename EdgeProperty, 
+           typename GraphProperty, typename EdgeListS>
+  class adjacency_list<OutEdgeListS,
+                       distributedS<ProcessGroup, 
+                                    InVertexListS, 
+                                    InDistribution>,
+                       DirectedS, VertexProperty,
+                       EdgeProperty, GraphProperty, EdgeListS>
+    : // Support for named vertices
+      public graph::distributed::maybe_named_graph<   
+        adjacency_list<OutEdgeListS,
+                       distributedS<ProcessGroup,
+                                    InVertexListS,
+                                    InDistribution>,
+                       DirectedS, VertexProperty,
+                       EdgeProperty, GraphProperty, EdgeListS>,
+        typename adjacency_list_traits<OutEdgeListS, 
+                                       distributedS<ProcessGroup,
+                                                    InVertexListS,
+                                                    InDistribution>,
+                                       DirectedS>::vertex_descriptor,
+        typename adjacency_list_traits<OutEdgeListS, 
+                                       distributedS<ProcessGroup,
+                                                    InVertexListS,
+                                                    InDistribution>,
+                                       DirectedS>::edge_descriptor,
+        detail::parallel::adjacency_list_config<OutEdgeListS, ProcessGroup, 
+                                                InVertexListS, InDistribution,
+                                                DirectedS, VertexProperty, 
+                                                EdgeProperty, GraphProperty, 
+                                                EdgeListS> >
+  {
+    typedef detail::parallel::adjacency_list_config<OutEdgeListS, ProcessGroup, 
+                                                InVertexListS, InDistribution,
+                                                DirectedS, VertexProperty, 
+                                                EdgeProperty, GraphProperty, 
+                                                EdgeListS>
+      config_type;
+      
+    typedef adjacency_list_traits<OutEdgeListS,
+                                  distributedS<ProcessGroup, 
+                                               InVertexListS, 
+                                               InDistribution>,
+                                  DirectedS> 
+      traits_type;
+
+    typedef typename DirectedS::is_directed_t is_directed;
+
+    typedef EdgeListS edge_list_selector;
+
+  public:
+    /// The container type that will store incoming edges for a
+    /// bidirectional graph.
+    typedef typename config_type::in_edge_list_type in_edge_list_type;
+//    typedef typename inherited::edge_descriptor   edge_descriptor;
+
+    /// The type of the underlying adjacency list implementation
+    typedef typename config_type::inherited inherited;
+
+    /// The type of properties stored in the local subgraph
+    /// Bidirectional graphs have an extra vertex property to store
+    /// the incoming edges.
+    typedef typename inherited::vertex_property_type
+      base_vertex_property_type;
+
+    /// The type of the distributed adjacency list (this type)
+    typedef typename config_type::graph_type graph_type;
+
+    /// Expose graph components and graph category
+    typedef typename traits_type::local_vertex_descriptor
+      local_vertex_descriptor;
+    typedef typename traits_type::local_edge_descriptor
+      local_edge_descriptor;
+    typedef typename traits_type::vertex_descriptor vertex_descriptor;
+    typedef typename traits_type::edge_descriptor edge_descriptor;
+
+    typedef typename traits_type::directed_category directed_category;
+    typedef typename inherited::edge_parallel_category
+      edge_parallel_category;
+    typedef typename inherited::graph_tag graph_tag;
+
+    // Current implementation requires the ability to have parallel
+    // edges in the underlying adjacency_list. Which processor each
+    // edge refers to is attached as an internal property. TBD:
+    // remove this restriction, which may require some rewriting.
+    BOOST_STATIC_ASSERT((is_same<edge_parallel_category,
+                                 allow_parallel_edge_tag>::value));
+
+    /** Determine the graph traversal category.
+     *
+     * A directed distributed adjacency list models the Distributed
+     * Graph, Incidence Graph, and Adjacency Graph
+     * concepts. Bidirectional and undirected graphs also model the
+     * Bidirectional Graph concept. Note that when modeling these
+     * concepts the domains of certain operations (e.g., in_edges)
+     * are restricted; see the distributed adjacency_list
+     * documentation.
+     */
+    typedef typename ct_if<
+              (is_same<DirectedS, directedS>::value),
+              directed_distributed_adj_list_tag,
+              typename ct_if<(is_same<DirectedS, bidirectionalS>::value),
+                             bidirectional_distributed_adj_list_tag,
+                             undirected_distributed_adj_list_tag>::type>
+      ::type traversal_category;
+
+    typedef typename inherited::degree_size_type degree_size_type;
+    typedef typename inherited::vertices_size_type vertices_size_type;
+    typedef typename inherited::edges_size_type edges_size_type;
+    typedef VertexProperty vertex_property_type;
+    typedef EdgeProperty edge_property_type;
+    typedef typename inherited::graph_property_type graph_property_type;
+    typedef typename inherited::vertex_bundled vertex_bundled;
+    typedef typename inherited::edge_bundled edge_bundled;
+
+    typedef typename container_gen<edge_list_selector, edge_descriptor>::type
+      local_edge_list_type;
+
+  private:
+    typedef typename ct_if<(is_same<DirectedS, bidirectionalS>::value),
+                           typename in_edge_list_type::const_iterator,
+                           typename inherited::out_edge_iterator>::type
+      base_in_edge_iterator;
+
+    typedef typename inherited::out_edge_iterator base_out_edge_iterator;
+    typedef typename graph_traits<inherited>::edge_iterator
+      base_edge_iterator;
+    typedef typename inherited::edge_property_type base_edge_property_type;
+
+    typedef typename local_edge_list_type::const_iterator
+      undirected_edge_iterator;
+
+    typedef InDistribution in_distribution_type;
+
+    typedef parallel::trigger_receive_context trigger_receive_context;
+
+  public:
+    /// Iterator over the (local) vertices of the graph
+    typedef transform_iterator<typename vertex_descriptor::generator,
+                               typename inherited::vertex_iterator>
+      vertex_iterator;
+
+    /// Helper for out_edge_iterator
+    typedef typename edge_descriptor::template out_generator<adjacency_list>
+      out_edge_generator;
+
+    /// Iterator over the outgoing edges of a vertex
+    typedef transform_iterator<out_edge_generator,
+                               typename inherited::out_edge_iterator>
+      out_edge_iterator;
+
+    /// Helper for in_edge_iterator
+    typedef typename edge_descriptor::template in_generator<adjacency_list>
+      in_edge_generator;
+
+    /// Iterator over the incoming edges of a vertex
+    typedef transform_iterator<in_edge_generator, base_in_edge_iterator>
+      in_edge_iterator;
+
+    /// Iterator over the neighbors of a vertex
+    typedef boost::adjacency_iterator<
+              adjacency_list, vertex_descriptor, out_edge_iterator,
+              typename detail::iterator_traits<base_out_edge_iterator>
+                         ::difference_type>
+      adjacency_iterator;
+
+    /// Iterator over the (local) edges in a graph
+    typedef typename ct_if<(is_same<DirectedS, undirectedS>::value),
+                           undirected_edge_iterator,
+                           transform_iterator<out_edge_generator,
+                                              base_edge_iterator>
+                           >::type 
+      edge_iterator;
+
+  public:
+    /// The type of the mixin for named vertices
+    typedef graph::distributed::maybe_named_graph<graph_type, 
+                                                  vertex_descriptor, 
+                                                  edge_descriptor, 
+                                                  config_type> 
+      named_graph_mixin;
+        
+    /// Process group used for communication
+    typedef ProcessGroup process_group_type;
+
+    /// How to refer to a process
+    typedef typename process_group_type::process_id_type process_id_type;
+
+    /// Whether this graph is directed, undirected, or bidirectional
+    typedef DirectedS directed_selector;
+
+    // Structure used for the lazy addition of vertices
+    struct lazy_add_vertex_with_property;
+    friend struct lazy_add_vertex_with_property;
+
+    // Structure used for the lazy addition of edges
+    struct lazy_add_edge;
+    friend struct lazy_add_edge;
+
+    // Structure used for the lazy addition of edges with properties
+    struct lazy_add_edge_with_property;
+    friend struct lazy_add_edge_with_property;
+
+    /// default_distribution_type is the type of the distribution used if the
+    /// user didn't specify an explicit one
+    typedef typename graph::distributed::select_distribution<
+              InDistribution, VertexProperty, vertices_size_type, 
+              ProcessGroup>::default_type 
+      default_distribution_type;
+    
+    /// distribution_type is the type of the distribution instance stored in
+    /// the maybe_named_graph base class
+    typedef typename graph::distributed::select_distribution<
+              InDistribution, VertexProperty, vertices_size_type,
+              ProcessGroup>::type 
+      base_distribution_type;
+
+      typedef graph::distributed::shuffled_distribution<
+          base_distribution_type> distribution_type;
+
+  private:
+    // FIXME: the original adjacency_list contained this comment:
+    //    Default copy constructor and copy assignment operators OK??? TBD
+    // but the adj_list_impl contained these declarations:
+    adjacency_list(const adjacency_list& other);
+    adjacency_list& operator=(const adjacency_list& other);
+
+  public:
+    adjacency_list(const ProcessGroup& pg = ProcessGroup())
+      : named_graph_mixin(pg, default_distribution_type(pg, 0)),
+        m_local_graph(GraphProperty()), 
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+    }
+
+    adjacency_list(const ProcessGroup& pg, 
+                   const base_distribution_type& distribution)
+      : named_graph_mixin(pg, distribution),
+        m_local_graph(GraphProperty()), 
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+    }
+
+    adjacency_list(const GraphProperty& g,
+                   const ProcessGroup& pg = ProcessGroup())
+      : named_graph_mixin(pg, default_distribution_type(pg, 0)),
+        m_local_graph(g), 
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+    }
+
+    adjacency_list(vertices_size_type n,
+                   const GraphProperty& p,
+                   const ProcessGroup& pg,
+                   const base_distribution_type& distribution)
+      : named_graph_mixin(pg, distribution),
+        m_local_graph(distribution.block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+    }
+
+    adjacency_list(vertices_size_type n,
+                   const ProcessGroup& pg,
+                   const base_distribution_type& distribution)
+      : named_graph_mixin(pg, distribution),
+        m_local_graph(distribution.block_size(process_id(pg), n), GraphProperty()),
+        process_group_(pg, graph::parallel::attach_distributed_object()) 
+    {
+      setup_triggers();
+
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+    }
+
+    adjacency_list(vertices_size_type n,
+                   const GraphProperty& p,
+                   const ProcessGroup& pg = ProcessGroup())
+      : named_graph_mixin(pg, default_distribution_type(pg, n)),
+        m_local_graph(this->distribution().block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+    }
+
+    adjacency_list(vertices_size_type n,
+                   const ProcessGroup& pg = ProcessGroup())
+      : named_graph_mixin(pg, default_distribution_type(pg, n)),
+        m_local_graph(this->distribution().block_size(process_id(pg), n), 
+                      GraphProperty()),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+    }
+
+    /*
+     * We assume that every processor sees the same list of edges, so
+     * they skip over any that don't originate from themselves. This
+     * means that programs switching between a local and a distributed
+     * graph will keep the same semantics.
+     */
+    template <class EdgeIterator>
+    adjacency_list(EdgeIterator first, EdgeIterator last,
+                   vertices_size_type n,
+                   const ProcessGroup& pg = ProcessGroup(),
+                   const GraphProperty& p = GraphProperty())
+      : named_graph_mixin(pg, default_distribution_type(pg, n)),
+        m_local_graph(this->distribution().block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      typedef typename config_type::VertexListS vertex_list_selector;
+      initialize(first, last, n, this->distribution(), vertex_list_selector());
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+
+    }
+
+    template <class EdgeIterator, class EdgePropertyIterator>
+    adjacency_list(EdgeIterator first, EdgeIterator last,
+                   EdgePropertyIterator ep_iter,
+                   vertices_size_type n,
+                   const ProcessGroup& pg = ProcessGroup(),
+                   const GraphProperty& p = GraphProperty())
+      : named_graph_mixin(pg, default_distribution_type(pg, n)),
+        m_local_graph(this->distribution().block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      typedef typename config_type::VertexListS vertex_list_selector;
+      initialize(first, last, ep_iter, n, this->distribution(),
+                 vertex_list_selector());
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+
+    }
+
+    template <class EdgeIterator>
+    adjacency_list(EdgeIterator first, EdgeIterator last,
+                   vertices_size_type n,
+                   const ProcessGroup& pg,
+                   const base_distribution_type& distribution,
+                   const GraphProperty& p = GraphProperty())
+      : named_graph_mixin(pg, distribution),
+        m_local_graph(distribution.block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      typedef typename config_type::VertexListS vertex_list_selector;
+      initialize(first, last, n, this->distribution(), vertex_list_selector());
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+
+    }
+
+    template <class EdgeIterator, class EdgePropertyIterator>
+    adjacency_list(EdgeIterator first, EdgeIterator last,
+                   EdgePropertyIterator ep_iter,
+                   vertices_size_type n,
+                   const ProcessGroup& pg,
+                   const base_distribution_type& distribution,
+                   const GraphProperty& p = GraphProperty())
+      : named_graph_mixin(pg, distribution),
+        m_local_graph(this->distribution().block_size(process_id(pg), n), p),
+        process_group_(pg, graph::parallel::attach_distributed_object())
+    {
+      setup_triggers();
+
+      typedef typename config_type::VertexListS vertex_list_selector;
+      initialize(first, last, ep_iter, n, distribution,
+                 vertex_list_selector());
+      detail::parallel::maybe_initialize_vertex_indices(vertices(base()),
+                                      get(vertex_index, base()));
+
+    }
+
+    ~adjacency_list()
+    {
+      synchronize(process_group_);
+    }
+
+    void clear()
+    {
+      base().clear();
+      local_edges_.clear();
+      named_graph_mixin::clearing_graph();
+    }
+
+    void swap(adjacency_list& other)
+    {
+      using std::swap;
+
+      base().swap(other);
+      swap(process_group_, other.process_group_);
+    }
+
+    static vertex_descriptor null_vertex()
+    {
+      return vertex_descriptor(processor_id_type(0),
+                               inherited::null_vertex());
+    }
+
+    inherited&       base()       { return m_local_graph; }
+    const inherited& base() const { return m_local_graph; }
+
+    processor_id_type processor() const { return process_id(process_group_); }
+    process_group_type process_group() const { return process_group_.base(); }
+
+    local_edge_list_type&       local_edges()       { return local_edges_; }
+    const local_edge_list_type& local_edges() const { return local_edges_; }
+
+    // Redistribute the vertices of the graph by placing each vertex
+    // v on the processor get(vertex_to_processor, v).
+    template<typename VertexProcessorMap>
+    void redistribute(VertexProcessorMap vertex_to_processor);
+
+    // Directly access a vertex or edge bundle
+    vertex_bundled& operator[](vertex_descriptor v)
+    {
+      assert(v.owner == processor());
+      return base()[v.local];
+    }
+    
+    const vertex_bundled& operator[](vertex_descriptor v) const
+    {
+      assert(v.owner == processor());
+      return base()[v.local];
+    }
+    
+    edge_bundled& operator[](edge_descriptor e)
+    {
+      assert(e.owner() == processor());
+      return base()[e.local];
+    }
+    
+    const edge_bundled& operator[](edge_descriptor e) const
+    {
+      assert(e.owner() == processor());
+      return base()[e.local];
+    }
+
+    template<typename OStreamConstructibleArchive>
+    void save(std::string const& filename) const;
+
+    template<typename IStreamConstructibleArchive>
+    void load(std::string const& filename);
+
+    // Callback that will be invoked whenever a new vertex is added locally
+    boost::function<void(vertex_descriptor, adjacency_list&)> on_add_vertex;
+
+    // Callback that will be invoked whenever a new edge is added locally
+    boost::function<void(edge_descriptor, adjacency_list&)> on_add_edge;
+
+  private:
+    // Request vertex->processor mapping for neighbors <does nothing>
+    template<typename VertexProcessorMap>
+    void
+    request_in_neighbors(vertex_descriptor,
+                         VertexProcessorMap,
+                         directedS) { }
+
+    // Request vertex->processor mapping for neighbors <does nothing>
+    template<typename VertexProcessorMap>
+    void
+    request_in_neighbors(vertex_descriptor,
+                         VertexProcessorMap,
+                         undirectedS) { }
+
+    // Request vertex->processor mapping for neighbors
+    template<typename VertexProcessorMap>
+    void
+    request_in_neighbors(vertex_descriptor v,
+                         VertexProcessorMap vertex_to_processor,
+                         bidirectionalS);
+
+    // Clear the list of in-edges, but don't tell the remote processor
+    void clear_in_edges_local(vertex_descriptor v, directedS) {}
+    void clear_in_edges_local(vertex_descriptor v, undirectedS) {}
+
+    void clear_in_edges_local(vertex_descriptor v, bidirectionalS)
+    { get(vertex_in_edges, base())[v.local].clear(); }
+
+    // Remove in-edges that have migrated <does nothing>
+    template<typename VertexProcessorMap>
+    void
+    remove_migrated_in_edges(vertex_descriptor,
+                             VertexProcessorMap,
+                             directedS) { }
+
+    // Remove in-edges that have migrated <does nothing>
+    template<typename VertexProcessorMap>
+    void
+    remove_migrated_in_edges(vertex_descriptor,
+                             VertexProcessorMap,
+                             undirectedS) { }
+
+    // Remove in-edges that have migrated
+    template<typename VertexProcessorMap>
+    void
+    remove_migrated_in_edges(vertex_descriptor v,
+                             VertexProcessorMap vertex_to_processor,
+                             bidirectionalS);
+
+    // Initialize the graph with the given edge list and vertex
+    // distribution. This variation works only when
+    // VertexListS=vecS, and we know how to create remote vertex
+    // descriptors based solely on the distribution.
+    template<typename EdgeIterator>
+    void
+    initialize(EdgeIterator first, EdgeIterator last,
+               vertices_size_type, const base_distribution_type& distribution, 
+               vecS);
+
+    // Initialize the graph with the given edge list, edge
+    // properties, and vertex distribution. This variation works
+    // only when VertexListS=vecS, and we know how to create remote
+    // vertex descriptors based solely on the distribution.
+    template<typename EdgeIterator, typename EdgePropertyIterator>
+    void
+    initialize(EdgeIterator first, EdgeIterator last,
+               EdgePropertyIterator ep_iter,
+               vertices_size_type, const base_distribution_type& distribution, 
+               vecS);
+
+    // Initialize the graph with the given edge list, edge
+    // properties, and vertex distribution.
+    template<typename EdgeIterator, typename EdgePropertyIterator,
+             typename VertexListS>
+    void
+    initialize(EdgeIterator first, EdgeIterator last,
+               EdgePropertyIterator ep_iter,
+               vertices_size_type n, 
+               const base_distribution_type& distribution,
+               VertexListS);
+
+    // Initialize the graph with the given edge list and vertex
+    // distribution. This is nearly identical to the one below it,
+    // for which I should be flogged. However, this version does use
+    // slightly less memory than the version that accepts an edge
+    // property iterator.
+    template<typename EdgeIterator, typename VertexListS>
+    void
+    initialize(EdgeIterator first, EdgeIterator last,
+               vertices_size_type n, 
+               const base_distribution_type& distribution,
+               VertexListS);
+
+  public:
+    //---------------------------------------------------------------------
+    // Build a vertex property instance for the underlying adjacency
+    // list from the given property instance of the type exposed to
+    // the user.
+    base_vertex_property_type 
+    build_vertex_property(const vertex_property_type& p)
+    { return build_vertex_property(p, directed_selector()); }
+
+    base_vertex_property_type
+    build_vertex_property(const vertex_property_type& p, directedS)
+    {
+      return base_vertex_property_type(p);
+    }
+
+    base_vertex_property_type
+    build_vertex_property(const vertex_property_type& p, bidirectionalS)
+    {
+      return base_vertex_property_type(in_edge_list_type(), p);
+    }
+
+    base_vertex_property_type
+    build_vertex_property(const vertex_property_type& p, undirectedS)
+    {
+      return base_vertex_property_type(p);
+    }
+    //---------------------------------------------------------------------
+
+    //---------------------------------------------------------------------
+    // Build an edge property instance for the underlying adjacency
+    // list from the given property instance of the type exposed to
+    // the user.
+    base_edge_property_type build_edge_property(const edge_property_type& p)
+    { return build_edge_property(p, directed_selector()); }
+
+    base_edge_property_type
+    build_edge_property(const edge_property_type& p, directedS)
+    {
+      return base_edge_property_type(0, p);
+    }
+
+    base_edge_property_type
+    build_edge_property(const edge_property_type& p, bidirectionalS)
+    {
+      return base_edge_property_type(0, p);
+    }
+
+    base_edge_property_type
+    build_edge_property(const edge_property_type& p, undirectedS)
+    {
+      typedef typename base_edge_property_type::next_type
+        edge_property_with_id;
+      return base_edge_property_type(true, edge_property_with_id(0, p));
+    }
+    //---------------------------------------------------------------------
+
+    /** The set of messages that can be transmitted and received by
+     *  a distributed adjacency list. This list will eventually be
+     *  exhaustive, but is currently quite limited.
+     */
+    enum {
+      /**
+       * Request to add or find a vertex with the given vertex
+       * property. The data will be a vertex_property_type
+       * structure.
+       */
+      msg_add_vertex_with_property = 0,
+
+      /**
+       * Request to add or find a vertex with the given vertex
+       * property, and request that the remote processor return the
+       * descriptor for the added/found edge. The data will be a
+       * vertex_property_type structure.
+       */
+      msg_add_vertex_with_property_and_reply,
+
+      /**
+       * Reply to a msg_add_vertex_* message, containing the local
+       * vertex descriptor that was added or found.
+       */
+      msg_add_vertex_reply,
+
+      /**
+       * Request to add an edge remotely. The data will be a
+       * msg_add_edge_data structure. 
+       */
+      msg_add_edge,
+
+      /**
+       * Request to add an edge remotely. The data will be a
+       * msg_add_edge_with_property_data structure. 
+       */
+      msg_add_edge_with_property,
+
+      /**
+       * Request to add an edge remotely and reply back with the
+       * edge descriptor. The data will be a
+       * msg_add_edge_data structure. 
+       */
+      msg_add_edge_with_reply,
+
+      /**
+       * Request to add an edge remotely and reply back with the
+       * edge descriptor. The data will be a
+       * msg_add_edge_with_property_data structure.
+       */
+      msg_add_edge_with_property_and_reply,
+
+      /**
+       * Reply message responding to an @c msg_add_edge_with_reply
+       * or @c msg_add_edge_with_property_and_reply messages. The
+       * data will be a std::pair<edge_descriptor, bool>.
+       */
+      msg_add_edge_reply,
+
+      /**
+       * Indicates that a nonlocal edge has been created that should
+       * be added locally. Only valid for bidirectional and
+       * undirected graphs. The message carries a
+       * msg_nonlocal_edge_data structure.
+       */
+      msg_nonlocal_edge,
+
+      /**
+       * Indicates that a remote edge should be removed. This
+       * message does not exist for directedS graphs but may refer
+       * to either in-edges or out-edges for undirectedS graphs.
+       */
+      msg_remove_edge,
+
+      /**
+       * Indicates the number of vertices and edges that will be
+       * relocated from the source processor to the target
+       * processor. The data will be a pair<vertices_size_type,
+       * edges_size_type>.
+       */
+      msg_num_relocated
+    };
+
+    typedef detail::parallel::msg_add_edge_data<vertex_descriptor,
+                                                local_vertex_descriptor>
+      msg_add_edge_data;
+
+    typedef detail::parallel::msg_add_edge_with_property_data
+              <vertex_descriptor, local_vertex_descriptor, 
+               edge_property_type> msg_add_edge_with_property_data;
+
+    typedef  boost::detail::parallel::msg_nonlocal_edge_data<
+      edge_property_type,local_edge_descriptor> msg_nonlocal_edge_data;
+
+    typedef boost::detail::parallel::msg_remove_edge_data<edge_descriptor>
+      msg_remove_edge_data;
+
+    void send_remove_edge_request(edge_descriptor e)
+    {
+      process_id_type dest = e.target_processor;
+      if (e.target_processor == process_id(process_group_))
+        dest = e.source_processor;
+      send(process_group_, dest, msg_remove_edge, msg_remove_edge_data(e));
+    }
+
+    /// Process incoming messages.
+    void setup_triggers();
+
+    void 
+    handle_add_vertex_with_property(int source, int tag,
+                                    const vertex_property_type&,
+                                    trigger_receive_context);
+
+    local_vertex_descriptor
+    handle_add_vertex_with_property_and_reply(int source, int tag,
+                                        const vertex_property_type&,
+                                        trigger_receive_context);
+
+    void 
+    handle_add_edge(int source, int tag, const msg_add_edge_data& data,
+                    trigger_receive_context);
+
+    boost::parallel::detail::untracked_pair<edge_descriptor, bool>
+    handle_add_edge_with_reply(int source, int tag, 
+                         const msg_add_edge_data& data,
+                         trigger_receive_context);
+
+    void 
+    handle_add_edge_with_property(int source, int tag,
+                                  const msg_add_edge_with_property_data&,
+                                  trigger_receive_context);
+              
+    boost::parallel::detail::untracked_pair<edge_descriptor, bool>
+    handle_add_edge_with_property_and_reply
+      (int source, int tag, const msg_add_edge_with_property_data&,
+       trigger_receive_context);
+
+    void 
+    handle_nonlocal_edge(int source, int tag, 
+                         const msg_nonlocal_edge_data& data,
+                         trigger_receive_context);
+
+    void 
+    handle_remove_edge(int source, int tag, 
+                       const msg_remove_edge_data& data,
+                       trigger_receive_context);
+         
+  protected:
+    /** Add an edge (locally) that was received from another
+     * processor. This operation is a no-op for directed graphs,
+     * because all edges reside on the local processor. For
+     * bidirectional graphs, this routine places the edge onto the
+     * list of incoming edges for the target vertex. For undirected
+     * graphs, the edge is placed along with all of the other edges
+     * for the target vertex, but it is marked as a non-local edge
+     * descriptor.
+     *
+     * \todo There is a potential problem here, where we could
+     * unintentionally allow duplicate edges in undirected graphs
+     * because the same edge is added on two different processors
+     * simultaneously. It's not an issue now, because we require
+     * that the graph allow parallel edges. Once we do support
+     * containers such as setS or hash_setS that disallow parallel
+     * edges we will need to deal with this.
+     */
+    void
+    add_remote_edge(const msg_nonlocal_edge_data&,
+                    processor_id_type, directedS)
+    { }
+
+
+    /**
+     * \overload
+     */
+    void
+    add_remote_edge(const msg_nonlocal_edge_data& data,
+                    processor_id_type other_proc, bidirectionalS)
+    {
+      typedef detail::parallel::stored_in_edge<local_edge_descriptor> stored_edge;
+
+      stored_edge edge(other_proc, data.e);
+      local_vertex_descriptor v = target(data.e, base());
+      boost::graph_detail::push(get(vertex_in_edges, base())[v], edge);
+    }
+
+    /**
+     * \overload
+     */
+    void
+    add_remote_edge(const msg_nonlocal_edge_data& data,
+                    processor_id_type other_proc, undirectedS)
+    {
+      std::pair<local_edge_descriptor, bool> edge =
+        detail::parallel::add_local_edge(target(data.e, base()), 
+                       source(data.e, base()),
+                       build_edge_property(data.get_property()), base());
+      assert(edge.second);
+      put(edge_target_processor_id, base(), edge.first, other_proc);
+
+      if (edge.second && on_add_edge)
+        on_add_edge(edge_descriptor(processor(), other_proc, false, 
+                                    edge.first),
+                    *this);
+    }
+
+    void
+    remove_local_edge(const msg_remove_edge_data&, processor_id_type,
+                      directedS)
+    { }
+
+    void
+    remove_local_edge(const msg_remove_edge_data& data,
+                      processor_id_type other_proc, bidirectionalS)
+    {
+      /* When the source is local, we first check if the edge still
+       * exists (it may have been deleted locally) and, if so,
+       * remove it locally.
+       */
+      vertex_descriptor src = source(data.e, *this);
+      vertex_descriptor tgt = target(data.e, *this);
+
+      if (src.owner == process_id(process_group_)) {
+        base_out_edge_iterator ei, ei_end;
+        for (tie(ei, ei_end) = out_edges(src.local, base());
+             ei != ei_end; ++ei) {
+          // TBD: can't check the descriptor here, because it could
+          // have changed if we're allowing the removal of
+          // edges. Egads!
+          if (tgt.local == target(*ei, base())
+              && get(edge_target_processor_id, base(), *ei) == other_proc)
+            break;
+        }
+
+        if (ei != ei_end) boost::remove_edge(ei, base());
+
+        remove_local_edge_from_list(src, tgt, undirectedS());
+      } else {
+        assert(tgt.owner == process_id(process_group_));
+        in_edge_list_type& in_edges =
+          get(vertex_in_edges, base())[tgt.local];
+        typename in_edge_list_type::iterator ei;
+        for (ei = in_edges.begin(); ei != in_edges.end(); ++ei) {
+          if (src.local == source(ei->e, base())
+              && src.owner == ei->source_processor)
+            break;
+        }
+
+        if (ei != in_edges.end()) in_edges.erase(ei);
+      }
+    }
+
+    void
+    remove_local_edge(const msg_remove_edge_data& data,
+                      processor_id_type other_proc, undirectedS)
+    {
+      vertex_descriptor local_vertex = source(data.e, *this);
+      vertex_descriptor remote_vertex = target(data.e, *this);
+      if (remote_vertex.owner == process_id(process_group_)) {
+        using std::swap;
+        swap(local_vertex, remote_vertex);
+      }
+
+      // Remove the edge from the out-edge list, if it is there
+      {
+        base_out_edge_iterator ei, ei_end;
+        for (tie(ei, ei_end) = out_edges(local_vertex.local, base());
+             ei != ei_end; ++ei) {
+          // TBD: can't check the descriptor here, because it could
+          // have changed if we're allowing the removal of
+          // edges. Egads!
+          if (remote_vertex.local == target(*ei, base())
+              && get(edge_target_processor_id, base(), *ei) == other_proc)
+            break;
+        }
+
+        if (ei != ei_end) boost::remove_edge(ei, base());
+      }
+
+      remove_local_edge_from_list(local_vertex, remote_vertex, undirectedS());
+    }
+
+  public:
+    void
+    remove_local_edge_from_list(vertex_descriptor, vertex_descriptor,
+                                directedS)
+    {
+    }
+
+    void
+    remove_local_edge_from_list(vertex_descriptor, vertex_descriptor,
+                                bidirectionalS)
+    {
+    }
+
+    void
+    remove_local_edge_from_list(vertex_descriptor src, vertex_descriptor tgt,
+                                undirectedS)
+    {
+      // TBD: At some point we'll be able to improve the speed here
+      // because we'll know when the edge can't be in the local
+      // list.
+      {
+        typename local_edge_list_type::iterator ei;
+        for (ei = local_edges_.begin(); ei != local_edges_.end(); ++ei) {
+          if ((source(*ei, *this) == src
+               && target(*ei, *this) == tgt)
+              || (source(*ei, *this) == tgt
+                  && target(*ei, *this) == src))
+            break;
+        }
+
+        if (ei != local_edges_.end()) local_edges_.erase(ei);
+      }
+
+    }
+
+  private:
+    /// The local subgraph
+    inherited m_local_graph;
+
+    /// The process group through which this distributed graph
+    /// communicates.
+    process_group_type process_group_;
+
+    // TBD: should only be available for undirected graphs, but for
+    // now it'll just be empty for directed and bidirectional
+    // graphs.
+    local_edge_list_type local_edges_;
+  };
+
+  //------------------------------------------------------------------------
+  // Lazy addition of vertices
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  struct PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_vertex_with_property
+  {
+    /// Construct a lazy request to add a vertex
+    lazy_add_vertex_with_property(adjacency_list& self, 
+                                  const vertex_property_type& property)
+      : self(self), property(property), committed(false) { }
+
+    /// Copying a lazy_add_vertex_with_property transfers the
+    /// responsibility for adding the vertex to the newly-constructed
+    /// object.
+    lazy_add_vertex_with_property(const lazy_add_vertex_with_property& other)
+      : self(other.self), property(other.property),
+        committed(other.committed)
+    {
+      other.committed = true;
+    }
+
+    /// If the vertex has not yet been added, add the vertex but don't
+    /// wait for a reply.
+    ~lazy_add_vertex_with_property();
+
+    /// Returns commit().
+    operator vertex_descriptor() const { return commit(); }
+
+    // Add the vertex. This operation will block if the vertex is
+    // being added remotely.
+    vertex_descriptor commit() const;
+
+  protected:
+    adjacency_list& self;
+    vertex_property_type property;
+    mutable bool committed;
+
+  private:
+    // No copy-assignment semantics
+    void operator=(lazy_add_vertex_with_property&);
+  };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_vertex_with_property::
+  ~lazy_add_vertex_with_property()
+  {
+    /// If this vertex has already been created or will be created by
+    /// someone else, or if someone threw an exception, we will not
+    /// create the vertex now.
+    if (committed || std::uncaught_exception())
+      return;
+
+    committed = true;
+
+    process_id_type owner 
+      = static_cast<graph_type&>(self).owner_by_property(property);
+    if (owner == self.processor()) {
+      /// Add the vertex locally.
+      vertex_descriptor v(owner, 
+                          add_vertex(self.build_vertex_property(property), 
+                                     self.base()));
+      if (self.on_add_vertex)
+        self.on_add_vertex(v, self);
+    }
+    else
+      /// Ask the owner of this new vertex to add the vertex. We
+      /// don't need a reply.
+      send(self.process_group_, owner, msg_add_vertex_with_property,
+           property);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor 
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_vertex_with_property::
+  commit() const
+  {
+    assert(!this->committed);
+    this->committed = true;
+
+    process_id_type owner 
+      = static_cast<graph_type&>(self).owner_by_property(property);
+    local_vertex_descriptor local_v;
+    if (owner == self.processor())
+      /// Add the vertex locally.
+      local_v = add_vertex(self.build_vertex_property(property), 
+                           self.base());
+    else {
+      // Request that the remote process add the vertex immediately
+      send_oob_with_reply(self.process_group_, owner,
+               msg_add_vertex_with_property_and_reply, property,
+               local_v);
+    }
+
+    vertex_descriptor v(owner, local_v);
+    if (self.on_add_vertex)
+      self.on_add_vertex(v, self);
+
+    // Build the full vertex descriptor to return
+    return v;
+  }
+  
+
+  /** 
+   * Data structure returned from add_edge that will "lazily" add
+   * the edge, either when it is converted to a
+   * @c pair<edge_descriptor, bool> or when the most recent copy has
+   * been destroyed.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  struct PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge
+  {
+    /// Construct a lazy request to add an edge
+    lazy_add_edge(adjacency_list& self, 
+                  vertex_descriptor source, vertex_descriptor target)
+      : self(self), source(source), target(target), committed(false) { }
+
+    /// Copying a lazy_add_edge transfers the responsibility for
+    /// adding the edge to the newly-constructed object.
+    lazy_add_edge(const lazy_add_edge& other)
+      : self(other.self), source(other.source), target(other.target), 
+        committed(other.committed)
+    {
+      other.committed = true;
+    }
+
+    /// If the edge has not yet been added, add the edge but don't
+    /// wait for a reply.
+    ~lazy_add_edge();
+
+    /// Returns commit().
+    operator std::pair<edge_descriptor, bool>() const { return commit(); }
+
+    // Add the edge. This operation will block if a remote edge is
+    // being added.
+    std::pair<edge_descriptor, bool> commit() const;
+
+  protected:
+    std::pair<edge_descriptor, bool> 
+    add_local_edge(const edge_property_type& property, directedS) const;
+
+    std::pair<edge_descriptor, bool> 
+    add_local_edge(const edge_property_type& property, bidirectionalS) const;
+
+    std::pair<edge_descriptor, bool> 
+    add_local_edge(const edge_property_type& property, undirectedS) const;
+
+    adjacency_list& self;
+    vertex_descriptor source;
+    vertex_descriptor target;
+    mutable bool committed;
+
+  private:
+    // No copy-assignment semantics
+    void operator=(lazy_add_edge&);
+  };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge::~lazy_add_edge()
+  {
+    /// If this edge has already been created or will be created by
+    /// someone else, or if someone threw an exception, we will not
+    /// create the edge now.
+    if (committed || std::uncaught_exception())
+      return;
+
+    committed = true;
+
+    if (source.owner == self.processor())
+      this->add_local_edge(edge_property_type(), DirectedS());
+    else
+      // Request that the remote processor add an edge and, but
+      // don't wait for a reply.
+      send(self.process_group_, source.owner, msg_add_edge,
+           msg_add_edge_data(source, target));
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge::commit() const
+  {
+    assert(!committed);
+    committed = true;
+
+    if (source.owner == self.processor())
+      return this->add_local_edge(edge_property_type(), DirectedS());
+    else {
+      // Request that the remote processor add an edge
+      boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
+      send_oob_with_reply(self.process_group_, source.owner, 
+                          msg_add_edge_with_reply,
+                          msg_add_edge_data(source, target), result);
+      return result;
+    }
+  }
+
+  // Add a local edge into a directed graph
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge::
+  add_local_edge(const edge_property_type& property, directedS) const
+  {
+    // Add the edge to the local part of the graph
+    std::pair<local_edge_descriptor, bool> inserted =
+      detail::parallel::add_local_edge(source.local, target.local,
+                                       self.build_edge_property(property), 
+                                       self.base());
+
+    if (inserted.second)
+      // Keep track of the owner of the target
+      put(edge_target_processor_id, self.base(), inserted.first, 
+          target.owner);
+
+    // Compose the edge descriptor and return the result
+    edge_descriptor e(source.owner, target.owner, true, inserted.first);
+
+    // Trigger the on_add_edge event
+    if (inserted.second && self.on_add_edge)
+      self.on_add_edge(e, self);
+
+    return std::pair<edge_descriptor, bool>(e, inserted.second);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge::
+  add_local_edge(const edge_property_type& property, bidirectionalS) const
+  {
+    // Add the directed edge.
+    std::pair<edge_descriptor, bool> result 
+      = this->add_local_edge(property, directedS());
+
+    if (result.second) {
+      if (target.owner == self.processor()) {
+        // Edge is local, so add the stored edge to the in_edges list
+        typedef detail::parallel::stored_in_edge<local_edge_descriptor>
+          stored_edge;
+
+        stored_edge e(self.processor(), result.first.local);
+        boost::graph_detail::push(get(vertex_in_edges, 
+                                      self.base())[target.local], e);
+      } 
+      else {
+        // Edge is remote, so notify the target's owner that an edge
+        // has been added.
+        if (self.process_group_.trigger_context() == graph::parallel::trc_out_of_band)
+          send_oob(self.process_group_, target.owner, msg_nonlocal_edge,
+                   msg_nonlocal_edge_data(result.first.local, property));
+        else
+          send(self.process_group_, target.owner, msg_nonlocal_edge,
+               msg_nonlocal_edge_data(result.first.local, property));
+      }
+    }
+
+    return result;
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge::
+  add_local_edge(const edge_property_type& property, undirectedS) const
+  {
+    // Add the directed edge
+    std::pair<edge_descriptor, bool> result
+      = this->add_local_edge(property, directedS());
+
+    typedef detail::parallel::stored_in_edge<local_edge_descriptor>
+      stored_edge;
+
+    if (result.second) {
+      if (target.owner == self.processor()) {
+        // Edge is local, so add the new edge to the list
+
+        // TODO: This is not what we want to do for an undirected
+        // edge, because we haven't linked the source and target's
+        // representations of those edges.
+        local_edge_descriptor return_edge =
+          detail::parallel::add_local_edge(target.local, source.local,
+                                           self.build_edge_property(property),
+                                           self.base()).first;
+
+        put(edge_target_processor_id, self.base(), return_edge, 
+            source.owner);
+      }
+      else {
+        // Edge is remote, so notify the target's owner that an edge
+        // has been added.
+        if (self.process_group_.trigger_context() == graph::parallel::trc_out_of_band)
+          send_oob(self.process_group_, target.owner, msg_nonlocal_edge,
+                   msg_nonlocal_edge_data(result.first.local, property));
+        else
+          send(self.process_group_, target.owner, msg_nonlocal_edge,
+               msg_nonlocal_edge_data(result.first.local, property));
+          
+      }
+
+      // Add this edge to the list of local edges
+      graph_detail::push(self.local_edges(), result.first);
+    }
+
+    return result;
+  }
+
+
+  /** 
+   * Data structure returned from add_edge that will "lazily" add
+   * the edge with its property, either when it is converted to a
+   * pair<edge_descriptor, bool> or when the most recent copy has
+   * been destroyed.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  struct PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge_with_property
+    : lazy_add_edge
+  {
+    /// Construct a lazy request to add an edge
+    lazy_add_edge_with_property(adjacency_list& self, 
+                                vertex_descriptor source, 
+                                vertex_descriptor target,
+                                const edge_property_type& property)
+      : lazy_add_edge(self, source, target), property(property) { }
+
+    /// Copying a lazy_add_edge transfers the responsibility for
+    /// adding the edge to the newly-constructed object.
+    lazy_add_edge_with_property(const lazy_add_edge& other)
+      : lazy_add_edge(other), property(other.property) { }
+
+    /// If the edge has not yet been added, add the edge but don't
+    /// wait for a reply.
+    ~lazy_add_edge_with_property();
+
+    /// Returns commit().
+    operator std::pair<edge_descriptor, bool>() const { return commit(); }
+
+    // Add the edge. This operation will block if a remote edge is
+    // being added.
+    std::pair<edge_descriptor, bool> commit() const;
+
+  private:
+    // No copy-assignment semantics
+    void operator=(lazy_add_edge_with_property&);
+
+    edge_property_type property;
+  };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge_with_property::
+  ~lazy_add_edge_with_property()
+  {
+    /// If this edge has already been created or will be created by
+    /// someone else, or if someone threw an exception, we will not
+    /// create the edge now.
+    if (this->committed || std::uncaught_exception())
+      return;
+
+    this->committed = true;
+
+    if (this->source.owner == this->self.processor())
+      // Add a local edge
+      this->add_local_edge(property, DirectedS());
+    else
+      // Request that the remote processor add an edge and, but
+      // don't wait for a reply.
+      send(this->self.process_group_, this->source.owner, 
+           msg_add_edge_with_property,
+           msg_add_edge_with_property_data(this->source, this->target, 
+                                           property));
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+  PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge_with_property::
+  commit() const
+  {
+    assert(!this->committed);
+    this->committed = true;
+
+    if (this->source.owner == this->self.processor())
+      // Add a local edge
+      return this->add_local_edge(property, DirectedS());
+    else {
+      // Request that the remote processor add an edge
+      boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
+      send_oob_with_reply(this->self.process_group_, this->source.owner, 
+                          msg_add_edge_with_property_and_reply,
+                          msg_add_edge_with_property_data(this->source, 
+                                                          this->target, 
+                                                          property),
+                          result);
+      return result;
+    }
+  }
+
+
+  /**
+   * Returns the set of vertices local to this processor. Note that
+   * although this routine matches a valid expression of a
+   * VertexListGraph, it does not meet the semantic requirements of
+   * VertexListGraph because it returns only local vertices (not all
+   * vertices).
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::vertex_iterator,
+            typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::vertex_iterator>
+  vertices(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+      ::vertex_descriptor Vertex;
+
+    typedef typename Vertex::generator generator;
+
+    return std::make_pair(make_transform_iterator(vertices(g.base()).first,
+                                                  generator(g.processor())),
+                          make_transform_iterator(vertices(g.base()).second,
+                                                  generator(g.processor())));
+  }
+
+  /**
+   * Returns the number of vertices local to this processor. Note that
+   * although this routine matches a valid expression of a
+   * VertexListGraph, it does not meet the semantic requirements of
+   * VertexListGraph because it returns only a count of local vertices
+   * (not all vertices).
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE
+             ::vertices_size_type
+  num_vertices(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    return num_vertices(g.base());
+  }
+
+  /***************************************************************************
+   * Implementation of Incidence Graph concept
+   ***************************************************************************/
+  /**
+   * Returns the source of edge @param e in @param g.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename Edge>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor
+  source(const detail::parallel::edge_descriptor<Edge>& e,
+         const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+      ::vertex_descriptor Vertex;
+    return Vertex(e.source_processor, source(e.local, g.base()));
+  }
+
+  /**
+   * Returns the target of edge @param e in @param g.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename Edge>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor
+  target(const detail::parallel::edge_descriptor<Edge>& e,
+         const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+      ::vertex_descriptor Vertex;
+    return Vertex(e.target_processor, target(e.local, g.base()));
+  }
+
+  /**
+   * Return the set of edges outgoing from a particular vertex. The
+   * vertex @param v must be local to the processor executing this
+   * routine.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::out_edge_iterator,
+            typename PBGL_DISTRIB_ADJLIST_TYPE::out_edge_iterator>
+  out_edges(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+            const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    assert(v.owner == g.processor());
+
+    typedef PBGL_DISTRIB_ADJLIST_TYPE impl;
+    typedef typename impl::out_edge_generator generator;
+
+    return std::make_pair(
+             make_transform_iterator(out_edges(v.local, g.base()).first,
+                                     generator(g)),
+             make_transform_iterator(out_edges(v.local, g.base()).second,
+                                     generator(g)));
+  }
+
+  /**
+   * Return the number of edges outgoing from a particular vertex. The
+   * vertex @param v must be local to the processor executing this
+   * routine.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::degree_size_type
+  out_degree(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+             const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    assert(v.owner == g.processor());
+
+    return out_degree(v.local, g.base());
+  }
+
+  /***************************************************************************
+   * Implementation of Bidirectional Graph concept
+   ***************************************************************************/
+  /**
+   * Returns the set of edges incoming to a particular vertex. The
+   * vertex @param v must be local to the processor executing this
+   * routine.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                       ::in_edge_iterator,
+            typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                       ::in_edge_iterator>
+  in_edges(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                         ::vertex_descriptor v,
+           const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    assert(v.owner == g.processor());
+
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS) impl;
+    typedef typename impl::inherited base_graph_type;
+    typedef typename impl::in_edge_generator generator;
+
+
+    typename property_map<base_graph_type, vertex_in_edges_t>::const_type
+      in_edges = get(vertex_in_edges, g.base());
+
+    return std::make_pair(make_transform_iterator(in_edges[v.local].begin(),
+                                                  generator(g)),
+                          make_transform_iterator(in_edges[v.local].end(),
+                                                  generator(g)));
+  }
+
+  /**
+   * \overload
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                       ::in_edge_iterator,
+            typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                       ::in_edge_iterator>
+  in_edges(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                         ::vertex_descriptor v,
+           const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    assert(v.owner == g.processor());
+
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS) impl;
+    typedef typename impl::in_edge_generator generator;
+
+    return std::make_pair(
+              make_transform_iterator(out_edges(v.local, g.base()).first,
+                                     generator(g)),
+             make_transform_iterator(out_edges(v.local, g.base()).second,
+                                     generator(g)));
+  }
+
+  /**
+   * Returns the number of edges incoming to a particular vertex. The
+   * vertex @param v must be local to the processor executing this
+   * routine.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)::degree_size_type
+  in_degree(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                           ::vertex_descriptor v,
+            const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    assert(v.owner == g.processor());
+
+    return get(vertex_in_edges, g.base())[v.local].size();
+  }
+
+  /**
+   * \overload
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)::degree_size_type
+  in_degree(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                           ::vertex_descriptor v,
+            const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    assert(v.owner == g.processor());
+
+    return out_degree(v.local, g.base());
+  }
+
+  /**
+   * Returns the number of edges incident on the given vertex. The
+   * vertex @param v must be local to the processor executing this
+   * routine.
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                       ::degree_size_type
+  degree(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                         ::vertex_descriptor v,
+         const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    assert(v.owner == g.processor());
+    return out_degree(v.local, g.base());
+  }
+
+  /**
+   * \overload
+   */
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                       ::degree_size_type
+  degree(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                         ::vertex_descriptor v,
+         const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    assert(v.owner == g.processor());
+    return out_degree(v, g) + in_degree(v, g);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::edges_size_type
+  num_edges(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    return num_edges(g.base());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)::edges_size_type
+  num_edges(const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    return g.local_edges().size();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<
+    typename PBGL_DISTRIB_ADJLIST_TYPE::edge_iterator,
+    typename PBGL_DISTRIB_ADJLIST_TYPE::edge_iterator>
+  edges(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE impl;
+    typedef typename impl::out_edge_generator generator;
+
+    return std::make_pair(make_transform_iterator(edges(g.base()).first,
+                                                  generator(g)),
+                          make_transform_iterator(edges(g.base()).second,
+                                                  generator(g)));
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  std::pair<
+    typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)::edge_iterator,
+    typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)::edge_iterator>
+  edges(const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    return std::make_pair(g.local_edges().begin(), g.local_edges().end());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline
+  typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor
+  vertex(typename PBGL_DISTRIB_ADJLIST_TYPE::vertices_size_type n,
+         const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor 
+      vertex_descriptor;
+
+    return vertex_descriptor(g.distribution()(n), g.distribution().local(n));
+  }
+
+  /***************************************************************************
+   * Access to particular edges
+   ***************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  std::pair<
+    typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)::edge_descriptor,
+    bool
+  >
+  edge(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)::vertex_descriptor u,
+       typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)::vertex_descriptor v,
+       const PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)
+                       ::edge_descriptor edge_descriptor;
+
+    // For directed graphs, u must be local
+    assert(u.owner == process_id(g.process_group()));
+
+    typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)
+        ::out_edge_iterator ei, ei_end;
+    for (tie(ei, ei_end) = out_edges(u, g); ei != ei_end; ++ei) {
+      if (target(*ei, g) == v) return std::make_pair(*ei, true);
+    }
+    return std::make_pair(edge_descriptor(), false);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<
+    typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor,
+    bool
+  >
+  edge(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+       typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+       const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::edge_descriptor edge_descriptor;
+
+    // For bidirectional and undirected graphs, u must be local or v
+    // must be local
+    if (u.owner == process_id(g.process_group())) {
+      typename PBGL_DISTRIB_ADJLIST_TYPE::out_edge_iterator ei, ei_end;
+      for (tie(ei, ei_end) = out_edges(u, g); ei != ei_end; ++ei) {
+        if (target(*ei, g) == v) return std::make_pair(*ei, true);
+      }
+      return std::make_pair(edge_descriptor(), false);
+    } else if (v.owner == process_id(g.process_group())) {
+      typename PBGL_DISTRIB_ADJLIST_TYPE::in_edge_iterator ei, ei_end;
+      for (tie(ei, ei_end) = in_edges(v, g); ei != ei_end; ++ei) {
+        if (source(*ei, g) == u) return std::make_pair(*ei, true);
+      }
+      return std::make_pair(edge_descriptor(), false);
+    } else {
+      assert(false);
+      exit(1);
+    }
+  }
+
+#if 0
+  // TBD: not yet supported
+  std::pair<out_edge_iterator, out_edge_iterator>
+  edge_range(vertex_descriptor u, vertex_descriptor v,
+             const adjacency_list& g);
+#endif
+
+  /***************************************************************************
+   * Implementation of Adjacency Graph concept
+   ***************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::adjacency_iterator,
+            typename PBGL_DISTRIB_ADJLIST_TYPE::adjacency_iterator>
+  adjacent_vertices(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+                    const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE::adjacency_iterator iter;
+    return std::make_pair(iter(out_edges(v, g).first, &g),
+                          iter(out_edges(v, g).second, &g));
+  }
+
+  /***************************************************************************
+   * Implementation of Mutable Graph concept
+   ***************************************************************************/
+
+  /************************************************************************
+   * add_edge
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge
+  add_edge(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+           typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+           PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_edge lazy_add_edge;
+
+    return lazy_add_edge(g, u, v);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE
+    ::lazy_add_edge_with_property
+  add_edge(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+           typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+           typename PBGL_DISTRIB_ADJLIST_TYPE::edge_property_type const& p,
+           PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+      ::lazy_add_edge_with_property lazy_add_edge_with_property;
+    return lazy_add_edge_with_property(g, u, v, p);
+  }
+
+  /************************************************************************
+   *
+   * remove_edge
+   *
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  void
+  remove_edge(typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor e,
+              PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    assert(source(e, g).owner == g.processor()
+           || target(e, g).owner == g.processor());
+
+    if (target(e, g).owner == g.processor())
+      detail::parallel::remove_in_edge(e, g, DirectedS());
+    if (source(e, g).owner == g.processor())
+      remove_edge(e.local, g.base());
+
+    g.remove_local_edge_from_list(source(e, g), target(e, g), DirectedS());
+
+    if (source(e, g).owner != g.processor()
+        || (target(e, g).owner != g.processor()
+            && !(is_same<DirectedS, directedS>::value))) {
+      g.send_remove_edge_request(e);
+    }
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  void
+  remove_edge(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+              typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v,
+              PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::vertex_descriptor vertex_descriptor;
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::edge_descriptor edge_descriptor;
+    std::pair<edge_descriptor, bool> the_edge = edge(u, v, g);
+    if (the_edge.second) remove_edge(the_edge.first, g);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline void
+  remove_edge(typename PBGL_DISTRIB_ADJLIST_TYPE::out_edge_iterator ei,
+              PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    remove_edge(*ei, g);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  inline void
+  remove_edge(typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)
+                ::out_edge_iterator ei,
+              PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)& g)
+  {
+    assert(source(*ei, g).owner == g.processor());
+    remove_edge(ei->local, g.base());
+  }
+
+  /************************************************************************
+   *
+   * remove_out_edge_if
+   *
+   ************************************************************************/
+  namespace parallel { namespace detail {
+    /**
+     * Function object that applies the underlying predicate to
+     * determine if an out-edge should be removed. If so, either
+     * removes the incoming edge (if it is stored locally) or sends a
+     * message to the owner of the target requesting that it remove
+     * the edge.
+     */
+    template<typename Graph, typename Predicate>
+    struct remove_out_edge_predicate
+    {
+      typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+      typedef typename Graph::local_edge_descriptor         argument_type;
+      typedef typename Graph::directed_selector             directed_selector;
+      typedef bool result_type;
+
+      remove_out_edge_predicate(Graph& g, Predicate& predicate)
+        : g(g), predicate(predicate) { }
+
+      bool operator()(const argument_type& le)
+      {
+        typedef typename edge_descriptor::template out_generator<Graph>
+          generator;
+
+        edge_descriptor e = generator(g)(le);
+
+        if (predicate(e)) {
+          if (source(e, g).owner != target(e, g).owner
+              && !(is_same<directed_selector, directedS>::value))
+            g.send_remove_edge_request(e);
+          else
+            ::boost::detail::parallel::remove_in_edge(e, g,
+                                                      directed_selector());
+
+           g.remove_local_edge_from_list(source(e, g), target(e, g),
+                                         directed_selector());
+          return true;
+        } else return false;
+      }
+
+    private:
+      Graph& g;
+      Predicate predicate;
+    };
+  } } // end namespace parallel::detail
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename Predicate>
+  inline void
+  remove_out_edge_if
+     (typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+      Predicate predicate,
+      PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE Graph;
+    typedef parallel::detail::remove_out_edge_predicate<Graph, Predicate>
+      Pred;
+
+    assert(u.owner == g.processor());
+    remove_out_edge_if(u.local, Pred(g, predicate), g.base());
+  }
+
+  /************************************************************************
+   *
+   * remove_in_edge_if
+   *
+   ************************************************************************/
+  namespace parallel { namespace detail {
+    /**
+     * Function object that applies the underlying predicate to
+     * determine if an in-edge should be removed. If so, either
+     * removes the outgoing edge (if it is stored locally) or sends a
+     * message to the owner of the target requesting that it remove
+     * the edge. Only required for bidirectional graphs.
+     */
+    template<typename Graph, typename Predicate>
+    struct remove_in_edge_predicate
+    {
+      typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+      typedef bool result_type;
+
+      remove_in_edge_predicate(Graph& g, const Predicate& predicate)
+        : g(g), predicate(predicate) { }
+
+      template<typename StoredEdge>
+      bool operator()(const StoredEdge& le)
+      {
+        typedef typename edge_descriptor::template in_generator<Graph>
+          generator;
+
+        edge_descriptor e = generator(g)(le);
+
+        if (predicate(e)) {
+          if (source(e, g).owner != target(e, g).owner)
+            g.send_remove_edge_request(e);
+          else
+            remove_edge(source(e, g).local, target(e, g).local, g.base());
+          return true;
+        } else return false;
+      }
+
+    private:
+      Graph& g;
+      Predicate predicate;
+    };
+  } } // end namespace parallel::detail
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG, typename Predicate>
+  inline void
+  remove_in_edge_if
+     (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                 ::vertex_descriptor u,
+      Predicate predicate,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS) Graph;
+    typedef parallel::detail::remove_in_edge_predicate<Graph, Predicate>
+      Pred;
+
+    assert(u.owner == g.processor());
+    graph_detail::erase_if(get(vertex_in_edges, g.base())[u.local],
+                           Pred(g, predicate));
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG, typename Predicate>
+  inline void
+  remove_in_edge_if
+     (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                 ::vertex_descriptor u,
+      Predicate predicate,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    remove_out_edge_if(u, predicate, g);
+  }
+
+  /************************************************************************
+   *
+   * remove_edge_if
+   *
+   ************************************************************************/
+  namespace parallel { namespace detail {
+    /**
+     * Function object that applies the underlying predicate to
+     * determine if a directed edge can be removed. This only applies
+     * to directed graphs.
+     */
+    template<typename Graph, typename Predicate>
+    struct remove_directed_edge_predicate
+    {
+      typedef typename Graph::local_edge_descriptor argument_type;
+      typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+      typedef bool result_type;
+
+      remove_directed_edge_predicate(Graph& g, const Predicate& predicate)
+        : g(g), predicate(predicate) { }
+
+      bool operator()(const argument_type& le)
+      {
+        typedef typename edge_descriptor::template out_generator<Graph>
+          generator;
+
+        edge_descriptor e = generator(g)(le);
+        return predicate(e);
+      }
+
+    private:
+      Graph& g;
+      Predicate predicate;
+    };
+  } } // end namespace parallel::detail
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG, typename Predicate>
+  inline void
+  remove_edge_if(Predicate predicate, 
+                 PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS) Graph;
+    typedef parallel::detail::remove_directed_edge_predicate<Graph,
+                                                             Predicate> Pred;
+    remove_edge_if(Pred(g, predicate), g.base());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG, typename Predicate>
+  inline void
+  remove_edge_if(Predicate predicate,
+                 PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS) Graph;
+    typedef parallel::detail::remove_out_edge_predicate<Graph,
+                                                        Predicate> Pred;
+    remove_edge_if(Pred(g, predicate), g.base());
+  }
+
+  namespace parallel { namespace detail {
+    /**
+     * Function object that applies the underlying predicate to
+     * determine if an undirected edge should be removed. If so,
+     * removes the local edges associated with the edge and
+     * (potentially) sends a message to the remote processor that also
+     * is removing this edge.
+     */
+    template<typename Graph, typename Predicate>
+    struct remove_undirected_edge_predicate
+    {
+      typedef typename graph_traits<Graph>::edge_descriptor argument_type;
+      typedef bool result_type;
+
+      remove_undirected_edge_predicate(Graph& g, Predicate& predicate)
+        : g(g), predicate(predicate) { }
+
+      bool operator()(const argument_type& e)
+      {
+        if (predicate(e)) {
+          if (source(e, g).owner != target(e, g).owner)
+            g.send_remove_edge_request(e);
+          if (target(e, g).owner == g.processor())
+            ::boost::detail::parallel::remove_in_edge(e, g, undirectedS());
+          if (source(e, g).owner == g.processor())
+            remove_edge(e.local, g.base());
+          return true;
+        } else return false;
+      }
+
+    private:
+      Graph& g;
+      Predicate predicate;
+    };
+  } } // end namespace parallel::detail
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG, typename Predicate>
+  inline void
+  remove_edge_if(Predicate predicate,
+                 PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS) Graph;
+    typedef parallel::detail::remove_undirected_edge_predicate<Graph,
+                                                               Predicate> Pred;
+    graph_detail::erase_if(g.local_edges(), Pred(g, predicate));
+  }
+
+  /************************************************************************
+   *
+   * clear_vertex
+   *
+   ************************************************************************/
+  namespace parallel { namespace detail {
+    struct always_true
+    {
+      typedef bool result_type;
+
+      template<typename T> bool operator()(const T&) const { return true; }
+    };
+  } } // end namespace parallel::detail
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  void
+  clear_vertex
+    (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+          ::vertex_descriptor u,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    clear_out_edges(u, g);
+    clear_in_edges(u, g);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  void
+  clear_vertex
+    (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)
+                ::vertex_descriptor u,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(undirectedS)& g)
+  {
+    remove_out_edge_if(u, parallel::detail::always_true(), g);
+  }
+
+  /************************************************************************
+   *
+   * clear_out_edges
+   *
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  void
+  clear_out_edges
+    (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)::vertex_descriptor u,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(directedS)& g)
+  {
+    assert(u.owner == g.processor());
+    clear_out_edges(u.local, g.base());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  void
+  clear_out_edges
+    (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                ::vertex_descriptor u,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    remove_out_edge_if(u, parallel::detail::always_true(), g);
+  }
+
+  /************************************************************************
+   *
+   * clear_in_edges
+   *
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS_CONFIG>
+  void
+  clear_in_edges
+    (typename PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)
+                ::vertex_descriptor u,
+      PBGL_DISTRIB_ADJLIST_TYPE_CONFIG(bidirectionalS)& g)
+  {
+    remove_in_edge_if(u, parallel::detail::always_true(), g);
+  }
+
+  /************************************************************************
+   *
+   * add_vertex
+   *
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor
+  add_vertex(PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE graph_type;
+    typename graph_type::vertex_property_type p;
+    return add_vertex(p, g);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename PBGL_DISTRIB_ADJLIST_TYPE::lazy_add_vertex_with_property
+  add_vertex(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_property_type const& p,
+             PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE
+                       ::lazy_add_vertex_with_property lazy_add_vertex;
+    return lazy_add_vertex(g, p);
+  }
+
+  /************************************************************************
+   *
+   * remove_vertex
+   *
+   ************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  void
+  remove_vertex(typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor u,
+                PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename PBGL_DISTRIB_ADJLIST_TYPE::graph_type graph_type;
+    typedef typename graph_type::named_graph_mixin named_graph_mixin;
+    assert(u.owner == g.processor());
+    static_cast<named_graph_mixin&>(static_cast<graph_type&>(g))
+      .removing_vertex(u);
+    g.distribution().clear();
+    remove_vertex(u.local, g.base());
+  }
+
+  /***************************************************************************
+   * Implementation of Property Graph concept
+   ***************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename Property>
+  struct property_map<PBGL_DISTRIB_ADJLIST_TYPE, Property>
+  : detail::parallel::get_adj_list_pmap<Property>
+      ::template apply<PBGL_DISTRIB_ADJLIST_TYPE>
+  { };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename Property>
+  struct property_map<PBGL_DISTRIB_ADJLIST_TYPE const, Property>
+          : boost::detail::parallel::get_adj_list_pmap<Property>
+// FIXME: in the original code the following was not const
+      ::template apply<PBGL_DISTRIB_ADJLIST_TYPE const>
+  { };
+
+  template<typename Property, PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, Property>::type
+  get(Property p, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE Graph;
+    typedef typename property_map<Graph, Property>::type result_type;
+    typedef typename property_traits<result_type>::value_type value_type;
+    typedef typename property_reduce<Property>::template apply<value_type>
+      reduce;
+
+    typedef typename property_traits<result_type>::key_type descriptor;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                              vertex_global_t, edge_global_t>::type
+      global_map_t;
+
+    return result_type(g.process_group(), get(global_map_t(), g),
+                       get(p, g.base()), reduce());
+  }
+
+  template<typename Property, PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, Property>::const_type
+  get(Property p, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE Graph;
+    typedef typename property_map<Graph, Property>::const_type result_type;
+    typedef typename property_traits<result_type>::value_type value_type;
+    typedef typename property_reduce<Property>::template apply<value_type>
+      reduce;
+
+    typedef typename property_traits<result_type>::key_type descriptor;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                              vertex_global_t, edge_global_t>::type
+      global_map_t;
+
+    return result_type(g.process_group(), get(global_map_t(), g),
+                       get(p, g.base()), reduce());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_local_index_t>::type
+  get(vertex_local_index_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    return get(vertex_local_index, g.base());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE,
+                        vertex_local_index_t>::const_type
+  get(vertex_local_index_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    return get(vertex_local_index, g.base());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_global_t>::const_type
+  get(vertex_global_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_global_t>::const_type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_global_t>::const_type
+  get(vertex_global_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_global_t>::const_type result_type;
+    return result_type();
+  }
+
+  /// Retrieve a property map mapping from a vertex descriptor to its
+  /// owner.
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_owner_t>::type
+  get(vertex_owner_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_owner_t>::type result_type;
+    return result_type();
+  }
+
+  /// Retrieve a property map mapping from a vertex descriptor to its
+  /// owner.
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_owner_t>::const_type
+  get(vertex_owner_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_owner_t>::const_type result_type;
+    return result_type();
+  }
+
+  /// Retrieve the owner of a vertex
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline processor_id_type
+  get(vertex_owner_t, PBGL_DISTRIB_ADJLIST_TYPE&,
+      typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v)
+  {
+    return v.owner;
+  }
+
+  /// Retrieve the owner of a vertex
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline processor_id_type
+  get(vertex_owner_t, const PBGL_DISTRIB_ADJLIST_TYPE&,
+      typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v)
+  {
+    return v.owner;
+  }
+
+  /// Retrieve a property map that maps from a vertex descriptor to
+  /// its local descriptor.
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_local_t>::type
+  get(vertex_local_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_local_t>::type result_type;
+    return result_type();
+  }
+
+  /// Retrieve a property map that maps from a vertex descriptor to
+  /// its local descriptor.
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_local_t>::const_type
+  get(vertex_local_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       vertex_local_t>::const_type result_type;
+    return result_type();
+  }
+
+  /// Retrieve the local descriptor of a vertex
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline typename PBGL_DISTRIB_ADJLIST_TYPE::local_vertex_descriptor
+  get(vertex_local_t, PBGL_DISTRIB_ADJLIST_TYPE&,
+      typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v)
+  {
+    return v.local;
+  }
+
+  /// Retrieve the local descriptor of a vertex
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  inline typename PBGL_DISTRIB_ADJLIST_TYPE::local_vertex_descriptor
+  get(vertex_local_t, const PBGL_DISTRIB_ADJLIST_TYPE&,
+      typename PBGL_DISTRIB_ADJLIST_TYPE::vertex_descriptor v)
+  {
+    return v.local;
+  }
+
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_global_t>::const_type
+  get(edge_global_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_global_t>::const_type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_global_t>::const_type
+  get(edge_global_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_global_t>::const_type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_owner_t>::type
+  get(edge_owner_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_owner_t>::type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_owner_t>::const_type
+  get(edge_owner_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_owner_t>::const_type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_local_t>::type
+  get(edge_local_t, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_local_t>::type result_type;
+    return result_type();
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, edge_local_t>::const_type
+  get(edge_local_t, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef typename property_map<
+                       PBGL_DISTRIB_ADJLIST_TYPE,
+                       edge_local_t>::const_type result_type;
+    return result_type();
+  }
+
+  template<typename Property, PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS,
+           typename Key>
+  inline
+  typename property_traits<typename property_map<
+                PBGL_DISTRIB_ADJLIST_TYPE, Property>::const_type
+           >::value_type
+  get(Property p, const PBGL_DISTRIB_ADJLIST_TYPE& g, const Key& key)
+  {
+    if (owner(key) == process_id(g.process_group()))
+      return get(p, g.base(), local(key));
+    else
+      assert(false);
+  }
+
+  template<typename Property, PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS,
+           typename Key, typename Value>
+  void
+  put(Property p, PBGL_DISTRIB_ADJLIST_TYPE& g, const Key& key, const Value& v)
+  {
+    if (owner(key) == process_id(g.process_group()))
+      put(p, g.base(), local(key), v);
+    else
+      assert(false);
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_index_t>::type
+  get(vertex_index_t vi, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE graph_type;
+    typedef typename property_map<graph_type, vertex_index_t>::type
+      result_type;
+    return result_type(g.process_group(), get(vertex_global, g),
+                       get(vi, g.base()));
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, vertex_index_t>::const_type
+  get(vertex_index_t vi, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE graph_type;
+    typedef typename property_map<graph_type, vertex_index_t>::const_type
+      result_type;
+    return result_type(g.process_group(), get(vertex_global, g),
+                       get(vi, g.base()));
+  }
+
+  /***************************************************************************
+   * Implementation of bundled properties
+   ***************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename T, typename Bundle>
+  struct property_map<PBGL_DISTRIB_ADJLIST_TYPE, T Bundle::*>
+    : detail::parallel::get_adj_list_pmap<T Bundle::*>
+      ::template apply<PBGL_DISTRIB_ADJLIST_TYPE>
+  { };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename T, typename Bundle>
+  struct property_map<PBGL_DISTRIB_ADJLIST_TYPE const, T Bundle::*>
+    : detail::parallel::get_adj_list_pmap<T Bundle::*>
+      ::template apply<PBGL_DISTRIB_ADJLIST_TYPE const>
+  { };
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename T, typename Bundle>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, T Bundle::*>::type
+  get(T Bundle::* p, PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE Graph;
+    typedef typename property_map<Graph, T Bundle::*>::type result_type;
+    typedef typename property_traits<result_type>::value_type value_type;
+    typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+      reduce;
+
+    typedef typename property_traits<result_type>::key_type descriptor;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                              vertex_global_t, edge_global_t>::type
+      global_map_t;
+
+    return result_type(g.process_group(), get(global_map_t(), g),
+                       get(p, g.base()), reduce());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS, typename T, typename Bundle>
+  typename property_map<PBGL_DISTRIB_ADJLIST_TYPE, T Bundle::*>::const_type
+  get(T Bundle::* p, const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE Graph;
+    typedef typename property_map<Graph, T Bundle::*>::const_type result_type;
+    typedef typename property_traits<result_type>::value_type value_type;
+    typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+      reduce;
+
+    typedef typename property_traits<result_type>::key_type descriptor;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                              vertex_global_t, edge_global_t>::type
+      global_map_t;
+
+    return result_type(g.process_group(), get(global_map_t(), g),
+                       get(p, g.base()), reduce());
+  }
+
+  /***************************************************************************
+   * Implementation of DistributedGraph concept
+   ***************************************************************************/
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  void synchronize(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  {
+    typedef PBGL_DISTRIB_ADJLIST_TYPE graph_type;
+    synchronize(g.process_group());
+  }
+
+  template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+  ProcessGroup
+  process_group(const PBGL_DISTRIB_ADJLIST_TYPE& g)
+  { return g.process_group(); }
+
+  /***************************************************************************
+   * Specializations of is_mpi_datatype for Serializable entities
+   ***************************************************************************/
+  namespace mpi {
+    template<typename Directed, typename Vertex>
+    struct is_mpi_datatype<boost::detail::edge_base<Directed, Vertex> >
+      : is_mpi_datatype<Vertex> { };
+
+    template<typename Directed, typename Vertex>
+    struct is_mpi_datatype<boost::detail::edge_desc_impl<Directed, Vertex> >
+      : is_mpi_datatype<boost::detail::edge_base<Directed, Vertex> > { };
+
+    template<typename LocalDescriptor>
+    struct is_mpi_datatype<boost::detail::parallel::global_descriptor<LocalDescriptor> >
+      : is_mpi_datatype<LocalDescriptor> { };
+
+    template<typename Edge>
+    struct is_mpi_datatype<boost::detail::parallel::edge_descriptor<Edge> >
+      : is_mpi_datatype<Edge> { };
+
+    template<typename Vertex, typename LocalVertex>
+    struct is_mpi_datatype<boost::detail::parallel::
+                             msg_add_edge_data<Vertex, LocalVertex> >
+      : is_mpi_datatype<Vertex> { };
+
+    template<typename Vertex, typename LocalVertex, typename EdgeProperty>
+    struct is_mpi_datatype<boost::detail::parallel::
+                             msg_add_edge_with_property_data<Vertex, 
+                                                             LocalVertex,
+                                                             EdgeProperty> >
+      : mpl::and_<is_mpi_datatype<Vertex>, is_mpi_datatype<EdgeProperty> > { };
+
+
+   template<typename EdgeProperty, typename EdgeDescriptor>
+   struct is_mpi_datatype<boost::detail::parallel::msg_nonlocal_edge_data<
+                          EdgeProperty,EdgeDescriptor> >
+           : mpl::and_<
+               is_mpi_datatype<boost::detail::parallel::maybe_store_property<
+                           EdgeProperty> >,
+           is_mpi_datatype<EdgeDescriptor> >
+  {};
+   
+   template<typename EdgeDescriptor>
+   struct is_mpi_datatype<
+            boost::detail::parallel::msg_remove_edge_data<EdgeDescriptor> >
+           : is_mpi_datatype<EdgeDescriptor> {};
+  }
+
+  /***************************************************************************
+   * Specializations of is_bitwise_serializable for Serializable entities
+   ***************************************************************************/
+  namespace serialization {
+    template<typename Directed, typename Vertex>
+    struct is_bitwise_serializable<boost::detail::edge_base<Directed, Vertex> >
+      : is_bitwise_serializable<Vertex> { };
+
+    template<typename Directed, typename Vertex>
+    struct is_bitwise_serializable<boost::detail::edge_desc_impl<Directed, Vertex> >
+      : is_bitwise_serializable<boost::detail::edge_base<Directed, Vertex> > { };
+
+    template<typename LocalDescriptor>
+    struct is_bitwise_serializable<boost::detail::parallel::global_descriptor<LocalDescriptor> >
+      : is_bitwise_serializable<LocalDescriptor> { };
+
+    template<typename Edge>
+    struct is_bitwise_serializable<boost::detail::parallel::edge_descriptor<Edge> >
+      : is_bitwise_serializable<Edge> { };
+
+    template<typename Vertex, typename LocalVertex>
+    struct is_bitwise_serializable<boost::detail::parallel::
+                             msg_add_edge_data<Vertex, LocalVertex> >
+      : is_bitwise_serializable<Vertex> { };
+
+    template<typename Vertex, typename LocalVertex, typename EdgeProperty>
+    struct is_bitwise_serializable<boost::detail::parallel::
+                             msg_add_edge_with_property_data<Vertex, 
+                                                             LocalVertex,
+                                                             EdgeProperty> >
+      : mpl::and_<is_bitwise_serializable<Vertex>, 
+                  is_bitwise_serializable<EdgeProperty> > { };
+
+   template<typename EdgeProperty, typename EdgeDescriptor>
+   struct is_bitwise_serializable<boost::detail::parallel::msg_nonlocal_edge_data<
+                                  EdgeProperty,EdgeDescriptor> >
+           : mpl::and_<
+               is_bitwise_serializable<
+                boost::detail::parallel::maybe_store_property<EdgeProperty> >,
+           is_bitwise_serializable<EdgeDescriptor> >
+  {};
+   
+   template<typename EdgeDescriptor>
+   struct is_bitwise_serializable<
+            boost::detail::parallel::msg_remove_edge_data<EdgeDescriptor> >
+           : is_bitwise_serializable<EdgeDescriptor> {};
+   
+    template<typename Directed, typename Vertex>
+    struct implementation_level<boost::detail::edge_base<Directed, Vertex> >
+      : mpl::int_<object_serializable> {};
+
+    template<typename Directed, typename Vertex>
+    struct implementation_level<boost::detail::edge_desc_impl<Directed, Vertex> >
+      : mpl::int_<object_serializable> {};
+
+    template<typename LocalDescriptor>
+    struct implementation_level<boost::detail::parallel::global_descriptor<LocalDescriptor> >
+      : mpl::int_<object_serializable> {};
+
+    template<typename Edge>
+    struct implementation_level<boost::detail::parallel::edge_descriptor<Edge> >
+      : mpl::int_<object_serializable> {};
+
+    template<typename Vertex, typename LocalVertex>
+    struct implementation_level<boost::detail::parallel::
+                             msg_add_edge_data<Vertex, LocalVertex> >
+      : mpl::int_<object_serializable> {};
+
+    template<typename Vertex, typename LocalVertex, typename EdgeProperty>
+    struct implementation_level<boost::detail::parallel::
+                             msg_add_edge_with_property_data<Vertex, 
+                                                             LocalVertex,
+                                                             EdgeProperty> >
+      : mpl::int_<object_serializable> {};
+
+   template<typename EdgeProperty, typename EdgeDescriptor>
+   struct implementation_level<boost::detail::parallel::msg_nonlocal_edge_data<
+                               EdgeProperty,EdgeDescriptor> >
+           : mpl::int_<object_serializable> {};
+   
+   template<typename EdgeDescriptor>
+   struct implementation_level<
+            boost::detail::parallel::msg_remove_edge_data<EdgeDescriptor> >
+          : mpl::int_<object_serializable> {};
+   
+    template<typename Directed, typename Vertex>
+    struct tracking_level<boost::detail::edge_base<Directed, Vertex> >
+      : mpl::int_<track_never> {};
+
+    template<typename Directed, typename Vertex>
+    struct tracking_level<boost::detail::edge_desc_impl<Directed, Vertex> >
+      : mpl::int_<track_never> {};
+
+    template<typename LocalDescriptor>
+    struct tracking_level<boost::detail::parallel::global_descriptor<LocalDescriptor> >
+      : mpl::int_<track_never> {};
+
+    template<typename Edge>
+    struct tracking_level<boost::detail::parallel::edge_descriptor<Edge> >
+      : mpl::int_<track_never> {};
+
+    template<typename Vertex, typename LocalVertex>
+    struct tracking_level<boost::detail::parallel::
+                             msg_add_edge_data<Vertex, LocalVertex> >
+      : mpl::int_<track_never> {};
+
+    template<typename Vertex, typename LocalVertex, typename EdgeProperty>
+    struct tracking_level<boost::detail::parallel::
+                             msg_add_edge_with_property_data<Vertex, 
+                                                             LocalVertex,
+                                                             EdgeProperty> >
+      : mpl::int_<track_never> {};
+
+   template<typename EdgeProperty, typename EdgeDescriptor>
+   struct tracking_level<boost::detail::parallel::msg_nonlocal_edge_data<
+                         EdgeProperty,EdgeDescriptor> >
+           : mpl::int_<track_never> {};
+   
+   template<typename EdgeDescriptor>
+   struct tracking_level<
+            boost::detail::parallel::msg_remove_edge_data<EdgeDescriptor> >
+          : mpl::int_<track_never> {};
+  }
+
+  // Hash function for global descriptors
+  template<typename LocalDescriptor>
+  struct hash<detail::parallel::global_descriptor<LocalDescriptor> >
+  {
+    typedef detail::parallel::global_descriptor<LocalDescriptor> argument_type;
+    std::size_t operator()(argument_type const& x) const
+    {
+      std::size_t hash = hash_value(x.owner);
+      hash_combine(hash, x.local);
+      return hash;
+    }
+  };
+
+  // Hash function for parallel edge descriptors
+  template<typename Edge>
+  struct hash<detail::parallel::edge_descriptor<Edge> >
+  {
+    typedef detail::parallel::edge_descriptor<Edge> argument_type;
+
+    std::size_t operator()(argument_type const& x) const
+    {
+      std::size_t hash = hash_value(x.owner());
+      hash_combine(hash, x.local);
+      return hash;
+    }
+  };
+
+} // end namespace boost
+
+#include <boost/graph/distributed/adjlist/handlers.hpp>
+#include <boost/graph/distributed/adjlist/initialize.hpp>
+#include <boost/graph/distributed/adjlist/redistribute.hpp>
+#include <boost/graph/distributed/adjlist/serialization.hpp>
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ADJACENCY_LIST_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/handlers.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/handlers.hpp
new file mode 100644 (file)
index 0000000..7c1e431
--- /dev/null
@@ -0,0 +1,148 @@
+// Copyright (C) 2007 Douglas Gregor 
+
+// 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)
+
+// This file contains code for the distributed adjacency list's
+// message handlers. It should not be included directly by users.
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/simple_trigger.hpp>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+
+namespace boost { 
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void
+PBGL_DISTRIB_ADJLIST_TYPE::
+setup_triggers()
+{
+  using boost::graph::parallel::simple_trigger;
+
+  simple_trigger(process_group_, msg_add_vertex_with_property, this,
+                 &adjacency_list::handle_add_vertex_with_property);
+  simple_trigger(process_group_, msg_add_vertex_with_property_and_reply, this,
+                 &adjacency_list::handle_add_vertex_with_property_and_reply);
+  simple_trigger(process_group_, msg_add_edge, this, 
+                 &adjacency_list::handle_add_edge);
+  simple_trigger(process_group_, msg_add_edge_with_reply, this, 
+                 &adjacency_list::handle_add_edge_with_reply);
+  simple_trigger(process_group_, msg_add_edge_with_property, this,
+                 &adjacency_list::handle_add_edge_with_property);
+  simple_trigger(process_group_,  msg_add_edge_with_property_and_reply, this,
+                 &adjacency_list::handle_add_edge_with_property_and_reply);
+  simple_trigger(process_group_, msg_nonlocal_edge, this,
+                 &adjacency_list::handle_nonlocal_edge);
+  simple_trigger(process_group_, msg_remove_edge, this,
+                 &adjacency_list::handle_remove_edge);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void 
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_vertex_with_property(int source, int tag, 
+                                const vertex_property_type& data, 
+                                trigger_receive_context)
+{
+  vertex_descriptor v(this->processor(), 
+                      add_vertex(this->build_vertex_property(data), 
+                                 this->base()));
+  if (on_add_vertex)
+    on_add_vertex(v, *this);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+typename PBGL_DISTRIB_ADJLIST_TYPE::local_vertex_descriptor
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_vertex_with_property_and_reply(int source, int tag, 
+                                          const vertex_property_type& data, 
+                                          trigger_receive_context)
+{
+  // Try to find a vertex with this name
+  local_vertex_descriptor local_v
+    = add_vertex(this->build_vertex_property(data), this->base());
+
+  vertex_descriptor v(processor(), local_v);
+  if (on_add_vertex)
+    on_add_vertex(v, *this);
+
+  return local_v;
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void 
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_edge(int source, int tag, const msg_add_edge_data& data,
+                trigger_receive_context)
+{
+  add_edge(vertex_descriptor(processor(), data.source), 
+           data.target, *this);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_edge_with_reply(int source, int tag, const msg_add_edge_data& data,
+                           trigger_receive_context)
+{
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = 
+    add_edge(vertex_descriptor(processor(), data.source),data.target, *this);
+  return p;
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void 
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_edge_with_property(int source, int tag, 
+                              const msg_add_edge_with_property_data& data,
+                              trigger_receive_context)
+{
+  add_edge(vertex_descriptor(processor(), data.source), 
+           data.target, data.get_property(), *this);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+boost::parallel::detail::untracked_pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool>
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_add_edge_with_property_and_reply
+  (int source, int tag, 
+   const msg_add_edge_with_property_data& data,
+   trigger_receive_context)
+{
+  std::pair<typename PBGL_DISTRIB_ADJLIST_TYPE::edge_descriptor, bool> p = 
+    add_edge(vertex_descriptor(processor(), data.source), 
+                  data.target, data.get_property(), *this);
+  return p;
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void 
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_nonlocal_edge(int source, int tag, 
+                     const msg_nonlocal_edge_data& data,
+                     trigger_receive_context)
+{
+  add_remote_edge(data, source, directed_selector());
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+void 
+PBGL_DISTRIB_ADJLIST_TYPE::
+handle_remove_edge(int source, int tag, 
+                   const msg_remove_edge_data& data,
+                   trigger_receive_context)
+{
+  remove_local_edge(data, source, directed_selector());
+}
+
+} 
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ADJLIST_HANDLERS_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/initialize.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/initialize.hpp
new file mode 100644 (file)
index 0000000..4bb85d4
--- /dev/null
@@ -0,0 +1,319 @@
+// Copyright (C) 2007 Douglas Gregor 
+
+// 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)
+
+// This file contains code for the distributed adjacency list's
+// initializations. It should not be included directly by users.
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_ADJLIST_INITIALIZE_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ADJLIST_INITIALIZE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { 
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename EdgeIterator>
+void
+PBGL_DISTRIB_ADJLIST_TYPE::
+initialize(EdgeIterator first, EdgeIterator last,
+           vertices_size_type, const base_distribution_type& distribution, 
+           vecS)
+{
+  process_id_type id = process_id(process_group_);
+  while (first != last) {
+    if ((process_id_type)distribution(first->first) == id) {
+      vertex_descriptor source(id, distribution.local(first->first));
+      vertex_descriptor target(distribution(first->second),
+                               distribution.local(first->second));
+      add_edge(source, target, *this);
+    }
+    ++first;
+  }
+
+  synchronize(process_group_);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename EdgeIterator, typename EdgePropertyIterator>
+void
+PBGL_DISTRIB_ADJLIST_TYPE::
+initialize(EdgeIterator first, EdgeIterator last,
+           EdgePropertyIterator ep_iter,
+           vertices_size_type, const base_distribution_type& distribution, 
+           vecS)
+{
+  process_id_type id = process_id(process_group_);
+  while (first != last) {
+    if (static_cast<process_id_type>(distribution(first->first)) == id) {
+      vertex_descriptor source(id, distribution.local(first->first));
+      vertex_descriptor target(distribution(first->second),
+                               distribution.local(first->second));
+      add_edge(source, target, *ep_iter, *this);
+    }
+    ++first;
+    ++ep_iter;
+  }
+
+  synchronize(process_group_);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename EdgeIterator, typename EdgePropertyIterator,
+         typename VertexListS>
+void
+PBGL_DISTRIB_ADJLIST_TYPE::
+initialize(EdgeIterator first, EdgeIterator last,
+           EdgePropertyIterator ep_iter,
+           vertices_size_type n, const base_distribution_type& distribution,
+           VertexListS)
+{
+  using boost::parallel::inplace_all_to_all;
+
+  typedef vertices_size_type vertex_number_t;
+  typedef typename std::iterator_traits<EdgePropertyIterator>::value_type
+    edge_property_init_t;
+
+  typedef std::pair<vertex_descriptor, vertex_number_t>
+    st_pair;
+  typedef std::pair<st_pair, edge_property_init_t> delayed_edge_t;
+
+  process_group_type pg = process_group();
+  process_id_type id = process_id(pg);
+
+  // Vertex indices
+  std::vector<local_vertex_descriptor> index_to_vertex;
+  index_to_vertex.reserve(num_vertices(*this));
+  BGL_FORALL_VERTICES_T(v, base(), inherited)
+    index_to_vertex.push_back(v);
+
+  // The list of edges we can't add immediately.
+  std::vector<delayed_edge_t> delayed_edges;
+
+  std::vector<std::vector<vertex_number_t> > descriptor_requests;
+  descriptor_requests.resize(num_processes(pg));
+
+  // Add all of the edges we can, up to the point where we run
+  // into a descriptor we don't know.
+  while (first != last) {
+    if (distribution(first->first) == id) {
+      if (distribution(first->second) != id) break;
+      vertex_descriptor source
+        (id, index_to_vertex[distribution.local(first->first)]);
+      vertex_descriptor target
+        (distribution(first->second),
+         index_to_vertex[distribution.local(first->second)]);
+      add_edge(source, target, *ep_iter, *this);
+    }
+    ++first;
+    ++ep_iter;
+  }
+
+  // Queue all of the remaining edges and determine the set of
+  // descriptors we need to know about.
+  while (first != last) {
+    if (distribution(first->first) == id) {
+      vertex_descriptor source
+        (id, index_to_vertex[distribution.local(first->first)]);
+      process_id_type dest = distribution(first->second);
+      if (dest != id) {
+        descriptor_requests[dest]
+          .push_back(distribution.local(first->second));
+        // Compact request list if we need to
+        if (descriptor_requests[dest].size() >
+              distribution.block_size(dest, n)) {
+          std::sort(descriptor_requests[dest].begin(),
+                    descriptor_requests[dest].end());
+          descriptor_requests[dest].erase(
+            std::unique(descriptor_requests[dest].begin(),
+                        descriptor_requests[dest].end()),
+            descriptor_requests[dest].end());
+        }
+      }
+
+      // Save the edge for later
+      delayed_edges.push_back
+        (delayed_edge_t(st_pair(source, first->second), *ep_iter));
+    }
+    ++first;
+    ++ep_iter;
+  }
+
+  // Compact descriptor requests
+  for (process_id_type dest = 0; dest < num_processes(pg); ++dest) {
+    std::sort(descriptor_requests[dest].begin(),
+              descriptor_requests[dest].end());
+    descriptor_requests[dest].erase(
+      std::unique(descriptor_requests[dest].begin(),
+                  descriptor_requests[dest].end()),
+      descriptor_requests[dest].end());
+  }
+
+  // Send out all of the descriptor requests
+  std::vector<std::vector<vertex_number_t> > in_descriptor_requests;
+  in_descriptor_requests.resize(num_processes(pg));
+  inplace_all_to_all(pg, descriptor_requests, in_descriptor_requests);
+
+  // Reply to all of the descriptor requests
+  std::vector<std::vector<local_vertex_descriptor> >
+    descriptor_responses;
+  descriptor_responses.resize(num_processes(pg));
+  for (process_id_type dest = 0; dest < num_processes(pg); ++dest) {
+    for (std::size_t i = 0; i < in_descriptor_requests[dest].size(); ++i) {
+      local_vertex_descriptor v =
+        index_to_vertex[in_descriptor_requests[dest][i]];
+      descriptor_responses[dest].push_back(v);
+    }
+    in_descriptor_requests[dest].clear();
+  }
+  in_descriptor_requests.clear();
+  inplace_all_to_all(pg, descriptor_responses);
+
+  // Add the queued edges
+  for(typename std::vector<delayed_edge_t>::iterator i
+        = delayed_edges.begin(); i != delayed_edges.end(); ++i) {
+    process_id_type dest = distribution(i->first.second);
+    local_vertex_descriptor tgt_local;
+    if (dest == id) {
+      tgt_local = index_to_vertex[distribution.local(i->first.second)];
+    } else {
+      std::vector<vertex_number_t>& requests = descriptor_requests[dest];
+      typename std::vector<vertex_number_t>::iterator pos =
+        std::lower_bound(requests.begin(), requests.end(),
+                         distribution.local(i->first.second));
+      tgt_local = descriptor_responses[dest][pos - requests.begin()];
+    }
+    add_edge(i->first.first, vertex_descriptor(dest, tgt_local),
+             i->second, *this);
+  }
+  synchronize(process_group_);
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename EdgeIterator, typename VertexListS>
+void
+PBGL_DISTRIB_ADJLIST_TYPE::
+initialize(EdgeIterator first, EdgeIterator last,
+           vertices_size_type n, const base_distribution_type& distribution,
+           VertexListS)
+{
+  using boost::parallel::inplace_all_to_all;
+
+  typedef vertices_size_type vertex_number_t;
+
+  typedef std::pair<vertex_descriptor, vertex_number_t> delayed_edge_t;
+
+  process_group_type pg = process_group();
+  process_id_type id = process_id(pg);
+
+  // Vertex indices
+  std::vector<local_vertex_descriptor> index_to_vertex;
+  index_to_vertex.reserve(num_vertices(*this));
+  BGL_FORALL_VERTICES_T(v, base(), inherited)
+    index_to_vertex.push_back(v);
+
+  // The list of edges we can't add immediately.
+  std::vector<delayed_edge_t> delayed_edges;
+
+  std::vector<std::vector<vertex_number_t> > descriptor_requests;
+  descriptor_requests.resize(num_processes(pg));
+
+  // Add all of the edges we can, up to the point where we run
+  // into a descriptor we don't know.
+  while (first != last) {
+    if (distribution(first->first) == id) {
+      if (distribution(first->second) != id) break;
+      vertex_descriptor source
+        (id, index_to_vertex[distribution.local(first->first)]);
+      vertex_descriptor target
+        (distribution(first->second),
+         index_to_vertex[distribution.local(first->second)]);
+      add_edge(source, target, *this);
+    }
+    ++first;
+  }
+
+  // Queue all of the remaining edges and determine the set of
+  // descriptors we need to know about.
+  while (first != last) {
+    if (distribution(first->first) == id) {
+      vertex_descriptor source
+        (id, index_to_vertex[distribution.local(first->first)]);
+      process_id_type dest = distribution(first->second);
+      if (dest != id) {
+        descriptor_requests[dest]
+          .push_back(distribution.local(first->second));
+        // Compact request list if we need to
+        if (descriptor_requests[dest].size() >
+              distribution.block_size(dest, n)) {
+          std::sort(descriptor_requests[dest].begin(),
+                    descriptor_requests[dest].end());
+          descriptor_requests[dest].erase(
+            std::unique(descriptor_requests[dest].begin(),
+                        descriptor_requests[dest].end()),
+            descriptor_requests[dest].end());
+        }
+      }
+
+      // Save the edge for later
+      delayed_edges.push_back(delayed_edge_t(source, first->second));
+    }
+    ++first;
+  }
+
+  // Compact descriptor requests
+  for (process_id_type dest = 0; dest < num_processes(pg); ++dest) {
+    std::sort(descriptor_requests[dest].begin(),
+              descriptor_requests[dest].end());
+    descriptor_requests[dest].erase(
+      std::unique(descriptor_requests[dest].begin(),
+                  descriptor_requests[dest].end()),
+      descriptor_requests[dest].end());
+  }
+
+  // Send out all of the descriptor requests
+  std::vector<std::vector<vertex_number_t> > in_descriptor_requests;
+  in_descriptor_requests.resize(num_processes(pg));
+  inplace_all_to_all(pg, descriptor_requests, in_descriptor_requests);
+
+  // Reply to all of the descriptor requests
+  std::vector<std::vector<local_vertex_descriptor> >
+    descriptor_responses;
+  descriptor_responses.resize(num_processes(pg));
+  for (process_id_type dest = 0; dest < num_processes(pg); ++dest) {
+    for (std::size_t i = 0; i < in_descriptor_requests[dest].size(); ++i) {
+      local_vertex_descriptor v =
+        index_to_vertex[in_descriptor_requests[dest][i]];
+      descriptor_responses[dest].push_back(v);
+    }
+    in_descriptor_requests[dest].clear();
+  }
+  in_descriptor_requests.clear();
+  inplace_all_to_all(pg, descriptor_responses);
+
+  // Add the queued edges
+  for(typename std::vector<delayed_edge_t>::iterator i
+        = delayed_edges.begin(); i != delayed_edges.end(); ++i) {
+    process_id_type dest = distribution(i->second);
+    local_vertex_descriptor tgt_local;
+    if (dest == id) {
+      tgt_local = index_to_vertex[distribution.local(i->second)];
+    } else {
+      std::vector<vertex_number_t>& requests = descriptor_requests[dest];
+      typename std::vector<vertex_number_t>::iterator pos =
+        std::lower_bound(requests.begin(), requests.end(),
+                         distribution.local(i->second));
+      tgt_local = descriptor_responses[dest][pos - requests.begin()];
+    }
+    add_edge(i->first, vertex_descriptor(dest, tgt_local), *this);
+  }
+  synchronize(process_group_);
+}
+
+}   // end namespace boost
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ADJLIST_INITIALIZE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/redistribute.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/redistribute.hpp
new file mode 100644 (file)
index 0000000..62e79bf
--- /dev/null
@@ -0,0 +1,393 @@
+// Copyright (C) 2005-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+//
+// Implements redistribution of vertices for a distributed adjacency
+// list. This file should not be included by users. It will be
+// included by the distributed adjacency list header.
+//
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/pending/container_traits.hpp>
+
+namespace boost { namespace detail { namespace parallel {
+
+/* This structure contains a (vertex or edge) descriptor that is being
+   moved from one processor to another. It contains the properties for
+   that descriptor (if any).
+ */
+template<typename Descriptor, typename DescriptorProperty>
+struct redistributed_descriptor : maybe_store_property<DescriptorProperty>
+{
+  typedef maybe_store_property<DescriptorProperty> inherited;
+
+  redistributed_descriptor() { }
+
+  redistributed_descriptor(const Descriptor& v, const DescriptorProperty& p)
+    : inherited(p), descriptor(v) { }
+
+  Descriptor descriptor;
+
+private:
+  friend class boost::serialization::access;
+
+  template<typename Archiver>
+  void serialize(Archiver& ar, unsigned int /*version*/)
+  {
+    ar & boost::serialization::base_object<inherited>(*this) 
+       & unsafe_serialize(descriptor);
+  }
+};
+
+/* Predicate that returns true if the target has migrated. */
+template<typename VertexProcessorMap, typename Graph>
+struct target_migrated_t
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+  target_migrated_t(VertexProcessorMap vertex_to_processor, const Graph& g)
+    : vertex_to_processor(vertex_to_processor), g(g) { }
+
+  bool operator()(Edge e) const
+  {
+    typedef global_descriptor<Vertex> DVertex;
+    processor_id_type owner = get(edge_target_processor_id, g, e);
+    return get(vertex_to_processor, DVertex(owner, target(e, g))) != owner;
+  }
+
+private:
+  VertexProcessorMap vertex_to_processor;
+  const Graph& g;
+};
+
+template<typename VertexProcessorMap, typename Graph>
+inline target_migrated_t<VertexProcessorMap, Graph>
+target_migrated(VertexProcessorMap vertex_to_processor, const Graph& g)
+{ return target_migrated_t<VertexProcessorMap, Graph>(vertex_to_processor, g); }
+
+/* Predicate that returns true if the source of an in-edge has migrated. */
+template<typename VertexProcessorMap, typename Graph>
+struct source_migrated_t
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+  source_migrated_t(VertexProcessorMap vertex_to_processor, const Graph& g)
+    : vertex_to_processor(vertex_to_processor), g(g) { }
+
+  bool operator()(stored_in_edge<Edge> e) const
+  {
+    return get(vertex_to_processor, DVertex(e.source_processor, source(e.e, g)))
+      != e.source_processor;
+  }
+
+private:
+  VertexProcessorMap vertex_to_processor;
+  const Graph& g;
+};
+
+template<typename VertexProcessorMap, typename Graph>
+inline source_migrated_t<VertexProcessorMap, Graph>
+source_migrated(VertexProcessorMap vertex_to_processor, const Graph& g)
+{ return source_migrated_t<VertexProcessorMap, Graph>(vertex_to_processor, g); }
+
+/* Predicate that returns true if the target has migrated. */
+template<typename VertexProcessorMap, typename Graph>
+struct source_or_target_migrated_t
+{
+  typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+  source_or_target_migrated_t(VertexProcessorMap vertex_to_processor,
+                              const Graph& g)
+    : vertex_to_processor(vertex_to_processor), g(g) { }
+
+  bool operator()(Edge e) const
+  {
+    return get(vertex_to_processor, source(e, g)) != source(e, g).owner
+      || get(vertex_to_processor, target(e, g)) != target(e, g).owner;
+  }
+
+private:
+  VertexProcessorMap vertex_to_processor;
+  const Graph& g;
+};
+
+template<typename VertexProcessorMap, typename Graph>
+inline source_or_target_migrated_t<VertexProcessorMap, Graph>
+source_or_target_migrated(VertexProcessorMap vertex_to_processor,
+const Graph& g)
+{
+  typedef source_or_target_migrated_t<VertexProcessorMap, Graph> result_type;
+  return result_type(vertex_to_processor, g);
+}
+
+} } // end of namespace detail::parallel
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename VertexProcessorMap>
+void
+PBGL_DISTRIB_ADJLIST_TYPE
+::request_in_neighbors(vertex_descriptor v,
+                       VertexProcessorMap vertex_to_processor,
+                       bidirectionalS)
+{
+  BGL_FORALL_INEDGES_T(v, e, *this, graph_type)
+    request(vertex_to_processor, source(e, *this));
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename VertexProcessorMap>
+void
+PBGL_DISTRIB_ADJLIST_TYPE
+::remove_migrated_in_edges(vertex_descriptor v,
+                           VertexProcessorMap vertex_to_processor,
+                           bidirectionalS)
+{
+  graph_detail::erase_if(get(vertex_in_edges, base())[v.local],
+                         source_migrated(vertex_to_processor, base()));
+}
+
+template<PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template<typename VertexProcessorMap>
+void
+PBGL_DISTRIB_ADJLIST_TYPE
+::redistribute(VertexProcessorMap vertex_to_processor)
+{
+  using boost::parallel::inplace_all_to_all;
+
+  // When we have stable descriptors, we only move those descriptors
+  // that actually need to be moved. Otherwise, we essentially have to
+  // regenerate the entire graph.
+  const bool has_stable_descriptors =
+    is_same<typename config_type::vertex_list_selector, listS>::value
+    || is_same<typename config_type::vertex_list_selector, setS>::value
+    || is_same<typename config_type::vertex_list_selector, multisetS>::value;
+
+  typedef detail::parallel::redistributed_descriptor<vertex_descriptor, 
+                                                     vertex_property_type>
+    redistributed_vertex;
+  typedef detail::parallel::redistributed_descriptor<edge_descriptor, 
+                                                     edge_property_type>
+    redistributed_edge;
+  typedef std::pair<vertices_size_type, edges_size_type> num_relocated_pair;
+
+  vertex_iterator vi, vi_end;
+  edge_iterator ei, ei_end;
+
+  process_group_type pg = process_group();
+
+  // Initial synchronization makes sure that we have all of our ducks
+  // in a row. We don't want any outstanding add/remove messages
+  // coming in mid-redistribution!
+  synchronize(process_group_);
+
+  // We cannot cope with eviction of ghost cells
+  vertex_to_processor.set_max_ghost_cells(0);
+
+  process_id_type p = num_processes(pg);
+
+  // Send vertices and edges to the processor where they will
+  // actually reside.  This requires O(|V| + |E|) communication
+  std::vector<std::vector<redistributed_vertex> > redistributed_vertices(p);
+  std::vector<std::vector<redistributed_edge> > redistributed_edges(p);
+
+  // Build the sets of relocated vertices for each process and then do
+  // an all-to-all transfer.
+  for (tie(vi, vi_end) = vertices(*this); vi != vi_end; ++vi) {
+    if (!has_stable_descriptors
+        || get(vertex_to_processor, *vi) != vi->owner) {
+      redistributed_vertices[get(vertex_to_processor, *vi)]
+        .push_back(redistributed_vertex(*vi, get(vertex_all_t(), base(),
+                                                 vi->local)));
+    }
+
+    // When our descriptors are stable, we need to determine which
+    // adjacent descriptors are stable to determine which edges will
+    // be removed.
+    if (has_stable_descriptors) {
+      BGL_FORALL_OUTEDGES_T(*vi, e, *this, graph_type)
+        request(vertex_to_processor, target(e, *this));
+      request_in_neighbors(*vi, vertex_to_processor, directed_selector());
+    }
+  }
+
+  inplace_all_to_all(pg, redistributed_vertices);
+
+  // If we have stable descriptors, we need to know where our neighbor
+  // vertices are moving.
+  if (has_stable_descriptors)
+    synchronize(vertex_to_processor);
+
+  // Build the sets of relocated edges for each process and then do
+  // an all-to-all transfer.
+  for (tie(ei, ei_end) = edges(*this); ei != ei_end; ++ei) {
+    vertex_descriptor src = source(*ei, *this);
+    vertex_descriptor tgt = target(*ei, *this);
+    if (!has_stable_descriptors
+        || get(vertex_to_processor, src) != src.owner
+        || get(vertex_to_processor, tgt) != tgt.owner)
+      redistributed_edges[get(vertex_to_processor, source(*ei, *this))]
+        .push_back(redistributed_edge(*ei, get(edge_all_t(), base(),
+                                               ei->local)));
+  }
+  inplace_all_to_all(pg, redistributed_edges);
+
+  // A mapping from old vertex descriptors to new vertex
+  // descriptors. This is an STL map partly because I'm too lazy to
+  // build a real property map (which is hard in the general case) but
+  // also because it won't try to look in the graph itself, because
+  // the keys are all vertex descriptors that have been invalidated.
+  std::map<vertex_descriptor, vertex_descriptor> old_to_new_vertex_map;
+
+  if (has_stable_descriptors) {
+    // Clear out all vertices and edges that will have moved. There
+    // are several stages to this.
+
+    // First, eliminate all outgoing edges from the (local) vertices
+    // that have been moved or whose targets have been moved.
+    BGL_FORALL_VERTICES_T(v, *this, graph_type) {
+      if (get(vertex_to_processor, v) != v.owner) {
+        clear_out_edges(v.local, base());
+        clear_in_edges_local(v, directed_selector());
+      } else {
+        remove_out_edge_if(v.local,
+                           target_migrated(vertex_to_processor, base()),
+                           base());
+        remove_migrated_in_edges(v, vertex_to_processor, directed_selector());
+      }
+    }
+
+    // Next, eliminate locally-stored edges that have migrated (for
+    // undirected graphs).
+    graph_detail::erase_if(local_edges_,
+                           source_or_target_migrated(vertex_to_processor, *this));
+
+    // Eliminate vertices that have migrated
+    for (tie(vi, vi_end) = vertices(*this); vi != vi_end; /* in loop */) {
+      if (get(vertex_to_processor, *vi) != vi->owner)
+        remove_vertex((*vi++).local, base());
+      else {
+        // Add the identity relation for vertices that have not migrated
+        old_to_new_vertex_map[*vi] = *vi;
+        ++vi;
+      }
+    }
+  } else {
+    // Clear out the local graph: the entire graph is in transit
+    clear();
+  }
+
+  // Add the new vertices to the graph. When we do so, update the old
+  // -> new vertex mapping both locally and for the owner of the "old"
+  // vertex.
+  {
+    typedef std::pair<vertex_descriptor, vertex_descriptor> mapping_pair;
+    std::vector<std::vector<mapping_pair> > mappings(p);
+
+    for (process_id_type src = 0; src < p; ++src) {
+      for (typename std::vector<redistributed_vertex>::iterator vi =
+             redistributed_vertices[src].begin();
+           vi != redistributed_vertices[src].end(); ++vi) {
+        vertex_descriptor new_vertex =
+            add_vertex(vi->get_property(), *this);
+        old_to_new_vertex_map[vi->descriptor] = new_vertex;
+        mappings[vi->descriptor.owner].push_back(mapping_pair(vi->descriptor,
+                                                              new_vertex));
+      }
+
+      redistributed_vertices[src].clear();
+    }
+
+    inplace_all_to_all(pg, mappings);
+
+    // Add the mappings we were sent into the old->new map.
+    for (process_id_type src = 0; src < p; ++src)
+      old_to_new_vertex_map.insert(mappings[src].begin(), mappings[src].end());
+  }
+
+  // Get old->new vertex mappings for all of the vertices we need to
+  // know about.
+
+  // TBD: An optimization here might involve sending the
+  // request-response pairs without an explicit request step (for
+  // bidirectional and undirected graphs). However, it may not matter
+  // all that much given the cost of redistribution.
+  {
+    std::vector<std::vector<vertex_descriptor> > vertex_map_requests(p);
+    std::vector<std::vector<vertex_descriptor> > vertex_map_responses(p);
+
+    // We need to know about all of the vertices incident on edges
+    // that have been relocated to this processor. Tell each processor
+    // what each other processor needs to know.
+    for (process_id_type src = 0; src < p; ++src)
+      for (typename std::vector<redistributed_edge>::iterator ei =
+             redistributed_edges[src].begin();
+           ei != redistributed_edges[src].end(); ++ei) {
+        vertex_descriptor need_vertex = target(ei->descriptor, *this);
+        if (old_to_new_vertex_map.find(need_vertex)
+            == old_to_new_vertex_map.end())
+          {
+            old_to_new_vertex_map[need_vertex] = need_vertex;
+            vertex_map_requests[need_vertex.owner].push_back(need_vertex);
+          }
+      }
+    inplace_all_to_all(pg,
+                       vertex_map_requests,
+                       vertex_map_responses);
+
+    // Process the requests made for vertices we own. Then perform yet
+    // another all-to-all swap. This one matches the requests we've
+    // made to the responses we were given.
+    for (process_id_type src = 0; src < p; ++src)
+      for (typename std::vector<vertex_descriptor>::iterator vi =
+             vertex_map_responses[src].begin();
+           vi != vertex_map_responses[src].end(); ++vi)
+        *vi = old_to_new_vertex_map[*vi];
+    inplace_all_to_all(pg, vertex_map_responses);
+
+    // Matching the requests to the responses, update the old->new
+    // vertex map for all of the vertices we will need to know.
+    for (process_id_type src = 0; src < p; ++src) {
+      typedef typename std::vector<vertex_descriptor>::size_type size_type;
+      for (size_type i = 0; i < vertex_map_requests[src].size(); ++i) {
+        old_to_new_vertex_map[vertex_map_requests[src][i]] =
+          vertex_map_responses[src][i];
+      }
+    }
+  }
+
+  // Add edges to the graph by mapping the source and target.
+  for (process_id_type src = 0; src < p; ++src) {
+    for (typename std::vector<redistributed_edge>::iterator ei =
+           redistributed_edges[src].begin();
+         ei != redistributed_edges[src].end(); ++ei) {
+      add_edge(old_to_new_vertex_map[source(ei->descriptor, *this)],
+               old_to_new_vertex_map[target(ei->descriptor, *this)],
+               ei->get_property(),
+               *this);
+    }
+
+    redistributed_edges[src].clear();
+  }
+
+  // Be sure that edge-addition messages are received now, completing
+  // the graph.
+  synchronize(process_group_);
+
+  this->distribution().clear();
+
+  detail::parallel::maybe_initialize_vertex_indices(vertices(base()), 
+                                                    get(vertex_index, base()));
+}
+
+} // end namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/serialization.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/adjlist/serialization.hpp
new file mode 100644 (file)
index 0000000..b1685b5
--- /dev/null
@@ -0,0 +1,1007 @@
+// Copyright Daniel Wallin 2007. 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)
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_ADJLIST_SERIALIZATION_070925_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ADJLIST_SERIALIZATION_070925_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+# include <boost/lexical_cast.hpp>
+# include <boost/foreach.hpp>
+# include <boost/filesystem/path.hpp>
+# include <boost/filesystem/operations.hpp>
+# include <cctype>
+# include <fstream>
+
+namespace boost {
+
+namespace detail { namespace parallel
+{
+
+  // Wraps a local descriptor, making it serializable.
+  template <class Local>
+  struct serializable_local_descriptor
+  {
+      serializable_local_descriptor()
+      {}
+
+      serializable_local_descriptor(Local local)
+        : local(local)
+      {}
+
+      operator Local const&() const
+      {
+          return local;
+      }
+
+      bool operator==(serializable_local_descriptor const& other) const
+      {
+          return local == other.local;
+      }
+
+      bool operator<(serializable_local_descriptor const& other) const
+      {
+          return local < other.local;
+      }
+
+      template <class Archive>
+      void serialize(Archive& ar, const unsigned int /*version*/)
+      {
+          ar & unsafe_serialize(local);
+      }
+
+      Local local;
+  };
+
+  template <class Vertex, class Properties>
+  struct pending_edge
+  {
+      pending_edge(
+          Vertex source, Vertex target
+        , Properties properties, void* property_ptr
+      )
+        : source(source)
+        , target(target)
+        , properties(properties)
+        , property_ptr(property_ptr)
+      {}
+
+      Vertex source;
+      Vertex target;
+      Properties properties;
+      void* property_ptr;
+  };
+
+  inline bool is_digit(char c)
+  {
+      return std::isdigit(c);
+  }
+
+  inline std::vector<int> 
+      available_process_files(std::string const& filename)
+      {
+          if (!filesystem::exists(filename))
+              return std::vector<int>();
+
+          std::vector<int> result;
+
+          for (filesystem::directory_iterator i(filename), end; i != end; ++i)
+          {
+              if (!filesystem::is_regular(*i))
+                  boost::throw_exception(std::runtime_error("directory contains non-regular entries"));
+
+#if BOOST_VERSION >= 103600
+              std::string process_name = i->path().filename();
+#else
+              std::string process_name = i->leaf();
+#endif
+              for (std::string::size_type i = 0; i < process_name.size(); ++i)
+                if (!is_digit(process_name[i]))
+                  boost::throw_exception(std::runtime_error("directory contains files with invalid names"));
+
+              result.push_back(boost::lexical_cast<int>(process_name));
+          }
+
+          return result;
+      }
+
+  template <class Archive, class Tag, class T, class Base>
+  void maybe_load_properties(
+      Archive& ar, char const* name, property<Tag, T, Base>& properties)
+  {
+      ar >> serialization::make_nvp(name, get_property_value(properties, Tag()));
+      maybe_load_properties(ar, name, static_cast<Base&>(properties));
+  }
+
+  template <class Archive>
+  void maybe_load_properties(
+      Archive&, char const*, no_property&)
+  {}
+
+  template <class Archive, typename Bundle>
+  void maybe_load_properties(
+      Archive& ar, char const* name, Bundle& bundle)
+  {
+    ar >> serialization::make_nvp(name, bundle);
+    no_property prop;
+    maybe_load_properties(ar, name, prop);
+  }
+
+
+
+
+
+
+  template <class Graph, class Archive, class VertexListS>
+  struct graph_loader
+  {
+      typedef typename Graph::vertex_descriptor vertex_descriptor;
+      typedef typename Graph::local_vertex_descriptor local_vertex_descriptor;
+      typedef typename Graph::vertex_property_type vertex_property_type;
+      typedef typename Graph::edge_descriptor edge_descriptor;
+      typedef typename Graph::local_edge_descriptor local_edge_descriptor;
+      typedef typename Graph::edge_property_type edge_property_type;
+      typedef typename Graph::process_group_type process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+      typedef typename Graph::directed_selector directed_selector;
+      typedef typename mpl::if_<
+          is_same<VertexListS, defaultS>, vecS, VertexListS
+      >::type vertex_list_selector;
+      typedef pending_edge<vertex_descriptor, edge_property_type> 
+          pending_edge_type; 
+      typedef serializable_local_descriptor<local_vertex_descriptor>
+          serializable_vertex_descriptor;
+
+      graph_loader(Graph& g, Archive& ar)
+        : m_g(g)
+        , m_ar(ar)
+        , m_pg(g.process_group())
+        , m_requested_vertices(num_processes(m_pg))
+        , m_remote_vertices(num_processes(m_pg))
+        , m_property_ptrs(num_processes(m_pg))
+      {
+          g.clear();
+          load_prefix();
+          load_vertices();
+          load_edges();
+          ar >> make_nvp("distribution", m_g.distribution());
+      }
+
+  private:
+      struct pending_in_edge
+      {
+          pending_in_edge(
+              vertex_descriptor u, vertex_descriptor v, void* property_ptr
+          )
+            : u(u)
+            , v(v)
+            , property_ptr(property_ptr)
+          {}
+
+          vertex_descriptor u;
+          vertex_descriptor v;
+          void* property_ptr;
+      };
+
+      bool is_root() const
+      {
+          return process_id(m_pg) == 0;
+      }
+
+      template <class T>
+      serialization::nvp<T> const make_nvp(char const* name, T& value) const
+      {
+          return serialization::nvp<T>(name, value);
+      }
+
+      void load_prefix();
+      void load_vertices();
+
+      template <class Anything>
+      void maybe_load_and_store_local_vertex(Anything);
+      void maybe_load_and_store_local_vertex(vecS);
+
+      void load_edges();
+      void load_in_edges(bidirectionalS);
+      void load_in_edges(directedS);
+      void add_pending_in_edge(
+          vertex_descriptor u, vertex_descriptor v, void* property_ptr, vecS);
+      template <class Anything>
+      void add_pending_in_edge(
+          vertex_descriptor u, vertex_descriptor v, void* property_ptr, Anything);
+      template <class Anything>
+      void add_edge(
+          vertex_descriptor u, vertex_descriptor v
+        , edge_property_type const& property, void* property_ptr, Anything);
+      void add_edge(
+          vertex_descriptor u, vertex_descriptor v
+        , edge_property_type const& property, void* property_ptr, vecS);
+      void add_remote_vertex_request(
+          vertex_descriptor u, vertex_descriptor v, directedS);
+      void add_remote_vertex_request(
+          vertex_descriptor u, vertex_descriptor v, bidirectionalS);
+      void add_in_edge(
+          edge_descriptor const&, void*, directedS);
+      void add_in_edge(
+          edge_descriptor const& edge, void* old_property_ptr, bidirectionalS);
+
+      void resolve_remote_vertices(directedS);
+      void resolve_remote_vertices(bidirectionalS);
+      vertex_descriptor resolve_remote_vertex(vertex_descriptor u) const;
+      vertex_descriptor resolve_remote_vertex(vertex_descriptor u, vecS) const;
+      template <class Anything>
+      vertex_descriptor resolve_remote_vertex(vertex_descriptor u, Anything) const;
+
+      void resolve_property_ptrs();
+
+      void commit_pending_edges(vecS);
+      template <class Anything>
+      void commit_pending_edges(Anything);
+      void commit_pending_in_edges(directedS);
+      void commit_pending_in_edges(bidirectionalS);
+
+      void* maybe_load_property_ptr(directedS) { return 0; }
+      void* maybe_load_property_ptr(bidirectionalS);
+
+      Graph& m_g;
+      Archive& m_ar;
+      process_group_type m_pg;
+
+      std::vector<process_id_type> m_id_mapping;
+
+      // Maps local vertices as loaded from the archive to
+      // the ones actually added to the graph. Only used 
+      // when !vecS.
+      std::map<local_vertex_descriptor, local_vertex_descriptor> m_local_vertices;
+
+      // This is the list of remote vertex descriptors that we
+      // are going to receive from other processes. This is
+      // kept sorted so that we can determine the position of
+      // the matching vertex descriptor in m_remote_vertices.
+      std::vector<std::vector<serializable_vertex_descriptor> > m_requested_vertices;
+
+      // This is the list of remote vertex descriptors that
+      // we send and receive from other processes.
+      std::vector<std::vector<serializable_vertex_descriptor> > m_remote_vertices;
+
+      // ...
+      std::vector<pending_edge_type> m_pending_edges;
+
+      // The pending in-edges that will be added in the commit step, after
+      // the remote vertex descriptors has been resolved. Only used
+      // when bidirectionalS and !vecS.
+      std::vector<pending_in_edge> m_pending_in_edges;
+
+      std::vector<std::vector<unsafe_pair<void*,void*> > > m_property_ptrs;
+  };
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::load_prefix()
+  {
+      typename process_group_type::process_size_type num_processes_;
+      m_ar >> make_nvp("num_processes", num_processes_);
+
+      if (num_processes_ != num_processes(m_pg))
+          boost::throw_exception(std::runtime_error("number of processes mismatch"));
+
+      process_id_type old_id;
+      m_ar >> make_nvp("id", old_id);
+
+      std::vector<typename Graph::distribution_type::size_type> mapping;
+      m_ar >> make_nvp("mapping", mapping);
+
+      // Fetch all the old id's from the other processes.
+      std::vector<process_id_type> old_ids;
+      all_gather(m_pg, &old_id, &old_id+1, old_ids);
+
+      m_id_mapping.resize(num_processes(m_pg), -1);
+
+      for (process_id_type i = 0; i < num_processes(m_pg); ++i)
+      {
+# ifdef PBGL_SERIALIZE_DEBUG
+          if (is_root())
+              std::cout << i << " used to be " << old_ids[i] << "\n"; 
+# endif
+          assert(m_id_mapping[old_ids[i]] == -1);
+          m_id_mapping[old_ids[i]] = i;
+      }
+
+      std::vector<typename Graph::distribution_type::size_type> new_mapping(
+          mapping.size());
+
+      for (int i = 0; i < num_processes(m_pg); ++i)
+      {
+          new_mapping[mapping[old_ids[i]]] = i;
+      }
+
+      m_g.distribution().assign_mapping(
+          new_mapping.begin(), new_mapping.end());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::load_vertices()
+  {
+      int V;
+      m_ar >> BOOST_SERIALIZATION_NVP(V); 
+
+# ifdef PBGL_SERIALIZE_DEBUG
+      if (is_root())
+          std::cout << "Loading vertices\n";
+# endif
+
+      for (int i = 0; i < V; ++i)
+      {
+          maybe_load_and_store_local_vertex(vertex_list_selector());
+      }
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  template <class Anything>
+  void graph_loader<Graph, Archive, VertexListS>::maybe_load_and_store_local_vertex(Anything)
+  {
+      // Load the original vertex descriptor
+      local_vertex_descriptor local;
+      m_ar >> make_nvp("local", unsafe_serialize(local)); 
+
+      // Load the properties
+      vertex_property_type property;
+      detail::parallel::maybe_load_properties(m_ar, "vertex_property",
+                          property);
+
+      // Add the vertex
+      vertex_descriptor v(process_id(m_pg), add_vertex(property, m_g.base()));
+
+      if (m_g.on_add_vertex)
+        m_g.on_add_vertex(v, m_g);
+
+      // Create the mapping from the "old" local descriptor to the new
+      // local descriptor.
+      m_local_vertices[local] = v.local;
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::maybe_load_and_store_local_vertex(vecS)
+  {
+      // Load the properties
+      vertex_property_type property;
+      detail::parallel::maybe_load_properties(m_ar, "vertex_property",
+                          property);
+
+      // Add the vertex
+      vertex_descriptor v(process_id(m_pg), 
+                          add_vertex(m_g.build_vertex_property(property), 
+                                     m_g.base()));
+
+      if (m_g.on_add_vertex)
+        m_g.on_add_vertex(v, m_g);
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::load_edges()
+  {
+      int E;
+      m_ar >> BOOST_SERIALIZATION_NVP(E);
+
+# ifdef PBGL_SERIALIZE_DEBUG
+      if (is_root())
+          std::cout << "Loading edges\n";
+# endif
+
+      for (int i = 0; i < E; ++i)
+      {
+          local_vertex_descriptor local_src;
+          process_id_type target_owner;
+          local_vertex_descriptor local_tgt;
+
+          m_ar >> make_nvp("source", unsafe_serialize(local_src)); 
+          m_ar >> make_nvp("target_owner", target_owner); 
+          m_ar >> make_nvp("target", unsafe_serialize(local_tgt)); 
+
+          process_id_type new_src_owner = process_id(m_pg);
+          process_id_type new_tgt_owner = m_id_mapping[target_owner];
+
+          vertex_descriptor source(new_src_owner, local_src);
+          vertex_descriptor target(new_tgt_owner, local_tgt);
+
+          edge_property_type properties;
+          detail::parallel::maybe_load_properties(m_ar, "edge_property", properties);
+
+          void* property_ptr = maybe_load_property_ptr(directed_selector());
+          add_edge(source, target, properties, property_ptr, vertex_list_selector());
+      }
+
+      load_in_edges(directed_selector());
+      commit_pending_edges(vertex_list_selector());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::load_in_edges(bidirectionalS)
+  {
+      std::size_t I;
+      m_ar >> BOOST_SERIALIZATION_NVP(I);
+
+# ifdef PBGL_SERIALIZE_DEBUG
+      if (is_root())
+          std::cout << "Loading in-edges\n";
+# endif
+
+      for (int i = 0; i < I; ++i)
+      {
+          process_id_type src_owner;
+          local_vertex_descriptor local_src;
+          local_vertex_descriptor local_target;
+          void* property_ptr;
+
+          m_ar >> make_nvp("src_owner", src_owner);
+          m_ar >> make_nvp("source", unsafe_serialize(local_src));
+          m_ar >> make_nvp("target", unsafe_serialize(local_target));
+          m_ar >> make_nvp("property_ptr", unsafe_serialize(property_ptr));
+
+          src_owner = m_id_mapping[src_owner];
+
+          vertex_descriptor u(src_owner, local_src);
+          vertex_descriptor v(process_id(m_pg), local_target);
+
+          add_pending_in_edge(u, v, property_ptr, vertex_list_selector());
+      }
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::load_in_edges(directedS)
+  {}
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::add_pending_in_edge(
+      vertex_descriptor u, vertex_descriptor v, void* property_ptr, vecS)
+  {
+      m_pending_in_edges.push_back(pending_in_edge(u,v,property_ptr));
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  template <class Anything>
+  void graph_loader<Graph, Archive, VertexListS>::add_pending_in_edge(
+      vertex_descriptor u, vertex_descriptor v, void* property_ptr, Anything)
+  {
+      // u and v represent the out-edge here, meaning v is local
+      // to us, and u is always remote.
+      m_pending_in_edges.push_back(pending_in_edge(u,v,property_ptr));
+      add_remote_vertex_request(v, u, bidirectionalS());
+  }
+
+  template <class Graph, class Archive, class VertexListS> 
+  template <class Anything>
+  void graph_loader<Graph, Archive, VertexListS>::add_edge(
+      vertex_descriptor u, vertex_descriptor v
+    , edge_property_type const& property, void* property_ptr, Anything)
+  {
+      m_pending_edges.push_back(pending_edge_type(u, v, property, property_ptr));
+      add_remote_vertex_request(u, v, directed_selector());
+  }
+
+  template <class Graph, class Archive, class VertexListS> 
+  void graph_loader<Graph, Archive, VertexListS>::add_remote_vertex_request(
+      vertex_descriptor u, vertex_descriptor v, directedS)
+  {
+      // We have to request the remote vertex.
+      m_requested_vertices[owner(v)].push_back(local(v));
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::add_remote_vertex_request(
+      vertex_descriptor u, vertex_descriptor v, bidirectionalS)
+  {
+      // If the edge spans to another process, we know
+      // that that process has a matching in-edge, so
+      // we can just send our vertex. No requests
+      // necessary.
+      if (owner(v) != m_g.processor())
+      {
+          m_remote_vertices[owner(v)].push_back(local(u));
+          m_requested_vertices[owner(v)].push_back(local(v));
+      }
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::add_edge(
+      vertex_descriptor u, vertex_descriptor v
+    , edge_property_type const& property, void* property_ptr, vecS)
+  {
+      std::pair<local_edge_descriptor, bool> inserted = 
+          detail::parallel::add_local_edge(
+              local(u), local(v)
+            , m_g.build_edge_property(property), m_g.base());
+      assert(inserted.second);
+      put(edge_target_processor_id, m_g.base(), inserted.first, owner(v));
+
+      edge_descriptor e(owner(u), owner(v), true, inserted.first);
+
+      if (inserted.second && m_g.on_add_edge)
+        m_g.on_add_edge(e, m_g);
+
+      add_in_edge(e, property_ptr, directed_selector());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::add_in_edge(
+      edge_descriptor const&, void*, directedS)
+  {}
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::add_in_edge(
+      edge_descriptor const& edge, void* old_property_ptr, bidirectionalS)
+  {
+      if (owner(target(edge, m_g)) == m_g.processor())
+      {
+          detail::parallel::stored_in_edge<local_edge_descriptor>
+              e(m_g.processor(), local(edge));
+          boost::graph_detail::push(get(
+              vertex_in_edges, m_g.base())[local(target(edge, m_g))], e);
+      }
+      else
+      {
+          // We send the (old,new) property pointer pair to
+          // the remote process. This could be optimized to
+          // only send the new one -- the ordering can be
+          // made implicit because the old pointer value is
+          // stored on the remote process.
+          //
+          // Doing that is a little bit more complicated, but
+          // in case it turns out it's important we can do it.
+          void* property_ptr = local(edge).get_property();
+          m_property_ptrs[owner(target(edge, m_g))].push_back(
+              unsafe_pair<void*,void*>(old_property_ptr, property_ptr));
+      }
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::resolve_property_ptrs()
+  {
+# ifdef PBGL_SERIALIZE_DEBUG
+      if (is_root())
+          std::cout << "Resolving property pointers\n";
+# endif
+
+      for (int i = 0; i < num_processes(m_pg); ++i)
+      {
+          std::sort(
+              m_property_ptrs[i].begin(), m_property_ptrs[i].end());
+      }
+
+      boost::parallel::inplace_all_to_all(m_pg, m_property_ptrs);
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::resolve_remote_vertices(directedS)
+  {
+      for (int i = 0; i < num_processes(m_pg); ++i)
+      {
+          std::sort(m_requested_vertices[i].begin(), m_requested_vertices[i].end());
+      }
+
+      boost::parallel::inplace_all_to_all(
+          m_pg, m_requested_vertices, m_remote_vertices);
+
+      for (int i = 0; i < num_processes(m_pg); ++i)
+      {
+          BOOST_FOREACH(serializable_vertex_descriptor& u, m_remote_vertices[i])
+          {
+              u = m_local_vertices[u];
+          }
+      }
+
+      boost::parallel::inplace_all_to_all(m_pg, m_remote_vertices);
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::resolve_remote_vertices(bidirectionalS)
+  {
+# ifdef PBGL_SERIALIZE_DEBUG
+      if (is_root())
+          std::cout << "Resolving remote vertices\n";
+# endif
+
+      for (int i = 0; i < num_processes(m_pg); ++i)
+      {
+          std::sort(m_requested_vertices[i].begin(), m_requested_vertices[i].end());
+          std::sort(m_remote_vertices[i].begin(), m_remote_vertices[i].end());
+
+          BOOST_FOREACH(serializable_vertex_descriptor& u, m_remote_vertices[i])
+          {
+              u = m_local_vertices[u];
+          }
+      }
+
+      boost::parallel::inplace_all_to_all(m_pg, m_remote_vertices);
+
+      for (int i = 0; i < num_processes(m_pg); ++i)
+          assert(m_remote_vertices[i].size() == m_requested_vertices[i].size());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::commit_pending_edges(vecS)
+  {
+      commit_pending_in_edges(directed_selector());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  template <class Anything>
+  void graph_loader<Graph, Archive, VertexListS>::commit_pending_edges(Anything)
+  {
+      resolve_remote_vertices(directed_selector());
+
+      BOOST_FOREACH(pending_edge_type const& e, m_pending_edges)
+      {
+          vertex_descriptor u = resolve_remote_vertex(e.source);
+          vertex_descriptor v = resolve_remote_vertex(e.target);
+          add_edge(u, v, e.properties, e.property_ptr, vecS());
+      }
+
+      commit_pending_in_edges(directed_selector());
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::commit_pending_in_edges(directedS)
+  {}
+
+  template <class Graph, class Archive, class VertexListS>
+  void graph_loader<Graph, Archive, VertexListS>::commit_pending_in_edges(bidirectionalS)
+  {
+      resolve_property_ptrs();
+
+      BOOST_FOREACH(pending_in_edge const& e, m_pending_in_edges)
+      {
+          vertex_descriptor u = resolve_remote_vertex(e.u, vertex_list_selector());
+          vertex_descriptor v = resolve_remote_vertex(e.v, vertex_list_selector());
+
+          typedef detail::parallel::stored_in_edge<local_edge_descriptor> stored_edge;
+
+          std::vector<unsafe_pair<void*,void*> >::iterator i = std::lower_bound(
+              m_property_ptrs[owner(u)].begin()
+            , m_property_ptrs[owner(u)].end()
+            , unsafe_pair<void*,void*>(e.property_ptr, 0)
+          );
+
+          if (i == m_property_ptrs[owner(u)].end()
+              || i->first != e.property_ptr)
+          {
+              assert(false);
+          }
+
+          local_edge_descriptor local_edge(local(u), local(v), i->second);
+          stored_edge edge(owner(u), local_edge);
+          boost::graph_detail::push(
+              get(vertex_in_edges, m_g.base())[local(v)], edge);
+      }
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  typename graph_loader<Graph, Archive, VertexListS>::vertex_descriptor 
+  graph_loader<Graph, Archive, VertexListS>::resolve_remote_vertex(
+      vertex_descriptor u) const
+  {
+      if (owner(u) == process_id(m_pg))
+      { 
+          return vertex_descriptor(
+              process_id(m_pg), m_local_vertices.find(local(u))->second);
+      }
+
+      typename std::vector<serializable_vertex_descriptor>::const_iterator 
+          i = std::lower_bound(
+              m_requested_vertices[owner(u)].begin()
+            , m_requested_vertices[owner(u)].end()
+            , serializable_vertex_descriptor(local(u))
+          );
+
+      if (i == m_requested_vertices[owner(u)].end()
+          || *i != local(u))
+      {
+          assert(false);
+      }
+
+      local_vertex_descriptor local =
+          m_remote_vertices[owner(u)][m_requested_vertices[owner(u)].end() - i];
+      return vertex_descriptor(owner(u), local);
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  typename graph_loader<Graph, Archive, VertexListS>::vertex_descriptor 
+  graph_loader<Graph, Archive, VertexListS>::resolve_remote_vertex(
+      vertex_descriptor u, vecS) const
+  {
+      return u;
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  template <class Anything>
+  typename graph_loader<Graph, Archive, VertexListS>::vertex_descriptor 
+  graph_loader<Graph, Archive, VertexListS>::resolve_remote_vertex(
+      vertex_descriptor u, Anything) const
+  {
+      return resolve_remote_vertex(u);
+  }
+
+  template <class Graph, class Archive, class VertexListS>
+  void* 
+  graph_loader<Graph, Archive, VertexListS>::maybe_load_property_ptr(bidirectionalS)
+  {
+      void* ptr;
+      m_ar >> make_nvp("property_ptr", unsafe_serialize(ptr));
+      return ptr;
+  }
+
+template <class Archive, class D>
+void maybe_save_local_descriptor(Archive& ar, D const&, vecS)
+{}
+
+template <class Archive, class D, class NotVecS>
+void maybe_save_local_descriptor(Archive& ar, D const& d, NotVecS)
+{
+    ar << serialization::make_nvp(
+        "local", unsafe_serialize(const_cast<D&>(d)));
+}
+
+template <class Archive>
+void maybe_save_properties(
+    Archive&, char const*, no_property const&)
+{}
+
+template <class Archive, class Tag, class T, class Base>
+void maybe_save_properties(
+    Archive& ar, char const* name, property<Tag, T, Base> const& properties)
+{
+    ar & serialization::make_nvp(name, get_property_value(properties, Tag()));
+    maybe_save_properties(ar, name, static_cast<Base const&>(properties));
+}
+
+template <class Archive, class Graph>
+void save_in_edges(Archive& ar, Graph const& g, directedS)
+{}
+
+// We need to save the edges in the base edge
+// list, and the in_edges that are stored in the
+// vertex_in_edges vertex property.
+template <class Archive, class Graph>
+void save_in_edges(Archive& ar, Graph const& g, bidirectionalS)
+{
+    typedef typename Graph::process_group_type
+        process_group_type;
+    typedef typename process_group_type::process_id_type
+        process_id_type;
+    typedef typename graph_traits<
+        Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename vertex_descriptor::local_descriptor_type 
+        local_vertex_descriptor;
+    typedef typename graph_traits<
+        Graph>::edge_descriptor edge_descriptor;
+
+    process_id_type id = g.processor();
+
+    typedef std::pair<local_vertex_descriptor, vertex_descriptor> in_edge;
+    std::vector<edge_descriptor> saved_in_edges;
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) 
+    {
+        BOOST_FOREACH(edge_descriptor const& e, in_edges(v, g))
+        {
+            // Only save the in_edges that isn't owned by this process.
+            if (owner(e) == id)
+                continue;
+
+            saved_in_edges.push_back(e);
+        }
+    }
+
+    std::size_t I = saved_in_edges.size();
+    ar << BOOST_SERIALIZATION_NVP(I);
+
+    BOOST_FOREACH(edge_descriptor const& e, saved_in_edges)
+    {
+        process_id_type src_owner = owner(source(e,g));
+        local_vertex_descriptor local_src = local(source(e,g));
+        local_vertex_descriptor local_target = local(target(e,g));
+        void* property_ptr = local(e).get_property();
+
+        using serialization::make_nvp;
+
+        ar << make_nvp("src_owner", src_owner);
+        ar << make_nvp("source", unsafe_serialize(local_src));
+        ar << make_nvp("target", unsafe_serialize(local_target));
+        ar << make_nvp("property_ptr", unsafe_serialize(property_ptr));
+    }
+}
+
+template <class Archive, class Edge>
+void maybe_save_property_ptr(Archive&, Edge const&, directedS)
+{}
+
+template <class Archive, class Edge>
+void maybe_save_property_ptr(Archive& ar, Edge const& e, bidirectionalS)
+{
+    void* ptr = local(e).get_property();
+    ar << serialization::make_nvp("property_ptr", unsafe_serialize(ptr));
+}
+
+template <class Archive, class Graph, class DirectedS>
+void save_edges(Archive& ar, Graph const& g, DirectedS)
+{
+    typedef typename Graph::process_group_type
+        process_group_type;
+    typedef typename process_group_type::process_id_type
+        process_id_type;
+    typedef typename graph_traits<
+        Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<
+        Graph>::edge_descriptor edge_descriptor;
+
+    // We retag the property list here so that bundled properties are
+    // properly placed into property<edge_bundle_t, Bundle>.
+    typedef typename boost::detail::retag_property_list<
+              edge_bundle_t,
+              typename Graph::edge_property_type>::type
+      edge_property_type;
+
+    int E = num_edges(g);
+    ar << BOOST_SERIALIZATION_NVP(E);
+
+    // For *directed* graphs, we can just save
+    // the edge list and be done.
+    //
+    // For *bidirectional* graphs, we need to also
+    // save the "vertex_in_edges" property map,
+    // because it might contain in-edges that
+    // are not locally owned.
+    BGL_FORALL_EDGES_T(e, g, Graph) 
+    {
+        vertex_descriptor src(source(e, g));
+        vertex_descriptor tgt(target(e, g));
+
+        typename vertex_descriptor::local_descriptor_type
+            local_u(local(src));
+        typename vertex_descriptor::local_descriptor_type
+            local_v(local(tgt));
+
+        process_id_type target_owner = owner(tgt);
+
+        using serialization::make_nvp;
+
+        ar << make_nvp("source", unsafe_serialize(local_u)); 
+        ar << make_nvp("target_owner", target_owner); 
+        ar << make_nvp("target", unsafe_serialize(local_v)); 
+
+        maybe_save_properties(
+            ar, "edge_property"
+          , static_cast<edge_property_type const&>(get(edge_all_t(), g, e))
+        );
+
+        maybe_save_property_ptr(ar, e, DirectedS());
+    }
+
+    save_in_edges(ar, g, DirectedS());
+}
+
+}} // namespace detail::parallel
+
+template <PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template <class IStreamConstructibleArchive>
+void PBGL_DISTRIB_ADJLIST_TYPE::load(std::string const& filename)
+{
+    typedef typename config_type::VertexListS vertex_list_selector;
+
+    process_group_type pg = process_group();
+    process_id_type id = process_id(pg);
+
+    synchronize(pg);
+
+    std::vector<int> disk_files = detail::parallel::available_process_files(filename);
+    std::sort(disk_files.begin(), disk_files.end());
+
+    // Negotiate which process gets which file. Serialized.
+    std::vector<int> consumed_files;
+    int picked_file = -1;
+
+    if (id > 0)
+        receive_oob(pg, id-1, 0, consumed_files);
+
+    std::sort(consumed_files.begin(), consumed_files.end());
+    std::vector<int> available_files;
+    std::set_difference(
+        disk_files.begin(), disk_files.end()
+      , consumed_files.begin(), consumed_files.end()
+      , std::back_inserter(available_files)
+    );
+
+    if (available_files.empty())
+        boost::throw_exception(std::runtime_error("no file available"));
+
+    // back() used for debug purposes. Making sure the
+    // ranks are shuffled.
+    picked_file = available_files.back();
+
+# ifdef PBGL_SERIALIZE_DEBUG
+    std::cout << id << " picked " << picked_file << "\n";
+# endif
+
+    consumed_files.push_back(picked_file);
+
+    if (id < num_processes(pg) - 1)
+        send_oob(pg, id+1, 0, consumed_files);
+
+    std::string local_filename = filename + "/" + 
+        lexical_cast<std::string>(picked_file);
+
+    std::ifstream in(local_filename.c_str(), std::ios_base::binary);
+    IStreamConstructibleArchive ar(in);
+
+    detail::parallel::graph_loader<
+        graph_type, IStreamConstructibleArchive, InVertexListS
+    > loader(*this, ar);
+
+# ifdef PBGL_SERIALIZE_DEBUG
+    std::cout << "Process " << id << " done loading.\n";
+# endif
+
+    synchronize(pg);
+}
+
+template <PBGL_DISTRIB_ADJLIST_TEMPLATE_PARMS>
+template <class OStreamConstructibleArchive>
+void PBGL_DISTRIB_ADJLIST_TYPE::save(std::string const& filename) const
+{
+    // We retag the property list here so that bundled properties are
+    // properly placed into property<vertex_bundle_t, Bundle>.
+    typedef typename boost::detail::retag_property_list<
+        vertex_bundle_t, vertex_property_type
+    >::type vertex_property_type;
+
+    typedef typename config_type::VertexListS vertex_list_selector;
+
+    process_group_type pg = process_group();
+    process_id_type id = process_id(pg);
+
+    if (filesystem::exists(filename) && !filesystem::is_directory(filename))
+        boost::throw_exception(std::runtime_error("entry exists, but is not a directory"));
+
+    filesystem::remove_all(filename);
+    filesystem::create_directory(filename);
+
+    synchronize(pg);
+
+    std::string local_filename = filename + "/" + 
+        lexical_cast<std::string>(id);
+
+    std::ofstream out(local_filename.c_str(), std::ios_base::binary);
+    OStreamConstructibleArchive ar(out);
+
+    using serialization::make_nvp;
+
+    typename process_group_type::process_size_type num_processes_ = num_processes(pg);
+    ar << make_nvp("num_processes", num_processes_);
+    ar << BOOST_SERIALIZATION_NVP(id);
+    ar << make_nvp("mapping", this->distribution().mapping());
+
+    int V = num_vertices(*this);
+    ar << BOOST_SERIALIZATION_NVP(V);
+
+    BGL_FORALL_VERTICES_T(v, *this, graph_type)
+    {
+        local_vertex_descriptor local_descriptor(local(v));
+        detail::parallel::maybe_save_local_descriptor(
+            ar, local_descriptor, vertex_list_selector());
+        detail::parallel::maybe_save_properties(
+            ar, "vertex_property"
+          , static_cast<vertex_property_type const&>(get(vertex_all_t(), *this, v))
+        );
+    }
+
+    detail::parallel::save_edges(ar, *this, directed_selector());
+
+    ar << make_nvp("distribution", this->distribution());
+}
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ADJLIST_SERIALIZATION_070925_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/betweenness_centrality.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/betweenness_centrality.hpp
new file mode 100644 (file)
index 0000000..134cc02
--- /dev/null
@@ -0,0 +1,1724 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_BRANDES_BETWEENNESS_CENTRALITY_HPP
+#define BOOST_GRAPH_PARALLEL_BRANDES_BETWEENNESS_CENTRALITY_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+// #define COMPUTE_PATH_COUNTS_INLINE
+
+#include <boost/graph/betweenness_centrality.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/config.hpp>
+
+// For additive_reducer
+#include <boost/graph/distributed/distributed_graph_utility.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/named_function_params.hpp>
+
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>
+#include <boost/tuple/tuple.hpp>
+
+// NGE - Needed for minstd_rand at L807, should pass vertex list
+//       or generator instead 
+#include <boost/random/linear_congruential.hpp>
+
+#include <algorithm>
+#include <stack>
+#include <vector>
+
+// Appending reducer
+template <typename T>
+struct append_reducer {
+  BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+      
+  template<typename K>
+  T operator()(const K&) const { return T(); }
+      
+  template<typename K>
+  T operator()(const K&, const T& x, const T& y) const 
+  { 
+    T z(x.begin(), x.end());
+    for (typename T::const_iterator iter = y.begin(); iter != y.end(); ++iter)
+      if (std::find(z.begin(), z.end(), *iter) == z.end())
+        z.push_back(*iter);
+    
+    return z;
+  }
+};
+
+namespace boost {
+
+  namespace serialization {
+
+    // TODO(nge): Write generalized serialization for tuples
+    template<typename Archive, typename T1, typename T2, typename T3, 
+             typename T4>
+    void serialize(Archive & ar,
+                   boost::tuple<T1,T2,T3, T4>& t,
+                   const unsigned int)
+    {
+      ar & get<0>(t);
+      ar & get<1>(t);
+      ar & get<2>(t);
+      ar & get<3>(t);
+    }
+
+  } // serialization
+
+  template <typename OwnerMap, typename Tuple>
+  class get_owner_of_first_tuple_element {
+
+  public:
+    typedef typename property_traits<OwnerMap>::value_type owner_type;
+    
+    get_owner_of_first_tuple_element(OwnerMap owner) : owner(owner) { }
+
+    owner_type get_owner(Tuple t) { return get(owner, get<0>(t)); }
+
+  private:
+    OwnerMap owner;
+  };
+
+  template <typename OwnerMap, typename Tuple>
+  typename get_owner_of_first_tuple_element<OwnerMap, Tuple>::owner_type
+  get(get_owner_of_first_tuple_element<OwnerMap, Tuple> o, Tuple t)
+  { return o.get_owner(t); } 
+
+  template <typename OwnerMap>
+  class get_owner_of_first_pair_element {
+
+  public:
+    typedef typename property_traits<OwnerMap>::value_type owner_type;
+    
+    get_owner_of_first_pair_element(OwnerMap owner) : owner(owner) { }
+
+    template <typename Vertex, typename T>
+    owner_type get_owner(std::pair<Vertex, T> p) { return get(owner, p.first); }
+
+  private:
+    OwnerMap owner;
+  };
+
+  template <typename OwnerMap, typename Vertex, typename T>
+  typename get_owner_of_first_pair_element<OwnerMap>::owner_type
+  get(get_owner_of_first_pair_element<OwnerMap> o, std::pair<Vertex, T> p)
+  { return o.get_owner(p); } 
+
+  namespace graph { namespace parallel { namespace detail {
+
+  template<typename DistanceMap, typename IncomingMap>
+  class betweenness_centrality_msg_value
+  {
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+    typedef typename property_traits<IncomingMap>::value_type incoming_type;
+    typedef typename incoming_type::value_type incoming_value_type;
+
+  public:
+    typedef std::pair<distance_type, incoming_value_type> type;
+    
+    static type create(distance_type dist, incoming_value_type source)
+    { return std::make_pair(dist, source); }
+  };
+
+
+  /************************************************************************/
+  /* Delta-stepping Betweenness Centrality                                */
+  /************************************************************************/
+
+  template<typename Graph, typename DistanceMap, typename IncomingMap, 
+           typename EdgeWeightMap, typename PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , typename IsSettledMap, typename VertexIndexMap
+#endif
+           >
+  class betweenness_centrality_delta_stepping_impl { 
+    // Could inherit from delta_stepping_impl to get run() method
+    // but for the time being it's just reproduced here
+
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::degree_size_type Degree;
+    typedef typename property_traits<EdgeWeightMap>::value_type Dist;
+    typedef typename property_traits<IncomingMap>::value_type IncomingType;
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+      ProcessGroup;
+    
+    typedef std::list<Vertex> Bucket;
+    typedef typename Bucket::iterator BucketIterator;
+    typedef typename std::vector<Bucket*>::size_type BucketIndex;
+
+    typedef betweenness_centrality_msg_value<DistanceMap, IncomingMap> 
+      MessageValue;
+    
+    enum { 
+      // Relax a remote vertex. The message contains a pair<Vertex,
+      // MessageValue>, the first part of which is the vertex whose
+      // tentative distance is being relaxed and the second part
+      // contains either the new distance (if there is no predecessor
+      // map) or a pair with the distance and predecessor.
+      msg_relax 
+    };
+
+  public:
+
+    // Must supply delta, ctor that guesses delta removed 
+    betweenness_centrality_delta_stepping_impl(const Graph& g,
+                                               DistanceMap distance, 
+                                               IncomingMap incoming,
+                                               EdgeWeightMap weight,
+                                               PathCountMap path_count,
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                                               IsSettledMap is_settled,
+                                               VertexIndexMap vertex_index,
+#endif
+                                               Dist delta);
+    
+    void run(Vertex s);
+
+  private:
+    // Relax the edge (u, v), creating a new best path of distance x.
+    void relax(Vertex u, Vertex v, Dist x);
+
+    // Synchronize all of the processes, by receiving all messages that
+    // have not yet been received.
+    void synchronize()
+    {
+      using boost::graph::parallel::synchronize;
+      synchronize(pg);
+    }
+    
+    // Setup triggers for msg_relax messages
+    void setup_triggers()
+    {
+      using boost::graph::parallel::simple_trigger;
+      simple_trigger(pg, msg_relax, this, 
+                     &betweenness_centrality_delta_stepping_impl::handle_msg_relax);
+    }
+
+    void handle_msg_relax(int /*source*/, int /*tag*/,
+                          const std::pair<Vertex, typename MessageValue::type>& data,
+                          trigger_receive_context)
+    { relax(data.second.second, data.first, data.second.first); }
+
+    const Graph& g;
+    IncomingMap incoming;
+    DistanceMap distance;
+    EdgeWeightMap weight;
+    PathCountMap path_count;
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+    IsSettledMap is_settled;
+    VertexIndexMap vertex_index;
+#endif
+    Dist delta;
+    ProcessGroup pg;
+    typename property_map<Graph, vertex_owner_t>::const_type owner;
+    typename property_map<Graph, vertex_local_t>::const_type local;
+    
+    // A "property map" that contains the position of each vertex in
+    // whatever bucket it resides in.
+    std::vector<BucketIterator> position_in_bucket;
+    
+    // Bucket data structure. The ith bucket contains all local vertices
+    // with (tentative) distance in the range [i*delta,
+    // (i+1)*delta). 
+    std::vector<Bucket*> buckets;
+    
+    // This "dummy" list is used only so that we can initialize the
+    // position_in_bucket property map with non-singular iterators. This
+    // won't matter for most implementations of the C++ Standard
+    // Library, but it avoids undefined behavior and allows us to run
+    // with library "debug modes".
+    std::list<Vertex> dummy_list;
+    
+    // A "property map" that states which vertices have been deleted
+    // from the bucket in this iteration.
+    std::vector<bool> vertex_was_deleted;
+  };
+
+  template<typename Graph, typename DistanceMap, typename IncomingMap, 
+           typename EdgeWeightMap, typename PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , typename IsSettledMap, typename VertexIndexMap
+#endif
+           >
+  betweenness_centrality_delta_stepping_impl<
+    Graph, DistanceMap, IncomingMap, EdgeWeightMap, PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , IsSettledMap, VertexIndexMap
+#endif
+    >::
+  betweenness_centrality_delta_stepping_impl(const Graph& g,
+                                             DistanceMap distance,
+                                             IncomingMap incoming,
+                                             EdgeWeightMap weight,
+                                             PathCountMap path_count,
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                                             IsSettledMap is_settled,
+                                             VertexIndexMap vertex_index,
+#endif
+                                             Dist delta)
+    : g(g),
+      incoming(incoming),
+      distance(distance),
+      weight(weight),
+      path_count(path_count),
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+      is_settled(is_settled),
+      vertex_index(vertex_index),
+#endif
+      delta(delta),
+      pg(boost::graph::parallel::process_group_adl(g), attach_distributed_object()),
+      owner(get(vertex_owner, g)),
+      local(get(vertex_local, g))
+
+  { setup_triggers(); }
+
+  template<typename Graph, typename DistanceMap, typename IncomingMap, 
+           typename EdgeWeightMap, typename PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , typename IsSettledMap, typename VertexIndexMap
+#endif
+           >
+  void
+  betweenness_centrality_delta_stepping_impl<
+    Graph, DistanceMap, IncomingMap, EdgeWeightMap, PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , IsSettledMap, VertexIndexMap
+#endif
+    >::
+  run(Vertex s)
+  {
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+      process_group_type;
+    typename process_group_type::process_id_type id = process_id(pg);
+
+    Dist inf = (std::numeric_limits<Dist>::max)();
+    
+    // None of the vertices are stored in the bucket.
+    position_in_bucket.clear();
+    position_in_bucket.resize(num_vertices(g), dummy_list.end());
+    
+    // None of the vertices have been deleted
+    vertex_was_deleted.clear();
+    vertex_was_deleted.resize(num_vertices(g), false);
+    
+    // No path from s to any other vertex, yet
+    BGL_FORALL_VERTICES_T(v, g, Graph)
+      put(distance, v, inf);
+    
+    // The distance to the starting node is zero
+    if (get(owner, s) == id) 
+      // Put "s" into its bucket (bucket 0)
+      relax(s, s, 0);
+    else
+      // Note that we know the distance to s is zero
+      cache(distance, s, 0);
+    
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+    // Synchronize here to deliver initial relaxation since we don't
+    // synchronize at the beginning of the inner loop any more
+    synchronize(); 
+
+    // Incoming edge count map is an implementation detail and should
+    // be freed as soon as possible so build it here
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+    std::vector<edges_size_type> incoming_edge_countS(num_vertices(g));
+    iterator_property_map<typename std::vector<edges_size_type>::iterator, VertexIndexMap> 
+      incoming_edge_count(incoming_edge_countS.begin(), vertex_index);
+#endif
+
+    BucketIndex max_bucket = (std::numeric_limits<BucketIndex>::max)();
+    BucketIndex current_bucket = 0;
+    do {
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+      // We need to clear the outgoing map after every bucket so just build it here
+      std::vector<IncomingType> outgoingS(num_vertices(g));
+      IncomingMap outgoing(outgoingS.begin(), vertex_index);
+      
+      outgoing.set_reduce(append_reducer<IncomingType>());
+#else
+      // Synchronize with all of the other processes.
+      synchronize();
+#endif    
+  
+      // Find the next bucket that has something in it.
+      while (current_bucket < buckets.size() 
+             && (!buckets[current_bucket] || buckets[current_bucket]->empty()))
+        ++current_bucket;
+      if (current_bucket >= buckets.size())
+        current_bucket = max_bucket;
+      
+      // Find the smallest bucket (over all processes) that has vertices
+      // that need to be processed.
+      using boost::parallel::all_reduce;
+      using boost::parallel::minimum;
+      current_bucket = all_reduce(pg, current_bucket, minimum<BucketIndex>());
+      
+      if (current_bucket == max_bucket)
+        // There are no non-empty buckets in any process; exit. 
+        break;
+      
+      // Contains the set of vertices that have been deleted in the
+      // relaxation of "light" edges. Note that we keep track of which
+      // vertices were deleted with the property map
+      // "vertex_was_deleted".
+      std::vector<Vertex> deleted_vertices;
+      
+      // Repeatedly relax light edges
+      bool nonempty_bucket;
+      do {
+        // Someone has work to do in this bucket.
+        
+        if (current_bucket < buckets.size() && buckets[current_bucket]) {
+          Bucket& bucket = *buckets[current_bucket];
+          // For each element in the bucket
+          while (!bucket.empty()) {
+            Vertex u = bucket.front();
+            
+            // Remove u from the front of the bucket
+            bucket.pop_front();
+            
+            // Insert u into the set of deleted vertices, if it hasn't
+            // been done already.
+            if (!vertex_was_deleted[get(local, u)]) {
+              vertex_was_deleted[get(local, u)] = true;
+              deleted_vertices.push_back(u);
+            }
+            
+            // Relax each light edge. 
+            Dist u_dist = get(distance, u);
+            BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+              if (get(weight, e) <= delta) // light edge 
+                relax(u, target(e, g), u_dist + get(weight, e));
+          }
+        }
+
+        // Synchronize with all of the other processes.
+        synchronize();
+        
+        // Is the bucket empty now?
+        nonempty_bucket = (current_bucket < buckets.size() 
+                           && buckets[current_bucket]
+                           && !buckets[current_bucket]->empty());
+      } while (all_reduce(pg, nonempty_bucket, std::logical_or<bool>()));
+      
+      // Relax heavy edges for each of the vertices that we previously
+      // deleted.
+      for (typename std::vector<Vertex>::iterator iter = deleted_vertices.begin();
+           iter != deleted_vertices.end(); ++iter) {
+        // Relax each heavy edge. 
+        Vertex u = *iter;
+        Dist u_dist = get(distance, u);
+        BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+          if (get(weight, e) > delta) // heavy edge
+            relax(u, target(e, g), u_dist + get(weight, e)); 
+
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+        // Set outgoing paths
+        IncomingType in = get(incoming, u);
+        for (typename IncomingType::iterator pred = in.begin(); pred != in.end(); ++pred) 
+          if (get(owner, *pred) == id) {
+            IncomingType x = get(outgoing, *pred);
+            if (std::find(x.begin(), x.end(), u) == x.end())
+              x.push_back(u);
+            put(outgoing, *pred, x);
+          } else {
+            IncomingType in;
+            in.push_back(u);
+            put(outgoing, *pred, in);
+          }
+
+        // Set incoming edge counts
+        put(incoming_edge_count, u, in.size());
+#endif
+      }
+
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+      synchronize();  // Deliver heavy edge relaxations and outgoing paths
+
+      // Build Queue
+      typedef typename property_traits<PathCountMap>::value_type PathCountType;
+      typedef std::pair<Vertex, PathCountType> queue_value_type;
+      typedef typename property_map<Graph, vertex_owner_t>::const_type OwnerMap;
+      typedef typename get_owner_of_first_pair_element<OwnerMap> IndirectOwnerMap;
+
+      typedef boost::queue<queue_value_type> local_queue_type;
+      typedef boost::graph::distributed::distributed_queue<process_group_type,
+                                                           IndirectOwnerMap,
+                                                           local_queue_type> dist_queue_type;
+
+      IndirectOwnerMap indirect_owner(owner);
+      dist_queue_type Q(pg, indirect_owner);
+
+      // Find sources to initialize queue
+      BGL_FORALL_VERTICES_T(v, g, Graph) {
+        if (get(is_settled, v) && !(get(outgoing, v).empty())) {
+          put(incoming_edge_count, v, 1); 
+          Q.push(std::make_pair(v, 0)); // Push this vertex with no additional path count
+        }
+      }
+
+      // Set path counts for vertices in this bucket
+      while (!Q.empty()) {
+        queue_value_type t = Q.top(); Q.pop();
+        Vertex v = t.first;
+        PathCountType p = t.second;
+
+        put(path_count, v, get(path_count, v) + p);
+        put(incoming_edge_count, v, get(incoming_edge_count, v) - 1);
+
+        if (get(incoming_edge_count, v) == 0) {
+          IncomingType out = get(outgoing, v);
+          for (typename IncomingType::iterator iter = out.begin(); iter != out.end(); ++iter)
+            Q.push(std::make_pair(*iter, get(path_count, v)));
+        }
+      }
+
+      // Mark the vertices in this bucket settled 
+      for (typename std::vector<Vertex>::iterator iter = deleted_vertices.begin();
+           iter != deleted_vertices.end(); ++iter) 
+        put(is_settled, *iter, true);
+
+      // No need to clear path count map as it is never read/written remotely
+      // No need to clear outgoing map as it is re-alloced every bucket 
+#endif
+      
+      // Go to the next bucket: the current bucket must already be empty.
+      ++current_bucket;
+    } while (true);
+    
+    // Delete all of the buckets.
+    for (typename std::vector<Bucket*>::iterator iter = buckets.begin();
+         iter != buckets.end(); ++iter) {
+      if (*iter) {
+        delete *iter;
+        *iter = 0;
+      }
+    }
+  }
+        
+  template<typename Graph, typename DistanceMap, typename IncomingMap, 
+           typename EdgeWeightMap, typename PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , typename IsSettledMap, typename VertexIndexMap
+#endif
+           >
+  void
+  betweenness_centrality_delta_stepping_impl<
+    Graph, DistanceMap, IncomingMap, EdgeWeightMap, PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           , IsSettledMap, VertexIndexMap
+#endif
+    >::
+  relax(Vertex u, Vertex v, Dist x)
+  {
+
+    if (x <= get(distance, v)) {
+      
+      // We're relaxing the edge to vertex v.
+      if (get(owner, v) == process_id(pg)) {
+        if (x < get(distance, v)) {
+          // Compute the new bucket index for v
+          BucketIndex new_index = static_cast<BucketIndex>(x / delta);
+        
+          // Make sure there is enough room in the buckets data structure.
+          if (new_index >= buckets.size()) buckets.resize(new_index + 1, 0);
+        
+          // Make sure that we have allocated the bucket itself.
+          if (!buckets[new_index]) buckets[new_index] = new Bucket;
+          
+          if (get(distance, v) != (std::numeric_limits<Dist>::max)()
+              && !vertex_was_deleted[get(local, v)]) {
+            // We're moving v from an old bucket into a new one. Compute
+            // the old index, then splice it in.
+            BucketIndex old_index 
+              = static_cast<BucketIndex>(get(distance, v) / delta);
+            buckets[new_index]->splice(buckets[new_index]->end(),
+                                       *buckets[old_index],
+                                       position_in_bucket[get(local, v)]);
+          } else {
+            // We're inserting v into a bucket for the first time. Put it
+            // at the end.
+            buckets[new_index]->push_back(v);
+          }
+          
+          // v is now at the last position in the new bucket
+          position_in_bucket[get(local, v)] = buckets[new_index]->end();
+          --position_in_bucket[get(local, v)];
+          
+          // Update tentative distance information and incoming, path_count
+          if (u != v) put(incoming, v, IncomingType(1, u));
+          put(distance, v, x);
+        }        // u != v covers initial source relaxation and self-loops
+        else if (x == get(distance, v) && u != v) {
+
+          // Add incoming edge if it's not already in the list
+          IncomingType in = get(incoming, v);
+          if (std::find(in.begin(), in.end(), u) == in.end()) {
+            in.push_back(u);
+            put(incoming, v, in);
+          }
+        }
+      } else {
+        // The vertex is remote: send a request to the vertex's owner
+        send(pg, get(owner, v), msg_relax, 
+             std::make_pair(v, MessageValue::create(x, u)));
+
+        // Cache tentative distance information
+        cache(distance, v, x);
+      }
+    }
+  }
+
+  /************************************************************************/
+  /* Shortest Paths function object for betweenness centrality            */
+  /************************************************************************/
+
+  template<typename WeightMap>
+  struct brandes_shortest_paths {
+    typedef typename property_traits<WeightMap>::value_type weight_type;
+
+    brandes_shortest_paths() 
+      : weight(1), delta(0)  { }
+    brandes_shortest_paths(weight_type delta) 
+      : weight(1), delta(delta)  { }
+    brandes_shortest_paths(WeightMap w) 
+      : weight(w), delta(0)  { }
+    brandes_shortest_paths(WeightMap w, weight_type delta) 
+      : weight(w), delta(delta)  { }
+
+    template<typename Graph, typename IncomingMap, typename DistanceMap,
+             typename PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+             , typename IsSettledMap, typename VertexIndexMap
+#endif
+
+             > 
+    void 
+    operator()(Graph& g, 
+               typename graph_traits<Graph>::vertex_descriptor s,
+               IncomingMap incoming,
+               DistanceMap distance,
+               PathCountMap path_count
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+               , IsSettledMap is_settled,
+               VertexIndexMap vertex_index 
+#endif
+               )
+    {  
+      typedef typename property_traits<DistanceMap>::value_type 
+        distance_type;
+
+      typedef std::plus<distance_type> Combine;
+      typedef std::less<distance_type> Compare;
+
+      // The "distance" map needs to act like one, retrieving the default
+      // value of infinity.
+      set_property_map_role(vertex_distance, distance);
+      
+      // Only calculate delta the first time operator() is called
+      // This presumes g is the same every time, but so does the fact
+      // that we're reusing the weight map
+      if (delta == 0)
+        set_delta(g);
+      
+      // TODO (NGE): Restructure the code so we don't have to construct
+      //             impl every time?
+      betweenness_centrality_delta_stepping_impl<
+          Graph, DistanceMap, IncomingMap, WeightMap, PathCountMap
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+          , IsSettledMap, VertexIndexMap
+#endif
+            >
+        impl(g, distance, incoming, weight, path_count, 
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+             is_settled, vertex_index, 
+#endif
+             delta);
+
+      impl.run(s);
+    }
+
+  private:
+
+    template <typename Graph>
+    void
+    set_delta(const Graph& g)
+    {
+      using boost::parallel::all_reduce;
+      using boost::parallel::maximum;
+      using std::max;
+
+      typedef typename graph_traits<Graph>::degree_size_type Degree;
+      typedef weight_type Dist;
+
+      // Compute the maximum edge weight and degree
+      Dist max_edge_weight = 0;
+      Degree max_degree = 0;
+      BGL_FORALL_VERTICES_T(u, g, Graph) {
+        max_degree = max BOOST_PREVENT_MACRO_SUBSTITUTION (max_degree, out_degree(u, g));
+        BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+          max_edge_weight = max BOOST_PREVENT_MACRO_SUBSTITUTION (max_edge_weight, get(weight, e));
+      }
+      
+      max_edge_weight = all_reduce(process_group(g), max_edge_weight, maximum<Dist>());
+      max_degree = all_reduce(process_group(g), max_degree, maximum<Degree>());
+      
+      // Take a guess at delta, based on what works well for random
+      // graphs.
+      delta = max_edge_weight / max_degree;
+      if (delta == 0)
+        delta = 1;
+    }
+
+    WeightMap     weight;
+    weight_type   delta;
+  };
+
+  // Perform a single SSSP from the specified vertex and update the centrality map(s)
+  template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+           typename IncomingMap, typename DistanceMap, typename DependencyMap, 
+           typename PathCountMap, 
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+           typename IsSettledMap,
+#endif 
+           typename VertexIndexMap, typename ShortestPaths> 
+  void
+  do_brandes_sssp(const Graph& g, 
+                  CentralityMap centrality,     
+                  EdgeCentralityMap edge_centrality_map,
+                  IncomingMap incoming,
+                  DistanceMap distance,
+                  DependencyMap dependency,
+                  PathCountMap path_count, 
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                  IsSettledMap is_settled,
+#endif 
+                  VertexIndexMap vertex_index,
+                  ShortestPaths shortest_paths,
+                  typename graph_traits<Graph>::vertex_descriptor s)
+  {
+    using boost::detail::graph::update_centrality;      
+    using boost::graph::parallel::process_group;
+
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+    typedef typename property_traits<IncomingMap>::value_type incoming_type;
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+    typedef typename property_traits<DependencyMap>::value_type dependency_type;
+    typedef typename property_traits<PathCountMap>::value_type path_count_type;
+
+    typedef typename incoming_type::iterator incoming_iterator;
+
+    typedef typename property_map<Graph, vertex_owner_t>::const_type OwnerMap;
+    OwnerMap owner = get(vertex_owner, g);
+
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+      process_group_type;
+    process_group_type pg = process_group(g);
+    typename process_group_type::process_id_type id = process_id(pg);
+
+    // TODO: Is it faster not to clear some of these maps?
+    // Initialize for this iteration
+    distance.clear();
+    incoming.clear();
+    path_count.clear();
+    dependency.clear();
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      put(path_count, v, 0);
+      put(dependency, v, 0);
+    }
+
+    if (get(owner, s) == id) {
+      put(incoming, s, incoming_type());
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+      put(path_count, s, 1);
+      put(is_settled, s, true);
+#endif
+    }
+
+    // Execute the shortest paths algorithm. This will be either
+    // a weighted or unweighted customized breadth-first search,
+    shortest_paths(g, s, incoming, distance, path_count
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                   , is_settled, vertex_index
+#endif 
+                   );
+
+#ifndef COMPUTE_PATH_COUNTS_INLINE
+
+    //
+    // TODO: Optimize case where source has no out-edges
+    //
+    // Count of incoming edges to tell when all incoming edges have been relaxed in 
+    // the induced shortest paths DAG 
+    std::vector<edges_size_type> incoming_edge_countS(num_vertices(g));
+    iterator_property_map<typename std::vector<edges_size_type>::iterator, VertexIndexMap> 
+      incoming_edge_count(incoming_edge_countS.begin(), vertex_index);
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      put(incoming_edge_count, v, get(incoming, v).size());
+    }
+
+    if (get(owner, s) == id) {
+      put(incoming_edge_count, s, 1);
+      put(incoming, s, incoming_type());
+    }
+
+    std::vector<incoming_type> outgoingS(num_vertices(g));
+    iterator_property_map<typename std::vector<incoming_type>::iterator, VertexIndexMap> 
+      outgoing(outgoingS.begin(), vertex_index);
+
+    outgoing.set_reduce(append_reducer<incoming_type>());
+
+    // Mark forward adjacencies in DAG of shortest paths
+
+    // TODO: It's possible to do this using edge flags but it's not currently done this way
+    //       because during traversal of the DAG we would have to examine all out edges
+    //       which would lead to more memory accesses and a larger cache footprint.
+    //
+    //       In the bidirectional graph case edge flags would be an excellent way of marking
+    //       edges in the DAG of shortest paths  
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      incoming_type i = get(incoming, v);
+      for (typename incoming_type::iterator iter = i.begin(); iter != i.end(); ++iter) {
+        if (get(owner, *iter) == id) {
+          incoming_type x = get(outgoing, *iter);
+          if (std::find(x.begin(), x.end(), v) == x.end())
+            x.push_back(v);
+          put(outgoing, *iter, x);
+        } else {
+          incoming_type in;
+          in.push_back(v);
+          put(outgoing, *iter, in);
+        }
+      }
+    }
+
+    synchronize(pg);
+
+    // Traverse DAG induced by forward edges in dependency order and compute path counts
+    {
+      typedef std::pair<vertex_descriptor, path_count_type> queue_value_type;
+      typedef get_owner_of_first_pair_element<OwnerMap> IndirectOwnerMap;
+
+      typedef boost::queue<queue_value_type> local_queue_type;
+      typedef boost::graph::distributed::distributed_queue<process_group_type,
+                                                           IndirectOwnerMap,
+                                                           local_queue_type> dist_queue_type;
+
+      IndirectOwnerMap indirect_owner(owner);
+      dist_queue_type Q(pg, indirect_owner);
+
+      if (get(owner, s) == id)
+        Q.push(std::make_pair(s, 1));
+
+      while (!Q.empty()) {
+        queue_value_type t = Q.top(); Q.pop();
+        vertex_descriptor v = t.first;
+        path_count_type p = t.second;
+
+        put(path_count, v, get(path_count, v) + p);
+        put(incoming_edge_count, v, get(incoming_edge_count, v) - 1);
+
+        if (get(incoming_edge_count, v) == 0) {
+          incoming_type out = get(outgoing, v);
+          for (typename incoming_type::iterator iter = out.begin(); iter != out.end(); ++iter)
+            Q.push(std::make_pair(*iter, get(path_count, v)));
+        }
+      }
+    }
+
+#endif // COMPUTE_PATH_COUNTS_INLINE
+
+    //
+    // Compute dependencies 
+    //    
+
+
+    // Build the distributed_queue
+    // Value type consists of 1) target of update 2) source of update
+    // 3) dependency of source 4) path count of source
+    typedef boost::tuple<vertex_descriptor, vertex_descriptor, dependency_type, path_count_type>
+      queue_value_type;
+    typedef get_owner_of_first_tuple_element<OwnerMap, queue_value_type> IndirectOwnerMap;
+
+    typedef boost::queue<queue_value_type> local_queue_type;
+    typedef boost::graph::distributed::distributed_queue<process_group_type,
+                                                         IndirectOwnerMap,
+                                                         local_queue_type> dist_queue_type;
+
+    IndirectOwnerMap indirect_owner(owner);
+    dist_queue_type Q(pg, indirect_owner);
+
+    // Calculate number of vertices each vertex depends on, when a vertex has been pushed
+    // that number of times then we will update it
+    // AND Request path counts of sources of incoming edges
+    std::vector<dependency_type> dependency_countS(num_vertices(g), 0);
+    iterator_property_map<typename std::vector<dependency_type>::iterator, VertexIndexMap> 
+      dependency_count(dependency_countS.begin(), vertex_index);
+
+    dependency_count.set_reduce(boost::graph::distributed::additive_reducer<dependency_type>());
+
+    path_count.set_max_ghost_cells(0);
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (get(distance, v) < (std::numeric_limits<distance_type>::max)()) {
+        incoming_type el = get(incoming, v);
+        for (incoming_iterator vw = el.begin(); vw != el.end(); ++vw) {
+          if (get(owner, *vw) == id)
+            put(dependency_count, *vw, get(dependency_count, *vw) + 1);
+          else {
+            put(dependency_count, *vw, 1);
+
+            // Request path counts
+            get(path_count, *vw); 
+          }
+
+          // request() doesn't work here, perhaps because we don't have a copy of this 
+          // ghost cell already?
+        }
+      }
+    }
+
+    synchronize(pg);
+
+    // Push vertices with non-zero distance/path count and zero dependency count
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (get(distance, v) < (std::numeric_limits<distance_type>::max)()
+          && get(dependency_count, v) == 0) 
+        Q.push(boost::make_tuple(v, v, get(dependency, v), get(path_count, v)));
+    }
+
+    dependency.set_max_ghost_cells(0);
+    while(!Q.empty()) {
+
+      queue_value_type x = Q.top(); Q.pop();
+      vertex_descriptor w = get<0>(x);
+      vertex_descriptor source = get<1>(x);
+      dependency_type dep = get<2>(x);
+      path_count_type pc = get<3>(x);
+
+      cache(dependency, source, dep);
+      cache(path_count, source, pc);
+
+      if (get(dependency_count, w) != 0)
+        put(dependency_count, w, get(dependency_count, w) - 1);
+
+      if (get(dependency_count, w) == 0) { 
+
+        // Update dependency and centrality of sources of incoming edges
+        incoming_type el = get(incoming, w);
+        for (incoming_iterator vw = el.begin(); vw != el.end(); ++vw) {
+          vertex_descriptor v = *vw;
+
+          assert(get(path_count, w) != 0);
+
+          dependency_type factor = dependency_type(get(path_count, v))
+            / dependency_type(get(path_count, w));
+          factor *= (dependency_type(1) + get(dependency, w));
+          
+          if (get(owner, v) == id)
+            put(dependency, v, get(dependency, v) + factor);
+          else
+            put(dependency, v, factor);
+          
+          update_centrality(edge_centrality_map, v, factor);
+        }
+        
+        if (w != s)
+          update_centrality(centrality, w, get(dependency, w));
+
+        // Push sources of edges in incoming edge list
+        for (incoming_iterator vw = el.begin(); vw != el.end(); ++vw)
+          Q.push(boost::make_tuple(*vw, w, get(dependency, w), get(path_count, w)));
+      }
+    }
+  }
+
+  template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+           typename IncomingMap, typename DistanceMap, typename DependencyMap, 
+           typename PathCountMap, typename VertexIndexMap, typename ShortestPaths, 
+           typename Buffer>
+  void 
+  brandes_betweenness_centrality_impl(const Graph& g, 
+                                      CentralityMap centrality,     
+                                      EdgeCentralityMap edge_centrality_map,
+                                      IncomingMap incoming,
+                                      DistanceMap distance,
+                                      DependencyMap dependency,
+                                      PathCountMap path_count, 
+                                      VertexIndexMap vertex_index,
+                                      ShortestPaths shortest_paths,
+                                      Buffer sources)
+  {
+    using boost::detail::graph::init_centrality_map;
+    using boost::detail::graph::divide_centrality_by_two;       
+    using boost::graph::parallel::process_group;
+    
+    typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<Graph>::edge_iterator edge_iterator;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+    typedef typename property_traits<DependencyMap>::value_type dependency_type;
+
+    // Initialize centrality
+    init_centrality_map(vertices(g), centrality);
+    init_centrality_map(edges(g), edge_centrality_map);
+
+    // Set the reduction operation on the dependency map to be addition
+    dependency.set_reduce(boost::graph::distributed::additive_reducer<dependency_type>()); 
+    distance.set_reduce(boost::graph::distributed::choose_min_reducer<distance_type>());
+
+    // Don't allow remote procs to write incoming or path_count maps
+    // updating them is handled inside the betweenness_centrality_queue
+    incoming.set_consistency_model(0);
+    path_count.set_consistency_model(0);
+
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+      process_group_type;
+    process_group_type pg = process_group(g);
+
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+    // Build is_settled maps
+    std::vector<bool> is_settledS(num_vertices(g));
+    typedef iterator_property_map<std::vector<bool>::iterator, VertexIndexMap> 
+      IsSettledMap;
+
+    IsSettledMap is_settled(is_settledS.begin(), vertex_index);
+#endif
+
+    if (!sources.empty()) {
+      // DO SSSPs
+      while (!sources.empty()) {
+        do_brandes_sssp(g, centrality, edge_centrality_map, incoming, distance,
+                        dependency, path_count, 
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                        is_settled,
+#endif 
+                        vertex_index, shortest_paths, sources.top());
+        sources.pop();
+      }
+    } else { // Exact Betweenness Centrality
+      typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+      vertices_size_type n = num_vertices(g);
+      n = boost::parallel::all_reduce(pg, n, std::plus<vertices_size_type>());
+      
+      for (vertices_size_type i = 0; i < n; ++i) {
+        vertex_descriptor v = vertex(i, g);
+
+        do_brandes_sssp(g, centrality, edge_centrality_map, incoming, distance,
+                        dependency, path_count, 
+#ifdef COMPUTE_PATH_COUNTS_INLINE
+                        is_settled,
+#endif 
+                        vertex_index, shortest_paths, v);
+      }
+    }
+
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    const bool is_undirected = 
+      is_convertible<directed_category*, undirected_tag*>::value;
+    if (is_undirected) {
+      divide_centrality_by_two(vertices(g), centrality);
+      divide_centrality_by_two(edges(g), edge_centrality_map);
+    }
+  }
+
+  template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+           typename IncomingMap, typename DistanceMap, typename DependencyMap, 
+           typename PathCountMap, typename VertexIndexMap, typename ShortestPaths,
+           typename Stack>
+  void
+  do_sequential_brandes_sssp(const Graph& g, 
+                             CentralityMap centrality,     
+                             EdgeCentralityMap edge_centrality_map,
+                             IncomingMap incoming,
+                             DistanceMap distance,
+                             DependencyMap dependency,
+                             PathCountMap path_count, 
+                             VertexIndexMap vertex_index,
+                             ShortestPaths shortest_paths,
+                             Stack& ordered_vertices,
+                             typename graph_traits<Graph>::vertex_descriptor v)
+  {
+    using boost::detail::graph::update_centrality;
+
+    typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+    typedef typename property_traits<IncomingMap>::value_type incoming_type;
+
+    // Initialize for this iteration
+    BGL_FORALL_VERTICES_T(w, g, Graph) {
+      // put(path_count, w, 0);
+      incoming[w].clear();
+      put(dependency, w, 0);
+    }
+
+    put(path_count, v, 1);
+    incoming[v].clear();
+
+    // Execute the shortest paths algorithm. This will be either
+    // Dijkstra's algorithm or a customized breadth-first search,
+    // depending on whether the graph is weighted or unweighted.
+    shortest_paths(g, v, ordered_vertices, incoming, distance,
+                   path_count, vertex_index);
+    
+    while (!ordered_vertices.empty()) {
+      vertex_descriptor w = ordered_vertices.top();
+      ordered_vertices.pop();
+      
+      typedef typename property_traits<IncomingMap>::value_type
+            incoming_type;
+      typedef typename incoming_type::iterator incoming_iterator;
+      typedef typename property_traits<DependencyMap>::value_type 
+        dependency_type;
+      
+      for (incoming_iterator vw = incoming[w].begin();
+           vw != incoming[w].end(); ++vw) {
+        vertex_descriptor v = source(*vw, g);
+        dependency_type factor = dependency_type(get(path_count, v))
+          / dependency_type(get(path_count, w));
+        factor *= (dependency_type(1) + get(dependency, w));
+        put(dependency, v, get(dependency, v) + factor);
+        update_centrality(edge_centrality_map, *vw, factor);
+      }
+      
+      if (w != v) {
+        update_centrality(centrality, w, get(dependency, w));
+      }
+    }
+  }
+
+  // Betweenness Centrality variant that duplicates graph across processors
+  // and parallizes SSSPs
+  // This function expects a non-distributed graph and property-maps
+  template<typename ProcessGroup, typename Graph, 
+           typename CentralityMap, typename EdgeCentralityMap,
+           typename IncomingMap, typename DistanceMap, 
+           typename DependencyMap, typename PathCountMap,
+           typename VertexIndexMap, typename ShortestPaths,
+           typename Buffer>
+  void
+  non_distributed_brandes_betweenness_centrality_impl(const ProcessGroup& pg,
+                                                      const Graph& g,
+                                                      CentralityMap centrality,
+                                                      EdgeCentralityMap edge_centrality_map,
+                                                      IncomingMap incoming, // P
+                                                      DistanceMap distance,         // d
+                                                      DependencyMap dependency,     // delta
+                                                      PathCountMap path_count,      // sigma
+                                                      VertexIndexMap vertex_index,
+                                                      ShortestPaths shortest_paths,
+                                                      Buffer sources)
+  {
+    using boost::detail::graph::init_centrality_map;
+    using boost::detail::graph::divide_centrality_by_two;       
+    using boost::graph::parallel::process_group;
+
+    typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<Graph>::edge_iterator edge_iterator;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+    typedef ProcessGroup process_group_type;
+
+    typename process_group_type::process_id_type id = process_id(pg);
+    typename process_group_type::process_size_type p = num_processes(pg);
+
+    // Initialize centrality
+    init_centrality_map(vertices(g), centrality);
+    init_centrality_map(edges(g), edge_centrality_map);
+
+    std::stack<vertex_descriptor> ordered_vertices;
+
+    if (!sources.empty()) {
+      std::vector<vertex_descriptor> local_sources;
+
+      for (int i = 0; i < id; ++i) if (!sources.empty()) sources.pop();
+      while (!sources.empty()) {
+        local_sources.push_back(sources.top());
+
+        for (int i = 0; i < p; ++i) if (!sources.empty()) sources.pop();
+      }
+
+      // DO SSSPs
+      for(size_t i = 0; i < local_sources.size(); ++i)
+        do_sequential_brandes_sssp(g, centrality, edge_centrality_map, incoming,
+                                   distance, dependency, path_count, vertex_index,
+                                   shortest_paths, ordered_vertices, local_sources[i]);
+
+    } else { // Exact Betweenness Centrality
+      typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+      vertices_size_type n = num_vertices(g);
+      
+      for (vertices_size_type i = id; i < n; i += p) {
+        vertex_descriptor v = vertex(i, g);
+
+        do_sequential_brandes_sssp(g, centrality, edge_centrality_map, incoming,
+                                   distance, dependency, path_count, vertex_index,
+                                   shortest_paths, ordered_vertices, v);
+      }
+    }
+
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    const bool is_undirected = 
+      is_convertible<directed_category*, undirected_tag*>::value;
+    if (is_undirected) {
+      divide_centrality_by_two(vertices(g), centrality);
+      divide_centrality_by_two(edges(g), edge_centrality_map);
+    }
+
+    // Merge the centrality maps by summing the values at each vertex)
+    // TODO(nge): this copy-out, reduce, copy-in is lame
+    typedef typename property_traits<CentralityMap>::value_type centrality_type;
+    typedef typename property_traits<EdgeCentralityMap>::value_type edge_centrality_type;
+
+    std::vector<centrality_type> centrality_v(num_vertices(g));
+    std::vector<edge_centrality_type> edge_centrality_v;
+    edge_centrality_v.reserve(num_edges(g));
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      centrality_v[get(vertex_index, v)] = get(centrality, v);
+    }
+    
+    // Skip when EdgeCentralityMap is a dummy_property_map
+    if (!is_same<EdgeCentralityMap, dummy_property_map>::value) {
+      BGL_FORALL_EDGES_T(e, g, Graph) {
+        edge_centrality_v.push_back(get(edge_centrality_map, e));
+      }
+      // NGE: If we trust that the order of elements in the vector isn't changed in the
+      //      all_reduce below then this method avoids the need for an edge index map
+    }
+
+    using boost::parallel::all_reduce;
+
+    all_reduce(pg, &centrality_v[0], &centrality_v[centrality_v.size()],
+               &centrality_v[0], std::plus<centrality_type>());
+
+    if (edge_centrality_v.size()) 
+      all_reduce(pg, &edge_centrality_v[0], &edge_centrality_v[edge_centrality_v.size()],
+                 &edge_centrality_v[0], std::plus<edge_centrality_type>());
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      put(centrality, v, centrality_v[get(vertex_index, v)]);
+    }
+
+    // Skip when EdgeCentralityMap is a dummy_property_map
+    if (!is_same<EdgeCentralityMap, dummy_property_map>::value) {
+      int i = 0;
+      BGL_FORALL_EDGES_T(e, g, Graph) {
+        put(edge_centrality_map, e, edge_centrality_v[i]);
+        ++i;
+      }
+    }
+  }
+
+} } } // end namespace graph::parallel::detail
+
+template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+         typename IncomingMap, typename DistanceMap, typename DependencyMap, 
+         typename PathCountMap, typename VertexIndexMap, typename Buffer>
+void 
+brandes_betweenness_centrality(const Graph& g, 
+                               CentralityMap centrality,
+                               EdgeCentralityMap edge_centrality_map,
+                               IncomingMap incoming, 
+                               DistanceMap distance, 
+                               DependencyMap dependency,     
+                               PathCountMap path_count,   
+                               VertexIndexMap vertex_index,
+                               Buffer sources,
+                               typename property_traits<DistanceMap>::value_type delta
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+  typedef static_property_map<distance_type> WeightMap;
+
+  graph::parallel::detail::brandes_shortest_paths<WeightMap> 
+    shortest_paths(delta);
+
+  graph::parallel::detail::brandes_betweenness_centrality_impl(g, centrality, 
+                                                               edge_centrality_map,
+                                                               incoming, distance,
+                                                               dependency, path_count,
+                                                               vertex_index, 
+                                                               shortest_paths,
+                                                               sources);
+}
+
+template<typename Graph, typename CentralityMap, typename EdgeCentralityMap, 
+         typename IncomingMap, typename DistanceMap, typename DependencyMap, 
+         typename PathCountMap, typename VertexIndexMap, typename WeightMap, 
+         typename Buffer>    
+void 
+brandes_betweenness_centrality(const Graph& g, 
+                               CentralityMap centrality,
+                               EdgeCentralityMap edge_centrality_map,
+                               IncomingMap incoming, 
+                               DistanceMap distance, 
+                               DependencyMap dependency,
+                               PathCountMap path_count, 
+                               VertexIndexMap vertex_index,
+                               Buffer sources,
+                               typename property_traits<WeightMap>::value_type delta,
+                               WeightMap weight_map
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  graph::parallel::detail::brandes_shortest_paths<WeightMap> shortest_paths(weight_map, delta);
+
+  graph::parallel::detail::brandes_betweenness_centrality_impl(g, centrality, 
+                                                               edge_centrality_map,
+                                                               incoming, distance,
+                                                               dependency, path_count,
+                                                               vertex_index, 
+                                                               shortest_paths,
+                                                               sources);
+}
+
+namespace graph { namespace parallel { namespace detail {
+  template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+           typename WeightMap, typename VertexIndexMap, typename Buffer>
+  void 
+  brandes_betweenness_centrality_dispatch2(const Graph& g,
+                                           CentralityMap centrality,
+                                           EdgeCentralityMap edge_centrality_map,
+                                           WeightMap weight_map,
+                                           VertexIndexMap vertex_index,
+                                           Buffer sources,
+                                           typename property_traits<WeightMap>::value_type delta)
+  {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_c<(is_same<CentralityMap, 
+                                        dummy_property_map>::value),
+                                         EdgeCentralityMap, 
+                               CentralityMap>::type a_centrality_map;
+    typedef typename property_traits<a_centrality_map>::value_type 
+      centrality_type;
+
+    typename graph_traits<Graph>::vertices_size_type V = num_vertices(g);
+
+    std::vector<std::vector<vertex_descriptor> > incoming(V);
+    std::vector<centrality_type> distance(V);
+    std::vector<centrality_type> dependency(V);
+    std::vector<degree_size_type> path_count(V);
+
+    brandes_betweenness_centrality(
+      g, centrality, edge_centrality_map,
+      make_iterator_property_map(incoming.begin(), vertex_index),
+      make_iterator_property_map(distance.begin(), vertex_index),
+      make_iterator_property_map(dependency.begin(), vertex_index),
+      make_iterator_property_map(path_count.begin(), vertex_index),
+      vertex_index, unwrap_ref(sources), delta,
+      weight_map);
+  }
+  
+  // TODO: Should the type of the distance and dependency map depend on the 
+  //       value type of the centrality map?
+  template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
+           typename VertexIndexMap, typename Buffer>
+  void 
+  brandes_betweenness_centrality_dispatch2(const Graph& g,
+                                           CentralityMap centrality,
+                                           EdgeCentralityMap edge_centrality_map,
+                                           VertexIndexMap vertex_index,
+                                           Buffer sources,
+                                           typename graph_traits<Graph>::edges_size_type delta)
+  {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename mpl::if_c<(is_same<CentralityMap, 
+                                        dummy_property_map>::value),
+                                         EdgeCentralityMap, 
+                               CentralityMap>::type a_centrality_map;
+
+    typename graph_traits<Graph>::vertices_size_type V = num_vertices(g);
+    
+    std::vector<std::vector<vertex_descriptor> > incoming(V);
+    std::vector<edges_size_type> distance(V);
+    std::vector<edges_size_type> dependency(V);
+    std::vector<degree_size_type> path_count(V);
+
+    brandes_betweenness_centrality(
+      g, centrality, edge_centrality_map,
+      make_iterator_property_map(incoming.begin(), vertex_index),
+      make_iterator_property_map(distance.begin(), vertex_index),
+      make_iterator_property_map(dependency.begin(), vertex_index),
+      make_iterator_property_map(path_count.begin(), vertex_index),
+      vertex_index, unwrap_ref(sources), delta); 
+  }
+
+  template<typename WeightMap>
+  struct brandes_betweenness_centrality_dispatch1
+  {
+    template<typename Graph, typename CentralityMap, typename EdgeCentralityMap, 
+             typename VertexIndexMap, typename Buffer>
+    static void 
+    run(const Graph& g, CentralityMap centrality, EdgeCentralityMap edge_centrality_map, 
+        VertexIndexMap vertex_index, Buffer sources,
+        typename property_traits<WeightMap>::value_type delta, WeightMap weight_map) 
+    {
+      boost::graph::parallel::detail::brandes_betweenness_centrality_dispatch2(
+       g, centrality, edge_centrality_map, weight_map, vertex_index, sources, delta);
+    }
+  };
+
+  template<>
+  struct brandes_betweenness_centrality_dispatch1<boost::detail::error_property_not_found> 
+  {
+    template<typename Graph, typename CentralityMap, typename EdgeCentralityMap, 
+             typename VertexIndexMap, typename Buffer>
+    static void 
+    run(const Graph& g, CentralityMap centrality, EdgeCentralityMap edge_centrality_map, 
+        VertexIndexMap vertex_index, Buffer sources,
+        typename graph_traits<Graph>::edges_size_type delta,
+        boost::detail::error_property_not_found)
+    {
+      boost::graph::parallel::detail::brandes_betweenness_centrality_dispatch2(
+       g, centrality, edge_centrality_map, vertex_index, sources, delta);
+    }
+  };
+
+} } } // end namespace graph::parallel::detail
+
+template<typename Graph, typename Param, typename Tag, typename Rest>
+void 
+brandes_betweenness_centrality(const Graph& g, 
+                               const bgl_named_params<Param,Tag,Rest>& params
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  typedef bgl_named_params<Param,Tag,Rest> named_params;
+
+  typedef queue<typename graph_traits<Graph>::vertex_descriptor> queue_t;
+  queue_t q;
+
+  typedef typename property_value<named_params, edge_weight_t>::type ew;
+  graph::parallel::detail::brandes_betweenness_centrality_dispatch1<ew>::run(
+    g, 
+    choose_param(get_param(params, vertex_centrality), 
+                 dummy_property_map()),
+    choose_param(get_param(params, edge_centrality), 
+                 dummy_property_map()),
+    choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
+    choose_param(get_param(params, buffer_param_t()), boost::ref(q)),
+    choose_param(get_param(params, lookahead_t()), 0),
+    get_param(params, edge_weight));
+}
+
+template<typename Graph, typename CentralityMap>
+void 
+brandes_betweenness_centrality(const Graph& g, CentralityMap centrality
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  typedef queue<typename graph_traits<Graph>::vertex_descriptor> queue_t;
+  queue_t q;
+
+  boost::graph::parallel::detail::brandes_betweenness_centrality_dispatch2(
+    g, centrality, dummy_property_map(), get(vertex_index, g), boost::ref(q), 0);
+}
+
+template<typename Graph, typename CentralityMap, typename EdgeCentralityMap>
+void 
+brandes_betweenness_centrality(const Graph& g, CentralityMap centrality,
+                               EdgeCentralityMap edge_centrality_map
+                               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  typedef queue<int> queue_t;
+  queue_t q;
+
+  boost::graph::parallel::detail::brandes_betweenness_centrality_dispatch2(
+    g, centrality, edge_centrality_map, get(vertex_index, g), boost::ref(q), 0);
+}
+  
+template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+         typename EdgeCentralityMap, typename IncomingMap, typename DistanceMap, 
+         typename DependencyMap, typename PathCountMap, typename VertexIndexMap, 
+         typename Buffer>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg,
+                                               const Graph& g, 
+                                               CentralityMap centrality,
+                                               EdgeCentralityMap edge_centrality_map,
+                                               IncomingMap incoming, 
+                                               DistanceMap distance, 
+                                               DependencyMap dependency,     
+                                               PathCountMap path_count,      
+                                               VertexIndexMap vertex_index,
+                                               Buffer sources)
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+  typedef static_property_map<distance_type> WeightMap;
+  
+  detail::graph::brandes_unweighted_shortest_paths shortest_paths;
+  
+  graph::parallel::detail::non_distributed_brandes_betweenness_centrality_impl(pg, g, centrality, 
+                                                                               edge_centrality_map,
+                                                                               incoming, distance,
+                                                                               dependency, path_count,
+                                                                               vertex_index, 
+                                                                               shortest_paths,
+                                                                               sources);
+}
+  
+template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+         typename EdgeCentralityMap, typename IncomingMap, typename DistanceMap, 
+         typename DependencyMap, typename PathCountMap, typename VertexIndexMap, 
+         typename WeightMap, typename Buffer>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg,
+                                               const Graph& g, 
+                                               CentralityMap centrality,
+                                               EdgeCentralityMap edge_centrality_map,
+                                               IncomingMap incoming, 
+                                               DistanceMap distance, 
+                                               DependencyMap dependency,
+                                               PathCountMap path_count, 
+                                               VertexIndexMap vertex_index,
+                                               WeightMap weight_map,
+                                               Buffer sources)
+{
+  detail::graph::brandes_dijkstra_shortest_paths<WeightMap> shortest_paths(weight_map);
+
+  graph::parallel::detail::non_distributed_brandes_betweenness_centrality_impl(pg, g, centrality, 
+                                                                               edge_centrality_map,
+                                                                               incoming, distance,
+                                                                               dependency, path_count,
+                                                                               vertex_index, 
+                                                                               shortest_paths,
+                                                                               sources);
+}
+
+namespace detail { namespace graph {
+  template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+           typename EdgeCentralityMap, typename WeightMap, typename VertexIndexMap,
+           typename Buffer>
+  void 
+  non_distributed_brandes_betweenness_centrality_dispatch2(const ProcessGroup& pg,
+                                                           const Graph& g,
+                                                           CentralityMap centrality,
+                                                           EdgeCentralityMap edge_centrality_map,
+                                                           WeightMap weight_map,
+                                                           VertexIndexMap vertex_index,
+                                                           Buffer sources)
+  {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+    typedef typename mpl::if_c<(is_same<CentralityMap, 
+                                        dummy_property_map>::value),
+                                         EdgeCentralityMap, 
+                               CentralityMap>::type a_centrality_map;
+    typedef typename property_traits<a_centrality_map>::value_type 
+      centrality_type;
+
+    typename graph_traits<Graph>::vertices_size_type V = num_vertices(g);
+    
+    std::vector<std::vector<edge_descriptor> > incoming(V);
+    std::vector<centrality_type> distance(V);
+    std::vector<centrality_type> dependency(V);
+    std::vector<degree_size_type> path_count(V);
+
+    non_distributed_brandes_betweenness_centrality(
+      pg, g, centrality, edge_centrality_map,
+      make_iterator_property_map(incoming.begin(), vertex_index),
+      make_iterator_property_map(distance.begin(), vertex_index),
+      make_iterator_property_map(dependency.begin(), vertex_index),
+      make_iterator_property_map(path_count.begin(), vertex_index),
+      vertex_index, weight_map, unwrap_ref(sources));
+  }
+  
+
+  template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+           typename EdgeCentralityMap, typename VertexIndexMap, typename Buffer>
+  void 
+  non_distributed_brandes_betweenness_centrality_dispatch2(const ProcessGroup& pg,
+                                                           const Graph& g,
+                                                           CentralityMap centrality,
+                                                           EdgeCentralityMap edge_centrality_map,
+                                                           VertexIndexMap vertex_index,
+                                                           Buffer sources)
+  {
+    typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+    typedef typename mpl::if_c<(is_same<CentralityMap, 
+                                        dummy_property_map>::value),
+                                         EdgeCentralityMap, 
+                               CentralityMap>::type a_centrality_map;
+    typedef typename property_traits<a_centrality_map>::value_type 
+      centrality_type;
+
+    typename graph_traits<Graph>::vertices_size_type V = num_vertices(g);
+    
+    std::vector<std::vector<edge_descriptor> > incoming(V);
+    std::vector<centrality_type> distance(V);
+    std::vector<centrality_type> dependency(V);
+    std::vector<degree_size_type> path_count(V);
+
+    non_distributed_brandes_betweenness_centrality(
+      pg, g, centrality, edge_centrality_map,
+      make_iterator_property_map(incoming.begin(), vertex_index),
+      make_iterator_property_map(distance.begin(), vertex_index),
+      make_iterator_property_map(dependency.begin(), vertex_index),
+      make_iterator_property_map(path_count.begin(), vertex_index),
+      vertex_index, unwrap_ref(sources));
+  }
+
+  template<typename WeightMap>
+  struct non_distributed_brandes_betweenness_centrality_dispatch1
+  {
+    template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+             typename EdgeCentralityMap, typename VertexIndexMap, typename Buffer>
+    static void 
+    run(const ProcessGroup& pg, const Graph& g, CentralityMap centrality, 
+        EdgeCentralityMap edge_centrality_map, VertexIndexMap vertex_index,
+        Buffer sources, WeightMap weight_map)
+    {
+      non_distributed_brandes_betweenness_centrality_dispatch2(pg, g, centrality, edge_centrality_map,
+                                                               weight_map, vertex_index, sources);
+    }
+  };
+
+  template<>
+  struct non_distributed_brandes_betweenness_centrality_dispatch1<detail::error_property_not_found>
+  {
+    template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+             typename EdgeCentralityMap, typename VertexIndexMap, typename Buffer>
+    static void 
+    run(const ProcessGroup& pg, const Graph& g, CentralityMap centrality, 
+        EdgeCentralityMap edge_centrality_map, VertexIndexMap vertex_index,
+        Buffer sources, detail::error_property_not_found)
+    {
+      non_distributed_brandes_betweenness_centrality_dispatch2(pg, g, centrality, edge_centrality_map,
+                                                               vertex_index, sources);
+    }
+  };
+
+} } // end namespace detail::graph
+
+template<typename ProcessGroup, typename Graph, typename Param, typename Tag, typename Rest>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg, const Graph& g, 
+                                               const bgl_named_params<Param,Tag,Rest>& params)
+{
+  typedef bgl_named_params<Param,Tag,Rest> named_params;
+
+  typedef queue<int> queue_t;
+  queue_t q;
+
+  typedef typename property_value<named_params, edge_weight_t>::type ew;
+  detail::graph::non_distributed_brandes_betweenness_centrality_dispatch1<ew>::run(
+    pg, g, 
+    choose_param(get_param(params, vertex_centrality), 
+                 dummy_property_map()),
+    choose_param(get_param(params, edge_centrality), 
+                 dummy_property_map()),
+    choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
+    choose_param(get_param(params, buffer_param_t()),  boost::ref(q)),
+    get_param(params, edge_weight));
+}
+
+template<typename ProcessGroup, typename Graph, typename CentralityMap>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg, const Graph& g, 
+                                               CentralityMap centrality)
+{
+  typedef queue<int> queue_t;
+  queue_t q;
+
+  detail::graph::non_distributed_brandes_betweenness_centrality_dispatch2(
+    pg, g, centrality, dummy_property_map(), get(vertex_index, g), boost::ref(q));
+}
+
+template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+         typename Buffer>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg, const Graph& g, 
+                                               CentralityMap centrality, Buffer sources)
+{
+  detail::graph::non_distributed_brandes_betweenness_centrality_dispatch2(
+    pg, g, centrality, dummy_property_map(), get(vertex_index, g), sources);
+}
+
+template<typename ProcessGroup, typename Graph, typename CentralityMap, 
+         typename EdgeCentralityMap, typename Buffer>
+void 
+non_distributed_brandes_betweenness_centrality(const ProcessGroup& pg, const Graph& g, 
+                                               CentralityMap centrality,
+                                               EdgeCentralityMap edge_centrality_map, 
+                                               Buffer sources)
+{
+  detail::graph::non_distributed_brandes_betweenness_centrality_dispatch2(
+    pg, g, centrality, edge_centrality_map, get(vertex_index, g), sources);
+}
+
+// Compute the central point dominance of a graph.
+// TODO: Make sure central point dominance works in parallel case
+template<typename Graph, typename CentralityMap>
+typename property_traits<CentralityMap>::value_type
+central_point_dominance(const Graph& g, CentralityMap centrality
+                        BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  using std::max;
+
+  typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+  typedef typename property_traits<CentralityMap>::value_type centrality_type;
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+
+  typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+    process_group_type;
+  process_group_type pg = boost::graph::parallel::process_group(g);
+
+  vertices_size_type n = num_vertices(g);
+
+  using boost::parallel::all_reduce;  
+  n = all_reduce(pg, n, std::plus<vertices_size_type>());
+
+  // Find max centrality
+  centrality_type max_centrality(0);
+  vertex_iterator v, v_end;
+  for (tie(v, v_end) = vertices(g); v != v_end; ++v) {
+    max_centrality = (max)(max_centrality, get(centrality, *v));
+  }
+
+  // All reduce to get global max centrality
+  max_centrality = all_reduce(pg, max_centrality, boost::parallel::maximum<centrality_type>());
+
+  // Compute central point dominance
+  centrality_type sum(0);
+  for (tie(v, v_end) = vertices(g); v != v_end; ++v) {
+    sum += (max_centrality - get(centrality, *v));
+  }
+
+  sum = all_reduce(pg, sum, std::plus<centrality_type>());
+
+  return sum/(n-1);
+}
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PARALLEL_BRANDES_BETWEENNESS_CENTRALITY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/boman_et_al_graph_coloring.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/boman_et_al_graph_coloring.hpp
new file mode 100644 (file)
index 0000000..c65f80f
--- /dev/null
@@ -0,0 +1,372 @@
+// Copyright (C) 2005-2008 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_BOMAN_ET_AL_GRAPH_COLORING_HPP
+#define BOOST_GRAPH_DISTRIBUTED_BOMAN_ET_AL_GRAPH_COLORING_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <functional>
+#include <vector>
+#include <utility>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/optional.hpp>
+#include <cassert>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/properties.hpp>
+
+#ifdef PBGL_ACCOUNTING
+#  include <boost/graph/accounting.hpp>
+#endif // PBGL_ACCOUNTING
+
+namespace boost { namespace graph { namespace distributed {
+
+/**************************************************************************
+ * This source file implements the distributed graph coloring algorithm   *
+ * by Boman et al in:                                                     *
+ *                                                                        *
+ *   Erik G. Boman, Doruk Bozdag, Umit Catalyurek, Assefaw H. Gebremedhin,*
+ *   and Fredrik Manne. A Scalable Parallel Graph Coloring Algorithm for  *
+ *   Distributed Memory Computers. [unpublished preprint?]                *
+ *                                                                        *
+ **************************************************************************/
+
+#ifdef PBGL_ACCOUNTING
+struct boman_et_al_graph_coloring_stats_t
+{
+  /* The size of the blocks to step through (i.e., the parameter s). */
+  std::size_t block_size;
+  
+  /* Total wall-clock time used by the algorithm.*/
+  accounting::time_type execution_time;
+
+  /* The number of conflicts that occurred during execution. */
+  std::size_t conflicts;
+
+  /* The number of supersteps. */
+  std::size_t supersteps;
+
+  /* The number of colors used. */
+  std::size_t num_colors;
+
+  template<typename OutputStream>
+  void print(OutputStream& out)
+  {
+    out << "Problem = \"Coloring\"\n"
+        << "Algorithm = \"Boman et al\"\n"
+        << "Function = boman_et_al_graph_coloring\n"
+        << "(P) Block size = " << block_size << "\n"
+        << "Wall clock time = " << accounting::print_time(execution_time) 
+        << "\nConflicts = " << conflicts << "\n"
+        << "Supersteps = " << supersteps << "\n"
+        << "(R) Colors = " << num_colors << "\n";
+  }
+};
+
+static boman_et_al_graph_coloring_stats_t boman_et_al_graph_coloring_stats;
+#endif
+
+namespace detail {
+  template<typename T>
+  struct graph_coloring_reduce
+  {
+    BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+    template<typename Key>
+    T operator()(const Key&) const { return (std::numeric_limits<T>::max)(); }
+
+    template<typename Key> T operator()(const Key&, T, T y) const { return y; }
+  };
+}
+
+template<typename Color>
+struct first_fit_color
+{
+  template<typename T>
+  Color operator()(const std::vector<T>& marked, T marked_true)
+  {
+    Color k = 0;
+    while (k < (Color)marked.size() && marked[k] == marked_true)
+      ++k;
+    return k;
+  }
+};
+
+template<typename DistributedGraph, typename ColorMap, typename ChooseColor,
+         typename VertexOrdering, typename VertexIndexMap>
+typename property_traits<ColorMap>::value_type
+boman_et_al_graph_coloring
+  (const DistributedGraph& g,
+   ColorMap color,
+   typename graph_traits<DistributedGraph>::vertices_size_type s,
+   ChooseColor choose_color,
+   VertexOrdering ordering, VertexIndexMap vertex_index)
+{
+  using namespace boost::graph::parallel;
+  using boost::parallel::all_reduce;
+
+  typename property_map<DistributedGraph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  typedef typename process_group_type<DistributedGraph>::type 
+    process_group_type;
+  typedef typename process_group_type::process_id_type process_id_type;
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<DistributedGraph>::edge_descriptor Edge;
+  typedef typename graph_traits<DistributedGraph>::vertices_size_type 
+    vertices_size_type;
+  typedef typename property_traits<ColorMap>::value_type color_type;
+  typedef unsigned long long iterations_type;
+  typedef typename std::vector<Vertex>::iterator vertex_set_iterator;
+  typedef std::pair<Vertex, color_type> message_type;
+
+#ifdef PBGL_ACCOUNTING
+  boman_et_al_graph_coloring_stats.block_size = s;
+  boman_et_al_graph_coloring_stats.execution_time = accounting::get_time();
+  boman_et_al_graph_coloring_stats.conflicts = 0;
+  boman_et_al_graph_coloring_stats.supersteps = 0;
+#endif
+
+  // Initialize color map
+  color_type no_color = (std::numeric_limits<color_type>::max)();
+  BGL_FORALL_VERTICES_T(v, g, DistributedGraph)
+    put(color, v, no_color);
+  color.set_reduce(detail::graph_coloring_reduce<color_type>());
+  
+  // Determine if we'll be using synchronous or asynchronous communication.
+  typedef typename process_group_type::communication_category
+    communication_category;
+  static const bool asynchronous = 
+    is_convertible<communication_category, immediate_process_group_tag>::value;
+  process_group_type pg = process_group(g);
+
+  // U_i <- V_i
+  std::vector<Vertex> vertices_to_color(vertices(g).first, vertices(g).second);
+
+  iterations_type iter_num = 1, outer_iter_num = 1;
+  std::vector<iterations_type> marked;
+  std::vector<iterations_type> marked_conflicting(num_vertices(g), 0);
+  std::vector<bool> sent_to_processors;
+
+  std::size_t rounds = vertices_to_color.size() / s 
+    + (vertices_to_color.size() % s == 0? 0 : 1);
+  rounds = all_reduce(pg, rounds, boost::parallel::maximum<std::size_t>());
+
+#ifdef PBGL_GRAPH_COLORING_DEBUG
+  std::cerr << "Number of rounds = " << rounds << std::endl;
+#endif
+
+  while (rounds > 0) {
+    if (!vertices_to_color.empty()) {
+      // Set of conflicting vertices
+      std::vector<Vertex> conflicting_vertices;
+
+      vertex_set_iterator first = vertices_to_color.begin();
+      while (first != vertices_to_color.end()) {
+        // For each subset of size s (or smaller for the last subset)
+        vertex_set_iterator start = first;
+        for (vertices_size_type counter = s; 
+             first != vertices_to_color.end() && counter > 0;
+             ++first, --counter) {
+          // This vertex hasn't been sent to anyone yet
+          sent_to_processors.assign(num_processes(pg), false);
+          sent_to_processors[process_id(pg)] = true;
+
+          // Mark all of the colors that we see
+          BGL_FORALL_OUTEDGES_T(*first, e, g, DistributedGraph) {
+            color_type k = get(color, target(e, g));
+            if (k != no_color) {
+              if (k >= (color_type)marked.size()) marked.resize(k + 1, 0);
+              marked[k] = iter_num;
+            }
+          }
+
+          // Find a color for this vertex
+          put(color, *first, choose_color(marked, iter_num));
+
+#ifdef PBGL_GRAPH_COLORING_DEBUG
+          std::cerr << "Chose color " << get(color, *first) << " for vertex "
+                    << *first << std::endl;
+#endif
+
+          // Send this vertex's color to the owner of the edge target.
+          BGL_FORALL_OUTEDGES_T(*first, e, g, DistributedGraph) {
+            if (!sent_to_processors[get(owner, target(e, g))]) {
+              send(pg, get(owner, target(e, g)), 17, 
+                   message_type(source(e, g), get(color, source(e, g))));
+              sent_to_processors[get(owner, target(e, g))] = true;
+            }
+          }
+
+          ++iter_num;
+        }
+
+        // Synchronize for non-immediate process groups.
+        if (!asynchronous) { 
+          --rounds;
+          synchronize(pg);
+        }
+
+        // Receive boundary colors from other processors
+        while (optional<std::pair<process_id_type, int> > stp = probe(pg)) {
+          assert(stp->second == 17);
+          message_type msg;
+          receive(pg, stp->first, stp->second, msg);
+          cache(color, msg.first, msg.second);
+#ifdef PBGL_GRAPH_COLORING_DEBUG
+          std::cerr << "Cached color " << msg.second << " for vertex " 
+                    << msg.first << std::endl;
+#endif
+        }
+
+        // Compute the set of conflicting vertices
+        // [start, first) contains all vertices in this subset
+        for (vertex_set_iterator vi = start; vi != first; ++vi) {
+          Vertex v = *vi;
+          BGL_FORALL_OUTEDGES_T(v, e, g, DistributedGraph) {
+            Vertex w = target(e, g);
+            if (get(owner, w) != process_id(pg) // boundary vertex
+                && marked_conflicting[get(vertex_index, v)] != outer_iter_num
+                && get(color, v) == get(color, w)
+                && ordering(v, w)) {
+              conflicting_vertices.push_back(v);
+              marked_conflicting[get(vertex_index, v)] = outer_iter_num;
+              put(color, v, no_color);
+#ifdef PBGL_GRAPH_COLORING_DEBUG
+              std::cerr << "Vertex " << v << " has a conflict with vertex "
+                        << w << std::endl;
+#endif
+              break;
+            }
+          }
+        }
+
+#ifdef PBGL_ACCOUNTING
+        boman_et_al_graph_coloring_stats.conflicts += 
+          conflicting_vertices.size();
+#endif
+      }
+
+      if (asynchronous) synchronize(pg);
+      else {
+        while (rounds > 0) {
+          synchronize(pg);
+          --rounds;
+        }
+      }
+      conflicting_vertices.swap(vertices_to_color);
+      ++outer_iter_num;
+    } else {
+      if (asynchronous) synchronize(pg);
+      else {
+        while (rounds > 0) {
+          synchronize(pg);
+          --rounds;
+        }
+      }
+    }
+
+    // Receive boundary colors from other processors
+    while (optional<std::pair<process_id_type, int> > stp = probe(pg)) {
+      assert(stp->second == 17);
+      message_type msg;
+      receive(pg, stp->first, stp->second, msg);
+      cache(color, msg.first, msg.second);
+    }
+
+    rounds = vertices_to_color.size() / s 
+      + (vertices_to_color.size() % s == 0? 0 : 1);
+    rounds = all_reduce(pg, rounds, boost::parallel::maximum<std::size_t>());
+
+#ifdef PBGL_ACCOUNTING
+    ++boman_et_al_graph_coloring_stats.supersteps;
+#endif
+  }
+
+  // Determine the number of colors used.
+  color_type num_colors = 0;
+  BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+    color_type k = get(color, v);
+    assert(k != no_color);
+    if (k != no_color) {
+      if (k >= (color_type)marked.size()) marked.resize(k + 1, 0); // TBD: perf?
+      if (marked[k] != iter_num) {
+        marked[k] = iter_num;
+        ++num_colors;
+      }
+    }
+  }
+
+  num_colors = 
+    all_reduce(pg, num_colors, boost::parallel::maximum<color_type>());
+
+
+#ifdef PBGL_ACCOUNTING
+  boman_et_al_graph_coloring_stats.execution_time = 
+    accounting::get_time() - boman_et_al_graph_coloring_stats.execution_time;
+  
+  boman_et_al_graph_coloring_stats.conflicts = 
+    all_reduce(pg, boman_et_al_graph_coloring_stats.conflicts,
+               std::plus<color_type>());
+  boman_et_al_graph_coloring_stats.num_colors = num_colors;
+#endif
+
+  return num_colors;
+}
+
+
+template<typename DistributedGraph, typename ColorMap, typename ChooseColor, 
+         typename VertexOrdering>
+inline typename property_traits<ColorMap>::value_type
+boman_et_al_graph_coloring
+  (const DistributedGraph& g, ColorMap color,
+   typename graph_traits<DistributedGraph>::vertices_size_type s,
+   ChooseColor choose_color, VertexOrdering ordering)
+{
+  return boman_et_al_graph_coloring(g, color, s, choose_color, ordering, 
+                                    get(vertex_index, g));
+}
+
+template<typename DistributedGraph, typename ColorMap, typename ChooseColor>
+inline typename property_traits<ColorMap>::value_type
+boman_et_al_graph_coloring
+  (const DistributedGraph& g,
+   ColorMap color,
+   typename graph_traits<DistributedGraph>::vertices_size_type s,
+   ChooseColor choose_color)
+{
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+    vertex_descriptor;
+  return boman_et_al_graph_coloring(g, color, s, choose_color,
+                                    std::less<vertex_descriptor>());
+}
+
+template<typename DistributedGraph, typename ColorMap>
+inline typename property_traits<ColorMap>::value_type
+boman_et_al_graph_coloring
+  (const DistributedGraph& g,
+   ColorMap color,
+   typename graph_traits<DistributedGraph>::vertices_size_type s = 100)
+{
+  typedef typename property_traits<ColorMap>::value_type Color;
+  return boman_et_al_graph_coloring(g, color, s, first_fit_color<Color>());
+}
+
+} } } // end namespace boost::graph::distributed
+
+namespace boost { namespace graph {
+using distributed::boman_et_al_graph_coloring;
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_DISTRIBUTED_BOMAN_ET_AL_GRAPH_COLORING_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/breadth_first_search.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/breadth_first_search.hpp
new file mode 100644 (file)
index 0000000..c987585
--- /dev/null
@@ -0,0 +1,164 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_BFS_HPP
+#define BOOST_GRAPH_PARALLEL_BFS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/breadth_first_search.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/distributed/detail/filtered_queue.hpp>
+#include <boost/graph/distributed/queue.hpp>
+#include <boost/dynamic_bitset.hpp>
+#include <boost/pending/queue.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+namespace boost {
+  namespace detail {
+    /** @brief A unary predicate that decides when to push into a
+     *         breadth-first search queue.
+     *
+     *  This predicate stores a color map that is used to determine
+     *  when to push. If it is provided with a key for which the color
+     *  is white, it darkens the color to gray and returns true (so
+     *  that the value will be pushed appropriately); if the color is
+     *  not white, it returns false so that the vertex will be
+     *  ignored.
+     */
+    template<typename ColorMap>
+    struct darken_and_push
+    {
+      typedef typename property_traits<ColorMap>::key_type argument_type;
+      typedef bool result_type;
+
+      explicit darken_and_push(const ColorMap& color) : color(color) { }
+
+      bool operator()(const argument_type& value) const
+      {
+        typedef color_traits<typename property_traits<ColorMap>::value_type>
+          Color;
+        if (get(color, value) == Color::white()) {
+          put(color, value, Color::gray());
+          return true;
+        } else {
+          return false;
+        }
+      }
+
+      ColorMap color;
+    };
+
+    template<typename IndexMap>
+    struct has_not_been_seen
+    {
+      typedef bool result_type;
+
+      has_not_been_seen() { }
+
+      has_not_been_seen(std::size_t n, IndexMap index_map)
+        : seen(n), index_map(index_map) {}
+
+      template<typename Key>
+      result_type operator()(Key key)
+      {
+        bool result = seen[get(index_map, key)];
+        seen[get(index_map, key)] = true;
+        return !result;
+      }
+
+      void swap(has_not_been_seen& other)
+      {
+        using std::swap;
+        swap(seen, other.seen);
+        swap(index_map, other.index_map);
+      }
+
+    private:
+      dynamic_bitset<> seen;
+      IndexMap index_map;
+    };
+
+    template<typename IndexMap>
+    inline void
+    swap(has_not_been_seen<IndexMap>& x, has_not_been_seen<IndexMap>& y)
+    {
+      x.swap(y);
+    }
+
+    template <class DistributedGraph, class ColorMap, class BFSVisitor,
+              class BufferRef, class VertexIndexMap>
+    inline void
+    parallel_bfs_helper
+      (DistributedGraph& g,
+       typename graph_traits<DistributedGraph>::vertex_descriptor s,
+       ColorMap color,
+       BFSVisitor vis,
+       BufferRef Q,
+       VertexIndexMap)
+    {
+      set_property_map_role(vertex_color, color);
+      color.set_consistency_model(0);
+      breadth_first_search(g, s, Q.ref, vis, color);
+    }
+
+    template <class DistributedGraph, class ColorMap, class BFSVisitor,
+              class VertexIndexMap>
+    void parallel_bfs_helper
+      (DistributedGraph& g,
+       typename graph_traits<DistributedGraph>::vertex_descriptor s,
+       ColorMap color,
+       BFSVisitor vis,
+       error_property_not_found,
+       VertexIndexMap vertex_index)
+    {
+      using boost::graph::parallel::process_group;
+
+      typedef graph_traits<DistributedGraph> Traits;
+      typedef typename Traits::vertex_descriptor Vertex;
+      typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type 
+        process_group_type;
+
+      set_property_map_role(vertex_color, color);
+      color.set_consistency_model(0);
+
+      // Buffer default
+      typedef typename property_map<DistributedGraph, vertex_owner_t>
+        ::const_type vertex_owner_map;
+      typedef boost::graph::distributed::distributed_queue<
+                process_group_type, vertex_owner_map, queue<Vertex>, 
+                detail::darken_and_push<ColorMap> > queue_t;
+      queue_t Q(process_group(g),
+                get(vertex_owner, g),
+                detail::darken_and_push<ColorMap>(color));
+      breadth_first_search(g, s, Q, vis, color);
+    }
+
+    template <class DistributedGraph, class ColorMap, class BFSVisitor,
+              class P, class T, class R>
+    void bfs_helper
+      (DistributedGraph& g,
+       typename graph_traits<DistributedGraph>::vertex_descriptor s,
+       ColorMap color,
+       BFSVisitor vis,
+       const bgl_named_params<P, T, R>& params,
+       BOOST_GRAPH_ENABLE_IF_MODELS(DistributedGraph, distributed_graph_tag,
+                                    void)*)
+        {
+            parallel_bfs_helper
+        (g, s, color, vis, get_param(params, buffer_param_t()),
+         choose_const_pmap(get_param(params, vertex_index),  g, vertex_index));
+        }
+  }
+}
+
+#endif // BOOST_GRAPH_PARALLEL_BFS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/compressed_sparse_row_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/compressed_sparse_row_graph.hpp
new file mode 100644 (file)
index 0000000..edbf167
--- /dev/null
@@ -0,0 +1,2168 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Jeremiah Willcock
+//           Andrew Lumsdaine
+
+// Distributed compressed sparse row graph type
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_CSR_HPP
+#define BOOST_GRAPH_DISTRIBUTED_CSR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#define BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+#include <boost/graph/compressed_sparse_row_graph.hpp>
+#include <boost/graph/distributed/selector.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/parallel/distribution.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+
+namespace boost {
+
+// Distributed and sequential inplace ctors have the same signature so
+// we need a separate tag for distributed inplace ctors
+enum distributed_construct_inplace_from_sources_and_targets_t 
+  {distributed_construct_inplace_from_sources_and_targets};
+
+// The number of bits we reserve for the processor ID. 
+// DPG TBD: This is a hack. It will eventually be a run-time quantity.
+static const int processor_bits = 8;
+
+// Tag class for a distributed CSR graph
+struct distributed_csr_tag
+  : public virtual distributed_graph_tag,
+    public virtual distributed_vertex_list_graph_tag,
+    public virtual distributed_edge_list_graph_tag,
+    public virtual incidence_graph_tag,
+    public virtual adjacency_graph_tag {};
+
+template<typename VertexProperty, typename EdgeProperty,
+         typename GraphProperty, typename ProcessGroup, typename InVertex,
+         typename InDistribution, typename InEdgeIndex>
+class compressed_sparse_row_graph<
+         directedS, VertexProperty, EdgeProperty, GraphProperty,
+         distributedS<ProcessGroup, InVertex, InDistribution>,
+         InEdgeIndex>
+{
+  typedef compressed_sparse_row_graph self_type;
+
+ private:
+  /**
+   *  Determine the type used to represent vertices in the graph. If
+   *  the user has overridden the default, use the user's
+   *  parameter. Otherwise, fall back to std::size_t.
+   */
+  typedef typename mpl::if_<is_same<InVertex, defaultS>,
+                            std::size_t,
+                            InVertex>::type Vertex;
+
+  /**
+   *  Determine the type used to represent edges in the graph. If
+   *  the user has overridden the default (which is to be the same as
+   *  the distributed vertex selector type), use the user's
+   *  parameter. Otherwise, fall back to the value of @c Vertex.
+   */
+  typedef typename mpl::if_<is_same<InEdgeIndex,
+                                    distributedS<ProcessGroup, InVertex,
+                                                 InDistribution> >,
+                            Vertex,
+                            InEdgeIndex>::type EdgeIndex;
+
+ public:
+  /**
+   * The type of the CSR graph that will be stored locally.
+   */
+  typedef compressed_sparse_row_graph<directedS, VertexProperty, EdgeProperty,
+                                      GraphProperty, Vertex, EdgeIndex>
+    base_type;
+
+  // -----------------------------------------------------------------
+  // Graph concept requirements
+  typedef Vertex vertex_descriptor;
+  typedef typename graph_traits<base_type>::edge_descriptor edge_descriptor;
+  typedef directed_tag directed_category;
+  typedef allow_parallel_edge_tag edge_parallel_category;
+  typedef distributed_csr_tag traversal_category;
+  static vertex_descriptor null_vertex();
+
+  // -----------------------------------------------------------------
+  // Distributed Vertex List Graph concept requirements
+  typedef Vertex vertices_size_type;
+  class vertex_iterator;
+
+  // -----------------------------------------------------------------
+  // Distributed Edge List Graph concept requirements
+  typedef EdgeIndex edges_size_type;
+  class edge_iterator;
+
+  // -----------------------------------------------------------------
+  // Incidence Graph concept requirements
+  typedef typename graph_traits<base_type>::out_edge_iterator
+    out_edge_iterator;
+  typedef typename graph_traits<base_type>::degree_size_type
+    degree_size_type;
+
+  // -----------------------------------------------------------------
+  // Adjacency Graph concept requirements
+  typedef typename graph_traits<base_type>::adjacency_iterator
+    adjacency_iterator;
+
+  // Note: This graph type does not model Bidirectional Graph.
+  // However, this typedef is required to satisfy graph_traits.
+  typedef void in_edge_iterator;
+
+  // -----------------------------------------------------------------
+  // Distributed Container concept requirements
+  typedef ProcessGroup process_group_type;
+  typedef boost::parallel::variant_distribution<process_group_type, Vertex>
+    distribution_type;
+
+  // -----------------------------------------------------------------
+  // Workarounds
+  typedef no_property vertex_property_type;
+  typedef no_property edge_property_type;
+  typedef typename mpl::if_<is_void<VertexProperty>,
+                            void****,
+                            VertexProperty>::type vertex_bundled;
+  typedef typename mpl::if_<is_void<EdgeProperty>,
+                            void****,
+                            EdgeProperty>::type edge_bundled;
+
+  // -----------------------------------------------------------------
+  // Useful types
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+  // -----------------------------------------------------------------
+  // Graph constructors
+  compressed_sparse_row_graph(const ProcessGroup& pg = ProcessGroup())
+    : m_process_group(pg), m_distribution(parallel::block(pg, 0)) {}
+
+  compressed_sparse_row_graph(const GraphProperty& prop,
+                              const ProcessGroup& pg = ProcessGroup())
+    : m_process_group(pg), m_distribution(parallel::block(pg, 0)) {}
+
+  compressed_sparse_row_graph(vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup())
+    : m_process_group(pg), m_distribution(parallel::block(pg, 0)),
+      m_base(numverts) 
+  {}
+
+  compressed_sparse_row_graph(vertices_size_type numverts,
+                              const GraphProperty& prop,
+                              const ProcessGroup& pg = ProcessGroup())
+    : m_process_group(pg), m_distribution(parallel::block(pg, 0)),
+      m_base(numverts) 
+  {}
+
+  template <typename Distribution>
+  compressed_sparse_row_graph(vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist)
+    : m_process_group(pg), m_distribution(dist), m_base(numverts) {}
+
+  template <typename Distribution>
+  compressed_sparse_row_graph(vertices_size_type numverts,
+                              const GraphProperty& prop,
+                              const ProcessGroup& pg,
+                              const Distribution& dist)
+    : m_process_group(pg), m_distribution(dist), m_base(numverts) {}
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+  template <typename InputIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename Distribution>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename EdgePropertyIterator,
+            typename Distribution>
+  compressed_sparse_row_graph(edges_are_unsorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename Distribution>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              edges_size_type numedges = 0,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename InputIterator, typename EdgePropertyIterator,
+            typename Distribution>
+  compressed_sparse_row_graph(edges_are_sorted_t,
+                              InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename MultiPassInputIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin, 
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename MultiPassInputIterator, typename Distribution>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin, 
+                              MultiPassInputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin, 
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename MultiPassInputIterator, typename EdgePropertyIterator,
+            typename Distribution>
+  compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                              MultiPassInputIterator edge_begin, 
+                              MultiPassInputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename Source>
+  compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                              std::vector<Source>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename Distribution, typename Source> 
+  compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                              std::vector<Source>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename Source>
+  compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                              std::vector<Source>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              std::vector<edge_bundled>& edge_props,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template <typename Distribution, typename Source>
+  compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                              std::vector<Source>& sources,
+                              std::vector<vertex_descriptor>& targets,
+                              std::vector<edge_bundled>& edge_props,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+#endif
+
+  template<typename InputIterator>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template<typename InputIterator, typename EdgePropertyIterator>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg = ProcessGroup(),
+                              const GraphProperty& prop = GraphProperty());
+
+  template<typename InputIterator, typename Distribution>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  template<typename InputIterator, typename EdgePropertyIterator, 
+           typename Distribution>
+  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                              EdgePropertyIterator ep_iter,
+                              vertices_size_type numverts,
+                              const ProcessGroup& pg,
+                              const Distribution& dist,
+                              const GraphProperty& prop = GraphProperty());
+
+  base_type&       base()       { return m_base; }
+  const base_type& base() const { return m_base; }
+
+  process_group_type process_group() const { return m_process_group.base(); }
+
+  distribution_type&       distribution()       { return m_distribution; }
+  const distribution_type& distribution() const { return m_distribution; }
+
+  // Directly access a vertex or edge bundle
+  vertex_bundled& operator[](vertex_descriptor v)
+  {
+    std::pair<process_id_type, vertex_descriptor> locator
+      = get(vertex_global, *this, v);
+    assert(locator.first == process_id(m_process_group));
+    return base().m_vertex_properties[locator.second];
+  }
+
+  const vertex_bundled& operator[](vertex_descriptor v) const
+  {
+    std::pair<process_id_type, vertex_descriptor> locator
+      = get(vertex_global, *this, v);
+    assert(locator.first == process_id(m_process_group));
+    return base().m_process_group[locator.second];
+  }
+
+  edge_bundled& operator[](edge_descriptor e)
+  {
+    assert(get(vertex_owner, *this, e.src) == process_id(m_process_group));
+    return base().m_edge_properties[e.idx];
+  }
+
+  const edge_bundled& operator[](edge_descriptor e) const
+  {
+    assert(get(vertex_owner, *this, e.src) == process_id(m_process_group));
+    return base().m_edge_properties[e.idx];
+  }
+
+  // Create a vertex descriptor from a process ID and a local index.
+  vertex_descriptor 
+  make_vertex_descriptor(process_id_type p, vertex_descriptor v) const
+  {
+    vertex_descriptor vertex_local_index_bits = 
+      sizeof(vertex_descriptor) * CHAR_BIT - processor_bits;
+    return v | ((vertex_descriptor)p << vertex_local_index_bits);
+  }
+
+  // Convert a local vertex descriptor into a global vertex descriptor
+  vertex_descriptor local_to_global_vertex(vertex_descriptor v) const
+  {
+    return make_vertex_descriptor(process_id(m_process_group), v);
+  }
+
+  // Structural modification
+  vertex_descriptor add_vertex()
+  {
+    typename graph_traits<base_type>::vertex_descriptor v 
+      = boost::add_vertex(m_base);
+
+    return make_vertex_descriptor(process_id(m_process_group), v);
+  }
+
+  vertex_descriptor add_vertex(const vertex_bundled& p)
+  {
+    typename graph_traits<base_type>::vertex_descriptor v 
+      = boost::add_vertex(m_base, p);
+
+    return make_vertex_descriptor(process_id(m_process_group), v);
+  }
+
+  vertex_descriptor add_vertices(vertices_size_type count)
+  {
+    typename graph_traits<base_type>::vertex_descriptor v 
+      = boost::add_vertices(count, m_base);
+
+    return make_vertex_descriptor(process_id(m_process_group), v);
+  }
+
+  template <typename InputIterator>
+  void 
+  add_edges(InputIterator first, InputIterator last)
+  { boost::add_edges_global(first, last, get(vertex_local, *this), m_base); }
+
+  template <typename InputIterator, typename EdgePropertyIterator>
+  void 
+  add_edges(InputIterator first, InputIterator last,
+            EdgePropertyIterator ep_iter,
+            EdgePropertyIterator ep_iter_end)
+  { boost::add_edges_global(first, last, ep_iter, ep_iter_end, 
+                            get(vertex_local, *this), m_base); }
+
+  template <typename InputIterator>
+  void 
+  add_edges_sorted(InputIterator first, InputIterator last)
+  { boost::add_edges_sorted_global(first, last, 
+                                   get(vertex_local, *this), m_base); }
+
+  template <typename InputIterator, typename EdgePropertyIterator>
+  void 
+  add_edges_sorted(InputIterator first_sorted, InputIterator last_sorted,
+                   EdgePropertyIterator ep_iter_sorted)
+  { boost::add_edges_sorted_global(first_sorted, last_sorted, ep_iter_sorted, 
+                                   get(vertex_local, *this), m_base); }
+
+ protected:
+  ProcessGroup m_process_group;
+  distribution_type m_distribution;
+  base_type m_base;
+};
+
+/** @brief Helper macro containing the template parameters for the
+ *   distributed CSR graph.
+ *
+ *  This macro contains all of the template parameters needed for the
+ *  distributed compressed_sparse_row graph type. It is used to reduce
+ *  the amount of typing required to declare free functions for this
+ *  graph type.
+ */
+#define BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS                          \
+  typename VertexProperty, typename EdgeProperty,    \
+  typename GraphProperty, typename ProcessGroup, typename InVertex,     \
+  typename InDistribution, typename InEdgeIndex
+
+/** @brief Helper macro containing the typical instantiation of the
+ *   distributed CSR graph.
+ *
+ *  This macro contains an instantiation of the distributed CSR graph
+ *  type using the typical template parameters names (e.g., those
+ *  provided by the macro @c
+ *  BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS). It is used to reduce
+ *  the amount of typing required to declare free functions for this
+ *  graph type.
+ */
+#define BOOST_DISTRIB_CSR_GRAPH_TYPE                            \
+  compressed_sparse_row_graph<                                  \
+    directedS, VertexProperty, EdgeProperty, GraphProperty,      \
+    distributedS<ProcessGroup, InVertex, InDistribution>,       \
+    InEdgeIndex>
+
+// -----------------------------------------------------------------
+// Graph concept operations
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+BOOST_DISTRIB_CSR_GRAPH_TYPE::null_vertex()
+{
+  return graph_traits<base_type>::null_vertex();
+}
+
+// -----------------------------------------------------------------
+// Incidence Graph concept operations
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+source(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor e,
+       const BOOST_DISTRIB_CSR_GRAPH_TYPE&)
+{ return e.src; }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+target(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor e,
+       const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return target(e, g.base()); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator,
+                 typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator>
+out_edges(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor u,
+          const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type
+    edges_size_type;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor ed;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator it;
+  edges_size_type u_local = get(vertex_local, g, u);
+  edges_size_type u_row_start = g.base().m_forward.m_rowstart[u_local];
+  edges_size_type next_row_start = g.base().m_forward.m_rowstart[u_local + 1];
+  return std::make_pair(it(ed(u, u_row_start)),
+                        it(ed(u, (std::max)(u_row_start, next_row_start))));
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::degree_size_type
+out_degree(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor u,
+           const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return out_degree(get(vertex_local, g, u), g.base());
+}
+
+// -----------------------------------------------------------------
+// DistributedGraph concept requirements
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+void synchronize(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef BOOST_DISTRIB_CSR_GRAPH_TYPE graph_type;
+  synchronize(g.process_group());
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS> 
+ProcessGroup
+process_group(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.process_group(); }
+
+
+// -----------------------------------------------------------------
+// Adjacency Graph concept requirements
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::adjacency_iterator,
+                 typename BOOST_DISTRIB_CSR_GRAPH_TYPE::adjacency_iterator>
+adjacent_vertices(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor u,
+                  const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return adjacent_vertices(get(vertex_local, g, u), g.base());
+}
+
+// -----------------------------------------------------------------
+// Distributed Vertex List Graph concept operations
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_iterator
+  : public iterator_adaptor<vertex_iterator,
+                            counting_iterator<Vertex>,
+                            Vertex,
+                            random_access_traversal_tag,
+                            Vertex>
+{
+  typedef iterator_adaptor<vertex_iterator,
+                           counting_iterator<Vertex>,
+                           Vertex,
+                           random_access_traversal_tag,
+                           Vertex> inherited;
+ public:
+  vertex_iterator() {}
+
+  explicit vertex_iterator(Vertex v, const self_type* graph)
+    : inherited(counting_iterator<Vertex>(v)), graph(graph) { }
+
+  Vertex dereference() const
+  {
+    return graph->local_to_global_vertex(*(this->base_reference()));
+  }
+
+  friend class iterator_core_access;
+
+ private:
+  const self_type* graph;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::degree_size_type
+num_vertices(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return num_vertices(g.base());
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_iterator,
+                 typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_iterator>
+vertices(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_iterator
+    vertex_iterator;
+  return std::make_pair(vertex_iterator(0, &g),
+                        vertex_iterator(num_vertices(g), &g));
+}
+
+// -----------------------------------------------------------------
+// Distributed Edge List Graph concept operations
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_iterator
+{
+ public:
+  typedef std::forward_iterator_tag iterator_category;
+  typedef edge_descriptor value_type;
+
+  typedef const edge_descriptor* pointer;
+
+  typedef edge_descriptor reference;
+  typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
+
+  edge_iterator() : graph(0), current_edge(), end_of_this_vertex(0) {}
+
+  edge_iterator(const compressed_sparse_row_graph& graph,
+                edge_descriptor current_edge,
+                EdgeIndex end_of_this_vertex)
+    : graph(&graph), local_src(current_edge.src), current_edge(current_edge),
+      end_of_this_vertex(end_of_this_vertex)
+  {
+    // The edge that comes in has a local source vertex. Make it global.
+    current_edge.src = graph.local_to_global_vertex(current_edge.src);
+  }
+
+  // From InputIterator
+  reference operator*() const { return current_edge; }
+  pointer operator->() const { return &current_edge; }
+
+  bool operator==(const edge_iterator& o) const {
+    return current_edge == o.current_edge;
+  }
+  bool operator!=(const edge_iterator& o) const {
+    return current_edge != o.current_edge;
+  }
+
+  edge_iterator& operator++()
+  {
+    ++current_edge.idx;
+    while (current_edge.idx == end_of_this_vertex && local_src < num_vertices(*graph)-1) {
+      ++local_src;
+      current_edge.src = graph->local_to_global_vertex(local_src);
+      end_of_this_vertex = graph->base().m_forward.m_rowstart[local_src + 1];
+    }
+    return *this;
+  }
+
+  edge_iterator operator++(int) {
+    edge_iterator temp = *this;
+    ++*this;
+    return temp;
+  }
+
+ private:
+  const compressed_sparse_row_graph* graph;
+  EdgeIndex local_src;
+  edge_descriptor current_edge;
+  EdgeIndex end_of_this_vertex;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type
+num_edges(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return g.base().m_forward.m_column.size();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_iterator,
+          typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_iterator>
+edges(const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor Vertex;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_iterator ei;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor edgedesc;
+  if (g.base().m_forward.m_rowstart.size() == 1 ||
+      g.base().m_forward.m_column.empty()) {
+    return std::make_pair(ei(), ei());
+  } else {
+    // Find the first vertex that has outgoing edges
+    Vertex src = 0;
+    while (g.base().m_forward.m_rowstart[src + 1] == 0) ++src;
+    return std::make_pair(ei(g, edgedesc(src, 0), g.base().m_forward.m_rowstart[src + 1]),
+                          ei(g, edgedesc(num_vertices(g), g.base().m_forward.m_column.size()), 0));
+  }
+}
+
+// -----------------------------------------------------------------
+// Graph constructors
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+// Returns true if a vertex belongs to a process according to a distribution
+template <typename OwnerMap, typename ProcessId>
+struct local_vertex {
+
+  local_vertex(OwnerMap owner, ProcessId id) 
+    : owner(owner), id(id) {}
+
+  template <typename Vertex>
+  bool operator()(Vertex x) 
+  { return get(owner, x) == id; }
+
+  template <typename Vertex>
+  bool operator()(Vertex x) const
+  { return get(owner, x) == id; }
+
+private:
+  OwnerMap owner;
+  ProcessId id;
+};
+
+// Returns true if a vertex belongs to a process according to a distribution
+template <typename OwnerMap, typename ProcessId>
+struct local_edge {
+
+  local_edge(OwnerMap owner, ProcessId id) 
+    : owner(owner), id(id) {}
+
+  template <typename Vertex>
+  bool operator()(std::pair<Vertex, Vertex>& x) 
+  { return get(owner, x.first) == id; }
+
+  template <typename Vertex>
+  bool operator()(const std::pair<Vertex, Vertex>& x) const
+  { return get(owner, x.first) == id; }
+
+private:
+  OwnerMap owner;
+  ProcessId id;
+};
+
+// Turns an index iterator into a vertex iterator
+template<typename IndexIterator, typename Graph>
+class index_to_vertex_iterator {
+  
+public:
+  typedef std::input_iterator_tag iterator_category;
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef std::pair<Vertex, Vertex> value_type;
+  typedef const value_type& reference;
+  typedef const value_type* pointer;
+  typedef void difference_type;
+
+  index_to_vertex_iterator(IndexIterator index,
+                           const Graph& g) 
+    : index(index), g(g), current(to_edge(*index)) {}
+
+  reference operator*() { current = to_edge(*index); return current; }
+  pointer operator->() { current = to_edge(*index); return &current; }
+
+  index_to_vertex_iterator& operator++()
+  {
+    ++index;
+    return *this;
+  }
+
+  index_to_vertex_iterator operator++(int)
+  {
+    index_to_vertex_iterator temp(*this);
+    ++(*this);
+    return temp;
+  }
+
+  bool operator==(const index_to_vertex_iterator& other) const
+  { return index == other.index; }
+  
+  bool operator!=(const index_to_vertex_iterator& other) const
+  { return !(*this == other); }
+
+private:
+  value_type to_edge(const typename std::iterator_traits<IndexIterator>::value_type& x)
+  { return std::make_pair(vertex(x.first, g), vertex(x.second, g)); }
+
+  IndexIterator index;
+  const Graph& g;  
+  value_type current;
+};
+
+template <typename Distribution, typename Graph>
+struct index_to_vertex_func {
+
+  typedef typename boost::graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename boost::graph_traits<Graph>::vertices_size_type vertices_size_type;
+  typedef std::pair<vertex_descriptor, vertex_descriptor> result_type;
+  typedef std::pair<vertices_size_type, vertices_size_type> base_iterator_type;
+
+  index_to_vertex_func(const Distribution& dist, const Graph& g)
+    : dist(dist), g(g) {}
+
+
+  result_type operator()(const base_iterator_type& p) const 
+  {
+    return std::make_pair(vertex(p.first, g), vertex(p.second, g));
+  }
+
+private:
+  const Distribution& dist;
+  const Graph& g;
+};
+
+// NGE: This method only works with iterators that have a difference_type,
+// the index_to_vertex_iterator class above is retained for compatibility
+// with BGL generators which have no difference_type
+template <typename IndexIterator, typename Distribution, typename Graph>
+boost::transform_iterator<index_to_vertex_func<Distribution, Graph>, IndexIterator>
+make_index_to_vertex_iterator(IndexIterator it, const Distribution& dist, 
+                              const Graph& g) {
+  return boost::make_transform_iterator(
+    it, index_to_vertex_func<Distribution, Graph>(dist, g));
+}
+#endif
+
+// Forward declaration of csr_vertex_owner_map
+template<typename ProcessID, typename Key> class csr_vertex_owner_map;
+
+#ifdef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename InputIterator, typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename EdgePropertyIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           ep_iter,
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename InputIterator, typename EdgePropertyIterator,
+          typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           ep_iter,
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_sorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            edges_size_type numedges, // This is not used as there is no appropriate BGL ctor
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_sorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename InputIterator, typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_sorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_sorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename EdgePropertyIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_sorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            edges_size_type numedges, // This is not used as there is no appropriate BGL ctor
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_sorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           ep_iter,
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename EdgePropertyIterator,
+         typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_sorted_t,
+                            InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_sorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           ep_iter,
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename MultiPassInputIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                            MultiPassInputIterator edge_begin, 
+                            MultiPassInputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_unsorted_multi_pass_global,
+           make_index_to_vertex_iterator(edge_begin, parallel::block(m_process_group, numverts), *this),
+           make_index_to_vertex_iterator(edge_end, parallel::block(m_process_group, numverts), *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename MultiPassInputIterator, typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                            MultiPassInputIterator edge_begin, 
+                            MultiPassInputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_unsorted_multi_pass_global,
+           make_index_to_vertex_iterator(edge_begin, parallel::block(m_process_group, numverts), *this),
+           make_index_to_vertex_iterator(edge_end, parallel::block(m_process_group, numverts), *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename MultiPassInputIterator, typename EdgePropertyIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                            MultiPassInputIterator edge_begin, 
+                            MultiPassInputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(edges_are_unsorted_multi_pass_global,
+           make_index_to_vertex_iterator(edge_begin, parallel::block(m_process_group, numverts), *this),
+           make_index_to_vertex_iterator(edge_end, parallel::block(m_process_group, numverts), *this),
+           ep_iter,
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename MultiPassInputIterator, typename EdgePropertyIterator,
+          typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(edges_are_unsorted_multi_pass_t,
+                            MultiPassInputIterator edge_begin, 
+                            MultiPassInputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(edges_are_unsorted_multi_pass_global,
+           make_index_to_vertex_iterator(edge_begin, parallel::block(m_process_group, numverts), *this),
+           make_index_to_vertex_iterator(edge_end, parallel::block(m_process_group, numverts), *this),
+           ep_iter,
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+{ }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename Source>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                            std::vector<Source>& sources,
+                            std::vector<vertex_descriptor>& targets,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+{ 
+  // Convert linear indices to global indices
+  for (edges_size_type i = 0; i < sources.size(); ++i) {
+    sources[i] = m_distribution.local(sources[i]);
+    targets[i] = make_vertex_descriptor(m_distribution(targets[i]), 
+                                        m_distribution.local(targets[i]));
+  }
+
+  m_base.assign_sources_and_targets_global(
+    sources, targets, m_distribution.block_size(process_id(m_process_group), numverts),
+    identity_property_map());
+
+  // TODO: set property on m_base?
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename Distribution, typename Source> 
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                            std::vector<Source>& sources,
+                            std::vector<vertex_descriptor>& targets,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+{ 
+  // Convert linear indices to global indices
+  for (edges_size_type i = 0; i < sources.size(); ++i) {
+    sources[i] = m_distribution.local(sources[i]);
+    targets[i] = make_vertex_descriptor(m_distribution(targets[i]), 
+                                        m_distribution.local(targets[i]));
+  }
+
+  m_base.assign_sources_and_targets_global(
+    sources, targets, m_distribution.block_size(process_id(m_process_group), numverts),
+    identity_property_map());
+
+  // TODO: set property on m_base?
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename Source>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                            std::vector<Source>& sources,
+                            std::vector<vertex_descriptor>& targets,
+                            std::vector<edge_bundled>& edge_props,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+{ 
+  // Convert linear indices to global indices
+  for (edges_size_type i = 0; i < sources.size(); ++i) {
+    sources[i] = m_distribution.local(sources[i]);
+    targets[i] = make_vertex_descriptor(m_distribution(targets[i]), 
+                                        m_distribution.local(targets[i]));
+  }
+
+  m_base.assign_sources_and_targets_global(
+    sources, targets, edge_props, 
+    m_distribution.block_size(process_id(m_process_group), numverts),
+    identity_property_map());
+
+  // TODO: set property on m_base?
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template <typename Distribution, typename Source> 
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(distributed_construct_inplace_from_sources_and_targets_t,
+                            std::vector<Source>& sources,
+                            std::vector<vertex_descriptor>& targets,
+                            std::vector<edge_bundled>& edge_props,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+{ 
+  // Convert linear indices to global indices
+  for (edges_size_type i = 0; i < sources.size(); ++i) {
+    sources[i] = m_distribution.local(sources[i]);
+    targets[i] = make_vertex_descriptor(m_distribution(targets[i]), 
+                                        m_distribution.local(targets[i]));
+  }
+
+  m_base.assign_sources_and_targets_global(
+    sources, targets, edge_props, 
+    m_distribution.block_size(process_id(m_process_group), numverts),
+    identity_property_map());
+
+  // TODO: set property on m_base?
+}
+
+#endif
+
+//
+// Old (untagged) ctors, these default to the unsorted sequential ctors
+//
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(parallel::block(m_process_group, numverts)),
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+#else
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+#endif    
+           
+{
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  parallel::block dist(m_process_group, numverts);
+
+  // Allows us to add edges
+  m_base.m_last_source = 0;
+
+  typename ProcessGroup::process_id_type id = process_id(m_process_group);
+
+  while (edge_begin != edge_end) {
+    vertex_descriptor src = edge_begin->first;
+    if (static_cast<process_id_type>(dist(src)) == id) {
+      vertex_descriptor tgt = 
+        make_vertex_descriptor(dist(edge_begin->second), 
+                               dist.local(edge_begin->second));
+      add_edge(dist.local(src), tgt, m_base);
+    }
+    ++edge_begin;
+  }
+#endif
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename EdgePropertyIterator>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+
+    m_distribution(parallel::block(m_process_group, numverts)),
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+    m_base(m_distribution.block_size(process_id(m_process_group), numverts))
+#else
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           ep_iter,
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+#endif
+{
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  parallel::block dist(m_process_group, numverts);
+
+  // Allows us to add edges
+  m_base.m_last_source = 0;
+
+  typename ProcessGroup::process_id_type id = process_id(m_process_group);
+
+  while (edge_begin != edge_end) {
+    EdgeIndex src = edge_begin->first;
+    if (static_cast<process_id_type>(dist(src)) == id) {
+      EdgeIndex tgt = 
+        make_vertex_descriptor(dist(edge_begin->second), 
+                               dist.local(edge_begin->second));
+      add_edge(dist.local(src), tgt, *ep_iter, m_base);
+    }
+    ++edge_begin;
+    ++ep_iter;
+  }
+#endif
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+    m_base(dist.block_size(process_id(m_process_group), numverts))
+#else
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+#endif
+{
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  // Allows us to add edges
+  m_base.m_last_source = 0;
+
+  typename ProcessGroup::process_id_type id = process_id(m_process_group);
+
+  while (edge_begin != edge_end) {
+    vertex_descriptor src = edge_begin->first;
+    if (static_cast<process_id_type>(dist(src)) == id) {
+      vertex_descriptor tgt = 
+        make_vertex_descriptor(dist(edge_begin->second), 
+                               dist.local(edge_begin->second));
+      assert(get(vertex_owner, *this, tgt) == dist(edge_begin->second));
+      assert(get(vertex_local, *this, tgt) == dist.local(edge_begin->second));
+      add_edge(dist.local(src), tgt, m_base);
+    }
+    ++edge_begin;
+  }
+#endif
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+template<typename InputIterator, typename EdgePropertyIterator, 
+         typename Distribution>
+BOOST_DISTRIB_CSR_GRAPH_TYPE::
+compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
+                            EdgePropertyIterator ep_iter,
+                            vertices_size_type numverts,
+                            const ProcessGroup& pg,
+                            const Distribution& dist,
+                            const GraphProperty& prop)
+  : m_process_group(pg),
+    m_distribution(dist),
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+    m_base(dist.block_size(process_id(m_process_group), numverts))
+#else
+    m_base(edges_are_unsorted_global,
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_begin, *this),
+           index_to_vertex_iterator<InputIterator, BOOST_DISTRIB_CSR_GRAPH_TYPE>(edge_end, *this),
+           m_distribution.block_size(process_id(m_process_group), numverts),
+           get(vertex_local, *this),
+           local_vertex<csr_vertex_owner_map<process_id_type, vertex_descriptor>, 
+                        process_id_type> (get(vertex_owner, *this), process_id(pg)),
+           prop)
+#endif
+{
+#ifndef BOOST_GRAPH_USE_NEW_CSR_INTERFACE
+  // Allows us to add edges
+  m_base.m_last_source = 0;
+
+  typename ProcessGroup::process_id_type id = process_id(m_process_group);
+
+  while (edge_begin != edge_end) {
+    EdgeIndex src = edge_begin->first;
+    if (static_cast<process_id_type>(dist(src)) == id) {
+      EdgeIndex tgt = 
+        make_vertex_descriptor(dist(edge_begin->second), 
+                               dist.local(edge_begin->second));
+      add_edge(dist.local(src), tgt, *ep_iter, m_base);
+    }
+    ++edge_begin;
+    ++ep_iter;
+  }
+#endif
+}
+
+// -----------------------------------------------------------------
+// Vertex Global Property Map
+template<typename ProcessID, typename Key>
+class csr_vertex_global_map
+{
+ public:
+  // -----------------------------------------------------------------
+  // Readable Property Map concept requirements
+  typedef std::pair<ProcessID, Key> value_type;
+  typedef value_type reference;
+  typedef Key key_type;
+  typedef readable_property_map_tag category;
+};
+
+template<typename ProcessID, typename Key>
+inline std::pair<ProcessID, Key>
+get(csr_vertex_global_map<ProcessID, Key>,
+    typename csr_vertex_global_map<ProcessID, Key>::key_type k)
+{
+  const int local_index_bits = sizeof(Key) * CHAR_BIT - processor_bits;
+  const Key local_index_mask = Key(-1) >> processor_bits;
+
+  return std::pair<ProcessID, Key>(k >> local_index_bits,
+                                   k & local_index_mask);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_global_t>
+{
+ public:
+  typedef csr_vertex_global_map<
+            typename ProcessGroup::process_id_type,
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor> type;
+  typedef type const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_global_t>::type
+get(vertex_global_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_global_t>
+    ::type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+std::pair<typename ProcessGroup::process_id_type,
+          typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor>
+get(vertex_global_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_global, 
+             const_cast<const BOOST_DISTRIB_CSR_GRAPH_TYPE&>(g), 
+             k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_global_t>::const_type
+get(vertex_global_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_global_t>
+    ::const_type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+std::pair<typename ProcessGroup::process_id_type,
+          typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor>
+get(vertex_global_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+    vertex_descriptor;
+  typedef std::pair<typename ProcessGroup::process_id_type, vertex_descriptor>
+    result_type;
+  const int local_index_bits = 
+    sizeof(vertex_descriptor) * CHAR_BIT - processor_bits;
+  const vertex_descriptor local_index_mask = 
+    vertex_descriptor(-1) >> processor_bits;
+
+  return result_type(k >> local_index_bits, k & local_index_mask);
+}
+
+// -----------------------------------------------------------------
+// Extra, common functions
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+vertex(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type i,
+       const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return g.make_vertex_descriptor(g.distribution()(i), 
+                                  g.distribution().local(i));
+}
+
+// Unlike for an adjacency_matrix, edge_range and edge take lg(out_degree(i))
+// time
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator,
+                 typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator>
+edge_range(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor i,
+           typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor j,
+           const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor Vertex;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type EdgeIndex;
+  typedef typename std::vector<Vertex>::const_iterator adj_iter;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor edge_desc;
+  std::pair<adj_iter, adj_iter> raw_adjacencies = adjacent_vertices(i, g);
+  std::pair<adj_iter, adj_iter> adjacencies =
+    std::equal_range(raw_adjacencies.first, raw_adjacencies.second, j);
+  EdgeIndex idx_begin = adjacencies.first - g.base().m_forward.m_column.begin();
+  EdgeIndex idx_end = adjacencies.second - g.base().m_forward.m_column.begin();
+  return std::make_pair(out_edge_iter(edge_desc(i, idx_begin)),
+                        out_edge_iter(edge_desc(i, idx_end)));
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline std::pair<typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor, bool>
+edge(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor i,
+     typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor j,
+     const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
+  std::pair<out_edge_iter, out_edge_iter> range = edge_range(i, j, g);
+  if (range.first == range.second)
+    return std::make_pair(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor(),
+                          false);
+  else
+    return std::make_pair(*range.first, true);
+}
+
+// A helper that turns requests for property maps for const graphs
+// into property maps for non-const graphs.
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename Property>
+class property_map<const BOOST_DISTRIB_CSR_GRAPH_TYPE, Property>
+{
+ public:
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, Property>
+    ::const_type type;
+  typedef type const_type;
+};
+
+// -----------------------------------------------------------------
+// Structural modifiers
+
+#if 0
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+add_vertex(BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.add_vertex(); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+add_vertex(const typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_bundled& p, 
+           BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.add_vertex(p); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+add_vertices(typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type count, 
+             BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.add_vertices(count); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator>
+void 
+add_edges(InputIterator first, InputIterator last,
+          BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ g.add_edges(first, last); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator, 
+         typename EdgePropertyIterator>
+void 
+add_edges(InputIterator first, InputIterator last,
+          EdgePropertyIterator ep_iter,
+          EdgePropertyIterator ep_iter_end,
+          BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.add_edges(first, last, ep_iter, ep_iter_end); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator>
+void 
+add_edges_sorted(InputIterator first, InputIterator last,
+                 BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ return g.add_edges_sorted(first, last); }
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename InputIterator, 
+         typename EdgePropertyIterator>
+void 
+add_edges_sorted(InputIterator first_sorted, InputIterator last_sorted,
+                 EdgePropertyIterator ep_iter_sorted,
+                 BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{ g.add_edges_sorted(first_sorted, last_sorted, ep_iter_sorted); }
+#endif
+
+// -----------------------------------------------------------------
+// Vertex Owner Property Map
+template<typename ProcessID, typename Key>
+class csr_vertex_owner_map
+{
+ public:
+  // -----------------------------------------------------------------
+  // Readable Property Map concept requirements
+  typedef ProcessID value_type;
+  typedef value_type reference;
+  typedef Key key_type;
+  typedef readable_property_map_tag category;
+};
+
+template<typename ProcessID, typename Key>
+inline ProcessID
+get(csr_vertex_owner_map<ProcessID, Key> pm,
+    typename csr_vertex_owner_map<ProcessID, Key>::key_type k)
+{
+  const int local_index_bits = sizeof(Key) * CHAR_BIT - processor_bits;
+  return k >> local_index_bits;
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_owner_t>
+{
+ public:
+  typedef csr_vertex_owner_map<
+            typename ProcessGroup::process_id_type,
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor> type;
+  typedef type const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_owner_t>::type
+get(vertex_owner_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_owner_t>
+    ::type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename ProcessGroup::process_id_type
+get(vertex_owner_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_owner, 
+             const_cast<const BOOST_DISTRIB_CSR_GRAPH_TYPE&>(g),
+             k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_owner_t>::const_type
+get(vertex_owner_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_owner_t>
+    ::const_type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename ProcessGroup::process_id_type
+get(vertex_owner_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+    vertex_descriptor;
+  const int local_index_bits = 
+    sizeof(vertex_descriptor) * CHAR_BIT - processor_bits;
+  return k >> local_index_bits;
+}
+
+// -----------------------------------------------------------------
+// Vertex Local Property Map
+template<typename Key>
+class csr_vertex_local_map
+{
+ public:
+  // -----------------------------------------------------------------
+  // Readable Property Map concept requirements
+  typedef Key value_type;
+  typedef value_type reference;
+  typedef Key key_type;
+  typedef readable_property_map_tag category;
+};
+
+template<typename Key>
+inline Key
+get(csr_vertex_local_map<Key> pm,
+    typename csr_vertex_local_map<Key>::key_type k)
+{
+  const Key local_index_mask = Key(-1) >> processor_bits;
+  return k & local_index_mask;
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t>
+{
+ public:
+  typedef csr_vertex_local_map<
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor> type;
+  typedef type const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t>::type
+get(vertex_local_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t>
+    ::type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+get(vertex_local_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_local, 
+             const_cast<const BOOST_DISTRIB_CSR_GRAPH_TYPE&>(g),
+             k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t>::const_type
+get(vertex_local_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t>
+    ::const_type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+get(vertex_local_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor 
+    vertex_descriptor;
+  const vertex_descriptor local_index_mask = 
+    vertex_descriptor(-1) >> processor_bits;
+  return k & local_index_mask;
+}
+
+// -----------------------------------------------------------------
+// Vertex Index Property Map
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_index_t>
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, 
+                                vertex_global_t>::const_type
+    global_map;
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::process_group_type
+    process_group_type;
+
+  typedef property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t> local;
+
+public:
+  typedef local_property_map<process_group_type, 
+                             global_map, 
+                             typename local::type> type;
+  typedef local_property_map<process_group_type, 
+                             global_map, 
+                             typename local::const_type> const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_index_t>::type
+get(vertex_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_index_t>
+    ::type result_type;
+
+  return result_type(g.process_group(), get(vertex_global, g),
+                     get(vertex_local, g));
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type
+get(vertex_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_local, g, k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_index_t>::const_type
+get(vertex_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_index_t>
+    ::const_type result_type;
+  return result_type(g.process_group(), get(vertex_global, g),
+                     get(vertex_local, g));
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type
+get(vertex_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_local, g, k);
+}
+
+// -----------------------------------------------------------------
+// Vertex Local Index Property Map
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_index_t>
+  : public property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_t> { };
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_index_t>::type
+get(vertex_local_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return get(vertex_local, g);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type
+get(vertex_local_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_local, g, k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, vertex_local_index_t>::const_type
+get(vertex_local_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  return get(vertex_local, g);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertices_size_type
+get(vertex_local_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor k)
+{
+  return get(vertex_local, g, k);
+}
+
+// -----------------------------------------------------------------
+// Edge Global Property Map
+template<typename ProcessID, typename Vertex, typename EdgeIndex>
+class csr_edge_global_map
+{
+ public:
+  // -----------------------------------------------------------------
+  // Readable Property Map concept requirements
+  typedef std::pair<ProcessID, EdgeIndex> value_type;
+  typedef value_type reference;
+  typedef detail::csr_edge_descriptor<Vertex, EdgeIndex> key_type;
+  typedef readable_property_map_tag category;
+};
+
+template<typename ProcessID, typename Vertex, typename EdgeIndex>
+inline std::pair<ProcessID, EdgeIndex>
+get(csr_edge_global_map<ProcessID, Vertex, EdgeIndex> pm,
+    typename csr_edge_global_map<ProcessID, Vertex, EdgeIndex>::key_type k)
+{
+  const int local_index_bits = sizeof(Vertex) * CHAR_BIT - processor_bits;
+  return std::pair<ProcessID, EdgeIndex>(k.src >> local_index_bits, k.idx);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>
+{
+ public:
+  typedef csr_edge_global_map<
+            typename ProcessGroup::process_id_type,
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor,
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type> type;
+  typedef type const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>::type
+get(edge_global_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>
+    ::type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+std::pair<typename ProcessGroup::process_id_type,
+          typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+get(edge_global_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
+{
+  return get(edge_global, 
+             const_cast<const BOOST_DISTRIB_CSR_GRAPH_TYPE&>(g),
+             k);
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>::const_type
+get(edge_global_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>
+    ::const_type result_type;
+  return result_type();
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+std::pair<typename ProcessGroup::process_id_type,
+          typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+get(edge_global_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
+{
+  typedef typename BOOST_DISTRIB_CSR_GRAPH_TYPE::vertex_descriptor
+    vertex_descriptor;
+
+  const int local_index_bits = 
+    sizeof(vertex_descriptor) * CHAR_BIT - processor_bits;
+  
+  typedef std::pair<typename ProcessGroup::process_id_type,
+                    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type>
+    result_type;
+
+  return result_type(k.src >> local_index_bits, k.idx);
+}
+
+// -----------------------------------------------------------------
+// Edge Index Property Map
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>
+{
+   typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_global_t>
+    ::type global_map;
+
+ public:
+  typedef local_property_map<
+            typename BOOST_DISTRIB_CSR_GRAPH_TYPE::process_group_type,
+            global_map,
+            identity_property_map> type;
+  typedef type const_type;
+};
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>::type
+get(edge_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>
+    ::type result_type;
+  return result_type(g.process_group(), get(edge_global, g),
+                     identity_property_map());
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type
+get(edge_index_t, BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
+{
+  return k.idx;
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>::const_type
+get(edge_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, edge_index_t>
+    ::const_type result_type;
+  return result_type(g.process_group(), get(edge_global, g),
+                     identity_property_map());
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS>
+inline typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edges_size_type
+get(edge_index_t, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g,
+    typename BOOST_DISTRIB_CSR_GRAPH_TYPE::edge_descriptor k)
+{
+  return k.idx;
+}
+
+// -----------------------------------------------------------------
+// Bundled Properties
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
+class property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>
+{
+  typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
+  typedef typename Graph::process_group_type process_group_type;
+
+  // Determine which locator map to use (vertex or edge)
+  typedef typename mpl::if_<detail::is_vertex_bundle<VertexProperty,
+                                                     EdgeProperty,
+                                                     Bundle>,
+                            vertex_global_t, edge_global_t>::type global_t;
+
+  // Extract the global property map for our key type.
+  typedef typename property_map<Graph, global_t>::const_type global_map;
+  typedef typename property_traits<global_map>::value_type locator;
+
+  // Determine which bundle type we are using
+  typedef typename mpl::if_<detail::is_vertex_bundle<VertexProperty,
+                                                     EdgeProperty,
+                                                     Bundle>,
+                            VertexProperty, EdgeProperty>::type bundle_t;
+
+public:
+  // Build the local property map
+  typedef bundle_property_map<std::vector<bundle_t>,
+                              typename locator::second_type,
+                              bundle_t,
+                              T> local_pmap;
+
+  // Build the local const property map
+  typedef bundle_property_map<const std::vector<bundle_t>,
+                              typename locator::second_type,
+                              bundle_t,
+                              const T> local_const_pmap;
+  typedef ::boost::parallel::distributed_property_map<
+            process_group_type, global_map, local_pmap> type;
+
+  typedef ::boost::parallel::distributed_property_map<
+            process_group_type, global_map, local_const_pmap> const_type;
+};
+
+namespace detail {
+  // Retrieve the local bundle_property_map corresponding to a
+  // non-const vertex property.
+  template<typename Graph, typename T, typename Bundle>
+  inline bundle_property_map<std::vector<typename Graph::vertex_bundled>,
+                             typename Graph::vertex_descriptor,
+                             typename Graph::vertex_bundled, T>
+  get_distrib_csr_bundle(T Bundle::* p, Graph& g, mpl::true_)
+  {
+    typedef bundle_property_map<std::vector<typename Graph::vertex_bundled>,
+                                typename Graph::vertex_descriptor,
+                                typename Graph::vertex_bundled, T> result_type;
+    return result_type(&g.base().vertex_properties().m_vertex_properties, p);
+  }
+
+  // Retrieve the local bundle_property_map corresponding to a
+  // const vertex property.
+  template<typename Graph, typename T, typename Bundle>
+  inline bundle_property_map<const std::vector<typename Graph::vertex_bundled>,
+                             typename Graph::vertex_descriptor,
+                             typename Graph::vertex_bundled, const T>
+  get_distrib_csr_bundle(T Bundle::* p, const Graph& g, mpl::true_)
+  {
+    typedef bundle_property_map<
+              const std::vector<typename Graph::vertex_bundled>,
+              typename Graph::vertex_descriptor,
+              typename Graph::vertex_bundled, const T> result_type;
+    return result_type(&g.base().vertex_properties().m_vertex_properties, p);
+  }
+
+  // Retrieve the local bundle_property_map corresponding to a
+  // non-const edge property.
+  template<typename Graph, typename T, typename Bundle>
+  inline bundle_property_map<std::vector<typename Graph::edge_bundled>,
+                             typename Graph::edges_size_type,
+                             typename Graph::edge_bundled, T>
+  get_distrib_csr_bundle(T Bundle::* p, Graph& g, mpl::false_)
+  {
+    typedef bundle_property_map<std::vector<typename Graph::edge_bundled>,
+                                typename Graph::edges_size_type,
+                                typename Graph::edge_bundled, T> result_type;
+    return result_type(&g.base().edge_properties().m_edge_properties, p);
+  }
+
+  // Retrieve the local bundle_property_map corresponding to a
+  // const edge property.
+  template<typename Graph, typename T, typename Bundle>
+  inline bundle_property_map<const std::vector<typename Graph::edge_bundled>,
+                             typename Graph::edges_size_type,
+                             typename Graph::edge_bundled, const T>
+  get_distrib_csr_bundle(T Bundle::* p, const Graph& g, mpl::false_)
+  {
+    typedef bundle_property_map<
+              const std::vector<typename Graph::edge_bundled>,
+              typename Graph::edges_size_type,
+              typename Graph::edge_bundled, const T> result_type;
+    return result_type(&g.base().edge_properties().m_edge_properties, p);
+  }
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>::type
+get(T Bundle::* p, BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
+  typedef typename property_map<Graph, T Bundle::*>::type result_type;
+  typedef typename property_map<Graph, T Bundle::*>::local_pmap local_pmap;
+
+  // Resolver
+  typedef typename property_traits<result_type>::value_type value_type;
+  typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+    reduce;
+
+  typedef typename property_traits<result_type>::key_type descriptor;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                            vertex_global_t, edge_global_t>::type
+    global_map_t;
+
+  return result_type(g.process_group(), get(global_map_t(), g),
+                     detail::get_distrib_csr_bundle
+                       (p, g, mpl::bool_<is_same<descriptor,
+                                         vertex_descriptor>::value>()),
+                     reduce());
+}
+
+template<BOOST_DISTRIB_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
+typename property_map<BOOST_DISTRIB_CSR_GRAPH_TYPE, T Bundle::*>::const_type
+get(T Bundle::* p, const BOOST_DISTRIB_CSR_GRAPH_TYPE& g)
+{
+  typedef BOOST_DISTRIB_CSR_GRAPH_TYPE Graph;
+  typedef typename property_map<Graph, T Bundle::*>::const_type result_type;
+  typedef typename property_map<Graph, T Bundle::*>::local_const_pmap
+    local_pmap;
+
+  // Resolver
+  typedef typename property_traits<result_type>::value_type value_type;
+  typedef typename property_reduce<T Bundle::*>::template apply<value_type>
+    reduce;
+
+  typedef typename property_traits<result_type>::key_type descriptor;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename mpl::if_<is_same<descriptor, vertex_descriptor>,
+                            vertex_global_t, edge_global_t>::type
+    global_map_t;
+
+  return result_type(g.process_group(), get(global_map_t(), g),
+                     detail::get_distrib_csr_bundle
+                       (p, g, mpl::bool_<is_same<descriptor,
+                                                 vertex_descriptor>::value>()),
+                     reduce());
+}
+
+namespace mpi {
+  template<typename Vertex, typename EdgeIndex>
+  struct is_mpi_datatype<boost::detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+    : mpl::true_ { };
+}
+
+namespace serialization {
+  template<typename Vertex, typename EdgeIndex>
+  struct is_bitwise_serializable<boost::detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+    : mpl::true_ { };
+
+  template<typename Vertex, typename EdgeIndex>
+  struct implementation_level<boost::detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+   : mpl::int_<object_serializable> {} ;
+
+  template<typename Vertex, typename EdgeIndex>
+  struct tracking_level<boost::detail::csr_edge_descriptor<Vertex, EdgeIndex> >
+   : mpl::int_<track_never> {} ;
+
+}
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_DISTRIBUTED_CSR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/concepts.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/concepts.hpp
new file mode 100644 (file)
index 0000000..ae1a695
--- /dev/null
@@ -0,0 +1,216 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+//
+// Distributed graph concepts and helpers
+//
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP
+#define BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/version.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_concepts.hpp>
+
+#if BOOST_VERSION >= 103500
+#  include <boost/concept/detail/concept_def.hpp>
+#endif
+
+namespace boost { 
+
+class distributed_graph_tag { };
+class distributed_vertex_list_graph_tag { };
+class distributed_edge_list_graph_tag { };
+
+#if BOOST_VERSION >= 103500
+  namespace concepts {
+#endif
+
+#if BOOST_VERSION < 103500
+
+template <class G>
+struct DistributedVertexListGraphConcept
+{
+  typedef typename graph_traits<G>::vertex_iterator vertex_iterator;
+  typedef typename graph_traits<G>::vertices_size_type vertices_size_type;
+  typedef typename graph_traits<G>::traversal_category
+    traversal_category;
+  void constraints() {
+    function_requires< GraphConcept<G> >();
+    function_requires< MultiPassInputIteratorConcept<vertex_iterator> >();
+    function_requires< ConvertibleConcept<traversal_category,
+      distributed_vertex_list_graph_tag> >();
+
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+    // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+    // you want to use vector_as_graph, it is!  I'm sure the graph
+    // library leaves these out all over the place.  Probably a
+    // redesign involving specializing a template with a static
+    // member function is in order :(
+    using boost::vertices;
+#endif      
+    p = vertices(g);
+    v = *p.first;
+    const_constraints(g);
+  }
+  void const_constraints(const G& cg) {
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+    // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+    // you want to use vector_as_graph, it is!  I'm sure the graph
+    // library leaves these out all over the place.  Probably a
+    // redesign involving specializing a template with a static
+    // member function is in order :(
+    using boost::vertices;
+#endif 
+    
+    p = vertices(cg);
+    v = *p.first;
+    V = num_vertices(cg);
+  }
+  std::pair<vertex_iterator,vertex_iterator> p;
+  typename graph_traits<G>::vertex_descriptor v;
+  G g;
+  vertices_size_type V;
+};
+
+template <class G>
+struct DistributedEdgeListGraphConcept
+{
+  typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+  typedef typename graph_traits<G>::edge_iterator edge_iterator;
+  typedef typename graph_traits<G>::edges_size_type edges_size_type;
+  typedef typename graph_traits<G>::traversal_category
+    traversal_category;
+  void constraints() {
+    function_requires< GraphConcept<G> >();
+    function_requires< MultiPassInputIteratorConcept<edge_iterator> >();
+    function_requires< DefaultConstructibleConcept<edge_descriptor> >();
+    function_requires< EqualityComparableConcept<edge_descriptor> >();
+    function_requires< AssignableConcept<edge_descriptor> >();
+    function_requires< ConvertibleConcept<traversal_category,
+      distributed_edge_list_graph_tag> >();
+
+    p = edges(g);
+    e = *p.first;
+    u = source(e, g);
+    v = target(e, g);
+    const_constraints(g);
+  }
+  void const_constraints(const G& cg) {
+    p = edges(cg);
+    E = num_edges(cg);
+    e = *p.first;
+    u = source(e, cg);
+    v = target(e, cg);
+  }
+  std::pair<edge_iterator,edge_iterator> p;
+  typename graph_traits<G>::vertex_descriptor u, v;
+  typename graph_traits<G>::edge_descriptor e;
+  edges_size_type E;
+  G g;
+};
+#else
+  BOOST_concept(DistributedVertexListGraph,(G))
+    : Graph<G>
+  {
+    typedef typename graph_traits<G>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<G>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<G>::traversal_category
+      traversal_category;
+    ~DistributedVertexListGraph() {
+      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<vertex_iterator>));
+      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+        distributed_vertex_list_graph_tag>));
+
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+      // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+      // you want to use vector_as_graph, it is!  I'm sure the graph
+      // library leaves these out all over the place.  Probably a
+      // redesign involving specializing a template with a static
+      // member function is in order :(
+      using boost::vertices;
+#endif      
+      p = vertices(g);
+      v = *p.first;
+      const_constraints(g);
+    }
+    void const_constraints(const G& cg) {
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+      // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+      // you want to use vector_as_graph, it is!  I'm sure the graph
+      // library leaves these out all over the place.  Probably a
+      // redesign involving specializing a template with a static
+      // member function is in order :(
+      using boost::vertices;
+#endif 
+      
+      p = vertices(cg);
+      v = *p.first;
+      V = num_vertices(cg);
+    }
+    std::pair<vertex_iterator,vertex_iterator> p;
+    typename graph_traits<G>::vertex_descriptor v;
+    G g;
+    vertices_size_type V;
+  };
+
+  BOOST_concept(DistributedEdgeListGraph,(G))
+    : Graph<G>
+  {
+    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+    typedef typename graph_traits<G>::edge_iterator edge_iterator;
+    typedef typename graph_traits<G>::edges_size_type edges_size_type;
+    typedef typename graph_traits<G>::traversal_category
+      traversal_category;
+    ~DistributedEdgeListGraph() {
+      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<edge_iterator>));
+      BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
+      BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
+      BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
+      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+        distributed_edge_list_graph_tag>));
+
+      p = edges(g);
+      e = *p.first;
+      u = source(e, g);
+      v = target(e, g);
+      const_constraints(g);
+    }
+    void const_constraints(const G& cg) {
+      p = edges(cg);
+      E = num_edges(cg);
+      e = *p.first;
+      u = source(e, cg);
+      v = target(e, cg);
+    }
+    std::pair<edge_iterator,edge_iterator> p;
+    typename graph_traits<G>::vertex_descriptor u, v;
+    typename graph_traits<G>::edge_descriptor e;
+    edges_size_type E;
+    G g;
+  };
+#endif
+
+#if BOOST_VERSION >= 103500
+  } // end namespace concepts
+
+  using concepts::DistributedVertexListGraphConcept;
+  using concepts::DistributedEdgeListGraphConcept;
+#endif
+} // end namespace boost
+
+#if BOOST_VERSION >= 103500
+#  include <boost/concept/detail/concept_undef.hpp>
+#endif
+
+#endif // BOOST_GRAPH_DISTRIBUTED_CONCEPTS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components.hpp
new file mode 100644 (file)
index 0000000..f62e29a
--- /dev/null
@@ -0,0 +1,766 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_CC_HPP
+#define BOOST_GRAPH_PARALLEL_CC_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/distributed/local_subgraph.hpp>
+#include <boost/graph/connected_components.hpp>
+#include <boost/graph/named_function_params.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/optional.hpp>
+#include <algorithm>
+#include <vector>
+#include <list>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/iteration_macros.hpp>
+
+#define PBGL_IN_PLACE_MERGE /* In place merge instead of sorting */
+//#define PBGL_SORT_ASSERT    /* Assert sorted for in place merge */
+
+/* Explicit sychronization in pointer doubling step? */
+#define PBGL_EXPLICIT_SYNCH
+//#define PBGL_CONSTRUCT_METAGRAPH
+#ifdef PBGL_CONSTRUCT_METAGRAPH
+#  define MAX_VERTICES_IN_METAGRAPH 10000
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+  namespace cc_detail {
+    enum connected_components_message { 
+      edges_msg, req_parents_msg, parents_msg, root_adj_msg
+    };
+
+    template <typename Vertex>
+    struct metaVertex {
+      metaVertex() {}
+      metaVertex(const Vertex& v) : name(v) {}
+
+      template<typename Archiver>
+      void serialize(Archiver& ar, const unsigned int /*version*/)
+      {
+        ar & name;
+      }
+
+      Vertex name;
+    };
+
+#ifdef PBGL_CONSTRUCT_METAGRAPH
+    // Build meta-graph on result of local connected components
+    template <typename Graph, typename ParentMap, typename RootIterator,
+              typename AdjacencyMap>
+    void
+    build_local_metagraph(const Graph& g, ParentMap p, RootIterator r,
+                          RootIterator r_end, AdjacencyMap& adj)
+    {
+      // TODO: Static assert that AdjacencyMap::value_type is std::vector<vertex_descriptor>
+
+      typedef typename boost::graph::parallel::process_group_type<Graph>::type
+        process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+      BOOST_STATIC_ASSERT((is_same<typename AdjacencyMap::mapped_type,
+                                     std::vector<vertex_descriptor> >::value));
+
+      using boost::graph::parallel::process_group;
+
+      process_group_type pg = process_group(g);
+      process_id_type id = process_id(pg);
+      
+      if (id != 0) {
+
+        // Send component roots and their associated edges to P0
+        for ( ; r != r_end; ++r ) {
+          std::vector<vertex_descriptor> adjs(1, *r); // Root
+          adjs.reserve(adjs.size() + adj[*r].size());
+          for (typename std::vector<vertex_descriptor>::iterator iter = adj[*r].begin();
+               iter != adj[*r].end(); ++iter)
+            adjs.push_back(get(p, *iter)); // Adjacencies
+
+          send(pg, 0, root_adj_msg, adjs); 
+        }
+      }
+      
+      synchronize(pg);
+
+      if (id == 0) {
+        typedef metaVertex<vertex_descriptor> VertexProperties;
+
+        typedef boost::adjacency_list<vecS, vecS, undirectedS, 
+          VertexProperties> metaGraph;
+        typedef typename graph_traits<metaGraph>::vertex_descriptor 
+          meta_vertex_descriptor;
+
+        std::map<vertex_descriptor, meta_vertex_descriptor> vertex_map;
+        std::vector<std::pair<vertex_descriptor, vertex_descriptor> > edges;
+
+        // Receive remote roots and edges
+        while (optional<std::pair<process_id_type, int> > m = probe(pg)) {
+          assert(m->second == root_adj_msg);
+
+          std::vector<vertex_descriptor> adjs;
+          receive(pg, m->first, m->second, adjs);
+
+          vertex_map[adjs[0]] = graph_traits<metaGraph>::null_vertex();
+          for (typename std::vector<vertex_descriptor>::iterator iter 
+                 = ++adjs.begin(); iter != adjs.end(); ++iter)
+            edges.push_back(std::make_pair(adjs[0], *iter));
+        }
+
+        // Add local roots and edges
+        for ( ; r != r_end; ++r ) {
+          vertex_map[*r] = graph_traits<metaGraph>::null_vertex();
+          edges.reserve(edges.size() + adj[*r].size());
+          for (typename std::vector<vertex_descriptor>::iterator iter = adj[*r].begin();
+               iter != adj[*r].end(); ++iter)
+            edges.push_back(std::make_pair(*r, get(p, *iter)));
+        } 
+
+        // Build local meta-graph
+        metaGraph mg;
+
+        // Add vertices with property to map back to distributed graph vertex
+        for (typename std::map<vertex_descriptor, meta_vertex_descriptor>::iterator
+               iter = vertex_map.begin(); iter != vertex_map.end(); ++iter)
+          vertex_map[iter->first] 
+            = add_vertex(metaVertex<vertex_descriptor>(iter->first), mg);
+
+        // Build meta-vertex map
+        typename property_map<metaGraph, vertex_descriptor VertexProperties::*>::type 
+          metaVertexMap = get(&VertexProperties::name, mg);
+
+        typename std::vector<std::pair<vertex_descriptor, vertex_descriptor> >
+          ::iterator edge_iter = edges.begin();
+        for ( ; edge_iter != edges.end(); ++edge_iter)
+          add_edge(vertex_map[edge_iter->first], vertex_map[edge_iter->second], mg);
+        
+        edges.clear();
+  
+        // Call connected_components on it
+        typedef typename property_map<metaGraph, vertex_index_t>::type 
+          meta_index_map_type;
+        meta_index_map_type meta_index = get(vertex_index, mg);
+
+        std::vector<std::size_t> mg_component_vec(num_vertices(mg));
+        typedef iterator_property_map<std::vector<std::size_t>::iterator,
+                                      meta_index_map_type>
+        meta_components_map_type;
+        meta_components_map_type mg_component(mg_component_vec.begin(),
+                                              meta_index);
+        std::size_t num_comp = connected_components(mg, mg_component);
+
+        // Update Parent pointers
+        std::vector<meta_vertex_descriptor> roots(num_comp, graph_traits<metaGraph>::null_vertex());
+
+        BGL_FORALL_VERTICES_T(v, mg, metaGraph) {
+          size_t component = get(mg_component, v);
+          if (roots[component] == graph_traits<metaGraph>::null_vertex() ||
+              get(meta_index, v) < get(meta_index, roots[component])) 
+            roots[component] = v;
+        }
+
+        // Set all the local parent pointers
+        BGL_FORALL_VERTICES_T(v, mg, metaGraph) {
+          // Problem in value being put (3rd parameter)
+          put(p, get(metaVertexMap, v), get(metaVertexMap, roots[get(mg_component, v)]));
+        }
+      }
+
+      synchronize(p);
+    }
+#endif
+
+    /* Function object used to remove internal vertices and vertices >
+       the current vertex from the adjacent vertex lists at each
+       root */
+    template <typename Vertex, typename ParentMap>
+    class cull_adjacency_list
+    {
+    public:
+      cull_adjacency_list(const Vertex v, const ParentMap p) : v(v), p(p) {}
+      bool operator() (const Vertex x) { return (get(p, x) == v || x == v); }
+
+    private:
+      const Vertex    v;
+      const ParentMap p;
+    };
+
+    /* Comparison operator used to choose targets for hooking s.t. vertices 
+       that are hooked to are evenly distributed across processors */
+    template <typename OwnerMap, typename LocalMap>
+    class hashed_vertex_compare
+    {
+    public:
+      hashed_vertex_compare (const OwnerMap& o, const LocalMap& l)
+        : owner(o), local(l) { }
+
+      template <typename Vertex>
+      bool operator() (const Vertex x, const Vertex y) 
+      { 
+        if (get(local, x) < get(local, y))
+          return true;
+        else if (get(local, x) == get(local, y))
+          return (get(owner, x) < get(owner, y));
+        return false;
+      }
+
+    private:
+      OwnerMap   owner;
+      LocalMap   local;
+    };
+
+#ifdef PBGL_EXPLICIT_SYNCH
+    template <typename Graph, typename ParentMap, typename VertexList>
+    void
+    request_parent_map_entries(const Graph& g, ParentMap p,
+                               std::vector<VertexList>& parent_requests)
+    {
+      typedef typename boost::graph::parallel::process_group_type<Graph>
+        ::type process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+
+      typedef typename graph_traits<Graph>::vertex_descriptor
+        vertex_descriptor;
+
+      process_group_type pg = process_group(g);
+      
+      /*
+        This should probably be send_oob_with_reply, especially when Dave 
+        finishes prefetch-batching
+      */
+
+      // Send root requests
+      for (process_id_type i = 0; i < num_processes(pg); ++i) {
+        if (!parent_requests[i].empty()) {
+          std::vector<vertex_descriptor> reqs(parent_requests[i].begin(),
+                                              parent_requests[i].end());
+          send(pg, i, req_parents_msg, reqs);
+        }
+      }
+      
+      synchronize(pg);
+      
+      // Receive root requests and reply to them
+      while (optional<std::pair<process_id_type, int> > m = probe(pg)) {
+        std::vector<vertex_descriptor> requests;
+        receive(pg, m->first, m->second, requests);
+        for (std::size_t i = 0; i < requests.size(); ++i)
+          requests[i] = get(p, requests[i]);
+        send(pg, m->first, parents_msg, requests);
+      }
+      
+      synchronize(pg);
+      
+      // Receive requested parents
+      std::vector<vertex_descriptor> responses;
+      for (process_id_type i = 0; i < num_processes(pg); ++i) {
+        if (!parent_requests[i].empty()) {
+          receive(pg, i, parents_msg, responses);
+          std::size_t parent_idx = 0;
+          for (typename VertexList::iterator v = parent_requests[i].begin();
+               v != parent_requests[i].end(); ++v, ++parent_idx)
+            put(p, *v, responses[parent_idx]);
+        }
+      }
+    }
+#endif
+    
+    template<typename DistributedGraph, typename ParentMap>
+    void
+    parallel_connected_components(DistributedGraph& g, ParentMap p)
+    {
+      using boost::connected_components;
+
+      typedef typename graph_traits<DistributedGraph>::adjacency_iterator
+        adjacency_iterator;
+      typedef typename graph_traits<DistributedGraph>::out_edge_iterator
+        out_edge_iterator;
+      typedef typename graph_traits<DistributedGraph>::edge_iterator
+        edge_iterator;
+      typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+        vertex_descriptor;
+      typedef typename graph_traits<DistributedGraph>::edge_descriptor
+        edge_descriptor;
+
+      typedef typename boost::graph::parallel::process_group_type<DistributedGraph>
+        ::type process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+
+      using boost::graph::parallel::process_group;
+
+      process_group_type pg = process_group(g);
+      process_id_type id = process_id(pg);
+
+      // TODO (NGE): Should old_roots, roots, and completed_roots be std::list
+      adjacency_iterator av1, av2;
+      std::vector<vertex_descriptor> old_roots;
+      typename std::vector<vertex_descriptor>::iterator liter;
+      typename std::vector<vertex_descriptor>::iterator aliter;
+      typename std::map<vertex_descriptor,
+                        std::vector<vertex_descriptor> > adj;
+
+      typedef typename property_map<DistributedGraph, vertex_owner_t>::const_type
+        OwnerMap;
+      OwnerMap owner = get(vertex_owner, g);
+      typedef typename property_map<DistributedGraph, vertex_local_t>::const_type
+        LocalMap;
+      LocalMap local = get(vertex_local, g);
+
+      // We need to hold on to all of the parent pointers
+      p.set_max_ghost_cells(0);
+
+      //
+      // STAGE 1 : Compute local components
+      //
+      local_subgraph<const DistributedGraph> ls(g);
+      typedef typename property_map<local_subgraph<const DistributedGraph>,
+                                    vertex_index_t>::type local_index_map_type;
+      local_index_map_type local_index = get(vertex_index, ls);
+
+      // Compute local connected components
+      std::vector<std::size_t> ls_components_vec(num_vertices(ls));
+      typedef iterator_property_map<std::vector<std::size_t>::iterator,
+                                    local_index_map_type>
+        ls_components_map_type;
+      ls_components_map_type ls_component(ls_components_vec.begin(),
+                                          local_index);
+      std::size_t num_comp = connected_components(ls, ls_component);
+
+      std::vector<vertex_descriptor> 
+        roots(num_comp, graph_traits<DistributedGraph>::null_vertex());
+
+      BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+        size_t component = get(ls_component, v);
+        if (roots[component] == graph_traits<DistributedGraph>::null_vertex() ||
+            get(local_index, v) < get(local_index, roots[component])) 
+          roots[component] = v;
+      }
+
+      // Set all the local parent pointers
+      BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+        put(p, v, roots[get(ls_component, v)]);
+      }
+
+      if (num_processes(pg) == 1) return;
+
+      // Build adjacency list for all roots
+      BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+        std::vector<vertex_descriptor>& my_adj = adj[get(p, v)];
+        for (tie(av1, av2) = adjacent_vertices(v, g);
+             av1 != av2; ++av1) {
+          if (get(owner, *av1) != id) my_adj.push_back(*av1);
+        }
+      }
+
+      // For all vertices adjacent to a local vertex get p(v)
+      for ( liter = roots.begin(); liter != roots.end(); ++liter ) {
+        std::vector<vertex_descriptor>& my_adj = adj[*liter];
+        for ( aliter = my_adj.begin(); aliter != my_adj.end(); ++aliter )
+          request(p, *aliter);
+      }
+      synchronize(p);
+
+      // Update adjacency list at root to make sure all adjacent
+      // vertices are roots of remote components
+      for ( liter = roots.begin(); liter != roots.end(); ++liter )
+        {
+          std::vector<vertex_descriptor>& my_adj = adj[*liter];
+          for ( aliter = my_adj.begin(); aliter != my_adj.end(); ++aliter )
+            *aliter = get(p, *aliter);
+
+          my_adj.erase
+            (remove_if(my_adj.begin(), my_adj.end(),
+                       cull_adjacency_list<vertex_descriptor, 
+                                           ParentMap>(*liter, p) ),
+             my_adj.end());
+          // This sort needs to be here to make sure the initial
+          // adjacency list is sorted
+          sort(my_adj.begin(), my_adj.end(), std::less<vertex_descriptor>());
+          my_adj.erase(unique(my_adj.begin(), my_adj.end()), my_adj.end());
+        }
+
+      // Get p(v) for the new adjacent roots
+      p.clear();
+      for ( liter = roots.begin(); liter != roots.end(); ++liter ) {
+        std::vector<vertex_descriptor>& my_adj = adj[*liter];
+        for ( aliter = my_adj.begin(); aliter != my_adj.end(); ++aliter )
+          request(p, *aliter);
+      }
+#ifdef PBGL_EXPLICIT_SYNCH
+      synchronize(p);
+#endif
+
+      // Lastly, remove roots with no adjacent vertices, this is
+      // unnecessary but will speed up sparse graphs
+      for ( liter = roots.begin(); liter != roots.end(); /*in loop*/)
+        {
+          if ( adj[*liter].empty() )
+            liter = roots.erase(liter);
+          else
+            ++liter;
+        }
+
+#ifdef PBGL_CONSTRUCT_METAGRAPH
+      /* TODO: If the number of roots is sufficiently small, we can 
+               use a 'problem folding' approach like we do in MST
+               to gather all the roots and their adjacencies on one proc
+               and solve for the connected components of the meta-graph */
+      using boost::parallel::all_reduce;
+      std::size_t num_roots = all_reduce(pg, roots.size(), std::plus<std::size_t>());
+      if (num_roots < MAX_VERTICES_IN_METAGRAPH) {
+        build_local_metagraph(g, p, roots.begin(), roots.end(), adj);
+        
+        // For each vertex in g, p(v) = p(p(v)), assign parent of leaf
+        // vertices from first step to final parent
+        BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+          put(p, v, get(p, get(p, v)));
+        }
+        
+        synchronize(p);
+        
+        return;
+      }
+#endif
+
+      //
+      // Parallel Phase
+      //
+
+      std::vector<vertex_descriptor> completed_roots;
+      hashed_vertex_compare<OwnerMap, LocalMap> v_compare(owner, local);
+      bool any_hooked;
+      vertex_descriptor new_root;
+
+      std::size_t steps = 0;
+
+      do {
+        ++steps;
+
+        // Pull in new parents for hooking phase
+        synchronize(p);
+
+        //
+        // Hooking
+        //
+        bool hooked = false;
+        completed_roots.clear();
+        for ( liter = roots.begin(); liter != roots.end(); )
+          {
+            new_root = graph_traits<DistributedGraph>::null_vertex();
+            std::vector<vertex_descriptor>& my_adj = adj[*liter];
+            for ( aliter = my_adj.begin(); aliter != my_adj.end(); ++aliter )
+              // try to hook to better adjacent vertex
+              if ( v_compare( get(p, *aliter), *liter ) )
+                new_root = get(p, *aliter);
+
+            if ( new_root != graph_traits<DistributedGraph>::null_vertex() )
+              {
+                hooked = true;
+                put(p, *liter, new_root);
+                old_roots.push_back(*liter);
+                completed_roots.push_back(*liter);
+                liter = roots.erase(liter);
+              }
+            else
+              ++liter;
+          }
+
+        //
+        // Pointer jumping, perform until new roots determined
+        //
+
+        // TODO: Implement cycle reduction rules to reduce this from
+        // O(n) to O(log n) [n = cycle length]
+        bool all_done;
+        std::size_t parent_root_count;
+
+        std::size_t double_steps = 0;
+
+        do {
+          ++double_steps;
+#ifndef PBGL_EXPLICIT_SYNCH
+          // Get p(p(v)) for all old roots, and p(v) for all current roots
+          for ( liter = old_roots.begin(); liter != old_roots.end(); ++liter )
+            request(p, get(p, *liter));
+
+          synchronize(p);
+#else
+          // Build root requests
+          typedef std::set<vertex_descriptor> VertexSet;
+          std::vector<VertexSet> parent_requests(num_processes(pg));
+          for ( liter = old_roots.begin(); liter != old_roots.end(); ++liter )
+            {
+              vertex_descriptor p1 = *liter;
+              if (get(owner, p1) != id) parent_requests[get(owner, p1)].insert(p1);
+              vertex_descriptor p2 = get(p, p1);
+              if (get(owner, p2) != id) parent_requests[get(owner, p2)].insert(p2);
+            }
+
+          request_parent_map_entries(g, p, parent_requests);
+#endif
+          // Perform a pointer jumping step on all old roots
+          for ( liter = old_roots.begin(); liter != old_roots.end(); ++liter )
+              put(p, *liter, get(p, get(p, *liter)));
+
+          // make sure the parent of all old roots is itself a root
+          parent_root_count = 0;
+          for ( liter = old_roots.begin(); liter != old_roots.end(); ++liter )
+            if ( get(p, *liter) == get(p, get(p, *liter)) )
+              parent_root_count++;
+
+          bool done = parent_root_count == old_roots.size();
+
+          all_reduce(pg, &done, &done+1, &all_done,
+                     std::logical_and<bool>());
+        } while ( !all_done );
+#ifdef PARALLEL_BGL_DEBUG
+        if (id == 0) std::cerr << double_steps << " doubling steps.\n";
+#endif
+        //
+        // Add adjacent vertices of just completed roots to adjacent
+        // vertex list at new parent
+        //
+        typename std::vector<vertex_descriptor> outgoing_edges;
+        for ( liter = completed_roots.begin(); liter != completed_roots.end();
+              ++liter )
+          {
+            vertex_descriptor new_parent = get(p, *liter);
+
+            if ( get(owner, new_parent) == id )
+              {
+                std::vector<vertex_descriptor>& my_adj = adj[new_parent];
+                my_adj.reserve(my_adj.size() + adj[*liter].size());
+                my_adj.insert( my_adj.end(),
+                               adj[*liter].begin(), adj[*liter].end() );
+#ifdef PBGL_IN_PLACE_MERGE
+#ifdef PBGL_SORT_ASSERT
+                assert(__gnu_cxx::is_sorted(my_adj.begin(),
+                                            my_adj.end() - adj[*liter].size(),
+                                            std::less<vertex_descriptor>()));
+                assert(__gnu_cxx::is_sorted(my_adj.end() - adj[*liter].size(),
+                                            my_adj.end(),
+                                            std::less<vertex_descriptor>()));
+#endif
+                std::inplace_merge(my_adj.begin(),
+                                   my_adj.end() - adj[*liter].size(),
+                                   my_adj.end(),
+                                   std::less<vertex_descriptor>());
+#endif
+
+
+              }
+            else if ( adj[*liter].begin() != adj[*liter].end() )
+              {
+                outgoing_edges.clear();
+                outgoing_edges.reserve(adj[*liter].size() + 1);
+                // First element is the destination of the adjacency list
+                outgoing_edges.push_back(new_parent);
+                outgoing_edges.insert(outgoing_edges.end(),
+                                      adj[*liter].begin(), adj[*liter].end() );
+                send(pg, get(owner, new_parent), edges_msg, outgoing_edges);
+                adj[*liter].clear();
+              }
+          }
+        synchronize(pg);
+
+        // Receive edges sent by remote nodes and add them to the
+        // indicated vertex's adjacency list
+        while (optional<std::pair<process_id_type, int> > m
+               = probe(pg))
+          {
+            std::vector<vertex_descriptor> incoming_edges;
+            receive(pg, m->first, edges_msg, incoming_edges);
+            typename std::vector<vertex_descriptor>::iterator aviter
+              = incoming_edges.begin();
+            ++aviter;
+
+            std::vector<vertex_descriptor>& my_adj = adj[incoming_edges[0]];
+
+            my_adj.reserve(my_adj.size() + incoming_edges.size() - 1);
+            my_adj.insert( my_adj.end(), aviter, incoming_edges.end() );
+
+#ifdef PBGL_IN_PLACE_MERGE
+            std::size_t num_incoming_edges = incoming_edges.size();
+#ifdef PBGL_SORT_ASSERT
+            assert(__gnu_cxx::is_sorted(my_adj.begin(),
+                                        my_adj.end() - (num_incoming_edges-1),
+                                        std::less<vertex_descriptor>()));
+            assert(__gnu_cxx::is_sorted(my_adj.end() - (num_incoming_edges-1),
+                                        my_adj.end(),
+                                        std::less<vertex_descriptor>()));
+#endif
+            std::inplace_merge(my_adj.begin(),
+                               my_adj.end() - (num_incoming_edges - 1),
+                               my_adj.end(),
+                               std::less<vertex_descriptor>());
+#endif
+
+          }
+
+
+        // Remove any adjacent vertices that are in the same component
+        // as a root from that root's list
+        for ( liter = roots.begin(); liter != roots.end(); ++liter )
+          {
+            // We can probably get away without sorting and removing
+            // duplicates Though sorting *may* cause root
+            // determination to occur faster by choosing the root with
+            // the most potential to hook to at each step
+            std::vector<vertex_descriptor>& my_adj = adj[*liter];
+            my_adj.erase
+              (remove_if(my_adj.begin(), my_adj.end(),
+                         cull_adjacency_list<vertex_descriptor,
+                                             ParentMap>(*liter, p) ),
+               my_adj.end());
+#ifndef PBGL_IN_PLACE_MERGE
+            sort(my_adj.begin(), my_adj.end(),
+                 std::less<vertex_descriptor>() );
+#endif
+            my_adj.erase(unique(my_adj.begin(), my_adj.end()), my_adj.end());
+          }
+
+        // Reduce result of empty root list test
+        all_reduce(pg, &hooked, &hooked+1, &any_hooked,
+                   std::logical_or<bool>());
+      } while ( any_hooked );
+#ifdef PARALLEL_BGL_DEBUG
+      if (id == 0) std::cerr << steps << " iterations.\n";
+#endif
+      //
+      // Finalize
+      //
+
+      // For each vertex in g, p(v) = p(p(v)), assign parent of leaf
+      // vertices from first step to final parent
+      BGL_FORALL_VERTICES_T(v, g, DistributedGraph) {
+        put(p, v, get(p, get(p, v)));
+      }
+      
+      synchronize(p);
+    }
+
+  } // end namespace cc_detail
+
+  template<typename Graph, typename ParentMap, typename ComponentMap>
+  typename property_traits<ComponentMap>::value_type
+  number_components_from_parents(const Graph& g, ParentMap p, ComponentMap c)
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor
+      vertex_descriptor;
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type
+      process_group_type;
+    typedef typename property_traits<ComponentMap>::value_type
+      ComponentMapType;
+
+    process_group_type pg = process_group(g);
+
+    /* Build list of roots */
+    std::vector<vertex_descriptor> my_roots, all_roots;
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if( find( my_roots.begin(), my_roots.end(), get(p, v) )
+          == my_roots.end() )
+        my_roots.push_back( get(p, v) );
+    }
+
+    all_gather(pg, my_roots.begin(), my_roots.end(), all_roots);
+
+    /* Number components */
+    std::map<vertex_descriptor, ComponentMapType> comp_numbers;
+    ComponentMapType c_num = 0;
+
+    // Compute component numbers
+    for (std::size_t i = 0; i < all_roots.size(); i++ )
+      if ( comp_numbers.count(all_roots[i]) == 0 )
+        comp_numbers[all_roots[i]] = c_num++;
+
+    // Broadcast component numbers
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      put( c, v, comp_numbers[get(p, v)] );
+    }
+
+    // Broadcast number of components
+    if (process_id(pg) == 0) {
+      typedef typename process_group_type::process_size_type
+        process_size_type;
+      for (process_size_type dest = 1, n = num_processes(pg);
+           dest != n; ++dest)
+        send(pg, dest, 0, c_num);
+    }
+    synchronize(pg);
+
+    if (process_id(pg) != 0) receive(pg, 0, 0, c_num);
+
+    synchronize(c);
+
+    return c_num;
+  }
+
+  template<typename Graph, typename ParentMap>
+  int
+  number_components_from_parents(const Graph& g, ParentMap p, 
+                                 dummy_property_map)
+  {
+    using boost::parallel::all_reduce;
+
+    // Count local roots.
+    int num_roots = 0;
+    BGL_FORALL_VERTICES_T(v, g, Graph)
+      if (get(p, v) == v) ++num_roots;
+    return all_reduce(g.process_group(), num_roots, std::plus<int>());
+  }
+
+  template<typename Graph, typename ComponentMap, typename ParentMap>
+  typename property_traits<ComponentMap>::value_type
+  connected_components
+    (const Graph& g, ComponentMap c, ParentMap p
+     BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, distributed_graph_tag))
+  {
+    cc_detail::parallel_connected_components(g, p);
+    return number_components_from_parents(g, p, c);
+  }
+
+  /* Construct ParentMap by default */
+  template<typename Graph, typename ComponentMap>
+  typename property_traits<ComponentMap>::value_type
+  connected_components
+    ( const Graph& g, ComponentMap c
+      BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, distributed_graph_tag) )
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+    std::vector<vertex_descriptor> x(num_vertices(g));
+
+    return connected_components
+             (g, c,
+              make_iterator_property_map(x.begin(), get(vertex_index, g)));
+  }
+} // end namespace distributed
+
+using distributed::connected_components;
+} // end namespace graph
+
+using graph::distributed::connected_components;
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PARALLEL_CC_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components_parallel_search.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/connected_components_parallel_search.hpp
new file mode 100644 (file)
index 0000000..815e3a3
--- /dev/null
@@ -0,0 +1,408 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Brian Barrett
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_CC_PS_HPP
+#define BOOST_GRAPH_PARALLEL_CC_PS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/optional.hpp>
+#include <algorithm>
+#include <vector>
+#include <queue>
+#include <limits>
+#include <map>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/iteration_macros.hpp>
+
+
+// Connected components algorithm based on a parallel search.
+//
+// Every N nodes starts a parallel search from the first vertex in
+// their local vertex list during the first superstep (the other nodes
+// remain idle during the first superstep to reduce the number of
+// conflicts in numbering the components).  At each superstep, all new
+// component mappings from remote nodes are handled.  If there is no
+// work from remote updates, a new vertex is removed from the local
+// list and added to the work queue.
+//
+// Components are allocated from the component_value_allocator object,
+// which ensures that a given component number is unique in the
+// system, currently by using the rank and number of processes to
+// stride allocations.
+//
+// When two components are discovered to actually be the same
+// component, a mapping is created in the collisions object.  The
+// lower component number is prefered in the resolution, so component
+// numbering resolution is consistent.  After the search has exhausted
+// all vertices in the graph, the mapping is shared with all
+// processes, and they independently resolve the comonent mapping (so
+// O((N * NP) + (V * NP)) work, in O(N + V) time, where N is the
+// number of mappings and V is the number of local vertices).  This
+// phase can likely be significantly sped up if a clever algorithm for
+// the reduction can be found.
+namespace boost { namespace graph { namespace distributed {
+  namespace cc_ps_detail {
+    // Local object for allocating component numbers.  There are two
+    // places this happens in the code, and I was getting sick of them
+    // getting out of sync.  Components are not tightly packed in
+    // numbering, but are numbered to ensure each rank has its own
+    // independent sets of numberings.
+    template<typename component_value_type>
+    class component_value_allocator {
+    public:
+      component_value_allocator(int num, int size) :
+        last(0), num(num), size(size)
+      {
+      }
+
+      component_value_type allocate(void)
+      {
+        component_value_type ret = num + (last * size);
+        last++;
+        return ret;
+      }
+
+    private:
+      component_value_type last;
+      int num;
+      int size;
+    };
+
+
+    // Map of the "collisions" between component names in the global
+    // component mapping.  TO make cleanup easier, component numbers
+    // are added, pointing to themselves, when a new component is
+    // found.  In order to make the results deterministic, the lower
+    // component number is always taken.  The resolver will drill
+    // through the map until it finds a component entry that points to
+    // itself as the next value, allowing some cleanup to happen at
+    // update() time.  Attempts are also made to update the mapping
+    // when new entries are created.
+    //
+    // Note that there's an assumption that the entire mapping is
+    // shared during the end of the algorithm, but before component
+    // name resolution.
+    template<typename component_value_type>
+    class collision_map {
+    public:
+      collision_map() : num_unique(0)
+      {
+      }
+
+      // add new component mapping first time component is used.  Own
+      // function only so that we can sanity check there isn't already
+      // a mapping for that component number (which would be bad)
+      void add(const component_value_type &a) 
+      {
+        assert(collisions.count(a) == 0);
+        collisions[a] = a;
+      }
+
+      // add a mapping between component values saying they're the
+      // same component
+      void add(const component_value_type &a, const component_value_type &b)
+      {
+        component_value_type high, low, tmp;
+        if (a > b) {
+          high = a;
+          low = b;
+        } else {
+          high = b;
+          low = a;
+        }
+
+        if (collisions.count(high) != 0 && collisions[high] != low) {
+          tmp = collisions[high];
+          if (tmp > low) {
+            collisions[tmp] = low;
+            collisions[high] = low;
+          } else {
+            collisions[low] = tmp;
+            collisions[high] = tmp;
+          }
+        } else {
+          collisions[high] = low;
+        }
+
+      }
+
+      // get the "real" component number for the given component.
+      // Used to resolve mapping at end of run.
+      component_value_type update(component_value_type a)
+      {
+        assert(num_unique > 0);
+        assert(collisions.count(a) != 0);
+        return collisions[a];
+      }
+
+      // collapse the collisions tree, so that update is a one lookup
+      // operation.  Count unique components at the same time.
+      void uniqify(void)
+      {
+        typename std::map<component_value_type, component_value_type>::iterator i, end;
+
+        end = collisions.end();
+        for (i = collisions.begin() ; i != end ; ++i) {
+          if (i->first == i->second) {
+            num_unique++;
+          } else {
+            i->second = collisions[i->second];
+          }
+        }
+      }
+
+      // get the number of component entries that have an associated
+      // component number of themselves, which are the real components
+      // used in the final mapping.  This is the number of unique
+      // components in the graph.
+      int unique(void)
+      {
+        assert(num_unique > 0);
+        return num_unique;
+      }
+
+      // "serialize" into a vector for communication.
+      std::vector<component_value_type> serialize(void)
+      {
+        std::vector<component_value_type> ret;
+        typename std::map<component_value_type, component_value_type>::iterator i, end;
+
+        end = collisions.end();
+        for (i = collisions.begin() ; i != end ; ++i) {
+          ret.push_back(i->first);
+          ret.push_back(i->second);
+        }
+
+        return ret;
+      }
+
+    private:
+      std::map<component_value_type, component_value_type> collisions;
+      int num_unique;
+    };
+
+
+    // resolver to handle remote updates.  The resolver will add
+    // entries into the collisions map if required, and if it is the
+    // first time the vertex has been touched, it will add the vertex
+    // to the remote queue.  Note that local updates are handled
+    // differently, in the main loop (below).
+
+      // BWB - FIX ME - don't need graph anymore - can pull from key value of Component Map.
+    template<typename ComponentMap, typename work_queue>
+    struct update_reducer {
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = false);
+
+      typedef typename property_traits<ComponentMap>::value_type component_value_type;
+      typedef typename property_traits<ComponentMap>::key_type vertex_descriptor;
+
+      update_reducer(work_queue *q,
+                     cc_ps_detail::collision_map<component_value_type> *collisions, 
+                     processor_id_type pg_id) :
+        q(q), collisions(collisions), pg_id(pg_id)
+      {
+      }
+
+      // ghost cell initialization routine.  This should never be
+      // called in this imlementation.
+      template<typename K>
+      component_value_type operator()(const K&) const
+      { 
+        return component_value_type(0); 
+      }
+
+      // resolver for remote updates.  I'm not entirely sure why, but
+      // I decided to not change the value of the vertex if it's
+      // already non-infinite.  It doesn't matter in the end, as we'll
+      // touch every vertex in the cleanup phase anyway.  If the
+      // component is currently infinite, set to the new component
+      // number and add the vertex to the work queue.  If it's not
+      // infinite, we've touched it already so don't add it to the
+      // work queue.  Do add a collision entry so that we know the two
+      // components are the same.
+      component_value_type operator()(const vertex_descriptor &v,
+                                      const component_value_type& current,
+                                      const component_value_type& update) const
+      {
+        const component_value_type max = (std::numeric_limits<component_value_type>::max)();
+        component_value_type ret = current;
+
+        if (max == current) {
+          q->push(v);
+          ret = update;
+        } else if (current != update) {
+          collisions->add(current, update);
+        }
+
+        return ret;
+      }                                    
+
+      // So for whatever reason, the property map can in theory call
+      // the resolver with a local descriptor in addition to the
+      // standard global descriptor.  As far as I can tell, this code
+      // path is never taken in this implementation, but I need to
+      // have this code here to make it compile.  We just make a
+      // global descriptor and call the "real" operator().
+      template<typename K>
+      component_value_type operator()(const K& v, 
+                                      const component_value_type& current, 
+                                      const component_value_type& update) const
+      {
+          return (*this)(vertex_descriptor(pg_id, v), current, update);
+      }
+
+    private:
+      work_queue *q;
+      collision_map<component_value_type> *collisions;
+      boost::processor_id_type pg_id;
+    };
+
+  } // namespace cc_ps_detail
+
+
+  template<typename Graph, typename ComponentMap>
+  typename property_traits<ComponentMap>::value_type
+  connected_components_ps(const Graph& g, ComponentMap c)
+  {
+    using boost::graph::parallel::process_group;
+
+    typedef typename property_traits<ComponentMap>::value_type component_value_type;
+    typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename boost::graph::parallel::process_group_type<Graph>
+      ::type process_group_type;
+    typedef typename process_group_type::process_id_type process_id_type;
+    typedef typename property_map<Graph, vertex_owner_t>
+      ::const_type vertex_owner_map;
+    typedef std::queue<vertex_descriptor> work_queue;
+
+    static const component_value_type max_component = 
+      (std::numeric_limits<component_value_type>::max)();
+    typename property_map<Graph, vertex_owner_t>::const_type
+      owner = get(vertex_owner, g);
+
+    // standard who am i? stuff
+    process_group_type pg = process_group(g);
+    process_id_type id = process_id(pg);
+
+    // Initialize every vertex to have infinite component number
+    BGL_FORALL_VERTICES_T(v, g, Graph) put(c, v, max_component);
+
+    vertex_iterator current, end;
+    tie(current, end) = vertices(g);
+
+    cc_ps_detail::component_value_allocator<component_value_type> cva(process_id(pg), num_processes(pg));
+    cc_ps_detail::collision_map<component_value_type> collisions;
+    work_queue q;  // this is intentionally a local data structure
+    c.set_reduce(cc_ps_detail::update_reducer<ComponentMap, work_queue>(&q, &collisions, id));
+
+    // add starting work
+    while (true) {
+        bool useful_found = false;
+        component_value_type val = cva.allocate();
+        put(c, *current, val);
+        collisions.add(val);
+        q.push(*current);
+        if (0 != out_degree(*current, g)) useful_found = true;
+        ++current;
+        if (useful_found) break;
+    }
+
+    // Run the loop until everyone in the system is done
+    bool global_done = false;
+    while (!global_done) {
+
+      // drain queue of work for this superstep
+      while (!q.empty()) {
+        vertex_descriptor v = q.front();
+        q.pop();
+        // iterate through outedges of the vertex currently being
+        // examined, setting their component to our component.  There
+        // is no way to end up in the queue without having a component
+        // number already.
+
+        BGL_FORALL_ADJ_T(v, peer, g, Graph) {
+          component_value_type my_component = get(c, v);
+
+          // update other vertex with our component information.
+          // Resolver will handle remote collisions as well as whether
+          // to put the vertex on the work queue or not.  We have to
+          // handle local collisions and work queue management
+          if (id == get(owner, peer)) {
+            if (max_component == get(c, peer)) {
+              put(c, peer, my_component);
+              q.push(peer);
+            } else if (my_component != get(c, peer)) {
+              collisions.add(my_component, get(c, peer));
+            }
+          } else {
+            put(c, peer, my_component);
+          }
+        }
+      }
+
+      // synchronize / start a new superstep.
+      synchronize(pg);
+      global_done = all_reduce(pg, (q.empty() && (current == end)), boost::parallel::minimum<bool>());
+
+      // If the queue is currently empty, add something to do to start
+      // the current superstep (supersteps start at the sync, not at
+      // the top of the while loop as one might expect).  Down at the
+      // bottom of the while loop so that not everyone starts the
+      // algorithm with something to do, to try to reduce component
+      // name conflicts
+      if (q.empty()) {
+        bool useful_found = false;
+        for ( ; current != end && !useful_found ; ++current) {
+          if (max_component == get(c, *current)) {
+            component_value_type val = cva.allocate();
+            put(c, *current, val);
+            collisions.add(val);
+            q.push(*current);
+            if (0 != out_degree(*current, g)) useful_found = true;
+          }
+        }
+      }
+    }
+
+    // share component mappings
+    std::vector<component_value_type> global;
+    std::vector<component_value_type> mine = collisions.serialize();
+    all_gather(pg, mine.begin(), mine.end(), global);
+    for (size_t i = 0 ; i < global.size() ; i += 2) {
+      collisions.add(global[i], global[i + 1]);
+    }
+    collisions.uniqify();
+
+    // update the component mappings
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      put(c, v, collisions.update(get(c, v)));
+    }
+
+    return collisions.unique();
+  }
+
+} // end namespace distributed
+
+} // end namespace graph
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PARALLEL_CC_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/crauser_et_al_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/crauser_et_al_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..c52ffd8
--- /dev/null
@@ -0,0 +1,664 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+/**************************************************************************
+ * This source file implements the variation on Dijkstra's algorithm      *
+ * presented by Crauser et al. in:                                        *
+ *                                                                        *
+ *   Andreas Crauser, Kurt Mehlhorn, Ulrich Meyer, and Peter              *
+ *   Sanders. A Parallelization of Dijkstra's Shortest Path               *
+ *   Algorithm. In Lubos Brim, Jozef Gruska, and Jiri Zlatuska,          *
+ *   editors, Mathematical Foundations of Computer Science (MFCS),        *
+ *   volume 1450 of Lecture Notes in Computer Science, pages              *
+ *   722--731, 1998. Springer.                                            *
+ *                                                                        *
+ * This implementation is, however, restricted to the distributed-memory  *
+ * case, where the work is distributed by virtue of the vertices being    *
+ * distributed. In a shared-memory (single address space) context, we     *
+ * would want to add an explicit balancing step.                          *
+ **************************************************************************/
+#ifndef BOOST_GRAPH_CRAUSER_ET_AL_SHORTEST_PATHS_HPP
+#define BOOST_GRAPH_CRAUSER_ET_AL_SHORTEST_PATHS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <functional>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/property_map/property_map_iterator.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <algorithm>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/distributed/detail/remote_update_set.hpp>
+#include <vector>
+#include <boost/graph/breadth_first_search.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+#ifdef PBGL_ACCOUNTING
+#  include <boost/graph/accounting.hpp>
+#  include <numeric>
+#endif // PBGL_ACCOUNTING
+
+#ifdef MUTABLE_QUEUE
+#    include <boost/pending/mutable_queue.hpp>
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+
+#ifdef PBGL_ACCOUNTING
+struct crauser_et_al_shortest_paths_stats_t
+{
+  /* Total wall-clock time used by the algorithm.*/
+  accounting::time_type execution_time;
+
+  /* The number of vertices deleted in each superstep. */
+  std::vector<std::size_t> deleted_vertices;
+
+  template<typename OutputStream>
+  void print(OutputStream& out)
+  {
+    double avg_deletions = std::accumulate(deleted_vertices.begin(),
+                                           deleted_vertices.end(),
+                                           0.0);
+    avg_deletions /= deleted_vertices.size();
+
+    out << "Problem = \"Single-Source Shortest Paths\"\n"
+        << "Algorithm = \"Crauser et al\"\n"
+        << "Function = crauser_et_al_shortest_paths\n"
+        << "Wall clock time = " << accounting::print_time(execution_time)
+        << "\nSupersteps = " << deleted_vertices.size() << "\n"
+        << "Avg. deletions per superstep = " << avg_deletions << "\n";
+  }
+};
+
+static crauser_et_al_shortest_paths_stats_t crauser_et_al_shortest_paths_stats;
+#endif
+
+namespace detail {
+
+  /************************************************************************
+   * Function objects that perform distance comparisons modified by the   *
+   * minimum or maximum edge weights.                                     *
+   ************************************************************************/
+  template<typename Vertex, typename DistanceMap, typename MinInWeightMap,
+           typename Combine, typename Compare>
+  struct min_in_distance_compare
+    : std::binary_function<Vertex, Vertex, bool>
+  {
+    min_in_distance_compare(DistanceMap d, MinInWeightMap m,
+                            Combine combine, Compare compare)
+      : distance_map(d), min_in_weight(m), combine(combine),
+        compare(compare)
+    {
+    }
+
+    bool operator()(const Vertex& x, const Vertex& y) const
+    {
+      return compare(combine(get(distance_map, x), -get(min_in_weight, x)),
+                     combine(get(distance_map, y), -get(min_in_weight, y)));
+    }
+
+  private:
+    DistanceMap distance_map;
+    MinInWeightMap min_in_weight;
+    Combine combine;
+    Compare compare;
+  };
+
+  template<typename Vertex, typename DistanceMap, typename MinOutWeightMap,
+           typename Combine, typename Compare>
+  struct min_out_distance_compare
+    : std::binary_function<Vertex, Vertex, bool>
+  {
+    min_out_distance_compare(DistanceMap d, MinOutWeightMap m,
+                             Combine combine, Compare compare)
+      : distance_map(d), min_out_weight(m), combine(combine),
+        compare(compare)
+    {
+    }
+
+    bool operator()(const Vertex& x, const Vertex& y) const
+    {
+      return compare(combine(get(distance_map, x), get(min_out_weight, x)),
+                     combine(get(distance_map, y), get(min_out_weight, y)));
+    }
+
+  private:
+    DistanceMap distance_map;
+    MinOutWeightMap min_out_weight;
+    Combine combine;
+    Compare compare;
+  };
+  /************************************************************************/
+
+  /************************************************************************
+   * Dijkstra queue that implements Crauser et al.'s criteria. This queue *
+   * actually stores three separate priority queues, to help expose all   *
+   * vertices that can be processed in a single phase.                    *
+   ************************************************************************/
+  template<typename Graph, typename Combine,
+           typename Compare, typename VertexIndexMap, typename DistanceMap,
+           typename PredecessorMap, typename MinOutWeightMap,
+           typename MinInWeightMap>
+  class crauser_et_al_dijkstra_queue
+    : public graph::detail::remote_update_set<
+               crauser_et_al_dijkstra_queue<
+                 Graph, Combine, Compare, VertexIndexMap, DistanceMap, 
+                 PredecessorMap, MinOutWeightMap, MinInWeightMap>,
+               typename boost::graph::parallel::process_group_type<Graph>::type,
+               typename dijkstra_msg_value<DistanceMap, PredecessorMap>::type,
+               typename property_map<Graph, vertex_owner_t>::const_type>
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor
+      vertex_descriptor;
+    typedef crauser_et_al_dijkstra_queue self_type;
+    typedef dijkstra_msg_value<DistanceMap, PredecessorMap> msg_value_creator;
+    typedef typename msg_value_creator::type msg_value_type;
+    typedef typename graph_traits<Graph>::vertices_size_type
+      vertices_size_type;
+    typedef typename property_map<Graph, vertex_owner_t>::const_type
+      OwnerPropertyMap;
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type
+      process_group_type;
+    typedef graph::detail::remote_update_set<self_type, process_group_type,
+                                             msg_value_type, OwnerPropertyMap>
+      inherited;
+
+    // Priority queue for tentative distances
+    typedef indirect_cmp<DistanceMap, Compare> dist_queue_compare_type;
+
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+#ifdef MUTABLE_QUEUE
+    typedef mutable_queue<vertex_descriptor, std::vector<vertex_descriptor>, 
+                          dist_queue_compare_type, VertexIndexMap> dist_queue_type;
+
+#else
+    typedef relaxed_heap<vertex_descriptor, dist_queue_compare_type,
+                         VertexIndexMap> dist_queue_type;
+#endif // MUTABLE_QUEUE
+
+    // Priority queue for OUT criteria
+    typedef min_out_distance_compare<vertex_descriptor, DistanceMap,
+                                     MinOutWeightMap, Combine, Compare>
+      out_queue_compare_type;
+
+#ifdef MUTABLE_QUEUE
+    typedef mutable_queue<vertex_descriptor, std::vector<vertex_descriptor>, 
+                          out_queue_compare_type, VertexIndexMap> out_queue_type;
+
+#else
+    typedef relaxed_heap<vertex_descriptor, out_queue_compare_type,
+                         VertexIndexMap> out_queue_type;
+#endif // MUTABLE_QUEUE
+
+    // Priority queue for IN criteria
+    typedef min_in_distance_compare<vertex_descriptor, DistanceMap,
+                                    MinInWeightMap, Combine, Compare>
+      in_queue_compare_type;
+
+#ifdef MUTABLE_QUEUE
+    typedef mutable_queue<vertex_descriptor, std::vector<vertex_descriptor>, 
+                          in_queue_compare_type, VertexIndexMap> in_queue_type;
+
+#else
+    typedef relaxed_heap<vertex_descriptor, in_queue_compare_type,
+                         VertexIndexMap> in_queue_type;
+#endif // MUTABLE_QUEUE
+
+    typedef typename process_group_type::process_id_type process_id_type;
+
+  public:
+    typedef typename dist_queue_type::size_type  size_type;
+    typedef typename dist_queue_type::value_type value_type;
+
+    crauser_et_al_dijkstra_queue(const Graph& g,
+                                 const Combine& combine,
+                                 const Compare& compare,
+                                 const VertexIndexMap& id,
+                                 const DistanceMap& distance_map,
+                                 const PredecessorMap& predecessor_map,
+                                 const MinOutWeightMap& min_out_weight,
+                                 const MinInWeightMap& min_in_weight)
+      : inherited(boost::graph::parallel::process_group(g), get(vertex_owner, g)),
+        dist_queue(num_vertices(g),
+                   dist_queue_compare_type(distance_map, compare),
+                   id),
+        out_queue(num_vertices(g),
+                  out_queue_compare_type(distance_map, min_out_weight,
+                                         combine, compare),
+                  id),
+        in_queue(num_vertices(g),
+                 in_queue_compare_type(distance_map, min_in_weight,
+                                       combine, compare),
+                 id),
+        g(g),
+        distance_map(distance_map),
+        predecessor_map(predecessor_map),
+        min_out_weight(min_out_weight),
+        min_in_weight(min_in_weight),
+        min_distance(0),
+        min_out_distance(0)
+#ifdef PBGL_ACCOUNTING
+        , local_deletions(0)
+#endif
+    { }
+
+    void push(const value_type& x)
+    {
+      msg_value_type msg_value =
+        msg_value_creator::create(get(distance_map, x),
+                                  predecessor_value(get(predecessor_map, x)));
+      inherited::update(x, msg_value);
+    }
+
+    void update(const value_type& x) { push(x); }
+
+    void pop()
+    {
+      // Remove from distance queue
+      dist_queue.remove(top_vertex);
+
+      // Remove from OUT queue
+      out_queue.remove(top_vertex);
+
+      // Remove from IN queue
+      in_queue.remove(top_vertex);
+
+#ifdef PBGL_ACCOUNTING
+      ++local_deletions;
+#endif
+    }
+
+    vertex_descriptor& top() { return top_vertex; }
+    const vertex_descriptor& top() const { return top_vertex; }
+
+    bool empty()
+    {
+      inherited::collect();
+
+      // If there are no suitable messages, wait until we get something
+      while (!has_suitable_vertex()) {
+        if (do_synchronize()) return true;
+      }
+      // Return true only if nobody has any messages; false if we
+      // have suitable messages
+      return false;
+    }
+
+    bool do_synchronize()
+    {
+      using boost::parallel::all_reduce;
+      using boost::parallel::minimum;
+
+      inherited::synchronize();
+
+      // TBD: could use combine here, but then we need to stop using
+      // minimum<distance_type>() as the function object.
+      distance_type local_distances[2];
+      local_distances[0] =
+        dist_queue.empty()? (std::numeric_limits<distance_type>::max)()
+        : get(distance_map, dist_queue.top());
+
+      local_distances[1] =
+        out_queue.empty()? (std::numeric_limits<distance_type>::max)()
+        : (get(distance_map, out_queue.top())
+           + get(min_out_weight, out_queue.top()));
+
+      distance_type distances[2];
+      all_reduce(this->process_group, local_distances, local_distances + 2,
+                 distances, minimum<distance_type>());
+      min_distance = distances[0];
+      min_out_distance = distances[1];
+
+#ifdef PBGL_ACCOUNTING
+      std::size_t deletions = 0;
+      all_reduce(this->process_group, &local_deletions, &local_deletions + 1,
+                 &deletions, std::plus<std::size_t>());
+      if (process_id(this->process_group) == 0) {
+        crauser_et_al_shortest_paths_stats.deleted_vertices.push_back(deletions);
+      }
+      local_deletions = 0;
+      assert(deletions > 0);
+#endif
+
+      return min_distance == (std::numeric_limits<distance_type>::max)();
+    }
+
+  private:
+    vertex_descriptor predecessor_value(vertex_descriptor v) const
+    { return v; }
+
+    vertex_descriptor
+    predecessor_value(property_traits<dummy_property_map>::reference) const
+    { return graph_traits<Graph>::null_vertex(); }
+
+    bool has_suitable_vertex() const
+    {
+      if (!dist_queue.empty()) {
+        top_vertex = dist_queue.top();
+        if (get(distance_map, dist_queue.top()) <= min_out_distance)
+          return true;
+      }
+
+      if (!in_queue.empty()) {
+        top_vertex = in_queue.top();
+        return (get(distance_map, top_vertex)
+                - get(min_in_weight, top_vertex)) <= min_distance;
+      }
+      return false;
+    }
+
+  public:
+    void
+    receive_update(process_id_type source, vertex_descriptor vertex,
+                   distance_type distance)
+    {
+      // Update the queue if the received distance is better than
+      // the distance we know locally
+      if (distance < get(distance_map, vertex)
+          || (distance == get(distance_map, vertex)
+              && source == process_id(this->process_group))) {
+        // Update the local distance map
+        put(distance_map, vertex, distance);
+
+        bool is_in_queue = dist_queue.contains(vertex);
+
+        if (!is_in_queue) {
+          dist_queue.push(vertex);
+          out_queue.push(vertex);
+          in_queue.push(vertex);
+        }
+        else {
+          dist_queue.update(vertex);
+          out_queue.update(vertex);
+          in_queue.update(vertex);
+        }
+      }
+    }
+
+    void
+    receive_update(process_id_type source, vertex_descriptor vertex,
+                   std::pair<distance_type, vertex_descriptor> p)
+    {
+      if (p.first <= get(distance_map, vertex)) {
+        put(predecessor_map, vertex, p.second);
+        receive_update(source, vertex, p.first);
+      }
+    }
+
+  private:
+    dist_queue_type           dist_queue;
+    out_queue_type            out_queue;
+    in_queue_type             in_queue;
+    mutable value_type        top_vertex;
+    const Graph&              g;
+    DistanceMap               distance_map;
+    PredecessorMap            predecessor_map;
+    MinOutWeightMap           min_out_weight;
+    MinInWeightMap            min_in_weight;
+    distance_type             min_distance;
+    distance_type             min_out_distance;
+#ifdef PBGL_ACCOUNTING
+    std::size_t               local_deletions;
+#endif
+  };
+  /************************************************************************/
+
+  /************************************************************************
+   * Initialize the property map that contains the minimum incoming edge  *
+   * weight for each vertex. There are separate implementations for       *
+   * directed, bidirectional, and undirected graph.                       *
+   ************************************************************************/
+  template<typename Graph, typename MinInWeightMap, typename WeightMap,
+           typename Inf, typename Compare>
+  void
+  initialize_min_in_weights(const Graph& g, MinInWeightMap min_in_weight,
+                            WeightMap weight, Inf inf, Compare compare,
+                            directed_tag, incidence_graph_tag)
+  {
+    // Send minimum weights off to the owners
+    set_property_map_role(vertex_distance, min_in_weight);
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      BGL_FORALL_OUTEDGES_T(v, e, g, Graph) {
+        if (get(weight, e) < get(min_in_weight, target(e, g)))
+          put(min_in_weight, target(e, g), get(weight, e));
+      }
+    }
+
+    using boost::graph::parallel::process_group;
+    synchronize(process_group(g));
+
+    // Replace any infinities with zeros
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (get(min_in_weight, v) == inf) put(min_in_weight, v, 0);
+    }
+  }
+
+  template<typename Graph, typename MinInWeightMap, typename WeightMap,
+           typename Inf, typename Compare>
+  void
+  initialize_min_in_weights(const Graph& g, MinInWeightMap min_in_weight,
+                            WeightMap weight, Inf inf, Compare compare,
+                            directed_tag, bidirectional_graph_tag)
+  {
+#if 0
+    typename property_map<Graph, vertex_local_t>::const_type
+      local = get(vertex_local, g);
+
+    // This code assumes that the properties of the in-edges are
+    // available locally. This is not necessarily the case, so don't
+    // do this yet.
+    set_property_map_role(vertex_distance, min_in_weight);
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (in_edges(v, g).first != in_edges(v, g).second) {
+        std::cerr << "weights(" << g.distribution().global(get(local, v))
+                  << ") = ";
+        BGL_FORALL_INEDGES_T(v, e, g, Graph) {
+          std::cerr << get(weight, e) << ' ';
+        }
+        std::cerr << std::endl;
+        put(min_in_weight, v,
+            *std::min_element
+            (make_property_map_iterator(weight, in_edges(v, g).first),
+             make_property_map_iterator(weight, in_edges(v, g).second),
+             compare));
+      } else {
+        put(min_in_weight, v, 0);
+      }
+      std::cerr << "miw(" << g.distribution().global(get(local, v)) << ") = "
+                << get(min_in_weight, v) << std::endl;
+    }
+#else
+    initialize_min_in_weights(g, min_in_weight, weight, inf, compare,
+                              directed_tag(), incidence_graph_tag());
+#endif
+  }
+
+  template<typename Graph, typename MinInWeightMap, typename WeightMap,
+           typename Inf, typename Compare>
+  inline void
+  initialize_min_in_weights(const Graph&, MinInWeightMap, WeightMap, Inf,
+                            Compare, undirected_tag, bidirectional_graph_tag)
+  {
+    // In weights are the same as out weights, so do nothing
+  }
+  /************************************************************************/
+
+
+  /************************************************************************
+   * Initialize the property map that contains the minimum outgoing edge  *
+   * weight for each vertex.                                              *
+   ************************************************************************/
+  template<typename Graph, typename MinOutWeightMap, typename WeightMap,
+           typename Compare>
+  void
+  initialize_min_out_weights(const Graph& g, MinOutWeightMap min_out_weight,
+                             WeightMap weight, Compare compare)
+  {
+    typedef typename property_traits<WeightMap>::value_type weight_type;
+
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (out_edges(v, g).first != out_edges(v, g).second) {
+        put(min_out_weight, v,
+            *std::min_element
+            (make_property_map_iterator(weight, out_edges(v, g).first),
+             make_property_map_iterator(weight, out_edges(v, g).second),
+             compare));
+        if (get(min_out_weight, v) < weight_type(0))
+            boost::throw_exception(negative_edge());
+      }
+    }
+  }
+
+  /************************************************************************/
+
+} // end namespace detail
+
+template<typename DistributedGraph, typename DijkstraVisitor,
+         typename PredecessorMap, typename DistanceMap, typename WeightMap,
+         typename IndexMap, typename ColorMap, typename Compare,
+         typename Combine, typename DistInf, typename DistZero>
+void
+crauser_et_al_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
+   IndexMap index_map, ColorMap color_map,
+   Compare compare, Combine combine, DistInf inf, DistZero zero,
+   DijkstraVisitor vis)
+{
+  typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type
+    process_group_type;
+  typedef typename process_group_type::process_id_type process_id_type;
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+    Vertex;
+  typedef typename graph_traits<DistributedGraph>::vertices_size_type
+    vertices_size_type;
+
+#ifdef PBGL_ACCOUNTING
+  crauser_et_al_shortest_paths_stats.deleted_vertices.clear();
+  crauser_et_al_shortest_paths_stats.execution_time = accounting::get_time();
+#endif
+
+  // Property map that stores the lowest edge weight outgoing from
+  // each vertex. If a vertex has no out-edges, the stored weight
+  // is zero.
+  typedef typename property_traits<WeightMap>::value_type weight_type;
+  typedef iterator_property_map<weight_type*, IndexMap> MinOutWeightMap;
+  std::vector<weight_type> min_out_weights_vec(num_vertices(g), inf);
+  MinOutWeightMap min_out_weight(&min_out_weights_vec.front(), index_map);
+  detail::initialize_min_out_weights(g, min_out_weight, weight, compare);
+
+  // Property map that stores the lowest edge weight incoming to
+  // each vertex. For undirected graphs, this will just be a
+  // shallow copy of the version for outgoing edges.
+  typedef typename graph_traits<DistributedGraph>::directed_category
+    directed_category;
+  const bool is_undirected =
+    is_same<directed_category, undirected_tag>::value;
+  typedef MinOutWeightMap MinInWeightMap;
+  std::vector<weight_type>
+    min_in_weights_vec(is_undirected? 1 : num_vertices(g), inf);
+  MinInWeightMap min_in_weight(&min_in_weights_vec.front(), index_map);
+  typedef typename graph_traits<DistributedGraph>::traversal_category
+    category;
+  detail::initialize_min_in_weights(g, min_in_weight, weight, inf, compare,
+                                    directed_category(), category());
+
+  // Initialize local portion of property maps
+  typename graph_traits<DistributedGraph>::vertex_iterator ui, ui_end;
+  for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
+    put(distance, *ui, inf);
+    put(predecessor, *ui, *ui);
+  }
+  put(distance, s, zero);
+
+  // Dijkstra Queue
+  typedef detail::crauser_et_al_dijkstra_queue
+            <DistributedGraph, Combine, Compare, IndexMap, DistanceMap, 
+             PredecessorMap, MinOutWeightMap, MinInWeightMap>
+    Queue;
+
+  Queue Q(g, combine, compare, index_map, distance, predecessor,
+          min_out_weight, is_undirected? min_out_weight : min_in_weight);
+
+  // Parallel Dijkstra visitor
+  ::boost::detail::dijkstra_bfs_visitor<
+      DijkstraVisitor, Queue, WeightMap,
+      boost::parallel::caching_property_map<PredecessorMap>,
+      boost::parallel::caching_property_map<DistanceMap>, Combine, Compare
+    > bfs_vis(vis, Q, weight,
+              boost::parallel::make_caching_property_map(predecessor),
+              boost::parallel::make_caching_property_map(distance),
+              combine, compare, zero);
+
+  set_property_map_role(vertex_color, color_map);
+  set_property_map_role(vertex_distance, distance);
+
+  breadth_first_search(g, s, Q, bfs_vis, color_map);
+
+#ifdef PBGL_ACCOUNTING
+  crauser_et_al_shortest_paths_stats.execution_time =
+    accounting::get_time() - crauser_et_al_shortest_paths_stats.execution_time;
+#endif
+}
+
+template<typename DistributedGraph, typename PredecessorMap,
+         typename DistanceMap, typename WeightMap>
+void
+crauser_et_al_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, WeightMap weight)
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+  std::vector<default_color_type> colors(num_vertices(g), white_color);
+
+  crauser_et_al_shortest_paths(g, s, predecessor, distance, weight,
+                               get(vertex_index, g),
+                               make_iterator_property_map(&colors[0],
+                                                          get(vertex_index, g)),
+                               std::less<distance_type>(),
+                               closed_plus<distance_type>(),
+                               (std::numeric_limits<distance_type>::max)(),
+                               distance_type(),
+                               dijkstra_visitor<>());
+}
+
+template<typename DistributedGraph, typename PredecessorMap,
+         typename DistanceMap>
+void
+crauser_et_al_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance)
+{
+  crauser_et_al_shortest_paths(g, s, predecessor, distance,
+                               get(edge_weight, g));
+}
+
+} // end namespace distributed
+
+#ifdef PBGL_ACCOUNTING
+using distributed::crauser_et_al_shortest_paths_stats;
+#endif
+
+using distributed::crauser_et_al_shortest_paths;
+
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_CRAUSER_ET_AL_SHORTEST_PATHS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp
new file mode 100644 (file)
index 0000000..3fcccf0
--- /dev/null
@@ -0,0 +1,938 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+/**
+ * This header implements four distributed algorithms to compute
+ * the minimum spanning tree (actually, minimum spanning forest) of a
+ * graph. All of the algorithms were implemented as specified in the
+ * paper by Dehne and Gotz:
+ *
+ *   Frank Dehne and Silvia Gotz. Practical Parallel Algorithms for Minimum
+ *   Spanning Trees. In Symposium on Reliable Distributed Systems,
+ *   pages 366--371, 1998.
+ *
+ * There are four algorithm variants implemented.
+ */
+
+#ifndef BOOST_DEHNE_GOTZ_MIN_SPANNING_TREE_HPP
+#define BOOST_DEHNE_GOTZ_MIN_SPANNING_TREE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <vector>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/limits.hpp>
+#include <utility>
+#include <boost/pending/disjoint_sets.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/graph/vertex_and_edge_range.hpp>
+#include <boost/graph/kruskal_min_spanning_tree.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+#include <cmath>
+
+namespace boost { namespace graph { namespace distributed {
+
+namespace detail {
+  /**
+   * Binary function object type that selects the (edge, weight) pair
+   * with the minimum weight. Used within a Boruvka merge step to select
+   * the candidate edges incident to each supervertex.
+   */
+  struct smaller_weighted_edge
+  {
+    template<typename Edge, typename Weight>
+    std::pair<Edge, Weight>
+    operator()(const std::pair<Edge, Weight>& x,
+               const std::pair<Edge, Weight>& y) const
+    { return x.second < y.second? x : y; }
+  };
+
+  /**
+   * Unary predicate that determines if the source and target vertices
+   * of the given edge have the same representative within a disjoint
+   * sets data structure. Used to indicate when an edge is now a
+   * self-loop because of supervertex merging in Boruvka's algorithm.
+   */
+  template<typename DisjointSets, typename Graph>
+  class do_has_same_supervertex
+  {
+  public:
+    typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+
+    do_has_same_supervertex(DisjointSets& dset, const Graph& g)
+      : dset(dset), g(g) { }
+
+    bool operator()(edge_descriptor e)
+    { return dset.find_set(source(e, g)) == dset.find_set(target(e, g));    }
+
+  private:
+    DisjointSets&  dset;
+    const Graph&   g;
+  };
+
+  /**
+   * Build a @ref do_has_same_supervertex object.
+   */
+  template<typename DisjointSets, typename Graph>
+  inline do_has_same_supervertex<DisjointSets, Graph>
+  has_same_supervertex(DisjointSets& dset, const Graph& g)
+  { return do_has_same_supervertex<DisjointSets, Graph>(dset, g); }
+
+  /** \brief A single distributed Boruvka merge step.
+   *
+   * A distributed Boruvka merge step involves computing (globally)
+   * the minimum weight edges incident on each supervertex and then
+   * merging supervertices along these edges. Once supervertices are
+   * merged, self-loops are eliminated.
+   *
+   * The set of parameters passed to this algorithm is large, and
+   * considering this algorithm in isolation there are several
+   * redundancies. However, the more asymptotically efficient
+   * distributed MSF algorithms require mixing Boruvka steps with the
+   * merging of local MSFs (implemented in
+   * merge_local_minimum_spanning_trees_step): the interaction of the
+   * two algorithms mandates the addition of these parameters.
+   *
+   * \param pg The process group over which communication should be
+   * performed. Within the distributed Boruvka algorithm, this will be
+   * equivalent to \code process_group(g); however, in the context of
+   * the mixed MSF algorithms, the process group @p pg will be a
+   * (non-strict) process subgroup of \code process_group(g).
+   *
+   * \param g The underlying graph on which the MSF is being
+   * computed. The type of @p g must model DistributedGraph, but there
+   * are no other requirements because the edge and (super)vertex
+   * lists are passed separately.
+   *
+   * \param weight_map Property map containing the weights of each
+   * edge. The type of this property map must model
+   * ReadablePropertyMap and must support caching.
+   *
+   * \param out An output iterator that will be written with the set
+   * of edges selected to build the MSF. Every process within the
+   * process group @p pg will receive all edges in the MSF.
+   *
+   * \param dset Disjoint sets data structure mapping from vertices in
+   * the graph @p g to their representative supervertex.
+   *
+   * \param supervertex_map Mapping from supervertex descriptors to
+   * indices.
+   *
+   * \param supervertices A vector containing all of the
+   * supervertices. Will be modified to include only the remaining
+   * supervertices after merging occurs.
+   *
+   * \param edge_list The list of edges that remain in the graph. This
+   * list will be pruned to remove self-loops once MSF edges have been
+   * found.
+   */
+  template<typename ProcessGroup, typename Graph, typename WeightMap,
+           typename OutputIterator, typename RankMap, typename ParentMap,
+           typename SupervertexMap, typename Vertex, typename EdgeList>
+  OutputIterator
+  boruvka_merge_step(ProcessGroup pg, const Graph& g, WeightMap weight_map,
+                     OutputIterator out,
+                     disjoint_sets<RankMap, ParentMap>& dset,
+                     SupervertexMap supervertex_map,
+                     std::vector<Vertex>& supervertices,
+                     EdgeList& edge_list)
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor
+                                                           vertex_descriptor;
+    typedef typename graph_traits<Graph>::vertices_size_type
+                                                           vertices_size_type;
+    typedef typename graph_traits<Graph>::edge_descriptor  edge_descriptor;
+    typedef typename EdgeList::iterator                    edge_iterator;
+    typedef typename property_traits<WeightMap>::value_type
+                                                           weight_type;
+    typedef boost::parallel::detail::untracked_pair<edge_descriptor, 
+                                       weight_type>        w_edge;
+    typedef typename property_traits<SupervertexMap>::value_type
+                                                           supervertex_index;
+
+    smaller_weighted_edge min_edge;
+    weight_type inf = (std::numeric_limits<weight_type>::max)();
+
+    // Renumber the supervertices
+    for (std::size_t i = 0; i < supervertices.size(); ++i)
+      put(supervertex_map, supervertices[i], i);
+
+    // BSP-B1: Find local minimum-weight edges for each supervertex
+    std::vector<w_edge> candidate_edges(supervertices.size(),
+                                        w_edge(edge_descriptor(), inf));
+    for (edge_iterator ei = edge_list.begin(); ei != edge_list.end(); ++ei) {
+      weight_type w = get(weight_map, *ei);
+      supervertex_index u =
+        get(supervertex_map, dset.find_set(source(*ei, g)));
+      supervertex_index v =
+        get(supervertex_map, dset.find_set(target(*ei, g)));
+
+      if (u != v) {
+        candidate_edges[u] = min_edge(candidate_edges[u], w_edge(*ei, w));
+        candidate_edges[v] = min_edge(candidate_edges[v], w_edge(*ei, w));
+      }
+    }
+
+    // BSP-B2 (a): Compute global minimum edges for each supervertex
+    all_reduce(pg,
+               &candidate_edges[0],
+               &candidate_edges[0] + candidate_edges.size(),
+               &candidate_edges[0], min_edge);
+
+    // BSP-B2 (b): Use the edges to compute sequentially the new
+    // connected components and emit the edges.
+    for (vertices_size_type i = 0; i < candidate_edges.size(); ++i) {
+      if (candidate_edges[i].second != inf) {
+        edge_descriptor e = candidate_edges[i].first;
+        vertex_descriptor u = dset.find_set(source(e, g));
+        vertex_descriptor v = dset.find_set(target(e, g));
+        if (u != v) {
+          // Emit the edge, but cache the weight so everyone knows it
+          cache(weight_map, e, candidate_edges[i].second);
+          *out++ = e;
+
+          // Link the two supervertices
+          dset.link(u, v);
+
+          // Whichever vertex was reparented will be removed from the
+          // list of supervertices.
+          vertex_descriptor victim = u;
+          if (dset.find_set(u) == u) victim = v;
+          supervertices[get(supervertex_map, victim)] =
+            graph_traits<Graph>::null_vertex();
+        }
+      }
+    }
+
+    // BSP-B3: Eliminate self-loops
+    edge_list.erase(std::remove_if(edge_list.begin(), edge_list.end(),
+                                   has_same_supervertex(dset, g)),
+                    edge_list.end());
+
+    // TBD: might also eliminate multiple edges between supervertices
+    // when the edges do not have the best weight, but this is not
+    // strictly necessary.
+
+    // Eliminate supervertices that have been absorbed
+    supervertices.erase(std::remove(supervertices.begin(),
+                                    supervertices.end(),
+                                    graph_traits<Graph>::null_vertex()),
+                        supervertices.end());
+
+    return out;
+  }
+
+  /**
+   * An edge descriptor adaptor that reroutes the source and target
+   * edges to different vertices, but retains the original edge
+   * descriptor for, e.g., property maps. This is used when we want to
+   * turn a set of edges in the overall graph into a set of edges
+   * between supervertices.
+   */
+  template<typename Graph>
+  struct supervertex_edge_descriptor
+  {
+    typedef supervertex_edge_descriptor self_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+    Vertex source;
+    Vertex target;
+    Edge e;
+
+    operator Edge() const { return e; }
+
+    friend inline bool operator==(const self_type& x, const self_type& y)
+    { return x.e == y.e; }
+
+    friend inline bool operator!=(const self_type& x, const self_type& y)
+    { return x.e != y.e; }
+  };
+
+  template<typename Graph>
+  inline typename supervertex_edge_descriptor<Graph>::Vertex
+  source(supervertex_edge_descriptor<Graph> se, const Graph&)
+  { return se.source; }
+
+  template<typename Graph>
+  inline typename supervertex_edge_descriptor<Graph>::Vertex
+  target(supervertex_edge_descriptor<Graph> se, const Graph&)
+  { return se.target; }
+
+  /**
+   * Build a supervertex edge descriptor from a normal edge descriptor
+   * using the given disjoint sets data structure to identify
+   * supervertex representatives.
+   */
+  template<typename Graph, typename DisjointSets>
+  struct build_supervertex_edge_descriptor
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::edge_descriptor   Edge;
+
+    typedef Edge argument_type;
+    typedef supervertex_edge_descriptor<Graph> result_type;
+
+    build_supervertex_edge_descriptor() : g(0), dsets(0) { }
+
+    build_supervertex_edge_descriptor(const Graph& g, DisjointSets& dsets)
+      : g(&g), dsets(&dsets) { }
+
+    result_type operator()(argument_type e) const
+    {
+      result_type result;
+      result.source = dsets->find_set(source(e, *g));
+      result.target = dsets->find_set(target(e, *g));
+      result.e = e;
+      return result;
+    }
+
+  private:
+    const Graph* g;
+    DisjointSets* dsets;
+  };
+
+  template<typename Graph, typename DisjointSets>
+  inline build_supervertex_edge_descriptor<Graph, DisjointSets>
+  make_supervertex_edge_descriptor(const Graph& g, DisjointSets& dsets)
+  { return build_supervertex_edge_descriptor<Graph, DisjointSets>(g, dsets); }
+
+  template<typename T>
+  struct identity_function
+  {
+    typedef T argument_type;
+    typedef T result_type;
+
+    result_type operator()(argument_type x) const { return x; }
+  };
+
+  template<typename Graph, typename DisjointSets, typename EdgeMapper>
+  class is_not_msf_edge
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+  public:
+    is_not_msf_edge(const Graph& g, DisjointSets dset, EdgeMapper edge_mapper)
+      : g(g), dset(dset), edge_mapper(edge_mapper) { }
+
+    bool operator()(Edge e)
+    {
+      Vertex u = dset.find_set(source(edge_mapper(e), g));
+      Vertex v = dset.find_set(target(edge_mapper(e), g));
+      if (u == v) return true;
+      else {
+        dset.link(u, v);
+        return false;
+      }
+    }
+
+  private:
+    const Graph& g;
+    DisjointSets dset;
+    EdgeMapper edge_mapper;
+  };
+
+  template<typename Graph, typename ForwardIterator, typename EdgeList,
+           typename EdgeMapper, typename RankMap, typename ParentMap>
+  void
+  sorted_mutating_kruskal(const Graph& g,
+                          ForwardIterator first_vertex,
+                          ForwardIterator last_vertex,
+                          EdgeList& edge_list, EdgeMapper edge_mapper,
+                          RankMap rank_map, ParentMap parent_map)
+  {
+    typedef disjoint_sets<RankMap, ParentMap> DisjointSets;
+
+    // Build and initialize disjoint-sets data structure
+    DisjointSets dset(rank_map, parent_map);
+    for (ForwardIterator v = first_vertex; v != last_vertex; ++v)
+      dset.make_set(*v);
+
+    is_not_msf_edge<Graph, DisjointSets, EdgeMapper>
+      remove_non_msf_edges(g, dset, edge_mapper);
+    edge_list.erase(std::remove_if(edge_list.begin(), edge_list.end(),
+                                   remove_non_msf_edges),
+                    edge_list.end());
+  }
+
+  /**
+   * Merge local minimum spanning forests from p processes into
+   * minimum spanning forests on p/D processes (where D is the tree
+   * factor, currently fixed at 3), eliminating unnecessary edges in
+   * the process.
+   *
+   * As with @ref boruvka_merge_step, this routine has many
+   * parameters, not all of which make sense within the limited
+   * context of this routine. The parameters are required for the
+   * Boruvka and local MSF merging steps to interoperate.
+   *
+   * \param pg The process group on which local minimum spanning
+   * forests should be merged. The top (D-1)p/D processes will be
+   * eliminated, and a new process subgroup containing p/D processors
+   * will be returned. The value D is a constant factor that is
+   * currently fixed to 3.
+   *
+   * \param g The underlying graph whose MSF is being computed. It must model
+   * the DistributedGraph concept.
+   *
+   * \param first_vertex Iterator to the first vertex in the graph
+   * that should be considered. While the local MSF merging algorithm
+   * typically operates on the entire vertex set, within the hybrid
+   * distributed MSF algorithms this will refer to the first
+   * supervertex.
+   *
+   * \param last_vertex The past-the-end iterator for the vertex list.
+   *
+   * \param edge_list The list of local edges that will be
+   * considered. For the p/D processes that remain, this list will
+   * contain edges in the MSF known to the vertex after other
+   * processes' edge lists have been merged. The edge list must be
+   * sorted in order of increasing weight.
+   *
+   * \param weight Property map containing the weights of each
+   * edge. The type of this property map must model
+   * ReadablePropertyMap and must support caching.
+   *
+   * \param global_index Mapping from vertex descriptors to a global
+   * index. The type must model ReadablePropertyMap.
+   *
+   * \param edge_mapper A function object that can remap edge descriptors
+   * in the edge list to any alternative edge descriptor. This
+   * function object will be the identity function when a pure merging
+   * of local MSFs is required, but may be a mapping to a supervertex
+   * edge when the local MSF merging occurs on a supervertex
+   * graph. This function object saves us the trouble of having to
+   * build a supervertex graph adaptor.
+   *
+   * \param already_local_msf True when the edge list already
+   * constitutes a local MSF. If false, Kruskal's algorithm will first
+   * be applied to the local edge list to select MSF edges.
+   *
+   * \returns The process subgroup containing the remaining p/D
+   * processes. If the size of this process group is greater than one,
+   * the MSF edges contained in the edge list do not constitute an MSF
+   * for the entire graph.
+   */
+  template<typename ProcessGroup, typename Graph, typename ForwardIterator,
+           typename EdgeList, typename WeightMap, typename GlobalIndexMap,
+           typename EdgeMapper>
+  ProcessGroup
+  merge_local_minimum_spanning_trees_step(ProcessGroup pg,
+                                          const Graph& g,
+                                          ForwardIterator first_vertex,
+                                          ForwardIterator last_vertex,
+                                          EdgeList& edge_list,
+                                          WeightMap weight,
+                                          GlobalIndexMap global_index,
+                                          EdgeMapper edge_mapper,
+                                          bool already_local_msf)
+  {
+    typedef typename ProcessGroup::process_id_type process_id_type;
+    typedef typename EdgeList::value_type edge_descriptor;
+    typedef typename property_traits<WeightMap>::value_type weight_type;
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+    // The tree factor, often called "D"
+    process_id_type const tree_factor = 3;
+    process_id_type num_procs = num_processes(pg);
+    process_id_type id = process_id(pg);
+    process_id_type procs_left = (num_procs + tree_factor - 1) / tree_factor;
+    std::size_t n = std::size_t(last_vertex - first_vertex);
+
+    if (!already_local_msf) {
+      // Compute local minimum spanning forest. We only care about the
+      // edges in the MSF, because only edges in the local MSF can be in
+      // the global MSF.
+      std::vector<std::size_t> ranks(n);
+      std::vector<vertex_descriptor> parents(n);
+      detail::sorted_mutating_kruskal
+        (g, first_vertex, last_vertex,
+         edge_list, edge_mapper,
+         make_iterator_property_map(ranks.begin(), global_index),
+         make_iterator_property_map(parents.begin(), global_index));
+    }
+
+    typedef std::pair<edge_descriptor, weight_type> w_edge;
+
+    // Order edges based on their weights.
+    indirect_cmp<WeightMap, std::less<weight_type> > cmp_edge_weight(weight);
+
+    if (id < procs_left) {
+      // The p/D processes that remain will receive local MSF edges from
+      // D-1 other processes.
+      synchronize(pg);
+      for (process_id_type from_id = procs_left + id; from_id < num_procs;
+           from_id += procs_left) {
+        std::size_t num_incoming_edges;
+        receive(pg, from_id, 0, num_incoming_edges);
+        if (num_incoming_edges > 0) {
+          std::vector<w_edge> incoming_edges(num_incoming_edges);
+          receive(pg, from_id, 1, &incoming_edges[0], num_incoming_edges);
+
+          edge_list.reserve(edge_list.size() + num_incoming_edges);
+          for (std::size_t i = 0; i < num_incoming_edges; ++i) {
+            cache(weight, incoming_edges[i].first, incoming_edges[i].second);
+            edge_list.push_back(incoming_edges[i].first);
+          }
+          std::inplace_merge(edge_list.begin(),
+                             edge_list.end() - num_incoming_edges,
+                             edge_list.end(),
+                             cmp_edge_weight);
+        }
+      }
+
+      // Compute the local MSF from union of the edges in the MSFs of
+      // all children.
+      std::vector<std::size_t> ranks(n);
+      std::vector<vertex_descriptor> parents(n);
+      detail::sorted_mutating_kruskal
+        (g, first_vertex, last_vertex,
+         edge_list, edge_mapper,
+         make_iterator_property_map(ranks.begin(), global_index),
+         make_iterator_property_map(parents.begin(), global_index));
+    } else {
+      // The (D-1)p/D processes that are dropping out of further
+      // computations merely send their MSF edges to their parent
+      // process in the process tree.
+      send(pg, id % procs_left, 0, edge_list.size());
+      if (edge_list.size() > 0) {
+        std::vector<w_edge> outgoing_edges;
+        outgoing_edges.reserve(edge_list.size());
+        for (std::size_t i = 0; i < edge_list.size(); ++i) {
+          outgoing_edges.push_back(std::make_pair(edge_list[i],
+                                                  get(weight, edge_list[i])));
+        }
+        send(pg, id % procs_left, 1, &outgoing_edges[0],
+             outgoing_edges.size());
+      }
+      synchronize(pg);
+    }
+
+    // Return a process subgroup containing the p/D parent processes
+    return process_subgroup(pg,
+                            make_counting_iterator(process_id_type(0)),
+                            make_counting_iterator(procs_left));
+  }
+} // end namespace detail
+
+// ---------------------------------------------------------------------
+// Dense Boruvka MSF algorithm
+// ---------------------------------------------------------------------
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename VertexIndexMap, typename RankMap, typename ParentMap,
+         typename SupervertexMap>
+OutputIterator
+dense_boruvka_minimum_spanning_tree(const Graph& g, WeightMap weight_map,
+                                    OutputIterator out,
+                                    VertexIndexMap index_map,
+                                    RankMap rank_map, ParentMap parent_map,
+                                    SupervertexMap supervertex_map)
+{
+  using boost::graph::parallel::process_group;
+
+  typedef typename graph_traits<Graph>::traversal_category traversal_category;
+
+  BOOST_STATIC_ASSERT((is_convertible<traversal_category*,
+                                      vertex_list_graph_tag*>::value));
+
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor  vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertex_iterator    vertex_iterator;
+  typedef typename graph_traits<Graph>::edge_descriptor    edge_descriptor;
+
+  // Don't throw away cached edge weights
+  weight_map.set_max_ghost_cells(0);
+
+  // Initialize the disjoint sets structures
+  disjoint_sets<RankMap, ParentMap> dset(rank_map, parent_map);
+  vertex_iterator vi, vi_end;
+  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
+    dset.make_set(*vi);
+
+  std::vector<vertex_descriptor> supervertices;
+  supervertices.assign(vertices(g).first, vertices(g).second);
+
+  // Use Kruskal's algorithm to find the minimum spanning forest
+  // considering only the local edges. The resulting edges are not
+  // necessarily going to be in the final minimum spanning
+  // forest. However, any edge not part of the local MSF cannot be a
+  // part of the global MSF, so we should have eliminated some edges
+  // from consideration.
+  std::vector<edge_descriptor> edge_list;
+  kruskal_minimum_spanning_tree
+    (make_vertex_and_edge_range(g, vertices(g).first, vertices(g).second,
+                                edges(g).first, edges(g).second),
+     std::back_inserter(edge_list),
+     boost::weight_map(weight_map).
+     vertex_index_map(index_map));
+
+  // While the number of supervertices is decreasing, keep executing
+  // Boruvka steps to identify additional MSF edges. This loop will
+  // execute log |V| times.
+  vertices_size_type old_num_supervertices;
+  do {
+    old_num_supervertices = supervertices.size();
+    out = detail::boruvka_merge_step(process_group(g), g,
+                                     weight_map, out,
+                                     dset, supervertex_map, supervertices,
+                                     edge_list);
+  } while (supervertices.size() < old_num_supervertices);
+
+  return out;
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename VertexIndex>
+OutputIterator
+dense_boruvka_minimum_spanning_tree(const Graph& g, WeightMap weight_map,
+                                    OutputIterator out, VertexIndex i_map)
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+  std::vector<std::size_t> ranks(num_vertices(g));
+  std::vector<vertex_descriptor> parents(num_vertices(g));
+  std::vector<std::size_t> supervertices(num_vertices(g));
+
+  return dense_boruvka_minimum_spanning_tree
+           (g, weight_map, out, i_map,
+            make_iterator_property_map(ranks.begin(), i_map),
+            make_iterator_property_map(parents.begin(), i_map),
+            make_iterator_property_map(supervertices.begin(), i_map));
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator>
+OutputIterator
+dense_boruvka_minimum_spanning_tree(const Graph& g, WeightMap weight_map,
+                                    OutputIterator out)
+{
+  return dense_boruvka_minimum_spanning_tree(g, weight_map, out,
+                                             get(vertex_index, g));
+}
+
+// ---------------------------------------------------------------------
+// Merge local MSFs MSF algorithm
+// ---------------------------------------------------------------------
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename GlobalIndexMap>
+OutputIterator
+merge_local_minimum_spanning_trees(const Graph& g, WeightMap weight,
+                                   OutputIterator out,
+                                   GlobalIndexMap global_index)
+{
+  using boost::graph::parallel::process_group_type;
+  using boost::graph::parallel::process_group;
+
+  typedef typename graph_traits<Graph>::traversal_category traversal_category;
+
+  BOOST_STATIC_ASSERT((is_convertible<traversal_category*,
+                                      vertex_list_graph_tag*>::value));
+
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+
+  // Don't throw away cached edge weights
+  weight.set_max_ghost_cells(0);
+
+  // Compute the initial local minimum spanning forests
+  std::vector<edge_descriptor> edge_list;
+  kruskal_minimum_spanning_tree
+    (make_vertex_and_edge_range(g, vertices(g).first, vertices(g).second,
+                                edges(g).first, edges(g).second),
+     std::back_inserter(edge_list),
+     boost::weight_map(weight).vertex_index_map(global_index));
+
+  // Merge the local MSFs from p processes into p/D processes,
+  // reducing the number of processes in each step. Continue looping
+  // until either (a) the current process drops out or (b) only one
+  // process remains in the group. This loop will execute log_D p
+  // times.
+  typename process_group_type<Graph>::type pg = process_group(g);
+  while (pg && num_processes(pg) > 1) {
+    pg = detail::merge_local_minimum_spanning_trees_step
+           (pg, g, vertices(g).first, vertices(g).second,
+            edge_list, weight, global_index,
+            detail::identity_function<edge_descriptor>(), true);
+  }
+
+  // Only process 0 has the entire edge list, so emit it to the output
+  // iterator.
+  if (pg && process_id(pg) == 0) {
+    out = std::copy(edge_list.begin(), edge_list.end(), out);
+  }
+
+  synchronize(process_group(g));
+  return out;
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator>
+inline OutputIterator
+merge_local_minimum_spanning_trees(const Graph& g, WeightMap weight,
+                                   OutputIterator out)
+{
+  return merge_local_minimum_spanning_trees(g, weight, out,
+                                            get(vertex_index, g));
+}
+
+// ---------------------------------------------------------------------
+// Boruvka-then-merge MSF algorithm
+// ---------------------------------------------------------------------
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename GlobalIndexMap, typename RankMap, typename ParentMap,
+         typename SupervertexMap>
+OutputIterator
+boruvka_then_merge(const Graph& g, WeightMap weight, OutputIterator out,
+                   GlobalIndexMap index, RankMap rank_map,
+                   ParentMap parent_map, SupervertexMap supervertex_map)
+{
+  using std::log;
+  using boost::graph::parallel::process_group_type;
+  using boost::graph::parallel::process_group;
+
+  typedef typename graph_traits<Graph>::traversal_category traversal_category;
+
+  BOOST_STATIC_ASSERT((is_convertible<traversal_category*,
+                                      vertex_list_graph_tag*>::value));
+
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor  vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertex_iterator    vertex_iterator;
+  typedef typename graph_traits<Graph>::edge_descriptor    edge_descriptor;
+
+  // Don't throw away cached edge weights
+  weight.set_max_ghost_cells(0);
+
+  // Compute the initial local minimum spanning forests
+  std::vector<edge_descriptor> edge_list;
+  kruskal_minimum_spanning_tree
+    (make_vertex_and_edge_range(g, vertices(g).first, vertices(g).second,
+                                edges(g).first, edges(g).second),
+     std::back_inserter(edge_list),
+     boost::weight_map(weight).
+     vertex_index_map(index));
+
+  // Initialize the disjoint sets structures for Boruvka steps
+  disjoint_sets<RankMap, ParentMap> dset(rank_map, parent_map);
+  vertex_iterator vi, vi_end;
+  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
+    dset.make_set(*vi);
+
+  // Construct the initial set of supervertices (all vertices)
+  std::vector<vertex_descriptor> supervertices;
+  supervertices.assign(vertices(g).first, vertices(g).second);
+
+  // Continue performing Boruvka merge steps until the number of
+  // supervertices reaches |V| / (log_D p)^2.
+  const std::size_t tree_factor = 3; // TBD: same as above! should be param
+  double log_d_p = log((double)num_processes(process_group(g)))
+                 / log((double)tree_factor);
+  vertices_size_type target_supervertices =
+    vertices_size_type(num_vertices(g) / (log_d_p * log_d_p));
+  vertices_size_type old_num_supervertices;
+  while (supervertices.size() > target_supervertices) {
+    old_num_supervertices = supervertices.size();
+    out = detail::boruvka_merge_step(process_group(g), g,
+                                     weight, out, dset,
+                                     supervertex_map, supervertices,
+                                     edge_list);
+    if (supervertices.size() == old_num_supervertices)
+      return out;
+  }
+
+  // Renumber the supervertices
+  for (std::size_t i = 0; i < supervertices.size(); ++i)
+    put(supervertex_map, supervertices[i], i);
+
+  // Merge local MSFs on the supervertices. (D-1)p/D processors drop
+  // out each iteration, so this loop executes log_D p times.
+  typename process_group_type<Graph>::type pg = process_group(g);
+  bool have_msf = false;
+  while (pg && num_processes(pg) > 1) {
+    pg = detail::merge_local_minimum_spanning_trees_step
+           (pg, g, supervertices.begin(), supervertices.end(),
+            edge_list, weight, supervertex_map,
+            detail::make_supervertex_edge_descriptor(g, dset),
+            have_msf);
+    have_msf = true;
+  }
+
+  // Only process 0 has the complete list of _supervertex_ MST edges,
+  // so emit those to the output iterator. This is not the complete
+  // list of edges in the MSF, however: the Boruvka steps in the
+  // beginning of the algorithm emitted any edges used to merge
+  // supervertices.
+  if (pg && process_id(pg) == 0)
+    out = std::copy(edge_list.begin(), edge_list.end(), out);
+
+  synchronize(process_group(g));
+  return out;
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename GlobalIndexMap>
+inline OutputIterator
+boruvka_then_merge(const Graph& g, WeightMap weight, OutputIterator out,
+                    GlobalIndexMap index)
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  std::vector<vertices_size_type> ranks(num_vertices(g));
+  std::vector<vertex_descriptor> parents(num_vertices(g));
+  std::vector<vertices_size_type> supervertex_indices(num_vertices(g));
+
+  return boruvka_then_merge
+           (g, weight, out, index,
+            make_iterator_property_map(ranks.begin(), index),
+            make_iterator_property_map(parents.begin(), index),
+            make_iterator_property_map(supervertex_indices.begin(), index));
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator>
+inline OutputIterator
+boruvka_then_merge(const Graph& g, WeightMap weight, OutputIterator out)
+{ return boruvka_then_merge(g, weight, out, get(vertex_index, g)); }
+
+// ---------------------------------------------------------------------
+// Boruvka-mixed-merge MSF algorithm
+// ---------------------------------------------------------------------
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename GlobalIndexMap, typename RankMap, typename ParentMap,
+         typename SupervertexMap>
+OutputIterator
+boruvka_mixed_merge(const Graph& g, WeightMap weight, OutputIterator out,
+                    GlobalIndexMap index, RankMap rank_map,
+                    ParentMap parent_map, SupervertexMap supervertex_map)
+{
+  using boost::graph::parallel::process_group_type;
+  using boost::graph::parallel::process_group;
+
+  typedef typename graph_traits<Graph>::traversal_category traversal_category;
+
+  BOOST_STATIC_ASSERT((is_convertible<traversal_category*,
+                                      vertex_list_graph_tag*>::value));
+
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor  vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertex_iterator    vertex_iterator;
+  typedef typename graph_traits<Graph>::edge_descriptor    edge_descriptor;
+
+  // Don't throw away cached edge weights
+  weight.set_max_ghost_cells(0);
+
+  // Initialize the disjoint sets structures for Boruvka steps
+  disjoint_sets<RankMap, ParentMap> dset(rank_map, parent_map);
+  vertex_iterator vi, vi_end;
+  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
+    dset.make_set(*vi);
+
+  // Construct the initial set of supervertices (all vertices)
+  std::vector<vertex_descriptor> supervertices;
+  supervertices.assign(vertices(g).first, vertices(g).second);
+
+  // Compute the initial local minimum spanning forests
+  std::vector<edge_descriptor> edge_list;
+  kruskal_minimum_spanning_tree
+    (make_vertex_and_edge_range(g, vertices(g).first, vertices(g).second,
+                                edges(g).first, edges(g).second),
+     std::back_inserter(edge_list),
+     boost::weight_map(weight).
+     vertex_index_map(index));
+
+  if (num_processes(process_group(g)) == 1) {
+    return std::copy(edge_list.begin(), edge_list.end(), out);
+  }
+
+  // Like the merging local MSFs algorithm and the Boruvka-then-merge
+  // algorithm, each iteration of this loop reduces the number of
+  // processes by a constant factor D, and therefore we require log_D
+  // p iterations. Note also that the number of edges in the edge list
+  // decreases geometrically, giving us an efficient distributed MSF
+  // algorithm.
+  typename process_group_type<Graph>::type pg = process_group(g);
+  vertices_size_type old_num_supervertices;
+  while (pg && num_processes(pg) > 1) {
+    // A single Boruvka step. If this doesn't change anything, we're done
+    old_num_supervertices = supervertices.size();
+    out = detail::boruvka_merge_step(pg, g, weight, out, dset,
+                                     supervertex_map, supervertices,
+                                     edge_list);
+    if (old_num_supervertices == supervertices.size()) {
+      edge_list.clear();
+      break;
+    }
+
+    // Renumber the supervertices
+    for (std::size_t i = 0; i < supervertices.size(); ++i)
+      put(supervertex_map, supervertices[i], i);
+
+    // A single merging of local MSTs, which reduces the number of
+    // processes we're using by a constant factor D.
+    pg = detail::merge_local_minimum_spanning_trees_step
+           (pg, g, supervertices.begin(), supervertices.end(),
+            edge_list, weight, supervertex_map,
+            detail::make_supervertex_edge_descriptor(g, dset),
+            true);
+
+  }
+
+  // Only process 0 has the complete edge list, so emit it for the
+  // user. Note that list edge list only contains the MSF edges in the
+  // final supervertex graph: all of the other edges were used to
+  // merge supervertices and have been emitted by the Boruvka steps,
+  // although only process 0 has received the complete set.
+  if (pg && process_id(pg) == 0)
+    out = std::copy(edge_list.begin(), edge_list.end(), out);
+
+  synchronize(process_group(g));
+  return out;
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator,
+         typename GlobalIndexMap>
+inline OutputIterator
+boruvka_mixed_merge(const Graph& g, WeightMap weight, OutputIterator out,
+                    GlobalIndexMap index)
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  std::vector<vertices_size_type> ranks(num_vertices(g));
+  std::vector<vertex_descriptor> parents(num_vertices(g));
+  std::vector<vertices_size_type> supervertex_indices(num_vertices(g));
+
+  return boruvka_mixed_merge
+           (g, weight, out, index,
+            make_iterator_property_map(ranks.begin(), index),
+            make_iterator_property_map(parents.begin(), index),
+            make_iterator_property_map(supervertex_indices.begin(), index));
+}
+
+template<typename Graph, typename WeightMap, typename OutputIterator>
+inline OutputIterator
+boruvka_mixed_merge(const Graph& g, WeightMap weight, OutputIterator out)
+{ return boruvka_mixed_merge(g, weight, out, get(vertex_index, g)); }
+
+} // end namespace distributed
+
+using distributed::dense_boruvka_minimum_spanning_tree;
+using distributed::merge_local_minimum_spanning_trees;
+using distributed::boruvka_then_merge;
+using distributed::boruvka_mixed_merge;
+
+} } // end namespace boost::graph
+
+
+#endif // BOOST_DEHNE_GOTZ_MIN_SPANNING_TREE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/delta_stepping_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/delta_stepping_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..ab1655b
--- /dev/null
@@ -0,0 +1,513 @@
+// Copyright (C) 2007 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+/**************************************************************************
+ * This source file implements the Delta-stepping algorithm:              *
+ *                                                                        *
+ *   Ulrich Meyer and Peter Sanders. Parallel Shortest Path for Arbitrary *
+ *   Graphs. In Proceedings from the 6th International Euro-Par           *
+ *   Conference on Parallel Processing, pages 461--470, 2000.             *
+ *                                                                        * 
+ *   Ulrich Meyer, Peter Sanders: [Delta]-stepping: A Parallelizable      *
+ *   Shortest Path Algorithm. J. Algorithms 49(1): 114-152, 2003.         *
+ *                                                                        *
+ * There are several potential optimizations we could still perform for   *
+ * this algorithm implementation:                                         *
+ *                                                                        *
+ *   - Implement "shortcuts", which bound the number of reinsertions      *
+ *     in a single bucket (to one). The computation of shortcuts looks    *
+ *     expensive in a distributed-memory setting, but it could be         *
+ *     ammortized over many queries.                                      *
+ *                                                                        *
+ *   - The size of the "buckets" data structure can be bounded to         *
+ *     max_edge_weight/delta buckets, if we treat the buckets as a        *
+ *     circular array.                                                    *
+ *                                                                        *
+ *   - If we partition light/heavy edges ahead of time, we could improve  *
+ *     relaxation performance by only iterating over the right portion    *
+ *     of the out-edge list each time.                                    *
+ *                                                                        *
+ *   - Implement a more sophisticated algorithm for guessing "delta",     *
+ *     based on the shortcut-finding algorithm.                           *
+ **************************************************************************/
+#ifndef BOOST_GRAPH_DELTA_STEPPING_SHORTEST_PATHS_HPP
+#define BOOST_GRAPH_DELTA_STEPPING_SHORTEST_PATHS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/config.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <limits>
+#include <list>
+#include <vector>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>
+#include <utility> // for std::pair
+#include <functional> // for std::logical_or
+#include <boost/graph/parallel/algorithm.hpp> // for all_reduce
+#include <cassert>
+#include <algorithm> // for std::min, std::max
+#include <boost/graph/parallel/simple_trigger.hpp>
+
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+#  include <iostream> // for std::cerr
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+class delta_stepping_impl {
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<Graph>::degree_size_type Degree;
+  typedef typename property_traits<EdgeWeightMap>::value_type Dist;
+  typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+    ProcessGroup;
+
+  typedef std::list<Vertex> Bucket;
+  typedef typename Bucket::iterator BucketIterator;
+  typedef typename std::vector<Bucket*>::size_type BucketIndex;
+
+  typedef detail::dijkstra_msg_value<DistanceMap, PredecessorMap> MessageValue;
+
+  enum { 
+    // Relax a remote vertex. The message contains a pair<Vertex,
+    // MessageValue>, the first part of which is the vertex whose
+    // tentative distance is being relaxed and the second part
+    // contains either the new distance (if there is no predecessor
+    // map) or a pair with the distance and predecessor.
+    msg_relax 
+  };
+
+public:
+  delta_stepping_impl(const Graph& g,
+                      PredecessorMap predecessor, 
+                      DistanceMap distance, 
+                      EdgeWeightMap weight,
+                      Dist delta);
+
+  delta_stepping_impl(const Graph& g,
+                      PredecessorMap predecessor, 
+                      DistanceMap distance, 
+                      EdgeWeightMap weight);
+
+  void run(Vertex s);
+
+private:
+  // Relax the edge (u, v), creating a new best path of distance x.
+  void relax(Vertex u, Vertex v, Dist x);
+
+  // Synchronize all of the processes, by receiving all messages that
+  // have not yet been received.
+  void synchronize();
+
+  // Handle a relax message that contains only the target and
+  // distance. This kind of message will be received when the
+  // predecessor map is a dummy_property_map.
+  void handle_relax_message(Vertex v, Dist x) { relax(v, v, x); }
+
+  // Handle a relax message that contains the source (predecessor),
+  // target, and distance. This kind of message will be received when
+  // the predecessor map is not a dummy_property_map.
+  void handle_relax_message(Vertex v, const std::pair<Dist, Vertex>& p)
+  { relax(p.second, v, p.first); }
+  
+  // Setup triggers for msg_relax messages
+  void setup_triggers();
+
+  void handle_msg_relax(int /*source*/, int /*tag*/,
+                        const std::pair<Vertex, typename MessageValue::type>& data,
+                        trigger_receive_context)
+  { handle_relax_message(data.first, data.second); }
+
+  const Graph& g;
+  PredecessorMap predecessor;
+  DistanceMap distance;
+  EdgeWeightMap weight;
+  Dist delta;
+  ProcessGroup pg;
+  typename property_map<Graph, vertex_owner_t>::const_type owner;
+  typename property_map<Graph, vertex_local_t>::const_type local;
+
+  // A "property map" that contains the position of each vertex in
+  // whatever bucket it resides in.
+  std::vector<BucketIterator> position_in_bucket;
+
+  // Bucket data structure. The ith bucket contains all local vertices
+  // with (tentative) distance in the range [i*delta,
+  // (i+1)*delta). 
+  std::vector<Bucket*> buckets;
+
+  // This "dummy" list is used only so that we can initialize the
+  // position_in_bucket property map with non-singular iterators. This
+  // won't matter for most implementations of the C++ Standard
+  // Library, but it avoids undefined behavior and allows us to run
+  // with library "debug modes".
+  std::list<Vertex> dummy_list;
+
+  // A "property map" that states which vertices have been deleted
+  // from the bucket in this iteration.
+  std::vector<bool> vertex_was_deleted;
+};
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+delta_stepping_impl(const Graph& g,
+                    PredecessorMap predecessor, 
+                    DistanceMap distance, 
+                    EdgeWeightMap weight,
+                    Dist delta)
+    : g(g),
+      predecessor(predecessor),
+      distance(distance),
+      weight(weight),
+      delta(delta),
+      pg(boost::graph::parallel::process_group_adl(g), attach_distributed_object()),
+      owner(get(vertex_owner, g)),
+      local(get(vertex_local, g))
+{
+  setup_triggers();
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+delta_stepping_impl(const Graph& g,
+                    PredecessorMap predecessor, 
+                    DistanceMap distance, 
+                    EdgeWeightMap weight)
+    : g(g),
+      predecessor(predecessor),
+      distance(distance),
+      weight(weight),
+      pg(boost::graph::parallel::process_group_adl(g), attach_distributed_object()),
+      owner(get(vertex_owner, g)),
+      local(get(vertex_local, g))
+{
+  using boost::parallel::all_reduce;
+  using boost::parallel::maximum;
+  using std::max;
+
+  // Compute the maximum edge weight and degree
+  Dist max_edge_weight = 0;
+  Degree max_degree = 0;
+  BGL_FORALL_VERTICES_T(u, g, Graph) {
+    max_degree = max BOOST_PREVENT_MACRO_SUBSTITUTION (max_degree, out_degree(u, g));
+    BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+      max_edge_weight = max BOOST_PREVENT_MACRO_SUBSTITUTION (max_edge_weight, get(weight, e));
+  }
+
+  max_edge_weight = all_reduce(pg, max_edge_weight, maximum<Dist>());
+  max_degree = all_reduce(pg, max_degree, maximum<Degree>());
+
+  // Take a guess at delta, based on what works well for random
+  // graphs.
+  delta = max_edge_weight / max_degree;
+  if (delta == 0)
+    delta = 1;
+
+  setup_triggers();
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+run(Vertex s)
+{
+  Dist inf = (std::numeric_limits<Dist>::max)();
+
+  // None of the vertices are stored in the bucket.
+  position_in_bucket.clear();
+  position_in_bucket.resize(num_vertices(g), dummy_list.end());
+
+  // None of the vertices have been deleted
+  vertex_was_deleted.clear();
+  vertex_was_deleted.resize(num_vertices(g), false);
+
+  // No path from s to any other vertex, yet
+  BGL_FORALL_VERTICES_T(v, g, Graph)
+    put(distance, v, inf);
+
+  // The distance to the starting node is zero
+  if (get(owner, s) == process_id(pg))
+    // Put "s" into its bucket (bucket 0)
+    relax(s, s, 0);
+  else
+    // Note that we know the distance to s is zero
+    cache(distance, s, 0);
+
+  BucketIndex max_bucket = (std::numeric_limits<BucketIndex>::max)();
+  BucketIndex current_bucket = 0;
+  do {
+    // Synchronize with all of the other processes.
+    synchronize();
+
+    // Find the next bucket that has something in it.
+    while (current_bucket < buckets.size() 
+           && (!buckets[current_bucket] || buckets[current_bucket]->empty()))
+      ++current_bucket;
+    if (current_bucket >= buckets.size())
+      current_bucket = max_bucket;
+
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+    std::cerr << "#" << process_id(pg) << ": lowest bucket is #" 
+              << current_bucket << std::endl;
+#endif
+    // Find the smallest bucket (over all processes) that has vertices
+    // that need to be processed.
+    using boost::parallel::all_reduce;
+    using boost::parallel::minimum;
+    current_bucket = all_reduce(pg, current_bucket, minimum<BucketIndex>());
+
+    if (current_bucket == max_bucket)
+      // There are no non-empty buckets in any process; exit. 
+      break;
+
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+    if (process_id(pg) == 0)
+      std::cerr << "Processing bucket #" << current_bucket << std::endl;
+#endif
+
+    // Contains the set of vertices that have been deleted in the
+    // relaxation of "light" edges. Note that we keep track of which
+    // vertices were deleted with the property map
+    // "vertex_was_deleted".
+    std::vector<Vertex> deleted_vertices;
+
+    // Repeatedly relax light edges
+    bool nonempty_bucket;
+    do {
+      // Someone has work to do in this bucket.
+
+      if (current_bucket < buckets.size() && buckets[current_bucket]) {
+        Bucket& bucket = *buckets[current_bucket];
+        // For each element in the bucket
+        while (!bucket.empty()) {
+          Vertex u = bucket.front();
+
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+          std::cerr << "#" << process_id(pg) << ": processing vertex " 
+                    << get(vertex_global, g, u).second << "@" 
+                    << get(vertex_global, g, u).first
+                    << std::endl;
+#endif
+
+          // Remove u from the front of the bucket
+          bucket.pop_front();
+          
+          // Insert u into the set of deleted vertices, if it hasn't
+          // been done already.
+          if (!vertex_was_deleted[get(local, u)]) {
+            vertex_was_deleted[get(local, u)] = true;
+            deleted_vertices.push_back(u);
+          }
+
+          // Relax each light edge. 
+          Dist u_dist = get(distance, u);
+          BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+            if (get(weight, e) <= delta) // light edge
+              relax(u, target(e, g), u_dist + get(weight, e));
+        }
+      }
+
+      // Synchronize with all of the other processes.
+      synchronize();
+
+      // Is the bucket empty now?
+      nonempty_bucket = (current_bucket < buckets.size() 
+                         && buckets[current_bucket]
+                         && !buckets[current_bucket]->empty());
+     } while (all_reduce(pg, nonempty_bucket, std::logical_or<bool>()));
+
+    // Relax heavy edges for each of the vertices that we previously
+    // deleted.
+    for (typename std::vector<Vertex>::iterator iter = deleted_vertices.begin();
+         iter != deleted_vertices.end(); ++iter) {
+      // Relax each heavy edge. 
+      Vertex u = *iter;
+      Dist u_dist = get(distance, u);
+      BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+        if (get(weight, e) > delta) // heavy edge
+          relax(u, target(e, g), u_dist + get(weight, e)); 
+    }
+
+    // Go to the next bucket: the current bucket must already be empty.
+    ++current_bucket;
+  } while (true);
+
+  // Delete all of the buckets.
+  for (typename std::vector<Bucket*>::iterator iter = buckets.begin();
+       iter != buckets.end(); ++iter) {
+    if (*iter) {
+      delete *iter;
+      *iter = 0;
+    }
+  }
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+relax(Vertex u, Vertex v, Dist x) 
+{
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+  std::cerr << "#" << process_id(pg) << ": relax(" 
+            << get(vertex_global, g, u).second << "@" 
+            << get(vertex_global, g, u).first << ", " 
+            << get(vertex_global, g, v).second << "@" 
+            << get(vertex_global, g, v).first << ", "
+            << x << ")" << std::endl;
+#endif
+
+  if (x < get(distance, v)) {
+    // We're relaxing the edge to vertex v.
+    if (get(owner, v) == process_id(pg)) {
+      // Compute the new bucket index for v
+      BucketIndex new_index = static_cast<BucketIndex>(x / delta);
+      
+      // Make sure there is enough room in the buckets data structure.
+      if (new_index >= buckets.size()) buckets.resize(new_index + 1, 0);
+
+      // Make sure that we have allocated the bucket itself.
+      if (!buckets[new_index]) buckets[new_index] = new Bucket;
+
+      if (get(distance, v) != (std::numeric_limits<Dist>::max)()
+          && !vertex_was_deleted[get(local, v)]) {
+        // We're moving v from an old bucket into a new one. Compute
+        // the old index, then splice it in.
+        BucketIndex old_index 
+          = static_cast<BucketIndex>(get(distance, v) / delta);
+        buckets[new_index]->splice(buckets[new_index]->end(),
+                                   *buckets[old_index],
+                                   position_in_bucket[get(local, v)]);
+      } else {
+        // We're inserting v into a bucket for the first time. Put it
+        // at the end.
+        buckets[new_index]->push_back(v);
+      }
+
+      // v is now at the last position in the new bucket
+      position_in_bucket[get(local, v)] = buckets[new_index]->end();
+      --position_in_bucket[get(local, v)];
+
+      // Update predecessor and tentative distance information
+      put(predecessor, v, u);
+      put(distance, v, x);
+    } else {
+#ifdef PBGL_DELTA_STEPPING_DEBUG
+      std::cerr << "#" << process_id(pg) << ": sending relax(" 
+                << get(vertex_global, g, u).second << "@" 
+                << get(vertex_global, g, u).first << ", " 
+                << get(vertex_global, g, v).second << "@" 
+                << get(vertex_global, g, v).first << ", "
+            << x << ") to " << get(owner, v) << std::endl;
+      
+#endif
+      // The vertex is remote: send a request to the vertex's owner
+      send(pg, get(owner, v), msg_relax, 
+           std::make_pair(v, MessageValue::create(x, u)));
+
+      // Cache tentative distance information
+      cache(distance, v, x);
+    }
+  }
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+synchronize()
+{
+  using boost::graph::parallel::synchronize;
+
+  // Synchronize at the process group level.
+  synchronize(pg);
+
+  // Receive any relaxation request messages.
+//   typedef typename ProcessGroup::process_id_type process_id_type;
+//   while (optional<std::pair<process_id_type, int> > stp = probe(pg)) {
+//     // Receive the relaxation message
+//     assert(stp->second == msg_relax);
+//     std::pair<Vertex, typename MessageValue::type> data;
+//     receive(pg, stp->first, stp->second, data);
+
+//     // Turn it into a "relax" call
+//     handle_relax_message(data.first, data.second);
+//   }
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void 
+delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>::
+setup_triggers() 
+{
+  using boost::graph::parallel::simple_trigger;
+        
+  simple_trigger(pg, msg_relax, this, 
+                 &delta_stepping_impl::handle_msg_relax);
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void 
+delta_stepping_shortest_paths
+  (const Graph& g,
+   typename graph_traits<Graph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, EdgeWeightMap weight,
+   typename property_traits<EdgeWeightMap>::value_type delta)
+{
+  // The "distance" map needs to act like one, retrieving the default
+  // value of infinity.
+  set_property_map_role(vertex_distance, distance);
+
+  // Construct the implementation object, which will perform all of
+  // the actual work.
+  delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>
+    impl(g, predecessor, distance, weight, delta);
+
+  // Run the delta-stepping algorithm. The results will show up in
+  // "predecessor" and "weight".
+  impl.run(s);
+}
+
+template<typename Graph, typename PredecessorMap, typename DistanceMap, 
+         typename EdgeWeightMap>
+void 
+delta_stepping_shortest_paths
+  (const Graph& g,
+   typename graph_traits<Graph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, EdgeWeightMap weight)
+{
+  // The "distance" map needs to act like one, retrieving the default
+  // value of infinity.
+  set_property_map_role(vertex_distance, distance);
+
+  // Construct the implementation object, which will perform all of
+  // the actual work.
+  delta_stepping_impl<Graph, PredecessorMap, DistanceMap, EdgeWeightMap>
+    impl(g, predecessor, distance, weight);
+
+  // Run the delta-stepping algorithm. The results will show up in
+  // "predecessor" and "weight".
+  impl.run(s);
+}
+   
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_DELTA_STEPPING_SHORTEST_PATHS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/depth_first_search.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/depth_first_search.hpp
new file mode 100644 (file)
index 0000000..b6d49c5
--- /dev/null
@@ -0,0 +1,306 @@
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_DFS_HPP
+#define BOOST_GRAPH_DISTRIBUTED_DFS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+namespace boost {
+  namespace graph { namespace distributed { namespace detail {
+    template<typename DistributedGraph, typename ColorMap, typename ParentMap,
+             typename ExploreMap, typename VertexIndexMap, typename DFSVisitor>
+    class parallel_dfs
+    {
+      typedef typename graph_traits<DistributedGraph>::vertex_iterator
+        vertex_iterator;
+      typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+        vertex_descriptor;
+      typedef typename graph_traits<DistributedGraph>::out_edge_iterator
+        out_edge_iterator;
+
+      typedef typename boost::graph::parallel::process_group_type<DistributedGraph>
+        ::type process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+
+      /**
+       * The first vertex in the pair is the local node (i) and the
+       * second vertex in the pair is the (possibly remote) node (j).
+       */
+      typedef boost::parallel::detail::untracked_pair<vertex_descriptor, vertex_descriptor> vertex_pair;
+
+      typedef typename property_traits<ColorMap>::value_type color_type;
+      typedef color_traits<color_type> Color;
+
+      // Message types
+      enum { discover_msg = 10, return_msg = 50, visited_msg = 100 , done_msg = 150};
+        
+
+    public:
+      parallel_dfs(const DistributedGraph& g, ColorMap color,
+                   ParentMap parent, ExploreMap explore,
+                   VertexIndexMap index_map, DFSVisitor vis)
+        : g(g), color(color), parent(parent), explore(explore),
+          index_map(index_map), vis(vis), pg(process_group(g)),
+          owner(get(vertex_owner, g)), next_out_edge(num_vertices(g))
+      { }
+
+      void run(vertex_descriptor s)
+      {
+        vertex_iterator vi, vi_end;
+        for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
+          put(color, *vi, Color::white());
+          put(parent, *vi, *vi); 
+          put(explore, *vi, *vi);
+          next_out_edge[get(index_map, *vi)] = out_edges(*vi, g).first;
+          vis.initialize_vertex(*vi, g);
+        }
+
+        vis.start_vertex(s, g);
+        
+        if (get(owner, s) == process_id(pg)) {
+          send_oob(pg, get(owner, s), discover_msg, vertex_pair(s, s));
+        }
+        
+        bool done = false;
+        while (!done) {
+          std::pair<process_id_type, int> msg = *pg.poll(true);
+
+          switch (msg.second) {
+          case discover_msg:
+            {
+              vertex_pair p;
+              receive_oob(pg, msg.first, msg.second, p);
+
+              if (p.first != p.second) {
+                // delete j from nomessage(j)
+                if (get(color, p.second) != Color::black())
+                  local_put(color, p.second, Color::gray());
+
+                if (recover(p)) break;
+              }
+
+              if (get(color, p.first) == Color::white()) {
+                put(color, p.first, Color::gray());
+                put(parent, p.first, p.second);
+
+                vis.discover_vertex(p.first, g);
+
+                if (shift_center_of_activity(p.first)) break;
+                
+                out_edge_iterator ei, ei_end;
+                for (tie(ei,ei_end) = out_edges(p.first, g); ei != ei_end; ++ei)
+                {
+                  // Notify everyone who may not know that the source
+                  // vertex has been visited. They can then mark the
+                  // corresponding color map entry gray.
+                  if (get(parent, p.first) != target(*ei, g)
+                      && get(explore, p.first) != target(*ei, g)) {
+                    vertex_pair visit(target(*ei, g), p.first);
+                    
+                    send_oob(pg, get(owner, target(*ei, g)), visited_msg, visit);
+                  }
+                }
+              }
+            }
+            break;
+            
+          case visited_msg:
+            {
+              vertex_pair p;
+              receive_oob(pg, msg.first, msg.second, p);
+              
+              // delete j from nomessage(j)
+              if (get(color, p.second) != Color::black())
+                local_put(color, p.second, Color::gray());
+
+              recover(p);
+            }
+            break;
+            
+          case return_msg:
+            {
+              vertex_pair p;
+              receive_oob(pg, msg.first, msg.second, p);
+              
+              // delete j from nomessage(i)
+              local_put(color, p.second, Color::black());
+
+              shift_center_of_activity(p.first);
+            }
+            break;
+            
+          case done_msg:
+            {
+              receive_oob(pg, msg.first, msg.second, done);
+
+              // Propagate done message downward in tree
+              done = true;
+              process_id_type id = process_id(pg);
+              process_id_type left = 2*id + 1;
+              process_id_type right = left + 1;
+              if (left < num_processes(pg))
+                send_oob(pg, left, done_msg, done);
+              if (right < num_processes(pg))
+                send_oob(pg, right, done_msg, done);
+            }
+            break;
+
+          default:
+            assert(false);
+          }
+        }
+      }
+      
+    private:
+      bool recover(const vertex_pair& p)
+      {
+        if (get(explore, p.first) == p.second) {
+          return shift_center_of_activity(p.first);
+        }
+        else
+          return false;
+      }
+      
+      bool shift_center_of_activity(vertex_descriptor i)
+      {
+        for (out_edge_iterator ei = next_out_edge[get(index_map, i)],
+                               ei_end = out_edges(i, g).second;
+             ei != ei_end; ++ei) {
+          vis.examine_edge(*ei, g);
+
+          vertex_descriptor k = target(*ei, g);
+          color_type target_color = get(color, k);
+          if (target_color == Color::black()) vis.forward_or_cross_edge(*ei, g);
+          else if (target_color == Color::gray()) vis.back_edge(*ei, g);
+          else {
+            put(explore, i, k);
+            vis.tree_edge(*ei, g);
+            vertex_pair p(k, i);
+            send_oob(pg, get(owner, k), discover_msg, p);
+            next_out_edge[get(index_map, i)] = ++ei;
+            return false;
+          } 
+        }
+
+        next_out_edge[get(index_map, i)] = out_edges(i, g).second;
+        put(explore, i, i);
+        put(color, i, Color::black());
+        vis.finish_vertex(i, g);
+          
+        if (get(parent, i) == i) {
+          send_oob(pg, 0, done_msg, true);
+          return true;
+        }
+        else {
+          vertex_pair ret(get(parent, i), i);
+          send_oob(pg, get(owner, ret.first), return_msg, ret);
+        }
+        return false;
+      }
+
+      const DistributedGraph& g; 
+      ColorMap color;
+      ParentMap parent; 
+      ExploreMap explore;
+      VertexIndexMap index_map;
+      DFSVisitor vis;
+      process_group_type pg;
+      typename property_map<DistributedGraph, vertex_owner_t>::const_type owner;
+      std::vector<out_edge_iterator> next_out_edge; 
+    };
+  } // end namespace detail
+
+  template<typename DistributedGraph, typename ColorMap, typename ParentMap,
+           typename ExploreMap, typename VertexIndexMap, typename DFSVisitor>
+  void
+  tsin_depth_first_visit
+    (const DistributedGraph& g,
+     typename graph_traits<DistributedGraph>::vertex_descriptor s,
+     DFSVisitor vis, ColorMap color, ParentMap parent, ExploreMap explore, 
+     VertexIndexMap index_map)
+  {
+    typedef typename graph_traits<DistributedGraph>::directed_category
+      directed_category;
+    BOOST_STATIC_ASSERT(
+      (is_convertible<directed_category, undirected_tag>::value));
+
+    set_property_map_role(vertex_color, color);
+    graph::distributed::detail::parallel_dfs
+      <DistributedGraph, ColorMap, ParentMap, ExploreMap, VertexIndexMap, 
+       DFSVisitor> do_dfs(g, color, parent, explore, index_map, vis);
+    do_dfs.run(s);
+
+    using boost::graph::parallel::process_group;
+    synchronize(process_group(g));
+  }
+    
+  template<typename DistributedGraph, typename DFSVisitor, 
+           typename VertexIndexMap>
+  void
+  tsin_depth_first_visit
+    (const DistributedGraph& g,
+     typename graph_traits<DistributedGraph>::vertex_descriptor s,
+     DFSVisitor vis,
+     VertexIndexMap index_map)
+  {
+    typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+      vertex_descriptor;
+
+    std::vector<default_color_type> colors(num_vertices(g));
+    std::vector<vertex_descriptor> parent(num_vertices(g));
+    std::vector<vertex_descriptor> explore(num_vertices(g));
+    tsin_depth_first_visit
+      (g, s,
+       vis,
+       make_iterator_property_map(colors.begin(), index_map),
+       make_iterator_property_map(parent.begin(), index_map),
+       make_iterator_property_map(explore.begin(), index_map),
+       index_map);
+  }
+
+  template<typename DistributedGraph, typename DFSVisitor, 
+           typename VertexIndexMap>
+  void
+  tsin_depth_first_visit
+    (const DistributedGraph& g,
+     typename graph_traits<DistributedGraph>::vertex_descriptor s,
+     DFSVisitor vis)
+  {
+    tsin_depth_first_visit(g, s, vis, get(vertex_index, g));
+  }
+} // end namespace distributed
+
+using distributed::tsin_depth_first_visit;
+
+} // end namespace graph
+
+template<typename DistributedGraph, typename DFSVisitor>
+void
+depth_first_visit
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   DFSVisitor vis)
+{
+  graph::tsin_depth_first_visit(g, s, vis, get(vertex_index, g));
+}
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_DISTRIBUTED_DFS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/dijkstra_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/dijkstra_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..0597689
--- /dev/null
@@ -0,0 +1,50 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_DIJKSTRA_DETAIL_HPP
+#define BOOST_GRAPH_PARALLEL_DIJKSTRA_DETAIL_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/property_map/property_map.hpp>
+
+namespace boost { namespace graph { namespace distributed { namespace detail {
+
+/**********************************************************************
+ * Dijkstra queue message data                                        *
+ **********************************************************************/
+template<typename DistanceMap, typename PredecessorMap>
+class dijkstra_msg_value
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+  typedef typename property_traits<PredecessorMap>::value_type
+    predecessor_type;
+
+public:
+  typedef std::pair<distance_type, predecessor_type> type;
+
+  static type create(distance_type dist, predecessor_type pred)
+  { return std::make_pair(dist, pred); }
+};
+
+template<typename DistanceMap>
+class dijkstra_msg_value<DistanceMap, dummy_property_map>
+{
+  typedef typename property_traits<DistanceMap>::key_type vertex_descriptor;
+public:
+  typedef typename property_traits<DistanceMap>::value_type type;
+
+  static type create(type dist, vertex_descriptor) { return dist; }
+};
+/**********************************************************************/
+
+} } } } // end namespace boost::graph::distributed::detail
+
+#endif // BOOST_GRAPH_PARALLEL_DIJKSTRA_DETAIL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/filtered_queue.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/filtered_queue.hpp
new file mode 100644 (file)
index 0000000..9871b70
--- /dev/null
@@ -0,0 +1,108 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_FILTERED_QUEUE_HPP
+#define BOOST_FILTERED_QUEUE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <algorithm>
+
+namespace boost {
+
+/** Queue adaptor that filters elements pushed into the queue
+ * according to some predicate.
+ */
+template<typename Buffer, typename Predicate>
+class filtered_queue
+{
+ public:
+  typedef Buffer                      buffer_type;
+  typedef Predicate                   predicate_type;
+  typedef typename Buffer::value_type value_type;
+  typedef typename Buffer::size_type  size_type;
+
+  /**
+   * Constructs a new filtered queue with an initial buffer and a
+   * predicate.
+   *
+   * @param buffer the initial buffer
+   * @param pred the predicate
+   */
+  explicit
+  filtered_queue(const buffer_type& buffer = buffer_type(),
+                 const predicate_type& pred = predicate_type())
+    : buffer(buffer), pred(pred) {}
+
+  /** Push a value into the queue.
+   *
+   *  If the predicate returns @c true for @p x, pushes @p x into the
+   *  buffer.
+   */
+  void push(const value_type& x)  { if (pred(x)) buffer.push(x); }
+
+  /** Pop the front element off the buffer.
+   *
+   * @pre @c !empty()
+   */
+  void pop()                      { buffer.pop(); }
+
+  /** Retrieve the front (top) element in the buffer.
+   *
+   * @pre @c !empty()
+   */
+  value_type& top()               { return buffer.top(); }
+
+  /**
+   * \overload
+   */
+  const value_type& top() const   { return buffer.top(); }
+
+  /** Determine the number of elements in the buffer. */
+  size_type size() const          { return buffer.size(); }
+
+  /** Determine if the buffer is empty. */
+  bool empty() const              { return buffer.empty(); }
+
+  /** Get a reference to the underlying buffer. */
+  buffer_type& base()             { return buffer; }
+  const buffer_type& base() const { return buffer; }
+
+  /** Swap the contents of this with @p other. */
+  void swap(filtered_queue& other)
+  {
+    using std::swap;
+    swap(buffer, other.buffer);
+    swap(pred, other.pred);
+  }
+
+ private:
+  buffer_type buffer;
+  predicate_type pred;
+};
+
+/** Create a filtered queue. */
+template<typename Buffer, typename Predicate>
+inline filtered_queue<Buffer, Predicate>
+make_filtered_queue(const Buffer& buffer, const Predicate& pred)
+{ return filtered_queue<Buffer, Predicate>(buffer, pred); }
+
+/** Swap a filtered_queue. */
+template<typename Buffer, typename Predicate>
+inline void
+swap(filtered_queue<Buffer, Predicate>& x,
+     filtered_queue<Buffer, Predicate>& y)
+{
+  x.swap(y);
+}
+
+} // end namespace boost
+
+#endif // BOOST_FILTERED_QUEUE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/mpi_process_group.ipp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/mpi_process_group.ipp
new file mode 100644 (file)
index 0000000..95ee21f
--- /dev/null
@@ -0,0 +1,1006 @@
+// -*- C++ -*-
+
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+// Copyright (C) 2007  Douglas Gregor <doug.gregor@gmail.com>
+// Copyright (C) 2007  Matthias Troyer  <troyer@boost-consulting.com>
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+//           Matthias Troyer
+
+//#define PBGL_PROCESS_GROUP_DEBUG
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <cassert>
+#include <algorithm>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+#include <numeric>
+#include <iterator>
+#include <functional>
+#include <vector>
+#include <queue>
+#include <stack>
+#include <boost/graph/distributed/detail/tag_allocator.hpp>
+
+// #define PBGL_PROCESS_GROUP_DEBUG
+
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+#  include <iostream>
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+
+struct mpi_process_group::impl
+{
+  
+  typedef mpi_process_group::message_header message_header;
+  typedef mpi_process_group::outgoing_messages outgoing_messages;
+
+  /**
+   * Stores the incoming messages from a particular processor.
+   *
+   * @todo Evaluate whether we should use a deque instance, which
+   * would reduce could reduce the cost of "receiving" messages and
+     allow us to deallocate memory earlier, but increases the time
+     spent in the synchronization step.
+   */
+  struct incoming_messages {
+    incoming_messages();
+    ~incoming_messages() {}
+
+    std::vector<message_header> headers;
+    buffer_type                 buffer;
+    std::vector<std::vector<message_header>::iterator> next_header;
+  };
+
+  struct batch_request {
+    MPI_Request request;
+    buffer_type buffer;
+  };
+
+  // send once we have a certain number of messages or bytes in the buffer
+  // these numbers need to be tuned, we keep them small at first for testing
+  std::size_t batch_header_number;
+  std::size_t batch_buffer_size;
+  std::size_t batch_message_size;
+  
+  /**
+   * The actual MPI communicator used to transmit data.
+   */
+  boost::mpi::communicator             comm;
+
+  /**
+   * The MPI communicator used to transmit out-of-band replies.
+   */
+  boost::mpi::communicator             oob_reply_comm;
+
+  /// Outgoing message information, indexed by destination processor.
+  std::vector<outgoing_messages> outgoing;
+
+  /// Incoming message information, indexed by source processor.
+  std::vector<incoming_messages> incoming;
+
+  /// The numbers of processors that have entered a synchronization stage
+  std::vector<int> processors_synchronizing_stage;
+  
+  /// The synchronization stage of a processor
+  std::vector<int> synchronizing_stage;
+
+  /// Number of processors still sending messages
+  std::vector<int> synchronizing_unfinished;
+  
+  /// Number of batches sent since last synchronization stage
+  std::vector<int> number_sent_batches;
+  
+  /// Number of batches received minus number of expected batches
+  std::vector<int> number_received_batches;
+  
+
+  /// The context of the currently-executing trigger, or @c trc_none
+  /// if no trigger is executing.
+  trigger_receive_context trigger_context;
+
+  /// Non-zero indicates that we're processing batches
+  /// Increment this when processing patches,
+  /// decrement it when you're done.
+  int processing_batches;
+
+  /**
+   * Contains all of the active blocks corresponding to attached
+   * distributed data structures.
+   */
+  blocks_type blocks;
+
+  /// Whether we are currently synchronizing
+  bool synchronizing;
+
+  /// The MPI requests for posted sends of oob messages
+  std::vector<MPI_Request> requests;
+  
+  /// The MPI buffers for posted irecvs of oob messages
+  std::map<int,buffer_type> buffers;
+
+  /// Queue for message batches received while already processing messages
+  std::queue<std::pair<int,outgoing_messages> > new_batches;
+  /// Maximum encountered size of the new_batches queue
+  std::size_t max_received;
+
+  /// The MPI requests and buffers for batchess being sent
+  std::list<batch_request> sent_batches;
+  /// Maximum encountered size of the sent_batches list
+  std::size_t max_sent;
+
+  /// Pre-allocated requests in a pool
+  std::vector<batch_request> batch_pool;
+  /// A stack controlling which batches are available
+  std::stack<std::size_t> free_batches;
+
+  void free_sent_batches();
+  
+  // Tag allocator
+  detail::tag_allocator allocated_tags;
+
+  impl(std::size_t num_headers, std::size_t buffers_size,
+       communicator_type parent_comm);
+  ~impl();
+  
+private:
+  void set_batch_size(std::size_t header_num, std::size_t buffer_sz);
+};
+
+inline trigger_receive_context mpi_process_group::trigger_context() const
+{
+  return impl_->trigger_context;
+}
+
+template<typename T>
+void
+mpi_process_group::send_impl(int dest, int tag, const T& value,
+                             mpl::true_ /*is_mpi_datatype*/) const
+{
+  assert(tag <  msg_reserved_first || tag > msg_reserved_last);
+
+  impl::outgoing_messages& outgoing = impl_->outgoing[dest];
+
+  // Start constructing the message header
+  impl::message_header header;
+  header.source = process_id(*this);
+  header.tag = tag;
+  header.offset = outgoing.buffer.size();
+  
+  boost::mpi::packed_oarchive oa(impl_->comm, outgoing.buffer);
+  oa << value;
+
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << "SEND: " << process_id(*this) << " -> " << dest << ", tag = "
+            << tag << ", bytes = " << packed_size << std::endl;
+#endif
+
+  // Store the header
+  header.bytes = outgoing.buffer.size() - header.offset;
+  outgoing.headers.push_back(header);
+
+  maybe_send_batch(dest);
+}
+
+
+template<typename T>
+void
+mpi_process_group::send_impl(int dest, int tag, const T& value,
+                             mpl::false_ /*is_mpi_datatype*/) const
+{
+  assert(tag <  msg_reserved_first || tag > msg_reserved_last);
+
+  impl::outgoing_messages& outgoing = impl_->outgoing[dest];
+
+  // Start constructing the message header
+  impl::message_header header;
+  header.source = process_id(*this);
+  header.tag = tag;
+  header.offset = outgoing.buffer.size();
+
+  // Serialize into the buffer
+  boost::mpi::packed_oarchive out(impl_->comm, outgoing.buffer);
+  out << value;
+
+  // Store the header
+  header.bytes = outgoing.buffer.size() - header.offset;
+  outgoing.headers.push_back(header);
+  maybe_send_batch(dest);
+
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << "SEND: " << process_id(*this) << " -> " << dest << ", tag = "
+            << tag << ", bytes = " << header.bytes << std::endl;
+#endif
+}
+
+template<typename T>
+inline void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, const T& value)
+{
+  pg.send_impl(dest, pg.encode_tag(pg.my_block_number(), tag), value,
+               boost::mpi::is_mpi_datatype<T>());
+}
+
+template<typename T>
+typename enable_if<boost::mpi::is_mpi_datatype<T>, void>::type
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, const T values[], std::size_t n)
+{
+  pg.send_impl(dest, pg.encode_tag(pg.my_block_number(), tag),
+                 boost::serialization::make_array(values,n), 
+                 boost::mpl::true_());
+}
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T>, void>::type
+mpi_process_group::
+array_send_impl(int dest, int tag, const T values[], std::size_t n) const
+{
+  assert(tag <  msg_reserved_first || tag > msg_reserved_last);
+
+  impl::outgoing_messages& outgoing = impl_->outgoing[dest];
+
+  // Start constructing the message header
+  impl::message_header header;
+  header.source = process_id(*this);
+  header.tag = tag;
+  header.offset = outgoing.buffer.size();
+
+  // Serialize into the buffer
+  boost::mpi::packed_oarchive out(impl_->comm, outgoing.buffer);
+  out << n;
+
+  for (std::size_t i = 0; i < n; ++i)
+    out << values[i];
+
+  // Store the header
+  header.bytes = outgoing.buffer.size() - header.offset;
+  outgoing.headers.push_back(header);
+  maybe_send_batch(dest);
+
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << "SEND: " << process_id(*this) << " -> " << dest << ", tag = "
+            << tag << ", bytes = " << header.bytes << std::endl;
+#endif
+}
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T>, void>::type
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, const T values[], std::size_t n)
+{
+  pg.array_send_impl(dest, pg.encode_tag(pg.my_block_number(), tag), 
+                     values, n);
+}
+
+template<typename InputIterator>
+void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, InputIterator first, InputIterator last)
+{
+  typedef typename std::iterator_traits<InputIterator>::value_type value_type;
+  std::vector<value_type> values(first, last);
+  if (values.empty()) send(pg, dest, tag, static_cast<value_type*>(0), 0);
+  else send(pg, dest, tag, &values[0], values.size());
+}
+
+template<typename T>
+bool
+mpi_process_group::receive_impl(int source, int tag, T& value,
+                                mpl::true_ /*is_mpi_datatype*/) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << "RECV: " << process_id(*this) << " <- " << source << ", tag = "
+            << tag << std::endl;
+#endif
+
+  impl::incoming_messages& incoming = impl_->incoming[source];
+
+  // Find the next header with the right tag
+  std::vector<impl::message_header>::iterator header =
+    incoming.next_header[my_block_number()];
+  while (header != incoming.headers.end() && header->tag != tag) ++header;
+
+  // If no header is found, notify the caller
+  if (header == incoming.headers.end()) return false;
+
+  // Unpack the data
+  if (header->bytes > 0) {
+    boost::mpi::packed_iarchive ia(impl_->comm, incoming.buffer, 
+                                   archive::no_header, header->offset);
+    ia >> value;
+  }
+
+  // Mark this message as received
+  header->tag = -1;
+
+  // Move the "next header" indicator to the next unreceived message
+  while (incoming.next_header[my_block_number()] != incoming.headers.end()
+         && incoming.next_header[my_block_number()]->tag == -1)
+    ++incoming.next_header[my_block_number()];
+
+  if (incoming.next_header[my_block_number()] == incoming.headers.end()) {
+    bool finished = true;
+    for (std::size_t i = 0; i < incoming.next_header.size() && finished; ++i) {
+      if (incoming.next_header[i] != incoming.headers.end()) finished = false;
+    }
+
+    if (finished) {
+      std::vector<impl::message_header> no_headers;
+      incoming.headers.swap(no_headers);
+      buffer_type empty_buffer;
+      incoming.buffer.swap(empty_buffer);
+      for (std::size_t i = 0; i < incoming.next_header.size(); ++i)
+        incoming.next_header[i] = incoming.headers.end();
+    }
+  }
+
+  return true;
+}
+
+template<typename T>
+bool
+mpi_process_group::receive_impl(int source, int tag, T& value,
+                                mpl::false_ /*is_mpi_datatype*/) const
+{
+  impl::incoming_messages& incoming = impl_->incoming[source];
+
+  // Find the next header with the right tag
+  std::vector<impl::message_header>::iterator header =
+    incoming.next_header[my_block_number()];
+  while (header != incoming.headers.end() && header->tag != tag) ++header;
+
+  // If no header is found, notify the caller
+  if (header == incoming.headers.end()) return false;
+
+  // Deserialize the data
+  boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, 
+                                 archive::no_header, header->offset);
+  in >> value;
+
+  // Mark this message as received
+  header->tag = -1;
+
+  // Move the "next header" indicator to the next unreceived message
+  while (incoming.next_header[my_block_number()] != incoming.headers.end()
+         && incoming.next_header[my_block_number()]->tag == -1)
+    ++incoming.next_header[my_block_number()];
+
+  if (incoming.next_header[my_block_number()] == incoming.headers.end()) {
+    bool finished = true;
+    for (std::size_t i = 0; i < incoming.next_header.size() && finished; ++i) {
+      if (incoming.next_header[i] != incoming.headers.end()) finished = false;
+    }
+
+    if (finished) {
+      std::vector<impl::message_header> no_headers;
+      incoming.headers.swap(no_headers);
+      buffer_type empty_buffer;
+      incoming.buffer.swap(empty_buffer);
+      for (std::size_t i = 0; i < incoming.next_header.size(); ++i)
+        incoming.next_header[i] = incoming.headers.end();
+    }
+  }
+
+  return true;
+}
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T>, bool>::type
+mpi_process_group::
+array_receive_impl(int source, int tag, T* values, std::size_t& n) const
+{
+  impl::incoming_messages& incoming = impl_->incoming[source];
+
+  // Find the next header with the right tag
+  std::vector<impl::message_header>::iterator header =
+    incoming.next_header[my_block_number()];
+  while (header != incoming.headers.end() && header->tag != tag) ++header;
+
+  // If no header is found, notify the caller
+  if (header == incoming.headers.end()) return false;
+
+  // Deserialize the data
+  boost::mpi::packed_iarchive in(impl_->comm, incoming.buffer, 
+                                 archive::no_header, header->offset);
+  std::size_t num_sent;
+  in >> num_sent;
+  if (num_sent > n)
+    std::cerr << "ERROR: Have " << num_sent << " items but only space for "
+              << n << " items\n";
+
+  for (std::size_t i = 0; i < num_sent; ++i)
+    in >> values[i];
+  n = num_sent;
+
+  // Mark this message as received
+  header->tag = -1;
+
+  // Move the "next header" indicator to the next unreceived message
+  while (incoming.next_header[my_block_number()] != incoming.headers.end()
+         && incoming.next_header[my_block_number()]->tag == -1)
+    ++incoming.next_header[my_block_number()];
+
+  if (incoming.next_header[my_block_number()] == incoming.headers.end()) {
+    bool finished = true;
+    for (std::size_t i = 0; i < incoming.next_header.size() && finished; ++i) {
+      if (incoming.next_header[i] != incoming.headers.end()) finished = false;
+    }
+
+    if (finished) {
+      std::vector<impl::message_header> no_headers;
+      incoming.headers.swap(no_headers);
+      buffer_type empty_buffer;
+      incoming.buffer.swap(empty_buffer);
+      for (std::size_t i = 0; i < incoming.next_header.size(); ++i)
+        incoming.next_header[i] = incoming.headers.end();
+    }
+  }
+
+  return true;
+}
+
+// Construct triggers
+template<typename Type, typename Handler>
+void mpi_process_group::trigger(int tag, const Handler& handler)
+{
+  assert(block_num);
+  install_trigger(tag,my_block_number(),shared_ptr<trigger_base>(
+    new trigger_launcher<Type, Handler>(*this, tag, handler)));
+}
+
+template<typename Type, typename Handler>
+void mpi_process_group::trigger_with_reply(int tag, const Handler& handler)
+{
+  assert(block_num);
+  install_trigger(tag,my_block_number(),shared_ptr<trigger_base>(
+    new reply_trigger_launcher<Type, Handler>(*this, tag, handler)));
+}
+
+template<typename Type, typename Handler>
+void mpi_process_group::global_trigger(int tag, const Handler& handler, 
+      std::size_t sz)
+{
+  if (sz==0) // normal trigger
+    install_trigger(tag,0,shared_ptr<trigger_base>(
+      new global_trigger_launcher<Type, Handler>(*this, tag, handler)));
+  else // trigger with irecv
+    install_trigger(tag,0,shared_ptr<trigger_base>(
+      new global_irecv_trigger_launcher<Type, Handler>(*this, tag, handler,sz)));
+  
+}
+
+namespace detail {
+
+template<typename Type>
+void  do_oob_receive(mpi_process_group const& self,
+    int source, int tag, Type& data, mpl::true_ /*is_mpi_datatype*/) 
+{
+  using boost::mpi::get_mpi_datatype;
+
+  //self.impl_->comm.recv(source,tag,data);
+  MPI_Recv(&data, 1, get_mpi_datatype<Type>(data), source, tag, self.impl_->comm,
+           MPI_STATUS_IGNORE);
+}
+
+template<typename Type>
+void do_oob_receive(mpi_process_group const& self,
+    int source, int tag, Type& data, mpl::false_ /*is_mpi_datatype*/) 
+{
+  //  self.impl_->comm.recv(source,tag,data);
+  // Receive the size of the data packet
+  boost::mpi::status status;
+  status = self.impl_->comm.probe(source, tag);
+
+#if BOOST_VERSION >= 103600
+  int size = status.count<boost::mpi::packed>().get();
+#else
+  int size;
+  MPI_Status& mpi_status = status;
+  MPI_Get_count(&mpi_status, MPI_PACKED, &size);
+#endif
+
+  // Receive the data packed itself
+  boost::mpi::packed_iarchive in(self.impl_->comm);
+  in.resize(size);
+  MPI_Recv(in.address(), size, MPI_PACKED, source, tag, self.impl_->comm,
+       MPI_STATUS_IGNORE);
+
+  // Deserialize the data
+  in >> data;
+}
+
+template<typename Type>
+void do_oob_receive(mpi_process_group const& self, int source, int tag, Type& data) 
+{
+  do_oob_receive(self, source, tag, data,
+                           boost::mpi::is_mpi_datatype<Type>());
+}
+
+
+} // namespace detail
+
+
+template<typename Type, typename Handler>
+void 
+mpi_process_group::trigger_launcher<Type, Handler>::
+receive(mpi_process_group const&, int source, int tag, 
+        trigger_receive_context context, int block) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << (out_of_band? "OOB trigger" : "Trigger") 
+            << " receive from source " << source << " and tag " << tag
+        << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl;
+#endif
+
+  Type data;
+
+  if (context == trc_out_of_band) {
+    // Receive the message directly off the wire
+    int realtag  = self.encode_tag(
+      block == -1 ? self.my_block_number() : block, tag);
+    detail::do_oob_receive(self,source,realtag,data);
+  }
+  else
+    // Receive the message out of the local buffer
+    boost::graph::distributed::receive(self, source, tag, data);
+
+  // Pass the message off to the handler
+  handler(source, tag, data, context);
+}
+
+template<typename Type, typename Handler>
+void 
+mpi_process_group::reply_trigger_launcher<Type, Handler>::
+receive(mpi_process_group const&, int source, int tag, 
+        trigger_receive_context context, int block) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << (out_of_band? "OOB reply trigger" : "Reply trigger") 
+            << " receive from source " << source << " and tag " << tag
+        << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl;
+#endif
+  assert(context == trc_out_of_band);
+
+  boost::parallel::detail::untracked_pair<int, Type> data;
+
+  // Receive the message directly off the wire
+  int realtag  = self.encode_tag(block == -1 ? self.my_block_number() : block,
+                                 tag);
+  detail::do_oob_receive(self, source, realtag, data);
+
+  // Pass the message off to the handler and send the result back to
+  // the source.
+  send_oob(self, source, data.first, 
+           handler(source, tag, data.second, context), -2);
+}
+
+template<typename Type, typename Handler>
+void 
+mpi_process_group::global_trigger_launcher<Type, Handler>::
+receive(mpi_process_group const& self, int source, int tag, 
+        trigger_receive_context context, int block) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << (out_of_band? "OOB trigger" : "Trigger") 
+            << " receive from source " << source << " and tag " << tag
+        << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl;
+#endif
+
+  Type data;
+
+  if (context == trc_out_of_band) {
+    // Receive the message directly off the wire
+    int realtag  = self.encode_tag(
+      block == -1 ? self.my_block_number() : block, tag);
+    detail::do_oob_receive(self,source,realtag,data);
+  }
+  else
+    // Receive the message out of the local buffer
+    boost::graph::distributed::receive(self, source, tag, data);
+
+  // Pass the message off to the handler
+  handler(self, source, tag, data, context);
+}
+
+
+template<typename Type, typename Handler>
+void 
+mpi_process_group::global_irecv_trigger_launcher<Type, Handler>::
+receive(mpi_process_group const& self, int source, int tag, 
+        trigger_receive_context context, int block) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+  std::cerr << (out_of_band? "OOB trigger" : "Trigger") 
+            << " receive from source " << source << " and tag " << tag
+        << " in block " << (block == -1 ? self.my_block_number() : block) << std::endl;
+#endif
+
+  Type data;
+
+  if (context == trc_out_of_band) {
+    return;
+  }
+  assert (context == trc_irecv_out_of_band);
+
+  // force posting of new MPI_Irecv, even though buffer is already allocated
+  boost::mpi::packed_iarchive ia(self.impl_->comm,self.impl_->buffers[tag]);
+  ia >> data;
+  // Start a new receive
+  prepare_receive(self,tag,true);
+  // Pass the message off to the handler
+  handler(self, source, tag, data, context);
+}
+
+
+template<typename Type, typename Handler>
+void 
+mpi_process_group::global_irecv_trigger_launcher<Type, Handler>::
+prepare_receive(mpi_process_group const& self, int tag, bool force) const
+{
+#ifdef PBGL_PROCESS_GROUP_DEBUG
+ std::cerr << ("Posting Irecv for trigger") 
+      << " receive with tag " << tag << std::endl;
+#endif
+  if (self.impl_->buffers.find(tag) == self.impl_->buffers.end()) {
+    self.impl_->buffers[tag].resize(buffer_size);
+    force = true;
+  }
+  assert(static_cast<int>(self.impl_->buffers[tag].size()) >= buffer_size);
+  
+  //BOOST_MPL_ASSERT(mpl::not_<is_mpi_datatype<Type> >);
+  if (force) {
+    self.impl_->requests.push_back(MPI_Request());
+    MPI_Request* request = &self.impl_->requests.back();
+    MPI_Irecv(&self.impl_->buffers[tag].front(),buffer_size,
+               MPI_PACKED,MPI_ANY_SOURCE,tag,self.impl_->comm,request);
+  }
+}
+
+
+template<typename T>
+inline mpi_process_group::process_id_type
+receive(const mpi_process_group& pg, int tag, T& value)
+{
+  for (std::size_t source = 0; source < pg.impl_->incoming.size(); ++source) {
+    if (pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                        value, boost::mpi::is_mpi_datatype<T>()))
+      return source;
+  }
+  assert (false);
+}
+
+template<typename T>
+typename 
+  enable_if<boost::mpi::is_mpi_datatype<T>, 
+            std::pair<mpi_process_group::process_id_type, std::size_t> >::type
+receive(const mpi_process_group& pg, int tag, T values[], std::size_t n)
+{
+  for (std::size_t source = 0; source < pg.impl_->incoming.size(); ++source) {
+    bool result =
+      pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                 boost::serialization::make_array(values,n),
+                 boost::mpl::true_());
+    if (result) 
+      return std::make_pair(source, n);
+  }
+  assert(false);
+}
+
+template<typename T>
+typename 
+  disable_if<boost::mpi::is_mpi_datatype<T>, 
+             std::pair<mpi_process_group::process_id_type, std::size_t> >::type
+receive(const mpi_process_group& pg, int tag, T values[], std::size_t n)
+{
+  for (std::size_t source = 0; source < pg.impl_->incoming.size(); ++source) {
+    if (pg.array_receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                              values, n))
+      return std::make_pair(source, n);
+  }
+  assert(false);
+}
+
+template<typename T>
+mpi_process_group::process_id_type
+receive(const mpi_process_group& pg,
+        mpi_process_group::process_id_type source, int tag, T& value)
+{
+  if (pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                      value, boost::mpi::is_mpi_datatype<T>()))
+    return source;
+  else {
+    fprintf(stderr,
+            "Process %d failed to receive a message from process %d with tag %d in block %d.\n",
+            process_id(pg), source, tag, pg.my_block_number());
+
+    assert(false);
+    exit(1);
+  }
+}
+
+template<typename T>
+typename 
+  enable_if<boost::mpi::is_mpi_datatype<T>, 
+            std::pair<mpi_process_group::process_id_type, std::size_t> >::type
+receive(const mpi_process_group& pg, int source, int tag, T values[], 
+        std::size_t n)
+{
+  if (pg.receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                      boost::serialization::make_array(values,n), 
+                      boost::mpl::true_()))
+    return std::make_pair(source,n);
+  else {
+    fprintf(stderr,
+            "Process %d failed to receive a message from process %d with tag %d in block %d.\n",
+            process_id(pg), source, tag, pg.my_block_number());
+
+    assert(false);
+    exit(1);
+  }
+}
+
+template<typename T>
+typename 
+  disable_if<boost::mpi::is_mpi_datatype<T>, 
+             std::pair<mpi_process_group::process_id_type, std::size_t> >::type
+receive(const mpi_process_group& pg, int source, int tag, T values[], 
+        std::size_t n)
+{
+  pg.array_receive_impl(source, pg.encode_tag(pg.my_block_number(), tag),
+                        values, n);
+
+  return std::make_pair(source, n);
+}
+
+template<typename T, typename BinaryOperation>
+T*
+all_reduce(const mpi_process_group& pg, T* first, T* last, T* out,
+           BinaryOperation bin_op)
+{
+  synchronize(pg);
+
+  bool inplace = first == out;
+
+  if (inplace) out = new T [last-first];
+
+  boost::mpi::all_reduce(boost::mpi::communicator(communicator(pg),
+                                                  boost::mpi::comm_attach), 
+                         first, last-first, out, bin_op);
+
+  if (inplace) {
+    std::copy(out, out + (last-first), first);
+    delete [] out;
+    return last;
+  }
+
+  return out;
+}
+
+template<typename T>
+void
+broadcast(const mpi_process_group& pg, T& val, 
+          mpi_process_group::process_id_type root)
+{
+  // broadcast the seed  
+  boost::mpi::communicator comm(communicator(pg),boost::mpi::comm_attach);
+  boost::mpi::broadcast(comm,val,root);
+}
+
+
+template<typename T, typename BinaryOperation>
+T*
+scan(const mpi_process_group& pg, T* first, T* last, T* out,
+           BinaryOperation bin_op)
+{
+  synchronize(pg);
+
+  bool inplace = first == out;
+
+  if (inplace) out = new T [last-first];
+
+  boost::mpi::scan(communicator(pg), first, last-first, out, bin_op);
+
+  if (inplace) {
+    std::copy(out, out + (last-first), first);
+    delete [] out;
+    return last;
+  }
+
+  return out;
+}
+
+
+template<typename InputIterator, typename T>
+void
+all_gather(const mpi_process_group& pg, InputIterator first,
+           InputIterator last, std::vector<T>& out)
+{
+  synchronize(pg);
+
+  // Stick a copy of the local values into a vector, so we can broadcast it
+  std::vector<T> local_values(first, last);
+
+  // Collect the number of vertices stored in each process
+  int size = local_values.size();
+  std::vector<int> sizes(num_processes(pg));
+  int result = MPI_Allgather(&size, 1, MPI_INT,
+                             &sizes[0], 1, MPI_INT,
+                             communicator(pg));
+  assert(result == MPI_SUCCESS);
+
+  // Adjust sizes based on the number of bytes
+  std::transform(sizes.begin(), sizes.end(), sizes.begin(),
+                 std::bind2nd(std::multiplies<int>(), sizeof(T)));
+
+  // Compute displacements
+  std::vector<int> displacements;
+  displacements.reserve(sizes.size() + 1);
+  displacements.push_back(0);
+  std::partial_sum(sizes.begin(), sizes.end(),
+                   std::back_inserter(displacements));
+
+  // Gather all of the values
+  out.resize(displacements.back() / sizeof(T));
+  if (!out.empty()) {
+    result = MPI_Allgatherv(local_values.empty()? (void*)&local_values
+                            /* local results */: (void*)&local_values[0],
+                            local_values.size() * sizeof(T),
+                            MPI_BYTE,
+                            &out[0], &sizes[0], &displacements[0], MPI_BYTE,
+                            communicator(pg));
+  }
+  assert(result == MPI_SUCCESS);
+}
+
+template<typename InputIterator>
+mpi_process_group
+process_subgroup(const mpi_process_group& pg,
+                 InputIterator first, InputIterator last)
+{
+/*
+  boost::mpi::group current_group = communicator(pg).group();
+  boost::mpi::group new_group = current_group.include(first,last);
+  boost::mpi::communicator new_comm(communicator(pg),new_group);
+  return mpi_process_group(new_comm);
+*/
+  std::vector<int> ranks(first, last);
+
+  MPI_Group current_group;
+  int result = MPI_Comm_group(communicator(pg), &current_group);
+  assert(result == MPI_SUCCESS);
+
+  MPI_Group new_group;
+  result = MPI_Group_incl(current_group, ranks.size(), &ranks[0], &new_group);
+  assert(result == MPI_SUCCESS);
+
+  MPI_Comm new_comm;
+  result = MPI_Comm_create(communicator(pg), new_group, &new_comm);
+  assert(result == MPI_SUCCESS);
+
+  result = MPI_Group_free(&new_group);
+  assert(result == MPI_SUCCESS);
+  result = MPI_Group_free(&current_group);
+  assert(result == MPI_SUCCESS);
+
+  if (new_comm != MPI_COMM_NULL) {
+    mpi_process_group result_pg(boost::mpi::communicator(new_comm,boost::mpi::comm_attach));
+    result = MPI_Comm_free(&new_comm);
+    assert(result == 0);
+    return result_pg;
+  } else {
+    return mpi_process_group(mpi_process_group::create_empty());
+  }
+
+}
+
+
+template<typename Receiver>
+Receiver* mpi_process_group::get_receiver()
+{
+  return impl_->blocks[my_block_number()]->on_receive
+           .template target<Receiver>();
+}
+
+template<typename T>
+typename enable_if<boost::mpi::is_mpi_datatype<T> >::type
+receive_oob(const mpi_process_group& pg, 
+            mpi_process_group::process_id_type source, int tag, T& value, int block)
+{
+  using boost::mpi::get_mpi_datatype;
+
+  // Determine the actual message we expect to receive, and which
+  // communicator it will come by.
+  std::pair<boost::mpi::communicator, int> actual
+    = pg.actual_communicator_and_tag(tag, block);
+
+  // Post a non-blocking receive that waits until we complete this request.
+  MPI_Request request;
+  MPI_Irecv(&value, 1, get_mpi_datatype<T>(value),  
+            source, actual.second, actual.first, &request); 
+
+  int done = 0;
+  do {
+    MPI_Test(&request, &done, MPI_STATUS_IGNORE);
+    if (!done)
+      pg.poll(/*wait=*/false, block);
+  } while (!done);
+}
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T> >::type
+receive_oob(const mpi_process_group& pg, 
+            mpi_process_group::process_id_type source, int tag, T& value, int block)
+{
+  // Determine the actual message we expect to receive, and which
+  // communicator it will come by.
+  std::pair<boost::mpi::communicator, int> actual
+    = pg.actual_communicator_and_tag(tag, block);
+
+  boost::optional<boost::mpi::status> status;
+  do {
+    status = actual.first.iprobe(source, actual.second);
+    if (!status)
+      pg.poll();
+  } while (!status);
+
+  //actual.first.recv(status->source(), status->tag(),value);
+
+  // Allocate the receive buffer
+  boost::mpi::packed_iarchive in(actual.first);
+
+#if BOOST_VERSION >= 103600
+  in.resize(status->count<boost::mpi::packed>().get());
+#else
+  int size;
+  MPI_Status mpi_status = *status;
+  MPI_Get_count(&mpi_status, MPI_PACKED, &size);
+  in.resize(size);
+#endif
+  
+  // Receive the message data
+  MPI_Recv(in.address(), in.size(), MPI_PACKED,
+           status->source(), status->tag(), actual.first, MPI_STATUS_IGNORE);
+  
+  // Unpack the message data
+  in >> value;
+}
+
+
+template<typename SendT, typename ReplyT>
+typename enable_if<boost::mpi::is_mpi_datatype<ReplyT> >::type
+send_oob_with_reply(const mpi_process_group& pg, 
+                    mpi_process_group::process_id_type dest,
+                    int tag, const SendT& send_value, ReplyT& reply_value,
+                    int block)
+{
+  detail::tag_allocator::token reply_tag = pg.impl_->allocated_tags.get_tag();
+  send_oob(pg, dest, tag, boost::parallel::detail::make_untracked_pair(
+        (int)reply_tag, send_value), block);
+  receive_oob(pg, dest, reply_tag, reply_value);
+}
+
+template<typename SendT, typename ReplyT>
+typename disable_if<boost::mpi::is_mpi_datatype<ReplyT> >::type
+send_oob_with_reply(const mpi_process_group& pg, 
+                    mpi_process_group::process_id_type dest,
+                    int tag, const SendT& send_value, ReplyT& reply_value,
+                    int block)
+{
+  detail::tag_allocator::token reply_tag = pg.impl_->allocated_tags.get_tag();
+  send_oob(pg, dest, tag, 
+           boost::parallel::detail::make_untracked_pair((int)reply_tag, 
+                                                        send_value), block);
+  receive_oob(pg, dest, reply_tag, reply_value);
+}
+
+} } } // end namespace boost::graph::distributed
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/queue.ipp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/queue.ipp
new file mode 100644 (file)
index 0000000..f37ff25
--- /dev/null
@@ -0,0 +1,177 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#include <boost/optional.hpp>
+#include <cassert>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <functional>
+#include <algorithm>
+#include <boost/graph/parallel/simple_trigger.hpp>
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+BOOST_DISTRIBUTED_QUEUE_TYPE::
+distributed_queue(const ProcessGroup& process_group, const OwnerMap& owner,
+                  const Buffer& buffer, bool polling)
+  : process_group(process_group, attach_distributed_object()),
+    owner(owner),
+    buffer(buffer),
+    polling(polling)
+{
+  if (!polling)
+    outgoing_buffers.reset(
+      new outgoing_buffers_t(num_processes(process_group)));
+
+  setup_triggers();
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+BOOST_DISTRIBUTED_QUEUE_TYPE::
+distributed_queue(const ProcessGroup& process_group, const OwnerMap& owner,
+                  const Buffer& buffer, const UnaryPredicate& pred,
+                  bool polling)
+  : process_group(process_group, attach_distributed_object()),
+    owner(owner),
+    buffer(buffer),
+    pred(pred),
+    polling(polling)
+{
+  if (!polling)
+    outgoing_buffers.reset(
+      new outgoing_buffers_t(num_processes(process_group)));
+
+  setup_triggers();
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+BOOST_DISTRIBUTED_QUEUE_TYPE::
+distributed_queue(const ProcessGroup& process_group, const OwnerMap& owner,
+                  const UnaryPredicate& pred, bool polling)
+  : process_group(process_group, attach_distributed_object()),
+    owner(owner),
+    pred(pred),
+    polling(polling)
+{
+  if (!polling)
+    outgoing_buffers.reset(
+      new outgoing_buffers_t(num_processes(process_group)));
+
+  setup_triggers();
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+void
+BOOST_DISTRIBUTED_QUEUE_TYPE::push(const value_type& x)
+{
+  typename ProcessGroup::process_id_type dest = get(owner, x);
+  if (outgoing_buffers)
+    outgoing_buffers->at(dest).push_back(x);
+  else if (dest == process_id(process_group))
+    buffer.push(x);
+  else
+    send(process_group, get(owner, x), msg_push, x);
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+bool
+BOOST_DISTRIBUTED_QUEUE_TYPE::empty() const
+{
+  /* Processes will stay here until the buffer is nonempty or
+     synchronization with the other processes indicates that all local
+     buffers are empty (and no messages are in transit).
+   */
+  while (buffer.empty() && !do_synchronize()) ;
+
+  return buffer.empty();
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+typename BOOST_DISTRIBUTED_QUEUE_TYPE::size_type
+BOOST_DISTRIBUTED_QUEUE_TYPE::size() const
+{
+  empty();
+  return buffer.size();
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+void BOOST_DISTRIBUTED_QUEUE_TYPE::setup_triggers()
+{
+  using boost::graph::parallel::simple_trigger;
+
+  simple_trigger(process_group, msg_push, this, 
+                 &distributed_queue::handle_push);
+  simple_trigger(process_group, msg_multipush, this, 
+                 &distributed_queue::handle_multipush);
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+void 
+BOOST_DISTRIBUTED_QUEUE_TYPE::
+handle_push(int /*source*/, int /*tag*/, const value_type& value, 
+            trigger_receive_context)
+{
+  if (pred(value)) buffer.push(value);
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+void 
+BOOST_DISTRIBUTED_QUEUE_TYPE::
+handle_multipush(int /*source*/, int /*tag*/, 
+                 const std::vector<value_type>& values, 
+                 trigger_receive_context)
+{
+  for (std::size_t i = 0; i < values.size(); ++i)
+    if (pred(values[i])) buffer.push(values[i]);
+}
+
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+bool
+BOOST_DISTRIBUTED_QUEUE_TYPE::do_synchronize() const
+{
+#ifdef PBGL_ACCOUNTING
+  ++num_synchronizations;
+#endif
+
+  using boost::parallel::all_reduce;
+  using std::swap;
+
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+  if (outgoing_buffers) {
+    // Transfer all of the push requests
+    process_id_type id = process_id(process_group);
+    process_id_type np = num_processes(process_group);
+    for (process_id_type dest = 0; dest < np; ++dest) {
+      outgoing_buffer_t& outgoing = outgoing_buffers->at(dest);
+      std::size_t size = outgoing.size();
+      if (size != 0) {
+        if (dest != id) {
+          send(process_group, dest, msg_multipush, outgoing);
+        } else {
+          for (std::size_t i = 0; i < size; ++i)
+            buffer.push(outgoing[i]);
+        }
+        outgoing.clear();
+      }
+    }
+  }
+  synchronize(process_group);
+
+  unsigned local_size = buffer.size();
+  unsigned global_size =
+    all_reduce(process_group, local_size, std::plus<unsigned>());
+  return global_size == 0;
+}
+
+} } } // end namespace boost::graph::distributed
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/remote_update_set.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/remote_update_set.hpp
new file mode 100644 (file)
index 0000000..08f4316
--- /dev/null
@@ -0,0 +1,259 @@
+// Copyright (C) 2005-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DETAIL_REMOTE_UPDATE_SET_HPP
+#define BOOST_GRAPH_DETAIL_REMOTE_UPDATE_SET_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <vector>
+#include <cassert>
+#include <boost/optional.hpp>
+#include <queue>
+
+namespace boost { namespace graph { namespace detail {
+
+template<typename ProcessGroup>
+void do_synchronize(ProcessGroup& pg)
+{ 
+  using boost::parallel::synchronize;
+  synchronize(pg);
+}
+
+struct remote_set_queued {};
+struct remote_set_immediate {};
+
+template<typename ProcessGroup>
+class remote_set_semantics
+{
+  BOOST_STATIC_CONSTANT
+    (bool, 
+     queued = (is_convertible<
+                 typename ProcessGroup::communication_category,
+                 parallel::bsp_process_group_tag>::value));
+
+ public:
+  typedef typename mpl::if_c<queued, 
+                             remote_set_queued, 
+                             remote_set_immediate>::type type;
+};
+
+
+template<typename Derived, typename ProcessGroup, typename Value,
+         typename OwnerMap,
+         typename Semantics = typename remote_set_semantics<ProcessGroup>::type>
+class remote_update_set;
+
+/**********************************************************************
+ * Remote updating set that queues messages until synchronization     *
+ **********************************************************************/
+template<typename Derived, typename ProcessGroup, typename Value,
+         typename OwnerMap>
+class remote_update_set<Derived, ProcessGroup, Value, OwnerMap,
+                        remote_set_queued>
+{
+  typedef typename property_traits<OwnerMap>::key_type Key;
+  typedef std::vector<std::pair<Key, Value> > Updates;
+  typedef typename Updates::size_type   updates_size_type;
+  typedef typename Updates::value_type  updates_pair_type;
+
+public:
+
+private:
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+  enum message_kind {
+    /** Message containing the number of updates that will be sent in
+     *  a msg_updates message that will immediately follow. This
+     *  message will contain a single value of type
+     *  updates_size_type. 
+     */
+    msg_num_updates,
+
+    /** Contains (key, value) pairs with all of the updates from a
+     *  particular source. The number of updates is variable, but will
+     *  be provided in a msg_num_updates message that immediately
+     *  preceeds this message.
+     *
+     */
+    msg_updates
+  };
+
+  struct handle_messages
+  {
+    explicit 
+    handle_messages(remote_update_set* self, const ProcessGroup& pg)
+      : self(self), update_sizes(num_processes(pg), 0) { }
+
+    void operator()(process_id_type source, int tag) 
+    { 
+      switch(tag) {
+      case msg_num_updates:
+        {
+          // Receive the # of updates
+          updates_size_type num_updates;
+          receive(self->process_group, source, tag, num_updates);
+
+          update_sizes[source] = num_updates;
+        }
+        break;
+
+      case msg_updates:
+        {
+          updates_size_type num_updates = update_sizes[source];
+          assert(num_updates);
+
+          // Receive the actual updates
+          std::vector<updates_pair_type> updates(num_updates);
+          receive(self->process_group, source, msg_updates, &updates[0],
+                  num_updates);
+          
+          // Send updates to derived "receive_update" member
+          Derived* derived = static_cast<Derived*>(self);
+          for (updates_size_type u = 0; u < num_updates; ++u)
+            derived->receive_update(source, updates[u].first, updates[u].second);
+
+          update_sizes[source] = 0;
+        }
+        break;
+      };
+    }
+
+  private:
+    remote_update_set* self;
+    std::vector<updates_size_type> update_sizes;
+  };
+  friend struct handle_messages;
+
+ protected:
+  remote_update_set(const ProcessGroup& pg, const OwnerMap& owner)
+    : process_group(pg, handle_messages(this, pg)),
+      updates(num_processes(pg)), owner(owner) { 
+    }
+
+
+  void update(const Key& key, const Value& value)
+  { 
+    if (get(owner, key) == process_id(process_group)) {
+      Derived* derived = static_cast<Derived*>(this);
+      derived->receive_update(get(owner, key), key, value);
+    }
+    else {
+      updates[get(owner, key)].push_back(std::make_pair(key, value));
+    }
+  }
+
+  void collect() { }
+
+  void synchronize()
+  {
+    // Emit all updates and then remove them
+    process_id_type num_processes = updates.size();
+    for (process_id_type p = 0; p < num_processes; ++p) {
+      if (!updates[p].empty()) {
+        send(process_group, p, msg_num_updates, updates[p].size());
+        send(process_group, p, msg_updates, 
+             &updates[p].front(), updates[p].size());
+        updates[p].clear();
+      }
+    }
+    
+    do_synchronize(process_group);
+  }
+
+  ProcessGroup process_group;
+
+ private:
+  std::vector<Updates> updates;
+  OwnerMap owner;
+};
+
+/**********************************************************************
+ * Remote updating set that sends messages immediately                *
+ **********************************************************************/
+template<typename Derived, typename ProcessGroup, typename Value,
+         typename OwnerMap>
+class remote_update_set<Derived, ProcessGroup, Value, OwnerMap,
+                        remote_set_immediate>
+{
+  typedef typename property_traits<OwnerMap>::key_type Key;
+  typedef std::pair<Key, Value> update_pair_type;
+  typedef typename std::vector<update_pair_type>::size_type updates_size_type;
+
+public:
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+private:
+  enum message_kind {
+    /** Contains a (key, value) pair that will be updated. */
+    msg_update
+  };
+
+  struct handle_messages
+  {
+    explicit handle_messages(remote_update_set* self, const ProcessGroup& pg) 
+      : self(self)
+    { update_sizes.resize(num_processes(pg), 0); }
+
+    void operator()(process_id_type source, int tag) 
+    { 
+      // Receive the # of updates
+      assert(tag == msg_update);
+      update_pair_type update;
+      receive(self->process_group, source, tag, update);
+      
+      // Send update to derived "receive_update" member
+      Derived* derived = static_cast<Derived*>(self);
+      derived->receive_update(source, update.first, update.second);
+    }
+
+  private:
+    std::vector<updates_size_type> update_sizes;
+    remote_update_set* self;
+  };
+  friend struct handle_messages;
+
+ protected:
+  remote_update_set(const ProcessGroup& pg, const OwnerMap& owner)
+    : process_group(pg, handle_messages(this, pg)), owner(owner) { }
+
+  void update(const Key& key, const Value& value)
+  { 
+    if (get(owner, key) == process_id(process_group)) {
+      Derived* derived = static_cast<Derived*>(this);
+      derived->receive_update(get(owner, key), key, value);
+    }
+    else
+      send(process_group, get(owner, key), msg_update, 
+           update_pair_type(key, value));
+  }
+
+  void collect() 
+  { 
+    typedef std::pair<process_id_type, int> probe_type;
+    handle_messages handler(this, process_group);
+    while (optional<probe_type> stp = probe(process_group))
+      if (stp->second == msg_update) handler(stp->first, stp->second);
+  }
+
+  void synchronize()
+  {
+    do_synchronize(process_group);
+  }
+
+  ProcessGroup process_group;
+  OwnerMap owner;
+};
+
+} } } // end namespace boost::graph::detail
+
+#endif // BOOST_GRAPH_DETAIL_REMOTE_UPDATE_SET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/tag_allocator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/detail/tag_allocator.hpp
new file mode 100644 (file)
index 0000000..2734039
--- /dev/null
@@ -0,0 +1,84 @@
+// -*- C++ -*-
+
+// Copyright (C) 2007  Douglas Gregor  <doug.gregor@gmail.com>
+
+// 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)
+#ifndef BOOST_GRAPH_DISTRIBUTED_TAG_ALLOCATOR_HPP
+#define BOOST_GRAPH_DISTRIBUTED_TAG_ALLOCATOR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <vector>
+
+namespace boost { namespace graph { namespace distributed { namespace detail {
+
+/**
+ * \brief The tag allocator allows clients to request unique tags that
+ * can be used for one-time communications.
+ *
+ * The tag allocator hands out tag values from a predefined maximum
+ * (given in the constructor) moving downward. Tags are provided one
+ * at a time via a @c token. When the @c token goes out of scope, the
+ * tag is returned and may be reallocated. These tags should be used,
+ * for example, for one-time communication of values.
+ */
+class tag_allocator {
+public:
+  class token;
+  friend class token;
+
+  /**
+   * Construct a new tag allocator that provides unique tags starting
+   * with the value @p top_tag and moving lower, as necessary.
+   */
+  explicit tag_allocator(int top_tag) : bottom(top_tag) { }
+
+  /**
+   * Retrieve a new tag. The token itself holds onto the tag, which
+   * will be released when the token is destroyed.
+   */
+  token get_tag();
+
+private:
+  int bottom;
+  std::vector<int> freed;
+};
+
+/**
+ * A token used to represent an allocated tag. 
+ */
+class tag_allocator::token {
+public:
+  /// Transfer ownership of the tag from @p other.
+  token(const token& other);
+
+  /// De-allocate the tag, if this token still owns it.
+  ~token();
+
+  /// Retrieve the tag allocated for this task.
+  operator int() const { return tag_; }
+
+private:
+  /// Create a token with a specific tag from the given tag_allocator
+  token(tag_allocator* allocator, int tag) 
+    : allocator(allocator), tag_(tag) { }
+
+  /// Undefined: tokens are not copy-assignable
+  token& operator=(const token&);
+
+  /// The allocator from which this tag was allocated.
+  tag_allocator* allocator;
+
+  /// The stored tag flag. If -1, this token does not own the tag.
+  mutable int tag_;
+
+  friend class tag_allocator;
+};
+
+} } } } // end namespace boost::graph::distributed::detail
+
+#endif // BOOST_GRAPH_DISTRIBUTED_TAG_ALLOCATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dijkstra_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/dijkstra_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..f72fa11
--- /dev/null
@@ -0,0 +1,205 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
+#define BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/distributed/crauser_et_al_shortest_paths.hpp>
+#include <boost/graph/distributed/eager_dijkstra_shortest_paths.hpp>
+
+namespace boost {
+
+  namespace graph { namespace detail {
+
+    
+    template<typename Lookahead>
+    struct parallel_dijkstra_impl2
+    {
+      template<typename DistributedGraph, typename DijkstraVisitor,
+               typename PredecessorMap, typename DistanceMap, 
+               typename WeightMap, typename IndexMap, typename ColorMap, 
+               typename Compare, typename Combine, typename DistInf, 
+               typename DistZero>
+      static void 
+      run(const DistributedGraph& g,
+          typename graph_traits<DistributedGraph>::vertex_descriptor s,
+          PredecessorMap predecessor, DistanceMap distance, 
+          typename property_traits<DistanceMap>::value_type lookahead,
+          WeightMap weight, IndexMap index_map, ColorMap color_map,
+          Compare compare, Combine combine, DistInf inf, DistZero zero,
+          DijkstraVisitor vis)
+      {
+        eager_dijkstra_shortest_paths(g, s, predecessor, distance, lookahead,
+                                      weight, index_map, color_map, compare,
+                                      combine, inf, zero, vis);
+      }
+    };
+
+    template<>
+    struct parallel_dijkstra_impl2< ::boost::detail::error_property_not_found >
+    {
+      template<typename DistributedGraph, typename DijkstraVisitor,
+               typename PredecessorMap, typename DistanceMap, 
+               typename WeightMap, typename IndexMap, typename ColorMap, 
+               typename Compare, typename Combine, typename DistInf, 
+               typename DistZero>
+      static void 
+      run(const DistributedGraph& g,
+          typename graph_traits<DistributedGraph>::vertex_descriptor s,
+          PredecessorMap predecessor, DistanceMap distance, 
+          ::boost::detail::error_property_not_found,
+          WeightMap weight, IndexMap index_map, ColorMap color_map,
+          Compare compare, Combine combine, DistInf inf, DistZero zero,
+          DijkstraVisitor vis)
+      {
+        crauser_et_al_shortest_paths(g, s, predecessor, distance, weight,
+                                     index_map, color_map, compare, combine,
+                                     inf, zero, vis);
+      }
+    };
+
+    template<typename ColorMap>
+    struct parallel_dijkstra_impl
+    {
+      template<typename DistributedGraph, typename DijkstraVisitor,
+               typename PredecessorMap, typename DistanceMap, 
+               typename Lookahead, typename WeightMap, typename IndexMap,
+               typename Compare, typename Combine, 
+               typename DistInf, typename DistZero>
+      static void 
+      run(const DistributedGraph& g,
+          typename graph_traits<DistributedGraph>::vertex_descriptor s,
+          PredecessorMap predecessor, DistanceMap distance, 
+          Lookahead lookahead,
+          WeightMap weight, IndexMap index_map, ColorMap color_map,
+          Compare compare, Combine combine, DistInf inf, DistZero zero,
+          DijkstraVisitor vis)
+      {
+        graph::detail::parallel_dijkstra_impl2<Lookahead>
+          ::run(g, s, predecessor, distance, lookahead, weight, index_map,
+                color_map, compare, combine, inf, zero, vis);
+      }
+    };
+    
+    template<>
+    struct parallel_dijkstra_impl< ::boost::detail::error_property_not_found >
+    {
+    private:
+      template<typename DistributedGraph, typename DijkstraVisitor,
+               typename PredecessorMap, typename DistanceMap, 
+               typename Lookahead, typename WeightMap, typename IndexMap,
+               typename ColorMap, typename Compare, typename Combine, 
+               typename DistInf, typename DistZero>
+      static void 
+      run_impl(const DistributedGraph& g,
+               typename graph_traits<DistributedGraph>::vertex_descriptor s,
+               PredecessorMap predecessor, DistanceMap distance, 
+               Lookahead lookahead, WeightMap weight, IndexMap index_map, 
+               ColorMap color_map, Compare compare, Combine combine, 
+               DistInf inf, DistZero zero, DijkstraVisitor vis)
+      {
+        BGL_FORALL_VERTICES_T(u, g, DistributedGraph)
+          BGL_FORALL_OUTEDGES_T(u, e, g, DistributedGraph)
+            local_put(color_map, target(e, g), white_color);
+
+        graph::detail::parallel_dijkstra_impl2<Lookahead>
+          ::run(g, s, predecessor, distance, lookahead, weight, index_map,
+                color_map, compare, combine, inf, zero, vis);
+      }
+
+    public:
+      template<typename DistributedGraph, typename DijkstraVisitor,
+               typename PredecessorMap, typename DistanceMap, 
+               typename Lookahead, typename WeightMap, typename IndexMap,
+               typename Compare, typename Combine, 
+               typename DistInf, typename DistZero>
+      static void 
+      run(const DistributedGraph& g,
+          typename graph_traits<DistributedGraph>::vertex_descriptor s,
+          PredecessorMap predecessor, DistanceMap distance, 
+          Lookahead lookahead, WeightMap weight, IndexMap index_map, 
+          ::boost::detail::error_property_not_found,
+          Compare compare, Combine combine, DistInf inf, DistZero zero,
+          DijkstraVisitor vis)
+      {
+        typedef typename graph_traits<DistributedGraph>::vertices_size_type
+          vertices_size_type;
+
+        vertices_size_type n = num_vertices(g);
+        std::vector<default_color_type> colors(n, white_color);
+
+        run_impl(g, s, predecessor, distance, lookahead, weight, index_map,
+                 make_iterator_property_map(colors.begin(), index_map),
+                 compare, combine, inf, zero, vis);
+      }
+    };
+  } } // end namespace graph::detail
+
+
+  /** Dijkstra's single-source shortest paths algorithm for distributed
+   * graphs.
+   *
+   * Also implements the heuristics of:
+   *
+   *   Andreas Crauser, Kurt Mehlhorn, Ulrich Meyer, and Peter
+   *   Sanders. A Parallelization of Dijkstra's Shortest Path
+   *   Algorithm. In Lubos Brim, Jozef Gruska, and Jiri Zlatuska,
+   *   editors, Mathematical Foundations of Computer Science (MFCS),
+   *   volume 1450 of Lecture Notes in Computer Science, pages
+   *   722--731, 1998. Springer.
+   */
+  template<typename DistributedGraph, typename DijkstraVisitor,
+           typename PredecessorMap, typename DistanceMap,
+           typename WeightMap, typename IndexMap, typename Compare,
+           typename Combine, typename DistInf, typename DistZero,
+           typename T, typename Tag, typename Base>
+  inline
+  void
+  dijkstra_shortest_paths
+    (const DistributedGraph& g,
+     typename graph_traits<DistributedGraph>::vertex_descriptor s,
+     PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
+     IndexMap index_map,
+     Compare compare, Combine combine, DistInf inf, DistZero zero,
+     DijkstraVisitor vis,
+     const bgl_named_params<T, Tag, Base>& params
+     BOOST_GRAPH_ENABLE_IF_MODELS_PARM(DistributedGraph,distributed_graph_tag))
+  {
+    typedef typename graph_traits<DistributedGraph>::vertices_size_type
+      vertices_size_type;
+
+    // Build a distributed property map for vertex colors, if we need it
+    bool use_default_color_map 
+      = is_default_param(get_param(params, vertex_color));
+    vertices_size_type n = use_default_color_map? num_vertices(g) : 1;
+    std::vector<default_color_type> color(n, white_color);
+    typedef iterator_property_map<std::vector<default_color_type>::iterator,
+                                  IndexMap> DefColorMap;
+    DefColorMap color_map(color.begin(), index_map);
+
+    typedef typename property_value< bgl_named_params<T, Tag, Base>,
+      vertex_color_t>::type color_map_type;
+
+    graph::detail::parallel_dijkstra_impl<color_map_type>
+      ::run(g, s, predecessor, distance, 
+            get_param(params, lookahead_t()),
+            weight, index_map,
+            get_param(params, vertex_color),
+            compare, combine, inf, zero, vis);
+  }
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PARALLEL_DIJKSTRA_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/distributed_graph_utility.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/distributed_graph_utility.hpp
new file mode 100644 (file)
index 0000000..058b988
--- /dev/null
@@ -0,0 +1,154 @@
+// Copyright (C) 2005-2006 The Trustees of Indiana University.
+// 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)
+
+//  Authors: Peter Gottschling
+//           Douglas Gregor
+//           Andrew Lumsdaine
+
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/property_map/parallel/global_index_map.hpp>
+
+#ifndef BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE
+#define BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { namespace graph {
+
+  template <class Property, class Graph>
+  void property_on_inedges(Property p, const Graph& g) 
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      BGL_FORALL_INEDGES_T(u, e, g, Graph)
+      request(p, e);
+    synchronize(p);
+  }
+  
+  // For reverse graphs
+  template <class Property, class Graph>
+  void property_on_outedges(Property p, const Graph& g) 
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+        request(p, e);
+    synchronize(p);
+  }
+
+  template <class Property, class Graph>
+  void property_on_successors(Property p, const Graph& g) 
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+        request(p, target(e, g));
+    synchronize(p);
+  }
+  
+  template <class Property, class Graph>
+  void property_on_predecessors(Property p, const Graph& g) 
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      BGL_FORALL_INEDGES_T(u, e, g, Graph)
+        request(p, source(e, g));
+    synchronize(p);
+  }
+  
+  // Like successors and predecessors but saves one synchronize (and a call)
+  template <class Property, class Graph>
+  void property_on_adjacents(Property p, const Graph& g) 
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph) {
+      BGL_FORALL_OUTEDGES_T(u, e, g, Graph)
+        request(p, target(e, g));
+      BGL_FORALL_INEDGES_T(u, e, g, Graph)
+        request(p, source(e, g));
+    }
+    synchronize(p);
+  }
+
+  template <class PropertyIn, class PropertyOut, class Graph>
+  void copy_vertex_property(PropertyIn p_in, PropertyOut p_out, Graph& g)
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      put(p_out, u, get(p_in, g));
+  }
+
+  template <class PropertyIn, class PropertyOut, class Graph>
+  void copy_edge_property(PropertyIn p_in, PropertyOut p_out, Graph& g)
+  {
+    BGL_FORALL_EDGES_T(e, g, Graph)
+      put(p_out, e, get(p_in, g));
+  }
+
+
+  namespace distributed {
+
+    // Define global_index<Graph>  global(graph);
+    // Then global(v) returns global index of v
+    template <typename Graph>
+    struct global_index
+    {
+      typedef typename property_map<Graph, vertex_index_t>::const_type
+      VertexIndexMap;
+      typedef typename property_map<Graph, vertex_global_t>::const_type
+      VertexGlobalMap;
+
+      explicit global_index(Graph const& g)
+        : global_index_map(process_group(g), num_vertices(g), get(vertex_index, g),
+                           get(vertex_global, g)) {}
+
+      int operator() (typename graph_traits<Graph>::vertex_descriptor v)
+      { return get(global_index_map, v); }
+    
+    protected:
+      boost::parallel::global_index_map<VertexIndexMap, VertexGlobalMap> 
+      global_index_map;
+    };
+
+    template<typename T>
+    struct additive_reducer {
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+      
+      template<typename K>
+      T operator()(const K&) const { return T(0); }
+      
+      template<typename K>
+      T operator()(const K&, const T& local, const T& remote) const { return local + remote; }
+    };
+
+    template <typename T>
+    struct choose_min_reducer {
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+      
+      template<typename K>
+      T operator()(const K&) const { return (std::numeric_limits<T>::max)(); }
+      
+      template<typename K>
+      T operator()(const K&, const T& x, const T& y) const 
+      { return x < y ? x : y; }
+    };
+
+    // To use a property map syntactically like a function
+    template <typename PropertyMap>
+    struct property_map_reader
+    {
+      explicit property_map_reader(PropertyMap pm) : pm(pm) {}
+
+      template <typename T>
+      typename PropertyMap::value_type
+      operator() (const T& v)
+      {
+        return get(pm, v);
+      }
+    private:
+      PropertyMap pm;
+    };
+
+  } // namespace distributed
+
+}} // namespace boost::graph
+
+#endif // BOOST_GRAPH_DISTRIBUTED_GRAPH_UTILITY_INCLUDE
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/eager_dijkstra_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/eager_dijkstra_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..8cee034
--- /dev/null
@@ -0,0 +1,446 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+/**************************************************************************
+ * This source file implements a variation on distributed Dijkstra's      *
+ * algorithm that can expose additional parallelism by permitting         *
+ * vertices within a certain distance from the minimum to be processed,   *
+ * even though they may not be at their final distance. This can          *
+ * introduce looping, but the algorithm will still terminate so long as   *
+ * there are no negative loops.                                           *
+ **************************************************************************/
+#ifndef BOOST_GRAPH_EAGER_DIJKSTRA_SHORTEST_PATHS_HPP
+#define BOOST_GRAPH_EAGER_DIJKSTRA_SHORTEST_PATHS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/distributed/detail/dijkstra_shortest_paths.hpp>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/distributed/detail/remote_update_set.hpp>
+#include <vector>
+#include <boost/graph/breadth_first_search.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+#ifdef PBGL_ACCOUNTING
+#  include <boost/graph/accounting.hpp>
+#  include <numeric>
+#endif // PBGL_ACCOUNTING
+
+#ifdef MUTABLE_QUEUE
+#  include <boost/pending/mutable_queue.hpp>
+#endif
+
+namespace boost { namespace graph { namespace distributed {
+
+#ifdef PBGL_ACCOUNTING
+struct eager_dijkstra_shortest_paths_stats_t
+{
+  /* The value of the lookahead parameter. */
+  double lookahead;
+
+  /* Total wall-clock time used by the algorithm.*/
+  accounting::time_type execution_time;
+
+  /* The number of vertices deleted in each superstep. */
+  std::vector<std::size_t> deleted_vertices;
+
+  template<typename OutputStream>
+  void print(OutputStream& out)
+  {
+    double avg_deletions = std::accumulate(deleted_vertices.begin(),
+                                           deleted_vertices.end(),
+                                           0.0);
+    avg_deletions /= deleted_vertices.size();
+
+    out << "Problem = \"Single-Source Shortest Paths\"\n"
+        << "Algorithm = \"Eager Dijkstra\"\n"
+        << "Function = eager_dijkstra_shortest_paths\n"
+        << "(P) Lookahead = " << lookahead << "\n"
+        << "Wall clock time = " << accounting::print_time(execution_time) 
+        << "\nSupersteps = " << deleted_vertices.size() << "\n"
+        << "Avg. deletions per superstep = " << avg_deletions << "\n";
+  }
+};
+
+static eager_dijkstra_shortest_paths_stats_t eager_dijkstra_shortest_paths_stats;
+#endif
+
+namespace detail {
+
+// Borrowed from BGL's dijkstra_shortest_paths
+template <class UniformCostVisitor, class Queue,
+          class WeightMap, class PredecessorMap, class DistanceMap,
+          class BinaryFunction, class BinaryPredicate>
+ struct parallel_dijkstra_bfs_visitor : bfs_visitor<>
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+  parallel_dijkstra_bfs_visitor(UniformCostVisitor vis, Queue& Q,
+                                WeightMap w, PredecessorMap p, DistanceMap d,
+                                BinaryFunction combine, BinaryPredicate compare,
+                                distance_type zero)
+    : m_vis(vis), m_Q(Q), m_weight(w), m_predecessor(p), m_distance(d),
+      m_combine(combine), m_compare(compare), m_zero(zero)  { }
+
+  template <class Vertex, class Graph>
+  void initialize_vertex(Vertex u, Graph& g)
+    { m_vis.initialize_vertex(u, g); }
+  template <class Vertex, class Graph>
+  void discover_vertex(Vertex u, Graph& g) { m_vis.discover_vertex(u, g); }
+  template <class Vertex, class Graph>
+  void examine_vertex(Vertex u, Graph& g) { m_vis.examine_vertex(u, g); }
+
+  /* Since the eager formulation of Parallel Dijkstra's algorithm can
+     loop, we may relax on *any* edge, not just those associated with
+     white and gray targets. */
+  template <class Edge, class Graph>
+  void examine_edge(Edge e, Graph& g) {
+    if (m_compare(get(m_weight, e), m_zero))
+        boost::throw_exception(negative_edge());
+
+    m_vis.examine_edge(e, g);
+
+    boost::parallel::caching_property_map<PredecessorMap> c_pred(m_predecessor);
+    boost::parallel::caching_property_map<DistanceMap> c_dist(m_distance);
+
+    distance_type old_distance = get(c_dist, target(e, g));
+
+    bool m_decreased = relax(e, g, m_weight, c_pred, c_dist,
+                             m_combine, m_compare);
+
+    /* On x86 Linux with optimization, we sometimes get into a
+       horrible case where m_decreased is true but the distance hasn't
+       actually changed. This occurs when the comparison inside
+       relax() occurs with the 80-bit precision of the x87 floating
+       point unit, but the difference is lost when the resulting
+       values are written back to lower-precision memory (e.g., a
+       double). With the eager Dijkstra's implementation, this results
+       in looping. */
+    if (m_decreased && old_distance != get(c_dist, target(e, g))) {
+      m_Q.update(target(e, g));
+      m_vis.edge_relaxed(e, g);
+    } else
+      m_vis.edge_not_relaxed(e, g);
+  }
+  template <class Vertex, class Graph>
+  void finish_vertex(Vertex u, Graph& g) { m_vis.finish_vertex(u, g); }
+
+  UniformCostVisitor m_vis;
+  Queue& m_Q;
+  WeightMap m_weight;
+  PredecessorMap m_predecessor;
+  DistanceMap m_distance;
+  BinaryFunction m_combine;
+  BinaryPredicate m_compare;
+  distance_type m_zero;
+};
+
+  /**********************************************************************
+   * Dijkstra queue that implements arbitrary "lookahead"               *
+   **********************************************************************/
+  template<typename Graph, typename Combine, typename Compare,
+           typename VertexIndexMap, typename DistanceMap,
+           typename PredecessorMap>
+  class lookahead_dijkstra_queue
+    : public graph::detail::remote_update_set<
+               lookahead_dijkstra_queue<
+                 Graph, Combine, Compare, VertexIndexMap, DistanceMap,
+                 PredecessorMap>,
+               typename boost::graph::parallel::process_group_type<Graph>::type,
+               typename dijkstra_msg_value<DistanceMap, PredecessorMap>::type,
+               typename property_map<Graph, vertex_owner_t>::const_type>
+  {
+    typedef typename graph_traits<Graph>::vertex_descriptor
+      vertex_descriptor;
+    typedef lookahead_dijkstra_queue self_type;
+    typedef typename boost::graph::parallel::process_group_type<Graph>::type
+      process_group_type;
+    typedef dijkstra_msg_value<DistanceMap, PredecessorMap> msg_value_creator;
+    typedef typename msg_value_creator::type msg_value_type;
+    typedef typename property_map<Graph, vertex_owner_t>::const_type
+      OwnerPropertyMap;
+
+    typedef graph::detail::remote_update_set<self_type, process_group_type,
+                                             msg_value_type, OwnerPropertyMap>
+      inherited;
+
+    // Priority queue for tentative distances
+    typedef indirect_cmp<DistanceMap, Compare> queue_compare_type;
+
+    typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+#ifdef MUTABLE_QUEUE
+    typedef mutable_queue<vertex_descriptor, std::vector<vertex_descriptor>, 
+                          queue_compare_type, VertexIndexMap> queue_type;
+
+#else
+    typedef relaxed_heap<vertex_descriptor, queue_compare_type, 
+                         VertexIndexMap> queue_type;
+#endif // MUTABLE_QUEUE
+
+    typedef typename process_group_type::process_id_type process_id_type;
+
+  public:
+    typedef vertex_descriptor value_type;
+
+    lookahead_dijkstra_queue(const Graph& g,
+                             const Combine& combine,
+                             const Compare& compare,
+                             const VertexIndexMap& id,
+                             const DistanceMap& distance_map,
+                             const PredecessorMap& predecessor_map,
+                             distance_type lookahead)
+      : inherited(boost::graph::parallel::process_group(g), get(vertex_owner, g)),
+        queue(num_vertices(g), queue_compare_type(distance_map, compare), id),
+        distance_map(distance_map),
+        predecessor_map(predecessor_map),
+        min_distance(0),
+        lookahead(lookahead)
+#ifdef PBGL_ACCOUNTING
+        , local_deletions(0)
+#endif
+    { }
+
+    void push(const value_type& x)
+    {
+      msg_value_type msg_value = 
+        msg_value_creator::create(get(distance_map, x),
+                                  predecessor_value(get(predecessor_map, x)));
+      inherited::update(x, msg_value);
+    }
+    
+    void update(const value_type& x) { push(x); }
+
+    void pop() 
+    { 
+      queue.pop(); 
+#ifdef PBGL_ACCOUNTING
+      ++local_deletions;
+#endif
+    }
+
+    value_type&       top()       { return queue.top(); }
+    const value_type& top() const { return queue.top(); }
+
+    bool empty()
+    {
+      inherited::collect();
+
+      // If there are no suitable messages, wait until we get something
+      while (!has_suitable_vertex()) {
+        if (do_synchronize()) return true;
+      }
+
+      // Return true only if nobody has any messages; false if we
+      // have suitable messages
+      return false;
+    }
+
+  private:
+    vertex_descriptor predecessor_value(vertex_descriptor v) const
+    { return v; }
+
+    vertex_descriptor
+    predecessor_value(property_traits<dummy_property_map>::reference) const
+    { return graph_traits<Graph>::null_vertex(); }
+
+    bool has_suitable_vertex() const
+    {
+      return (!queue.empty() 
+              && get(distance_map, queue.top()) <= min_distance + lookahead);
+    }
+
+    bool do_synchronize()
+    {
+      using boost::parallel::all_reduce;
+      using boost::parallel::minimum;
+
+      inherited::synchronize();
+
+      // TBD: could use combine here, but then we need to stop using
+      // minimum<distance_type>() as the function object.
+      distance_type local_distance = 
+        queue.empty()? (std::numeric_limits<distance_type>::max)()
+        : get(distance_map, queue.top());
+
+      all_reduce(this->process_group, &local_distance, &local_distance + 1,
+                 &min_distance, minimum<distance_type>());
+
+#ifdef PBGL_ACCOUNTING
+      std::size_t deletions = 0;
+      all_reduce(this->process_group, &local_deletions, &local_deletions + 1,
+                 &deletions, std::plus<std::size_t>());
+      if (process_id(this->process_group) == 0)
+        eager_dijkstra_shortest_paths_stats.deleted_vertices
+          .push_back(deletions);
+      local_deletions = 0;
+      assert(deletions > 0);
+#endif
+
+      return min_distance == (std::numeric_limits<distance_type>::max)();
+    }
+    
+  public:
+    void 
+    receive_update(process_id_type source, vertex_descriptor vertex,
+                   distance_type distance)
+    {
+      // Update the queue if the received distance is better than
+      // the distance we know locally
+      if (distance <= get(distance_map, vertex)) {
+
+        // Update the local distance map
+        put(distance_map, vertex, distance);
+
+        bool is_in_queue = queue.contains(vertex);
+
+        if (!is_in_queue) 
+          queue.push(vertex);
+        else 
+          queue.update(vertex);
+      }
+    }
+
+    void 
+    receive_update(process_id_type source, vertex_descriptor vertex,
+                   std::pair<distance_type, vertex_descriptor> p)
+    {
+      if (p.first <= get(distance_map, vertex)) {
+        put(predecessor_map, vertex, p.second);
+        receive_update(source, vertex, p.first);
+      }
+    }
+
+  private:
+    queue_type     queue;
+    DistanceMap    distance_map;
+    PredecessorMap predecessor_map;
+    distance_type  min_distance;
+    distance_type  lookahead;
+#ifdef PBGL_ACCOUNTING
+    std::size_t    local_deletions;
+#endif
+  };
+  /**********************************************************************/
+} // end namespace detail
+
+template<typename DistributedGraph, typename DijkstraVisitor,
+         typename PredecessorMap, typename DistanceMap, typename WeightMap,
+         typename IndexMap, typename ColorMap, typename Compare,
+         typename Combine, typename DistInf, typename DistZero>
+void
+eager_dijkstra_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, 
+   typename property_traits<DistanceMap>::value_type lookahead,
+   WeightMap weight, IndexMap index_map, ColorMap color_map,
+   Compare compare, Combine combine, DistInf inf, DistZero zero,
+   DijkstraVisitor vis)
+{
+  typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type
+    process_group_type;
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+    Vertex;
+  typedef typename graph_traits<DistributedGraph>::vertices_size_type
+    vertices_size_type;
+
+#ifdef PBGL_ACCOUNTING
+  eager_dijkstra_shortest_paths_stats.deleted_vertices.clear();
+  eager_dijkstra_shortest_paths_stats.lookahead = lookahead;
+  eager_dijkstra_shortest_paths_stats.execution_time = accounting::get_time();
+#endif
+
+  // Initialize local portion of property maps
+  typename graph_traits<DistributedGraph>::vertex_iterator ui, ui_end;
+  for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
+    put(distance, *ui, inf);
+    put(predecessor, *ui, *ui);
+  }
+  put(distance, s, zero);
+
+  // Dijkstra Queue
+  typedef detail::lookahead_dijkstra_queue
+            <DistributedGraph, Combine, Compare, IndexMap, DistanceMap,
+             PredecessorMap> Queue;
+
+  Queue Q(g, combine, compare, index_map, distance, 
+          predecessor, lookahead);
+
+  // Parallel Dijkstra visitor
+  detail::parallel_dijkstra_bfs_visitor
+    <DijkstraVisitor, Queue, WeightMap, PredecessorMap, DistanceMap, Combine, 
+     Compare> bfs_vis(vis, Q, weight, predecessor, distance, combine, compare,
+                      zero);
+
+  set_property_map_role(vertex_color, color_map);
+  set_property_map_role(vertex_distance, distance);
+
+  breadth_first_search(g, s, Q, bfs_vis, color_map);
+
+#ifdef PBGL_ACCOUNTING
+  eager_dijkstra_shortest_paths_stats.execution_time = 
+    accounting::get_time() 
+    - eager_dijkstra_shortest_paths_stats.execution_time;
+#endif
+}
+
+template<typename DistributedGraph, typename DijkstraVisitor,
+         typename PredecessorMap, typename DistanceMap, typename WeightMap>
+void
+eager_dijkstra_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance, 
+   typename property_traits<DistanceMap>::value_type lookahead,
+   WeightMap weight)
+{
+  typedef typename property_traits<DistanceMap>::value_type distance_type;
+
+  std::vector<default_color_type> colors(num_vertices(g), white_color);
+
+  eager_dijkstra_shortest_paths(g, s, predecessor, distance, lookahead, weight,
+                                get(vertex_index, g),
+                                make_iterator_property_map(&colors[0],
+                                                           get(vertex_index, 
+                                                               g)),
+                                std::less<distance_type>(),
+                                closed_plus<distance_type>(),
+                                distance_type(),
+                                (std::numeric_limits<distance_type>::max)(),
+                                dijkstra_visitor<>());
+}
+
+template<typename DistributedGraph, typename DijkstraVisitor,
+         typename PredecessorMap, typename DistanceMap>
+void
+eager_dijkstra_shortest_paths
+  (const DistributedGraph& g,
+   typename graph_traits<DistributedGraph>::vertex_descriptor s,
+   PredecessorMap predecessor, DistanceMap distance,
+   typename property_traits<DistanceMap>::value_type lookahead)
+{
+  eager_dijkstra_shortest_paths(g, s, predecessor, distance, lookahead,
+                               get(edge_weight, g));
+}
+} // end namespace distributed
+
+#ifdef PBGL_ACCOUNTING
+using distributed::eager_dijkstra_shortest_paths_stats;
+#endif
+
+using distributed::eager_dijkstra_shortest_paths;
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_EAGER_DIJKSTRA_SHORTEST_PATHS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/filtered_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/filtered_graph.hpp
new file mode 100644 (file)
index 0000000..9677e4d
--- /dev/null
@@ -0,0 +1,51 @@
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_DISTRIBUTED_FILTERED_GRAPH_HPP
+#define BOOST_DISTRIBUTED_FILTERED_GRAPH_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/graph/filtered_graph.hpp>
+
+namespace boost {
+  namespace graph {
+          namespace parallel {
+      /// Retrieve the process group from a filtered graph
+      template<typename Graph, typename EdgePredicate, typename VertexPredicate>
+      struct process_group_type<filtered_graph<Graph, EdgePredicate, VertexPredicate> >
+        : process_group_type<Graph> { };
+
+      template<typename Graph, typename EdgePredicate, typename VertexPredicate>
+      struct process_group_type<const filtered_graph<Graph, EdgePredicate, VertexPredicate> >
+        : process_group_type<Graph> { };
+    }
+
+  }
+
+  /// Retrieve the process group from a filtered graph
+  template<typename Graph, typename EdgePredicate, typename VertexPredicate>
+  inline typename graph::parallel::process_group_type<Graph>::type
+  process_group(filtered_graph<Graph, EdgePredicate, VertexPredicate> const& g) {
+    return process_group(g.m_g);
+  }
+
+  /// Forward vertex() to vertex() of the base graph 
+  template <typename Graph, typename EdgePredicate, typename VertexPredicate>
+  typename graph_traits<Graph>::vertex_descriptor
+  vertex(typename graph_traits<Graph>::vertices_size_type i, 
+         filtered_graph<Graph, EdgePredicate, VertexPredicate> const& g)
+  { return vertex(i, g.m_g); }
+
+}
+
+#endif // BOOST_DISTRIBUTED_FILTERED_GRAPH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/fruchterman_reingold.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/fruchterman_reingold.hpp
new file mode 100644 (file)
index 0000000..a89aea3
--- /dev/null
@@ -0,0 +1,384 @@
+// Copyright (C) 2005-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_FRUCHTERMAN_REINGOLD_HPP
+#define BOOST_GRAPH_DISTRIBUTED_FRUCHTERMAN_REINGOLD_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/fruchterman_reingold.hpp>
+
+namespace boost { namespace graph { namespace distributed {
+
+class simple_tiling
+{
+ public:
+  simple_tiling(int columns, int rows, bool flip = true) 
+    : columns(columns), rows(rows), flip(flip)
+  {
+  }
+
+  // Convert from a position (x, y) in the tiled display into a
+  // processor ID number
+  int operator()(int x, int y) const
+  {
+    return flip? (rows - y - 1) * columns + x : y * columns + x;
+  }
+
+  // Convert from a process ID to a position (x, y) in the tiled
+  // display
+  std::pair<int, int> operator()(int id)
+  {
+    int my_col = id % columns;
+    int my_row = flip? rows - (id / columns) - 1 : id / columns;
+    return std::make_pair(my_col, my_row);
+  }
+
+  int columns, rows;
+
+ private:
+  bool flip;
+};
+
+// Force pairs function object that does nothing
+struct no_force_pairs
+{
+  template<typename Graph, typename ApplyForce>
+  void operator()(const Graph&, const ApplyForce&)
+  {
+  }
+};
+
+// Computes force pairs in the distributed case.
+template<typename PositionMap, typename DisplacementMap, typename LocalForces,
+         typename NonLocalForces = no_force_pairs>
+class distributed_force_pairs_proxy
+{
+ public:
+  distributed_force_pairs_proxy(const PositionMap& position, 
+                                const DisplacementMap& displacement,
+                                const LocalForces& local_forces,
+                                const NonLocalForces& nonlocal_forces = NonLocalForces())
+    : position(position), displacement(displacement), 
+      local_forces(local_forces), nonlocal_forces(nonlocal_forces)
+  {
+  }
+
+  template<typename Graph, typename ApplyForce>
+  void operator()(const Graph& g, ApplyForce apply_force)
+  {
+    // Flush remote displacements
+    displacement.flush();
+
+    // Receive updated positions for all of our neighbors
+    synchronize(position);
+
+    // Reset remote displacements 
+    displacement.reset();
+
+    // Compute local repulsive forces
+    local_forces(g, apply_force);
+
+    // Compute neighbor repulsive forces
+    nonlocal_forces(g, apply_force);
+  }
+
+ protected:
+  PositionMap position;
+  DisplacementMap displacement;
+  LocalForces local_forces;
+  NonLocalForces nonlocal_forces;
+};
+
+template<typename PositionMap, typename DisplacementMap, typename LocalForces>
+inline 
+distributed_force_pairs_proxy<PositionMap, DisplacementMap, LocalForces>
+make_distributed_force_pairs(const PositionMap& position, 
+                             const DisplacementMap& displacement,
+                             const LocalForces& local_forces)
+{
+  typedef 
+    distributed_force_pairs_proxy<PositionMap, DisplacementMap, LocalForces>
+    result_type;
+  return result_type(position, displacement, local_forces);
+}
+
+template<typename PositionMap, typename DisplacementMap, typename LocalForces,
+         typename NonLocalForces>
+inline 
+distributed_force_pairs_proxy<PositionMap, DisplacementMap, LocalForces,
+                              NonLocalForces>
+make_distributed_force_pairs(const PositionMap& position, 
+                             const DisplacementMap& displacement,
+                             const LocalForces& local_forces,
+                             const NonLocalForces& nonlocal_forces)
+{
+  typedef 
+    distributed_force_pairs_proxy<PositionMap, DisplacementMap, LocalForces,
+                                  NonLocalForces>
+      result_type;
+  return result_type(position, displacement, local_forces, nonlocal_forces);
+}
+
+// Compute nonlocal force pairs based on the shared borders with
+// adjacent tiles.
+template<typename PositionMap>
+class neighboring_tiles_force_pairs
+{
+ public:
+  typedef typename property_traits<PositionMap>::value_type Point;
+  typedef typename point_traits<Point>::component_type Dim;
+
+  enum bucket_position { left, top, right, bottom, end_position };
+  
+  neighboring_tiles_force_pairs(PositionMap position, Point origin,
+                                Point extent, simple_tiling tiling)
+    : position(position), origin(origin), extent(extent), tiling(tiling)
+  {
+  }
+
+  template<typename Graph, typename ApplyForce>
+  void operator()(const Graph& g, ApplyForce apply_force)
+  {
+    // TBD: Do this some smarter way
+    if (tiling.columns == 1 && tiling.rows == 1)
+      return;
+
+    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+#ifndef BOOST_NO_STDC_NAMESPACE
+    using std::sqrt;
+#endif // BOOST_NO_STDC_NAMESPACE
+
+    // TBD: num_vertices(g) should be the global number of vertices?
+    Dim two_k = Dim(2) * sqrt(extent[0] * extent[1] / num_vertices(g));
+
+    std::vector<vertex_descriptor> my_vertices[4];
+    std::vector<vertex_descriptor> neighbor_vertices[4];
+   
+    // Compute cutoff positions
+    Dim cutoffs[4];
+    cutoffs[left] = origin[0] + two_k;
+    cutoffs[top] = origin[1] + two_k;
+    cutoffs[right] = origin[0] + extent[0] - two_k;
+    cutoffs[bottom] = origin[1] + extent[1] - two_k;
+
+    // Compute neighbors
+    typename PositionMap::process_group_type pg = position.process_group();
+    std::pair<int, int> my_tile = tiling(process_id(pg));
+    int neighbors[4] = { -1, -1, -1, -1 } ;
+    if (my_tile.first > 0)
+      neighbors[left] = tiling(my_tile.first - 1, my_tile.second);
+    if (my_tile.second > 0)
+      neighbors[top] = tiling(my_tile.first, my_tile.second - 1);
+    if (my_tile.first < tiling.columns - 1)
+      neighbors[right] = tiling(my_tile.first + 1, my_tile.second);
+    if (my_tile.second < tiling.rows - 1)
+      neighbors[bottom] = tiling(my_tile.first, my_tile.second + 1);
+
+    // Sort vertices along the edges into buckets
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      if (position[v][0] <= cutoffs[left]) my_vertices[left].push_back(v); 
+      if (position[v][1] <= cutoffs[top]) my_vertices[top].push_back(v); 
+      if (position[v][0] >= cutoffs[right]) my_vertices[right].push_back(v); 
+      if (position[v][1] >= cutoffs[bottom]) my_vertices[bottom].push_back(v); 
+    }
+
+    // Send vertices to neighbors, and gather our neighbors' vertices
+    bucket_position pos;
+    for (pos = left; pos < end_position; pos = bucket_position(pos + 1)) {
+      if (neighbors[pos] != -1) {
+        send(pg, neighbors[pos], 0, my_vertices[pos].size());
+        if (!my_vertices[pos].empty())
+          send(pg, neighbors[pos], 1, 
+               &my_vertices[pos].front(), my_vertices[pos].size());
+      }
+    }
+
+    // Pass messages around
+    synchronize(pg);
+    
+    // Receive neighboring vertices
+    for (pos = left; pos < end_position; pos = bucket_position(pos + 1)) {
+      if (neighbors[pos] != -1) {
+        std::size_t incoming_vertices;
+        receive(pg, neighbors[pos], 0, incoming_vertices);
+
+        if (incoming_vertices) {
+          neighbor_vertices[pos].resize(incoming_vertices);
+          receive(pg, neighbors[pos], 1, &neighbor_vertices[pos].front(),
+                  incoming_vertices);
+        }
+      }
+    }
+
+    // For each neighboring vertex, we need to get its current position
+    for (pos = left; pos < end_position; pos = bucket_position(pos + 1))
+      for (typename std::vector<vertex_descriptor>::iterator i = 
+             neighbor_vertices[pos].begin(); 
+           i != neighbor_vertices[pos].end();
+           ++i)
+        request(position, *i);
+    synchronize(position);
+
+    // Apply forces in adjacent bins. This is O(n^2) in the worst
+    // case. Oh well.
+    for (pos = left; pos < end_position; pos = bucket_position(pos + 1)) {
+      for (typename std::vector<vertex_descriptor>::iterator i = 
+             my_vertices[pos].begin(); 
+           i != my_vertices[pos].end();
+           ++i)
+        for (typename std::vector<vertex_descriptor>::iterator j = 
+               neighbor_vertices[pos].begin(); 
+             j != neighbor_vertices[pos].end();
+             ++j)
+          apply_force(*i, *j);
+    }
+  }
+
+ protected:
+  PositionMap position;
+  Point origin;
+  Point extent;
+  simple_tiling tiling;
+};
+
+template<typename PositionMap>
+inline neighboring_tiles_force_pairs<PositionMap>
+make_neighboring_tiles_force_pairs
+ (PositionMap position, 
+  typename property_traits<PositionMap>::value_type origin,
+  typename property_traits<PositionMap>::value_type extent,
+  simple_tiling tiling)
+{
+  return neighboring_tiles_force_pairs<PositionMap>(position, origin, extent,
+                                                    tiling);
+}
+
+template<typename DisplacementMap, typename Cooling>
+class distributed_cooling_proxy
+{
+ public:
+  typedef typename Cooling::result_type result_type;
+
+  distributed_cooling_proxy(const DisplacementMap& displacement,
+                            const Cooling& cooling)
+    : displacement(displacement), cooling(cooling)
+  {
+  }
+
+  result_type operator()()
+  {
+    // Accumulate displacements computed on each processor
+    synchronize(displacement.data->process_group);
+
+    // Allow the underlying cooling to occur
+    return cooling();
+  }
+
+ protected:
+  DisplacementMap displacement;
+  Cooling cooling;
+};
+
+template<typename DisplacementMap, typename Cooling>
+inline distributed_cooling_proxy<DisplacementMap, Cooling>
+make_distributed_cooling(const DisplacementMap& displacement,
+                         const Cooling& cooling)
+{
+  typedef distributed_cooling_proxy<DisplacementMap, Cooling> result_type;
+  return result_type(displacement, cooling);
+}
+
+template<typename Point>
+struct point_accumulating_reducer {
+  BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+  template<typename K>
+  Point operator()(const K&) const { return Point(); }
+
+  template<typename K>
+  Point operator()(const K&, const Point& p1, const Point& p2) const 
+  { return Point(p1[0] + p2[0], p1[1] + p2[1]); }
+};
+
+template<typename Graph, typename PositionMap, 
+         typename AttractiveForce, typename RepulsiveForce,
+         typename ForcePairs, typename Cooling, typename DisplacementMap>
+void
+fruchterman_reingold_force_directed_layout
+ (const Graph&    g,
+  PositionMap     position,
+  typename property_traits<PositionMap>::value_type const& origin,
+  typename property_traits<PositionMap>::value_type const& extent,
+  AttractiveForce attractive_force,
+  RepulsiveForce  repulsive_force,
+  ForcePairs      force_pairs,
+  Cooling         cool,
+  DisplacementMap displacement)
+{
+  typedef typename property_traits<PositionMap>::value_type Point;
+
+  // Reduction in the displacement map involves summing the forces
+  displacement.set_reduce(point_accumulating_reducer<Point>());
+
+  // We need to track the positions of all of our neighbors
+  BGL_FORALL_VERTICES_T(u, g, Graph)
+    BGL_FORALL_ADJ_T(u, v, g, Graph)
+      request(position, v);
+
+  // Invoke the "sequential" Fruchterman-Reingold implementation
+  boost::fruchterman_reingold_force_directed_layout
+    (g, position, origin, extent,
+     attractive_force, repulsive_force,
+     make_distributed_force_pairs(position, displacement, force_pairs),
+     make_distributed_cooling(displacement, cool),
+     displacement);
+}
+
+template<typename Graph, typename PositionMap, 
+         typename AttractiveForce, typename RepulsiveForce,
+         typename ForcePairs, typename Cooling, typename DisplacementMap>
+void
+fruchterman_reingold_force_directed_layout
+ (const Graph&    g,
+  PositionMap     position,
+  typename property_traits<PositionMap>::value_type const& origin,
+  typename property_traits<PositionMap>::value_type const& extent,
+  AttractiveForce attractive_force,
+  RepulsiveForce  repulsive_force,
+  ForcePairs      force_pairs,
+  Cooling         cool,
+  DisplacementMap displacement,
+  simple_tiling   tiling)
+{
+  typedef typename property_traits<PositionMap>::value_type Point;
+
+  // Reduction in the displacement map involves summing the forces
+  displacement.set_reduce(point_accumulating_reducer<Point>());
+
+  // We need to track the positions of all of our neighbors
+  BGL_FORALL_VERTICES_T(u, g, Graph)
+    BGL_FORALL_ADJ_T(u, v, g, Graph)
+      request(position, v);
+
+  // Invoke the "sequential" Fruchterman-Reingold implementation
+  boost::fruchterman_reingold_force_directed_layout
+    (g, position, origin, extent,
+     attractive_force, repulsive_force,
+     make_distributed_force_pairs
+      (position, displacement, force_pairs,
+       make_neighboring_tiles_force_pairs(position, origin, extent, tiling)),
+     make_distributed_cooling(displacement, cool),
+     displacement);
+}
+
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_DISTRIBUTED_FRUCHTERMAN_REINGOLD_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/graphviz.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/graphviz.hpp
new file mode 100644 (file)
index 0000000..1ca4082
--- /dev/null
@@ -0,0 +1,294 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_GRAPHVIZ_HPP
+#define BOOST_GRAPH_PARALLEL_GRAPHVIZ_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/graphviz.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <fstream>
+#include <sstream>
+#include <iostream>
+#include <string>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/property_map/parallel/global_index_map.hpp>
+
+namespace boost {
+
+template<typename Graph>
+struct graph_id_writer
+{
+  explicit graph_id_writer(const Graph& g) : g(g) { }
+
+  void operator()(std::ostream& out)
+  {
+    out << "    label=\"p" << process_id(g.process_group()) << "\";\n";
+  }
+
+ private:
+  const Graph& g;
+};
+
+template<typename NumberMap>
+struct paint_by_number_writer
+{
+  explicit paint_by_number_writer(NumberMap number) : number(number) { }
+
+  template<typename Descriptor>
+  void operator()(std::ostream& out, Descriptor k)
+  {
+    static const char* color_names[] = {
+      "blue",
+      "brown",
+      "cyan",
+      "darkgreen",
+      "darkorchid",
+      "darksalmon",
+      "darkviolet",
+      "deeppink",
+      "gold3",
+      "green",
+      "magenta",
+      "navy",
+      "red",
+      "yellow",
+      "palegreen",
+      "gray65",
+      "gray21",
+      "bisque2",
+      "greenyellow",
+      "indianred4",
+      "lightblue2",
+      "mediumspringgreen",
+      "orangered",
+      "orange"
+    };
+    const int colors = sizeof(color_names) / sizeof(color_names[0]);
+    if (get(number, k) < colors) {
+      out << " [ style=\"filled\", fillcolor=\"" << color_names[get(number, k)]
+          << "\" ]";
+    } else {
+      out << " [ label=\"(" << get(number, k) << ")\" ]";
+    }
+  }
+
+ private:
+  NumberMap number;
+};
+
+template<typename NumberMap>
+inline paint_by_number_writer<NumberMap>
+paint_by_number(NumberMap number)
+{ return paint_by_number_writer<NumberMap>(number); }
+
+template<typename Graph, typename VertexPropertiesWriter, 
+         typename EdgePropertiesWriter, typename GraphPropertiesWriter>
+void 
+write_graphviz(std::ostream& out,
+               const Graph& g, 
+               VertexPropertiesWriter vpw,
+               EdgePropertiesWriter epw,
+               GraphPropertiesWriter gpw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  typedef typename graph_traits<Graph>::directed_category directed_category;
+  typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+  typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+    process_group_type;
+  typedef typename process_group_type::process_id_type process_id_type;
+  typedef typename property_map<Graph, vertex_index_t>::const_type
+    VertexIndexMap;
+  typedef typename property_map<Graph, vertex_global_t>::const_type
+    VertexGlobalMap;
+
+  static const bool is_undirected
+    = (is_base_and_derived<undirected_tag, directed_category>::value
+       || is_same<undirected_tag, directed_category>::value);
+  static const char* graph_kind = is_undirected? "graph" : "digraph";
+  static const char* edge_kind = is_undirected? "--" : "->";
+
+  using boost::graph::parallel::process_group;
+  process_group_type pg = process_group(g);
+
+  parallel::global_index_map<VertexIndexMap, VertexGlobalMap> 
+    global_index(pg, num_vertices(g), get(vertex_index, g),
+                 get(vertex_global, g));
+
+  std::ostringstream local_graph_out;
+
+  local_graph_out << "  subgraph cluster_" << process_id(pg) << " {\n";
+  gpw(local_graph_out);
+
+  typename graph_traits<Graph>::vertex_iterator vi, vi_end;
+  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
+
+    int global_idx = get(global_index, *vi);
+    local_graph_out << "    n" << global_idx;
+    vpw(local_graph_out, *vi);
+    local_graph_out << ";\n";
+  }
+  local_graph_out << "  }\n\n";
+
+  
+  typename graph_traits<Graph>::edge_iterator ei, ei_end;
+  for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) {
+    int source_idx = get(global_index, source(*ei, g));
+    int target_idx = get(global_index, target(*ei, g));
+    local_graph_out << "  n" << source_idx << " " << edge_kind << " n" 
+                    << target_idx;
+    epw(local_graph_out, *ei);
+    local_graph_out << ";\n";
+  }
+
+  if (process_id(pg) == 0) {
+    out << graph_kind << " g {\n";
+    out << local_graph_out.str();
+
+    synchronize(pg);
+    for (int i = 1; i < num_processes(pg); ++i) {
+      int len;
+      receive(pg, i, 0, len);
+      char* data = new char [len+1];
+      data[len] = 0;
+      receive(pg, i, 1, data, len);
+      out << std::endl << data;
+      delete [] data;
+    }
+    out << "}\n";
+  } else {
+    std::string result_str = local_graph_out.str();
+    const char* data = result_str.c_str();
+
+    int len = result_str.length();
+    send(pg, 0, 0, len);
+    send(pg, 0, 1, data, len);
+    synchronize(pg);
+  }
+  synchronize(pg);
+  synchronize(pg);
+  synchronize(pg);
+}
+
+template<typename Graph, typename VertexPropertiesWriter, 
+         typename EdgePropertiesWriter>
+inline void 
+write_graphviz(std::ostream& out,
+               const Graph& g, 
+               VertexPropertiesWriter vpw,
+               EdgePropertiesWriter epw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  write_graphviz(out, g, vpw, epw, graph_id_writer<Graph>(g));
+}
+
+template<typename Graph, typename VertexPropertiesWriter>
+inline void 
+write_graphviz(std::ostream& out,
+               const Graph& g, 
+               VertexPropertiesWriter vpw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  write_graphviz(out, g, vpw, default_writer());
+}
+
+template<typename Graph>
+inline void 
+write_graphviz(std::ostream& out, const Graph& g
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  write_graphviz(out, g, default_writer());
+}
+
+template<typename Graph, typename VertexPropertiesWriter, 
+         typename EdgePropertiesWriter, typename GraphPropertiesWriter>
+void 
+write_graphviz(const std::string& filename,
+               const Graph& g, 
+               VertexPropertiesWriter vpw,
+               EdgePropertiesWriter epw,
+               GraphPropertiesWriter gpw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  if (process_id(g.process_group()) == 0) {
+    std::ofstream out(filename.c_str());
+    write_graphviz(out, g, vpw, epw, gpw);
+  } else {
+    write_graphviz(std::cout, g, vpw, epw, gpw);
+  }
+}
+
+template<typename Graph, typename VertexPropertiesWriter, 
+         typename EdgePropertiesWriter>
+void 
+write_graphviz(const std::string& filename,
+               const Graph& g, 
+               VertexPropertiesWriter vpw,
+               EdgePropertiesWriter epw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  if (process_id(g.process_group()) == 0) {
+    std::ofstream out(filename.c_str());
+    write_graphviz(out, g, vpw, epw);
+  } else {
+    write_graphviz(std::cout, g, vpw, epw);
+  }
+}
+
+template<typename Graph, typename VertexPropertiesWriter>
+void 
+write_graphviz(const std::string& filename,
+               const Graph& g, 
+               VertexPropertiesWriter vpw
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  if (process_id(g.process_group()) == 0) {
+    std::ofstream out(filename.c_str());
+    write_graphviz(out, g, vpw);
+  } else {
+    write_graphviz(std::cout, g, vpw);
+  }
+}
+
+template<typename Graph>
+void 
+write_graphviz(const std::string& filename, const Graph& g
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  if (process_id(g.process_group()) == 0) {
+    std::ofstream out(filename.c_str());
+    write_graphviz(out, g);
+  } else {
+    write_graphviz(std::cout, g);
+  }
+}
+
+template<typename Graph>
+void
+write_graphviz(std::ostream& out, const Graph& g,
+               const dynamic_properties& dp, 
+               const std::string& node_id = "node_id"
+               BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,distributed_graph_tag))
+{
+  write_graphviz
+    (out, g,
+     /*vertex_writer=*/dynamic_vertex_properties_writer(dp, node_id),
+     /*edge_writer=*/dynamic_properties_writer(dp));
+}
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PARALLEL_GRAPHVIZ_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/hohberg_biconnected_components.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/hohberg_biconnected_components.hpp
new file mode 100644 (file)
index 0000000..8c3c16a
--- /dev/null
@@ -0,0 +1,1129 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+// An implementation of Walter Hohberg's distributed biconnected
+// components algorithm, from:
+//
+//   Walter Hohberg. How to Find Biconnected Components in Distributed
+//   Networks. J. Parallel Distrib. Comput., 9(4):374-386, 1990.
+//
+#ifndef BOOST_GRAPH_DISTRIBUTED_HOHBERG_BICONNECTED_COMPONENTS_HPP
+#define BOOST_GRAPH_DISTRIBUTED_HOHBERG_BICONNECTED_COMPONENTS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+/* You can define PBGL_HOHBERG_DEBUG to an integer value (1, 2, or 3)
+ * to enable debugging information. 1 includes only the phases of the
+ * algorithm and messages as their are received. 2 and 3 add
+ * additional levels of detail about internal data structures related
+ * to the algorithm itself.
+ *
+ * #define PBGL_HOHBERG_DEBUG 1
+*/
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpi/operations.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/graph/graph_concepts.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/optional.hpp>
+#include <utility> // for std::pair
+#include <cassert>
+#include <algorithm> // for std::find, std::mismatch
+#include <vector>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/distributed/connected_components.hpp>
+
+namespace boost { namespace graph { namespace distributed {
+
+namespace hohberg_detail {
+  enum message_kind {
+    /* A header for the PATH message, stating which edge the message
+       is coming on and how many vertices will be following. The data
+       structure communicated will be a path_header. */
+    msg_path_header,
+    /* A message containing the vertices that make up a path. It will
+       always follow a msg_path_header and will contain vertex
+       descriptors, only. */
+    msg_path_vertices,
+    /* A header for the TREE message, stating the value of gamma and
+       the number of vertices to come in the following
+       msg_tree_vertices. */
+    msg_tree_header,
+    /* A message containing the vertices that make up the set of
+       vertices in the same bicomponent as the sender. It will always
+       follow a msg_tree_header and will contain vertex descriptors,
+       only. */
+    msg_tree_vertices,
+    /* Provides a name for the biconnected component of the edge. */
+    msg_name
+  };
+
+  // Payload for a msg_path_header message.
+  template<typename EdgeDescriptor>
+  struct path_header
+  {
+    // The edge over which the path is being communicated
+    EdgeDescriptor edge;
+
+    // The length of the path, i.e., the number of vertex descriptors
+    // that will be coming in the next msg_path_vertices message.
+    std::size_t    path_length;
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned int /*version*/)
+    {
+      ar & edge & path_length;
+    }
+  };
+
+  // Payload for a msg_tree_header message.
+  template<typename Vertex, typename Edge>
+  struct tree_header
+  {
+    // The edge over which the tree is being communicated
+    Edge edge;
+
+    // Gamma, which is the eta of the sender.
+    Vertex gamma;
+
+    // The length of the list of vertices in the bicomponent, i.e.,
+    // the number of vertex descriptors that will be coming in the
+    // next msg_tree_vertices message.
+    std::size_t    bicomp_length;
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned int /*version*/)
+    {
+      ar & edge & gamma & bicomp_length;
+    }
+  };
+
+  // Payload for the msg_name message.
+  template<typename EdgeDescriptor>
+  struct name_header
+  {
+    // The edge being communicated and named.
+    EdgeDescriptor edge;
+
+    // The 0-based name of the component
+    std::size_t name;
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned int /*version*/)
+    {
+      ar & edge & name;
+    }
+  };
+
+  /* Computes the branch point between two paths. The branch point is
+     the last position at which both paths are equivalent, beyond
+     which the paths diverge. Both paths must have length > 0 and the
+     initial elements of the paths must be equal. This is guaranteed
+     in Hohberg's algorithm because all paths start at the
+     leader. Returns the value at the branch point. */
+  template<typename T>
+  T branch_point(const std::vector<T>& p1, const std::vector<T>& p2)
+  {
+    assert(!p1.empty());
+    assert(!p2.empty());
+    assert(p1.front() == p2.front());
+
+    typedef typename std::vector<T>::const_iterator iterator;
+
+    iterator mismatch_pos;
+    if (p1.size() <= p2.size())
+      mismatch_pos = std::mismatch(p1.begin(), p1.end(), p2.begin()).first;
+    else
+      mismatch_pos = std::mismatch(p2.begin(), p2.end(), p1.begin()).first;
+    --mismatch_pos;
+    return *mismatch_pos;
+  }
+
+  /* Computes the infimum of vertices a and b in the given path. The
+     infimum is the largest element that is on the paths from a to the
+     root and from b to the root. */
+  template<typename T>
+  T infimum(const std::vector<T>& parent_path, T a, T b)
+  {
+    using std::swap;
+
+    typedef typename std::vector<T>::const_iterator iterator;
+    iterator first = parent_path.begin(), last = parent_path.end();
+
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+    std::cerr << "infimum(";
+    for (iterator i = first; i != last; ++i) {
+      if (i != first) std::cerr << ' ';
+      std::cerr << local(*i) << '@' << owner(*i);
+    }
+    std::cerr << ", " << local(a) << '@' << owner(a) << ", "
+              << local(b) << '@' << owner(b) << ") = ";
+#endif
+
+    if (a == b) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+      std::cerr << local(a) << '@' << owner(a) << std::endl;
+#endif
+      return a;
+    }
+
+    // Try to find a or b, whichever is closest to the end
+    --last;
+    while (*last != a) {
+      // If we match b, swap the two so we'll be looking for b later.
+      if (*last == b) { swap(a,b); break; }
+
+      if (last == first) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+        std::cerr << local(*first) << '@' << owner(*first) << std::endl;
+#endif
+        return *first;
+      }
+      else --last;
+    }
+
+    // Try to find b (which may originally have been a)
+    while (*last != b) {
+      if (last == first) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+        std::cerr << local(*first) << '@' << owner(*first) << std::endl;
+#endif
+        return *first;
+      }
+      else --last;
+    }
+
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+    std::cerr << local(*last) << '@' << owner(*last) << std::endl;
+#endif
+    // We've found b; it's the infimum.
+    return *last;
+  }
+} // end namespace hohberg_detail
+
+/* A message that will be stored for each edge by Hohberg's algorithm. */
+template<typename Graph>
+struct hohberg_message
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<Graph>::edge_descriptor   Edge;
+
+  // Assign from a path message
+  void assign(const std::vector<Vertex>& path)
+  {
+    gamma = graph_traits<Graph>::null_vertex();
+    path_or_bicomp = path;
+  }
+
+  // Assign from a tree message
+  void assign(Vertex gamma, const std::vector<Vertex>& in_same_bicomponent)
+  {
+    this->gamma = gamma;
+    path_or_bicomp = in_same_bicomponent;
+  }
+
+  bool is_path() const { return gamma == graph_traits<Graph>::null_vertex(); }
+  bool is_tree() const { return gamma != graph_traits<Graph>::null_vertex(); }
+
+  /// The "gamma" of a tree message, or null_vertex() for a path message
+  Vertex gamma;
+
+  // Either the path for a path message or the in_same_bicomponent
+  std::vector<Vertex> path_or_bicomp;
+};
+
+
+/* An abstraction of a vertex processor in Hohberg's algorithm. The
+   hohberg_vertex_processor class is responsible for processing
+   messages transmitted to it via its edges. */
+template<typename Graph>
+class hohberg_vertex_processor
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+  typedef typename graph_traits<Graph>::edge_descriptor   Edge;
+  typedef typename graph_traits<Graph>::degree_size_type  degree_size_type;
+  typedef typename graph_traits<Graph>::edges_size_type   edges_size_type;
+  typedef typename boost::graph::parallel::process_group_type<Graph>::type
+    ProcessGroup;
+  typedef std::vector<Vertex> path_t;
+  typedef typename path_t::iterator path_iterator;
+
+ public:
+  hohberg_vertex_processor()
+    : phase(1),
+      parent(graph_traits<Graph>::null_vertex()),
+      eta(graph_traits<Graph>::null_vertex())
+  {
+  }
+
+  // Called to initialize a leader in the algorithm, which involves
+  // sending out the initial path messages and being ready to receive
+  // them.
+  void initialize_leader(Vertex alpha, const Graph& g);
+
+  /// Handle a path message on edge e. The path will be destroyed by
+  /// this operation.
+  void
+  operator()(Edge e, path_t& path, const Graph& g);
+
+  /// Handle a tree message on edge e. in_same_bicomponent will be
+  /// destroyed by this operation.
+  void
+  operator()(Edge e, Vertex gamma, path_t& in_same_bicomponent,
+             const Graph& g);
+
+  // Handle a name message.
+  void operator()(Edge e, edges_size_type name, const Graph& g);
+
+  // Retrieve the phase
+  unsigned char get_phase() const { return phase; }
+
+  // Start the naming phase. The current phase must be 3 (echo), and
+  // the offset contains the offset at which this processor should
+  // begin when labelling its bicomponents. The offset is just a
+  // parallel prefix sum of the number of bicomponents in each
+  // processor that precedes it (globally).
+  void
+  start_naming_phase(Vertex alpha, const Graph& g, edges_size_type offset);
+
+  /* Determine the number of bicomponents that we will be naming
+   * ourselves.
+   */
+  edges_size_type num_starting_bicomponents(Vertex alpha, const Graph& g);
+
+  // Fill in the edge component map with biconnected component
+  // numbers.
+  template<typename ComponentMap>
+  void fill_edge_map(Vertex alpha, const Graph& g, ComponentMap& component);
+
+ protected:
+  /* Start the echo phase (phase 3) where we propagate information up
+     the tree. */
+  void echo_phase(Vertex alpha, const Graph& g);
+
+  /* Retrieve the index of edge in the out-edges list of target(e, g). */
+  std::size_t get_edge_index(Edge e, const Graph& g);
+
+  /* Retrieve the index of the edge incidence on v in the out-edges
+     list of vertex u. */
+  std::size_t get_incident_edge_index(Vertex u, Vertex v, const Graph& g);
+
+  /* Keeps track of which phase of the algorithm we are in. There are
+   * four phases plus the "finished" phase:
+   *
+   *   1) Building the spanning tree
+   *   2) Discovering cycles
+   *   3) Echoing back up the spanning tree
+   *   4) Labelling biconnected components
+   *   5) Finished
+   */
+  unsigned char phase;
+
+  /* The parent of this vertex in the spanning tree. This value will
+     be graph_traits<Graph>::null_vertex() for the leader. */
+  Vertex parent;
+
+  /* The farthest ancestor up the tree that resides in the same
+     biconnected component as we do. This information is approximate:
+     we might not know about the actual farthest ancestor, but this is
+     the farthest one we've seen so far. */
+  Vertex eta;
+
+  /* The number of edges that have not yet transmitted any messages to
+     us. This starts at the degree of the vertex and decreases as we
+     receive messages. When this counter hits zero, we're done with
+     the second phase of the algorithm. In Hohberg's paper, the actual
+     remaining edge set E is stored with termination when all edges
+     have been removed from E, but we only need to detect termination
+     so the set E need not be explicitly represented. */
+  degree_size_type num_edges_not_transmitted;
+
+  /* The path from the root of the spanning tree to this vertex. This
+     vector will always store only the parts of the path leading up to
+     this vertex, and not the vertex itself. Thus, it will be empty
+     for the leader. */
+  std::vector<Vertex> path_from_root;
+
+  /* Structure containing all of the extra data we need to keep around
+     PER EDGE. This information can not be contained within a property
+     map, because it can't be shared among vertices without breaking
+     the algorithm. Decreasing the size of this structure will drastically */
+  struct per_edge_data
+  {
+    hohberg_message<Graph> msg;
+    std::vector<Vertex> M;
+    bool is_tree_edge;
+    degree_size_type partition;
+  };
+
+  /* Data for each edge in the graph. This structure will be indexed
+     by the position of the edge in the out_edges() list. */
+  std::vector<per_edge_data> edge_data;
+
+  /* The mapping from local partition numbers (0..n-1) to global
+     partition numbers. */
+  std::vector<edges_size_type> local_to_global_partitions;
+
+  friend class boost::serialization::access;
+
+  // We cannot actually serialize a vertex processor, nor would we
+  // want to. However, the fact that we're putting instances into a
+  // distributed_property_map means that we need to have a serialize()
+  // function available.
+  template<typename Archiver>
+  void serialize(Archiver&, const unsigned int /*version*/)
+  {
+    assert(false);
+  }
+};
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::initialize_leader(Vertex alpha,
+                                                   const Graph& g)
+{
+  using namespace hohberg_detail;
+
+  ProcessGroup pg = process_group(g);
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  path_header<Edge> header;
+  header.path_length = 1;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    header.edge = e;
+    send(pg, get(owner, target(e, g)), msg_path_header, header);
+    send(pg, get(owner, target(e, g)), msg_path_vertices, alpha);
+  }
+
+  num_edges_not_transmitted = degree(alpha, g);
+  edge_data.resize(num_edges_not_transmitted);
+  phase = 2;
+}
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::operator()(Edge e, path_t& path,
+                                            const Graph& g)
+{
+  using namespace hohberg_detail;
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+#ifdef PBGL_HOHBERG_DEBUG
+//  std::cerr << local(source(e, g)) << '@' << owner(source(e, g)) << " -> "
+//            << local(target(e, g)) << '@' << owner(target(e, g)) << ": path(";
+//  for (std::size_t i = 0; i < path.size(); ++i) {
+//    if (i > 0) std::cerr << ' ';
+//    std::cerr << local(path[i]) << '@' << owner(path[i]);
+//  }
+  std::cerr << "), phase = " << (int)phase << std::endl;
+#endif
+
+  // Get access to edge-specific data
+  if (edge_data.empty())
+    edge_data.resize(degree(target(e, g), g));
+  per_edge_data& edata = edge_data[get_edge_index(e, g)];
+
+  // Record the message. We'll need it in phase 3.
+  edata.msg.assign(path);
+
+  // Note: "alpha" refers to the vertex "processor" receiving the
+  // message.
+  Vertex alpha = target(e, g);
+
+  switch (phase) {
+  case 1:
+    {
+      num_edges_not_transmitted = degree(alpha, g) - 1;
+      edata.is_tree_edge = true;
+      parent = path.back();
+      eta = parent;
+      edata.M.clear(); edata.M.push_back(parent);
+
+      // Broadcast the path from the root to our potential children in
+      // the spanning tree.
+      path.push_back(alpha);
+      path_header<Edge> header;
+      header.path_length = path.size();
+      ProcessGroup pg = process_group(g);
+      BGL_FORALL_OUTEDGES_T(alpha, oe, g, Graph) {
+        // Skip the tree edge we just received
+        if (target(oe, g) != source(e, g)) {
+          header.edge = oe;
+          send(pg, get(owner, target(oe, g)), msg_path_header, header);
+          send(pg, get(owner, target(oe, g)), msg_path_vertices, &path[0],
+               header.path_length);
+        }
+      }
+      path.pop_back();
+
+      // Swap the old path in, to save some extra copying. Nobody
+      path_from_root.swap(path);
+
+      // Once we have received our place in the spanning tree, move on
+      // to phase 2.
+      phase = 2;
+
+      // If we only had only edge, skip to phase 3.
+      if (num_edges_not_transmitted == 0)
+        echo_phase(alpha, g);
+      return;
+    }
+
+  case 2:
+    {
+      --num_edges_not_transmitted;
+      edata.is_tree_edge = false;
+
+      // Determine if alpha (our vertex) is in the path
+      path_iterator pos = std::find(path.begin(), path.end(), alpha);
+      if (pos != path.end()) {
+        // Case A: There is a cycle alpha beta ... gamma alpha
+        // M(e) <- {beta, gammar}
+        edata.M.clear();
+        ++pos;
+        // If pos == path.end(), we have a self-loop
+        if (pos != path.end()) {
+          // Add beta
+          edata.M.push_back(*pos);
+          ++pos;
+        }
+        // If pos == path.end(), we have a self-loop or beta == gamma
+        // (parallel edge). Otherwise, add gamma.
+        if (pos != path.end()) edata.M.push_back(path.back());
+      } else {
+        // Case B: There is a cycle but we haven't seen alpha yet.
+        // M(e) = {parent, path.back()}
+        edata.M.clear();
+        edata.M.push_back(path.back());
+        if (parent != path.back()) edata.M.push_back(parent);
+
+        // eta = inf(eta, bra(pi_t, pi))
+        eta = infimum(path_from_root, eta, branch_point(path_from_root, path));
+      }
+      if (num_edges_not_transmitted == 0)
+        echo_phase(alpha, g);
+      break;
+    }
+
+  default:
+//    std::cerr << "Phase is " << int(phase) << "\n";
+    assert(false);
+  }
+}
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::operator()(Edge e, Vertex gamma,
+                                            path_t& in_same_bicomponent,
+                                            const Graph& g)
+{
+  using namespace hohberg_detail;
+
+#ifdef PBGL_HOHBERG_DEBUG
+  std::cerr << local(source(e, g)) << '@' << owner(source(e, g)) << " -> "
+            << local(target(e, g)) << '@' << owner(target(e, g)) << ": tree("
+            << local(gamma) << '@' << owner(gamma) << ", ";
+  for (std::size_t i = 0; i < in_same_bicomponent.size(); ++i) {
+    if (i > 0) std::cerr << ' ';
+    std::cerr << local(in_same_bicomponent[i]) << '@'
+              << owner(in_same_bicomponent[i]);
+  }
+  std::cerr << ", " << local(source(e, g)) << '@' << owner(source(e, g))
+            << "), phase = " << (int)phase << std::endl;
+#endif
+
+  // Get access to edge-specific data
+  per_edge_data& edata = edge_data[get_edge_index(e, g)];
+
+  // Record the message. We'll need it in phase 3.
+  edata.msg.assign(gamma, in_same_bicomponent);
+
+  // Note: "alpha" refers to the vertex "processor" receiving the
+  // message.
+  Vertex alpha = target(e, g);
+  Vertex beta = source(e, g);
+
+  switch (phase) {
+  case 2:
+    --num_edges_not_transmitted;
+    edata.is_tree_edge = true;
+
+    if (gamma == alpha) {
+      // Case C
+      edata.M.swap(in_same_bicomponent);
+    } else {
+      // Case D
+      edata.M.clear();
+      edata.M.push_back(parent);
+      if (beta != parent) edata.M.push_back(beta);
+      eta = infimum(path_from_root, eta, gamma);
+    }
+    if (num_edges_not_transmitted == 0)
+      echo_phase(alpha, g);
+    break;
+
+  default:
+    assert(false);
+  }
+}
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::operator()(Edge e, edges_size_type name,
+                                            const Graph& g)
+{
+  using namespace hohberg_detail;
+
+#ifdef PBGL_HOHBERG_DEBUG
+  std::cerr << local(source(e, g)) << '@' << owner(source(e, g)) << " -> "
+            << local(target(e, g)) << '@' << owner(target(e, g)) << ": name("
+            << name << "), phase = " << (int)phase << std::endl;
+#endif
+
+  assert(phase == 4);
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  // Send name messages along the spanning tree edges that are in the
+  // same bicomponent as the edge to our parent.
+  ProcessGroup pg = process_group(g);
+
+  Vertex alpha = target(e, g);
+
+  std::size_t idx = 0;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    per_edge_data& edata = edge_data[idx++];
+    if (edata.is_tree_edge
+        && find(edata.M.begin(), edata.M.end(), parent) != edata.M.end()
+        && target(e, g) != parent) {
+      // Notify our children in the spanning tree of this name
+      name_header<Edge> header;
+      header.edge = e;
+      header.name = name;
+      send(pg, get(owner, target(e, g)), msg_name, header);
+    } else if (target(e, g) == parent) {
+      // Map from local partition numbers to global bicomponent numbers
+      local_to_global_partitions[edata.partition] = name;
+    }
+  }
+
+  // Final stage
+  phase = 5;
+}
+
+template<typename Graph>
+typename hohberg_vertex_processor<Graph>::edges_size_type
+hohberg_vertex_processor<Graph>::
+num_starting_bicomponents(Vertex alpha, const Graph& g)
+{
+  edges_size_type not_mapped = (std::numeric_limits<edges_size_type>::max)();
+
+  edges_size_type result = 0;
+  std::size_t idx = 0;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    per_edge_data& edata = edge_data[idx++];
+    if (edata.is_tree_edge
+        && find(edata.M.begin(), edata.M.end(), parent) == edata.M.end()) {
+      // Map from local partition numbers to global bicomponent numbers
+      if (local_to_global_partitions[edata.partition] == not_mapped)
+        local_to_global_partitions[edata.partition] = result++;
+    }
+  }
+
+#ifdef PBGL_HOHBERG_DEBUG
+  std::cerr << local(alpha) << '@' << owner(alpha) << " has " << result
+            << " bicomponents originating at it." << std::endl;
+#endif
+
+  return result;
+}
+
+template<typename Graph>
+template<typename ComponentMap>
+void
+hohberg_vertex_processor<Graph>::
+fill_edge_map(Vertex alpha, const Graph& g, ComponentMap& component)
+{
+  std::size_t idx = 0;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    per_edge_data& edata = edge_data[idx++];
+    local_put(component, e, local_to_global_partitions[edata.partition]);
+
+#if defined(PBGL_HOHBERG_DEBUG) && PBGL_HOHBERG_DEBUG > 2
+    std::cerr << "component("
+              << local(source(e, g)) << '@' << owner(source(e, g)) << " -> "
+              << local(target(e, g)) << '@' << owner(target(e, g)) << ") = "
+              << local_to_global_partitions[edata.partition]
+              << " (partition = " << edata.partition << " of "
+              << local_to_global_partitions.size() << ")" << std::endl;
+#endif
+  }
+}
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::
+start_naming_phase(Vertex alpha, const Graph& g, edges_size_type offset)
+{
+  using namespace hohberg_detail;
+
+  assert(phase == 4);
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  // Send name messages along the spanning tree edges of the
+  // components that we get to number.
+  ProcessGroup pg = process_group(g);
+
+  bool has_more_children_to_name = false;
+
+  // Map from local partition numbers to global bicomponent numbers
+  edges_size_type not_mapped = (std::numeric_limits<edges_size_type>::max)();
+  for (std::size_t i = 0; i < local_to_global_partitions.size(); ++i) {
+    if (local_to_global_partitions[i] != not_mapped)
+      local_to_global_partitions[i] += offset;
+  }
+
+  std::size_t idx = 0;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    per_edge_data& edata = edge_data[idx++];
+    if (edata.is_tree_edge
+        && find(edata.M.begin(), edata.M.end(), parent) == edata.M.end()) {
+      // Notify our children in the spanning tree of this new name
+      name_header<Edge> header;
+      header.edge = e;
+      header.name = local_to_global_partitions[edata.partition];
+      send(pg, get(owner, target(e, g)), msg_name, header);
+    } else if (edata.is_tree_edge) {
+      has_more_children_to_name = true;
+    }
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 2
+    std::cerr << "M[" << local(source(e, g)) << '@' << owner(source(e, g))
+              << " -> " << local(target(e, g)) << '@' << owner(target(e, g))
+              << "] = ";
+    for (std::size_t i = 0; i < edata.M.size(); ++i) {
+      std::cerr << local(edata.M[i]) << '@' << owner(edata.M[i]) << ' ';
+    }
+    std::cerr << std::endl;
+#endif
+  }
+
+  // See if we're done.
+  if (!has_more_children_to_name)
+    // Final stage
+    phase = 5;
+}
+
+template<typename Graph>
+void
+hohberg_vertex_processor<Graph>::echo_phase(Vertex alpha, const Graph& g)
+{
+  using namespace hohberg_detail;
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  /* We're entering the echo phase. */
+  phase = 3;
+
+  if (parent != graph_traits<Graph>::null_vertex()) {
+    Edge edge_to_parent;
+
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 1
+     std::cerr << local(alpha) << '@' << owner(alpha) << " echo: parent = "
+               << local(parent) << '@' << owner(parent) << ", eta = "
+               << local(eta) << '@' << owner(eta) << ", Gamma = ";
+#endif
+
+    std::vector<Vertex> bicomp;
+    std::size_t e_index = 0;
+    BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+      if (target(e, g) == parent && parent == eta) {
+        edge_to_parent = e;
+        if (find(bicomp.begin(), bicomp.end(), alpha) == bicomp.end()) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 1
+          std::cerr << local(alpha) << '@' << owner(alpha) << ' ';
+#endif
+          bicomp.push_back(alpha);
+        }
+      } else {
+        if (target(e, g) == parent) edge_to_parent = e;
+
+        per_edge_data& edata = edge_data[e_index];
+
+        if (edata.msg.is_path()) {
+          path_iterator pos = std::find(edata.msg.path_or_bicomp.begin(),
+                                        edata.msg.path_or_bicomp.end(),
+                                        eta);
+          if (pos != edata.msg.path_or_bicomp.end()) {
+            ++pos;
+            if (pos != edata.msg.path_or_bicomp.end()
+                && find(bicomp.begin(), bicomp.end(), *pos) == bicomp.end()) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 1
+              std::cerr << local(*pos) << '@' << owner(*pos) << ' ';
+#endif
+              bicomp.push_back(*pos);
+            }
+          }
+        } else if (edata.msg.is_tree() && edata.msg.gamma == eta) {
+          for (path_iterator i = edata.msg.path_or_bicomp.begin();
+               i != edata.msg.path_or_bicomp.end(); ++i) {
+            if (find(bicomp.begin(), bicomp.end(), *i) == bicomp.end()) {
+#if defined(PBGL_HOHBERG_DEBUG) and PBGL_HOHBERG_DEBUG > 1
+              std::cerr << local(*i) << '@' << owner(*i) << ' ';
+#endif
+              bicomp.push_back(*i);
+            }
+          }
+        }
+      }
+      ++e_index;
+    }
+#ifdef PBGL_HOHBERG_DEBUG
+    std::cerr << std::endl;
+#endif
+
+    // Send tree(eta, bicomp) to parent
+    tree_header<Vertex, Edge> header;
+    header.edge = edge_to_parent;
+    header.gamma = eta;
+    header.bicomp_length = bicomp.size();
+    ProcessGroup pg = process_group(g);
+    send(pg, get(owner, parent), msg_tree_header, header);
+    send(pg, get(owner, parent), msg_tree_vertices, &bicomp[0],
+         header.bicomp_length);
+  }
+
+  // Compute the partition of edges such that iff two edges e1 and e2
+  // are in different subsets then M(e1) is disjoint from M(e2).
+
+  // Start by putting each edge in a different partition
+  std::vector<degree_size_type> parent_vec(edge_data.size());
+  degree_size_type idx = 0;
+  for (idx = 0; idx < edge_data.size(); ++idx)
+    parent_vec[idx] = idx;
+
+  // Go through each edge e, performing a union() on the edges
+  // incident on all vertices in M[e].
+  idx = 0;
+  BGL_FORALL_OUTEDGES_T(alpha, e, g, Graph) {
+    per_edge_data& edata = edge_data[idx++];
+
+    // Compute union of vertices in M
+    if (!edata.M.empty()) {
+      degree_size_type e1 = get_incident_edge_index(alpha, edata.M.front(), g);
+      while (parent_vec[e1] != e1) e1 = parent_vec[e1];
+
+      for (std::size_t i = 1; i < edata.M.size(); ++i) {
+        degree_size_type e2 = get_incident_edge_index(alpha, edata.M[i], g);
+        while (parent_vec[e2] != e2) e2 = parent_vec[e2];
+        parent_vec[e2] = e1;
+      }
+    }
+  }
+
+  edges_size_type not_mapped = (std::numeric_limits<edges_size_type>::max)();
+
+  // Determine the number of partitions
+  for (idx = 0; idx < parent_vec.size(); ++idx) {
+    if (parent_vec[idx] == idx) {
+      edge_data[idx].partition = local_to_global_partitions.size();
+      local_to_global_partitions.push_back(not_mapped);
+    }
+  }
+
+  // Assign partition numbers to each edge
+  for (idx = 0; idx < parent_vec.size(); ++idx) {
+    degree_size_type rep = parent_vec[idx];
+    while (rep != parent_vec[rep]) rep = parent_vec[rep];
+    edge_data[idx].partition = edge_data[rep].partition;
+  }
+
+  // Enter the naming phase (but don't send anything yet).
+  phase = 4;
+}
+
+template<typename Graph>
+std::size_t
+hohberg_vertex_processor<Graph>::get_edge_index(Edge e, const Graph& g)
+{
+  std::size_t result = 0;
+  BGL_FORALL_OUTEDGES_T(target(e, g), oe, g, Graph) {
+    if (source(e, g) == target(oe, g)) return result;
+    ++result;
+  }
+  assert(false);
+}
+
+template<typename Graph>
+std::size_t
+hohberg_vertex_processor<Graph>::get_incident_edge_index(Vertex u, Vertex v,
+                                                         const Graph& g)
+{
+  std::size_t result = 0;
+  BGL_FORALL_OUTEDGES_T(u, e, g, Graph) {
+    if (target(e, g) == v) return result;
+    ++result;
+  }
+  assert(false);
+}
+
+template<typename Graph, typename InputIterator, typename ComponentMap,
+         typename VertexProcessorMap>
+typename graph_traits<Graph>::edges_size_type
+hohberg_biconnected_components
+  (const Graph& g,
+   ComponentMap component,
+   InputIterator first, InputIterator last,
+   VertexProcessorMap vertex_processor)
+{
+  using namespace boost::graph::parallel;
+  using namespace hohberg_detail;
+  using boost::parallel::all_reduce;
+
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  // The graph must be undirected
+  BOOST_STATIC_ASSERT(
+    (is_convertible<typename graph_traits<Graph>::directed_category,
+                    undirected_tag>::value));
+
+  // The graph must model Incidence Graph
+  function_requires< IncidenceGraphConcept<Graph> >();
+
+  typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+  typedef typename graph_traits<Graph>::degree_size_type degree_size_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+
+  // Retrieve the process group we will use for communication
+  typedef typename process_group_type<Graph>::type process_group_type;
+  process_group_type pg = process_group(g);
+
+  // Keeps track of the edges that we know to be tree edges.
+  std::vector<edge_descriptor> tree_edges;
+
+  // The leaders send out a path message to initiate the algorithm
+  while (first != last) {
+    vertex_descriptor leader = *first;
+    if (process_id(pg) == get(owner, leader))
+      vertex_processor[leader].initialize_leader(leader, g);
+    ++first;
+  }
+  synchronize(pg);
+
+  // Will hold the number of bicomponents in the graph.
+  edges_size_type num_bicomponents = 0;
+
+  // Keep track of the path length that we should expect, based on the
+  // level in the breadth-first search tree. At present, this is only
+  // used as a sanity check. TBD: This could be used to decrease the
+  // amount of communication required per-edge (by about 4 bytes).
+  std::size_t path_length = 1;
+
+  typedef std::vector<vertex_descriptor> path_t;
+  typedef typename path_t::iterator path_iterator;
+
+  unsigned char minimum_phase = 5;
+  do {
+    while (optional<std::pair<int, int> > msg = probe(pg)) {
+      switch (msg->second) {
+      case msg_path_header:
+        {
+          // Receive the path header
+          path_header<edge_descriptor> header;
+          receive(pg, msg->first, msg->second, header);
+          assert(path_length == header.path_length);
+
+          // Receive the path itself
+          path_t path(path_length);
+          receive(pg, msg->first, msg_path_vertices, &path[0], path_length);
+
+          edge_descriptor e = header.edge;
+          vertex_processor[target(e, g)](e, path, g);
+        }
+        break;
+
+      case msg_path_vertices:
+        // Should be handled in msg_path_header case, unless we're going
+        // stateless.
+        assert(false);
+        break;
+
+      case msg_tree_header:
+        {
+          // Receive the tree header
+          tree_header<vertex_descriptor, edge_descriptor> header;
+          receive(pg, msg->first, msg->second, header);
+
+          // Receive the tree itself
+          path_t in_same_bicomponent(header.bicomp_length);
+          receive(pg, msg->first, msg_tree_vertices, &in_same_bicomponent[0],
+                  header.bicomp_length);
+
+          edge_descriptor e = header.edge;
+          vertex_processor[target(e, g)](e, header.gamma, in_same_bicomponent,
+                                         g);
+        }
+        break;
+
+      case msg_tree_vertices:
+        // Should be handled in msg_tree_header case, unless we're
+        // going stateless.
+        assert(false);
+        break;
+
+      case msg_name:
+        {
+          name_header<edge_descriptor> header;
+          receive(pg, msg->first, msg->second, header);
+          edge_descriptor e = header.edge;
+          vertex_processor[target(e, g)](e, header.name, g);
+        }
+        break;
+
+      default:
+        assert(false);
+      }
+    }
+    ++path_length;
+
+    // Compute minimum phase locally
+    minimum_phase = 5;
+    unsigned char maximum_phase = 1;
+    BGL_FORALL_VERTICES_T(v, g, Graph) {
+      minimum_phase = (std::min)(minimum_phase, vertex_processor[v].get_phase());
+      maximum_phase = (std::max)(maximum_phase, vertex_processor[v].get_phase());
+    }
+
+#ifdef PBGL_HOHBERG_DEBUG
+    if (process_id(pg) == 0)
+      std::cerr << "<---------End of stage------------->" << std::endl;
+#endif
+    // Compute minimum phase globally
+    minimum_phase = all_reduce(pg, minimum_phase, boost::mpi::minimum<char>());
+
+#ifdef PBGL_HOHBERG_DEBUG
+    if (process_id(pg) == 0)
+      std::cerr << "Minimum phase = " << (int)minimum_phase << std::endl;
+#endif
+
+    if (minimum_phase == 4
+        && all_reduce(pg, maximum_phase, boost::mpi::maximum<char>()) == 4) {
+
+#ifdef PBGL_HOHBERG_DEBUG
+      if (process_id(pg) == 0)
+        std::cerr << "<---------Naming phase------------->" << std::endl;
+#endif
+      // Compute the biconnected component number offsets for each
+      // vertex.
+      std::vector<edges_size_type> local_offsets;
+      local_offsets.reserve(num_vertices(g));
+      edges_size_type num_local_bicomponents = 0;
+      BGL_FORALL_VERTICES_T(v, g, Graph) {
+        local_offsets.push_back(num_local_bicomponents);
+        num_local_bicomponents +=
+          vertex_processor[v].num_starting_bicomponents(v, g);
+      }
+
+      synchronize(pg);
+
+      // Find our the number of bicomponent names that will originate
+      // from each process. This tells us how many bicomponents are in
+      // the entire graph and what our global offset is for computing
+      // our own biconnected component names.
+      std::vector<edges_size_type> all_bicomponents(num_processes(pg));
+      all_gather(pg, &num_local_bicomponents, &num_local_bicomponents + 1,
+                 all_bicomponents);
+      num_bicomponents = 0;
+      edges_size_type my_global_offset = 0;
+      for (std::size_t i = 0; i < all_bicomponents.size(); ++i) {
+        if (i == (std::size_t)process_id(pg)) 
+          my_global_offset = num_bicomponents;
+        num_bicomponents += all_bicomponents[i];
+      }
+
+      std::size_t index = 0;
+      BGL_FORALL_VERTICES_T(v, g, Graph) {
+        edges_size_type offset = my_global_offset + local_offsets[index++];
+        vertex_processor[v].start_naming_phase(v, g, offset);
+      }
+    }
+
+    synchronize(pg);
+  } while (minimum_phase < 5);
+
+  // Number the edges appropriately.
+  BGL_FORALL_VERTICES_T(v, g, Graph)
+    vertex_processor[v].fill_edge_map(v, g, component);
+
+  return num_bicomponents;
+}
+
+template<typename Graph, typename ComponentMap, typename InputIterator>
+typename graph_traits<Graph>::edges_size_type
+hohberg_biconnected_components
+  (const Graph& g, ComponentMap component,
+   InputIterator first, InputIterator last)
+
+{
+  std::vector<hohberg_vertex_processor<Graph> >
+    vertex_processors(num_vertices(g));
+  return hohberg_biconnected_components
+           (g, component, first, last,
+            make_iterator_property_map(vertex_processors.begin(),
+                                       get(vertex_index, g)));
+}
+
+template<typename Graph, typename ComponentMap, typename ParentMap>
+typename graph_traits<Graph>::edges_size_type
+hohberg_biconnected_components(const Graph& g, ComponentMap component,
+                               ParentMap parent)
+{
+  // We need the connected components of the graph, but we don't care
+  // about component numbers.
+  connected_components(g, dummy_property_map(), parent);
+
+  // Each root in the parent map is a leader
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  std::vector<vertex_descriptor> leaders;
+  BGL_FORALL_VERTICES_T(v, g, Graph)
+    if (get(parent, v) == v) leaders.push_back(v);
+
+  return hohberg_biconnected_components(g, component,
+                                        leaders.begin(), leaders.end());
+}
+
+template<typename Graph, typename ComponentMap>
+typename graph_traits<Graph>::edges_size_type
+hohberg_biconnected_components(const Graph& g, ComponentMap component)
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  std::vector<vertex_descriptor> parents(num_vertices(g));
+  return hohberg_biconnected_components
+           (g, component, make_iterator_property_map(parents.begin(),
+                                                     get(vertex_index, g)));
+}
+
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_DISTRIBUTED_HOHBERG_BICONNECTED_COMPONENTS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/local_subgraph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/local_subgraph.hpp
new file mode 100644 (file)
index 0000000..0029623
--- /dev/null
@@ -0,0 +1,175 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_LOCAL_SUBGRAPH_HPP
+#define BOOST_GRAPH_LOCAL_SUBGRAPH_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/filtered_graph.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+namespace boost {
+
+namespace graph { namespace detail {
+  // Optionally, virtually derive from a base class
+  template<bool Derive, typename Base> struct derive_from_if;
+  template<typename Base> struct derive_from_if<true, Base> : virtual Base {};
+  template<typename Base> struct derive_from_if<false, Base> {};
+
+  template<typename NewBase, typename Tag, typename OldBase = NewBase>
+  struct derive_from_if_tag_is : 
+    derive_from_if<(is_base_and_derived<OldBase, Tag>::value
+                    || is_same<OldBase, Tag>::value), 
+                   NewBase>
+  {
+  };
+} } // end namespace graph::detail
+
+template<typename DistributedGraph>
+class is_local_edge
+{
+public:
+  typedef bool result_type;
+  typedef typename graph_traits<DistributedGraph>::edge_descriptor
+    argument_type;
+
+  is_local_edge() : g(0) {}
+  is_local_edge(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) {}
+
+  // Since either the source or target vertex must be local, the
+  // equivalence of their owners indicates a local edge.
+  result_type operator()(const argument_type& e) const
+  { return get(owner, source(e, *g)) == get(owner, target(e, *g)); }
+
+private:
+  DistributedGraph* g;
+  typename property_map<DistributedGraph, vertex_owner_t>::const_type owner;
+};
+
+template<typename DistributedGraph>
+class is_local_vertex
+{
+public:
+  typedef bool result_type;
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor
+    argument_type;
+
+  is_local_vertex() : g(0) {}
+  is_local_vertex(DistributedGraph& g) : g(&g), owner(get(vertex_owner, g)) { }
+
+  // Since either the source or target vertex must be local, the
+  // equivalence of their owners indicates a local edge.
+  result_type operator()(const argument_type& v) const
+  { 
+    return get(owner, v) == process_id(process_group(*g)); 
+  }
+
+private:
+  DistributedGraph* g;
+  typename property_map<DistributedGraph, vertex_owner_t>::const_type owner;
+};
+
+template<typename DistributedGraph>
+class local_subgraph 
+  : public filtered_graph<DistributedGraph, 
+                          is_local_edge<DistributedGraph>,
+                          is_local_vertex<DistributedGraph> >
+{
+  typedef filtered_graph<DistributedGraph, 
+                         is_local_edge<DistributedGraph>,
+                         is_local_vertex<DistributedGraph> >
+    inherited;
+  typedef typename graph_traits<DistributedGraph>::traversal_category
+    inherited_category;
+  
+public:
+  struct traversal_category :
+    graph::detail::derive_from_if_tag_is<incidence_graph_tag, 
+                                         inherited_category>,
+    graph::detail::derive_from_if_tag_is<adjacency_graph_tag, 
+                                         inherited_category>,
+    graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, 
+                                         inherited_category>,
+    graph::detail::derive_from_if_tag_is<edge_list_graph_tag, 
+                                         inherited_category>,
+    graph::detail::derive_from_if_tag_is<vertex_list_graph_tag, 
+                                         inherited_category,
+                                         distributed_vertex_list_graph_tag>,
+    graph::detail::derive_from_if_tag_is<edge_list_graph_tag, 
+                                         inherited_category,
+                                         distributed_edge_list_graph_tag>
+  { };
+
+  local_subgraph(DistributedGraph& g) 
+    : inherited(g, 
+                is_local_edge<DistributedGraph>(g),
+                is_local_vertex<DistributedGraph>(g)), 
+      g(g) 
+  {
+  }
+
+  // Distributed Container
+  typedef typename boost::graph::parallel::process_group_type<DistributedGraph>::type
+    process_group_type;
+
+  process_group_type&       process_group()       
+  { 
+    using boost::graph::parallel::process_group;
+    return process_group(g); 
+  }
+  const process_group_type& process_group() const 
+  { 
+    using boost::graph::parallel::process_group;
+    return boost::graph::parallel::process_group(g); 
+  }
+  
+  DistributedGraph&         base()               { return g; }
+  const DistributedGraph&   base() const         { return g; }
+
+private:
+  DistributedGraph& g;
+};
+
+template<typename DistributedGraph, typename PropertyTag>
+class property_map<local_subgraph<DistributedGraph>, PropertyTag>
+  : public property_map<DistributedGraph, PropertyTag> { };
+
+template<typename DistributedGraph, typename PropertyTag>
+class property_map<local_subgraph<const DistributedGraph>, PropertyTag>
+{
+ public:
+  typedef typename property_map<DistributedGraph, PropertyTag>::const_type
+    type;
+  typedef type const_type;
+};
+
+template<typename PropertyTag, typename DistributedGraph>
+inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag>::type
+get(PropertyTag p, local_subgraph<DistributedGraph>& g)
+{ return get(p, g.base()); }
+
+template<typename PropertyTag, typename DistributedGraph>
+inline typename property_map<local_subgraph<DistributedGraph>, PropertyTag>
+  ::const_type
+get(PropertyTag p, const local_subgraph<DistributedGraph>& g)
+{ return get(p, g.base()); } 
+
+template<typename DistributedGraph>
+inline local_subgraph<DistributedGraph> 
+make_local_subgraph(DistributedGraph& g)
+{ return local_subgraph<DistributedGraph>(g); }
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_LOCAL_SUBGRAPH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/mpi_process_group.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/mpi_process_group.hpp
new file mode 100644 (file)
index 0000000..e0ee579
--- /dev/null
@@ -0,0 +1,809 @@
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+// Copyright (C) 2007   Douglas Gregor
+// Copyright (C) 2007  Matthias Troyer  <troyer@boost-consulting.com>
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Matthias Troyer
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_MPI_PROCESS_GROUP
+#define BOOST_GRAPH_DISTRIBUTED_MPI_PROCESS_GROUP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+//#define NO_SPLIT_BATCHES
+#define SEND_OOB_BSEND
+
+#include <boost/optional.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <utility>
+#include <memory>
+#include <boost/function/function1.hpp>
+#include <boost/function/function2.hpp>
+#include <boost/function/function0.hpp>
+#include <boost/mpi.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost { namespace graph { namespace distributed {
+
+// Process group tags
+struct mpi_process_group_tag : virtual parallel::linear_process_group_tag { };
+
+class mpi_process_group
+{
+  struct impl;
+
+ public:
+  /// Number of tags available to each data structure.
+  static const int max_tags = 256;
+
+  /**
+   * The type of a "receive" handler, that will be provided with
+   * (source, tag) pairs when a message is received. Users can provide a
+   * receive handler for a distributed data structure, for example, to
+   * automatically pick up and respond to messages as needed.  
+   */
+  typedef function<void(int source, int tag)> receiver_type;
+
+  /**
+   * The type of a handler for the on-synchronize event, which will be
+   * executed at the beginning of synchronize().
+   */
+  typedef function0<void>      on_synchronize_event_type;
+
+  /// Used as a tag to help create an "empty" process group.
+  struct create_empty {};
+
+  /// The type used to buffer message data
+  typedef boost::mpi::packed_oprimitive::buffer_type buffer_type;
+
+  /// The type used to identify a process
+  typedef int process_id_type;
+
+  /// The type used to count the number of processes
+  typedef int process_size_type;
+
+  /// The type of communicator used to transmit data via MPI
+  typedef boost::mpi::communicator communicator_type;
+
+  /// Classification of the capabilities of this process group
+  struct communication_category
+    : virtual parallel::bsp_process_group_tag, 
+      virtual mpi_process_group_tag { };
+
+  // TBD: We can eliminate the "source" field and possibly the
+  // "offset" field.
+  struct message_header {
+    /// The process that sent the message
+    process_id_type source;
+
+    /// The message tag
+    int tag;
+
+    /// The offset of the message into the buffer
+    std::size_t offset;
+
+    /// The length of the message in the buffer, in bytes
+    std::size_t bytes;
+    
+    template <class Archive>
+    void serialize(Archive& ar, int)
+    {
+      ar & source & tag & offset & bytes;
+    }
+  };
+
+  /**
+   * Stores the outgoing messages for a particular processor.
+   *
+   * @todo Evaluate whether we should use a deque instance, which
+   * would reduce could reduce the cost of "sending" messages but
+   * increases the time spent in the synchronization step.
+   */
+  struct outgoing_messages {
+        outgoing_messages() {}
+        ~outgoing_messages() {}
+
+    std::vector<message_header> headers;
+    buffer_type                 buffer;
+    
+    template <class Archive>
+    void serialize(Archive& ar, int)
+    {
+      ar & headers & buffer;
+    }
+    
+    void swap(outgoing_messages& x) 
+    {
+      headers.swap(x.headers);
+      buffer.swap(x.buffer);
+    }
+  };
+
+private:
+  /**
+   * Virtual base from which every trigger will be launched. See @c
+   * trigger_launcher for more information.
+   */
+  class trigger_base : boost::noncopyable
+  {
+  public:
+    explicit trigger_base(int tag) : tag_(tag) { }
+
+    /// Retrieve the tag associated with this trigger  
+    int tag() const { return tag_; }
+
+    virtual ~trigger_base() { }
+
+    /**
+     * Invoked to receive a message that matches a particular trigger. 
+     *
+     * @param source      the source of the message
+     * @param tag         the (local) tag of the message
+     * @param context     the context under which the trigger is being
+     *                    invoked
+     */
+    virtual void 
+    receive(mpi_process_group const& pg, int source, int tag, 
+            trigger_receive_context context, int block=-1) const = 0;
+
+  protected:
+    // The message tag associated with this trigger
+    int tag_;
+  };
+
+  /**
+   * Launches a specific handler in response to a trigger. This
+   * function object wraps up the handler function object and a buffer
+   * for incoming data. 
+   */
+  template<typename Type, typename Handler>
+  class trigger_launcher : public trigger_base
+  {
+  public:
+    explicit trigger_launcher(mpi_process_group& self, int tag, 
+                              const Handler& handler) 
+      : trigger_base(tag), self(self), handler(handler) 
+      {}
+
+    void 
+    receive(mpi_process_group const& pg, int source, int tag,  
+            trigger_receive_context context, int block=-1) const;
+
+  private:
+    mpi_process_group& self;
+    mutable Handler handler;
+  };
+
+  /**
+   * Launches a specific handler with a message reply in response to a
+   * trigger. This function object wraps up the handler function
+   * object and a buffer for incoming data.
+   */
+  template<typename Type, typename Handler>
+  class reply_trigger_launcher : public trigger_base
+  {
+  public:
+    explicit reply_trigger_launcher(mpi_process_group& self, int tag, 
+                                    const Handler& handler) 
+      : trigger_base(tag), self(self), handler(handler) 
+      {}
+
+    void 
+    receive(mpi_process_group const& pg, int source, int tag, 
+            trigger_receive_context context, int block=-1) const;
+
+  private:
+    mpi_process_group& self;
+    mutable Handler handler;
+  };
+
+  template<typename Type, typename Handler>
+  class global_trigger_launcher : public trigger_base
+  {
+  public:
+    explicit global_trigger_launcher(mpi_process_group& self, int tag, 
+                              const Handler& handler) 
+      : trigger_base(tag), handler(handler) 
+      { 
+      }
+
+    void 
+    receive(mpi_process_group const& pg, int source, int tag, 
+            trigger_receive_context context, int block=-1) const;
+
+  private:
+    mutable Handler handler;
+    // TBD: do not forget to cancel any outstanding Irecv when deleted,
+    // if we decide to use Irecv
+  };
+
+  template<typename Type, typename Handler>
+  class global_irecv_trigger_launcher : public trigger_base
+  {
+  public:
+    explicit global_irecv_trigger_launcher(mpi_process_group& self, int tag, 
+                              const Handler& handler, int sz) 
+      : trigger_base(tag), handler(handler), buffer_size(sz)
+      { 
+        prepare_receive(self,tag);
+      }
+
+    void 
+    receive(mpi_process_group const& pg, int source, int tag, 
+            trigger_receive_context context, int block=-1) const;
+
+  private:
+    void prepare_receive(mpi_process_group const& pg, int tag, bool force=false) const;
+    Handler handler;
+    int buffer_size;
+    // TBD: do not forget to cancel any outstanding Irecv when deleted,
+    // if we decide to use Irecv
+  };
+
+public:
+  /** 
+   * Construct a new BSP process group from an MPI communicator. The
+   * MPI communicator will be duplicated to create a new communicator
+   * for this process group to use.
+   */
+  mpi_process_group(communicator_type parent_comm = communicator_type());
+
+  /** 
+   * Construct a new BSP process group from an MPI communicator. The
+   * MPI communicator will be duplicated to create a new communicator
+   * for this process group to use. This constructor allows to tune the
+   * size of message batches.
+   *    
+   *   @param num_headers The maximum number of headers in a message batch
+   *
+   *   @param buffer_size The maximum size of the message buffer in a batch.
+   *
+   */
+  mpi_process_group( std::size_t num_headers, std::size_t buffer_size, 
+                     communicator_type parent_comm = communicator_type());
+
+  /**
+   * Construct a copy of the BSP process group for a new distributed
+   * data structure. This data structure will synchronize with all
+   * other members of the process group's equivalence class (including
+   * @p other), but will have its own set of tags. 
+   *
+   *   @param other The process group that this new process group will
+   *   be based on, using a different set of tags within the same
+   *   communication and synchronization space.
+   *
+   *   @param handler A message handler that will be passed (source,
+   *   tag) pairs for each message received by this data
+   *   structure. The handler is expected to receive the messages
+   *   immediately. The handler can be changed after-the-fact by
+   *   calling @c replace_handler.
+   *
+   *   @param out_of_band_receive An anachronism. TODO: remove this.
+   */
+  mpi_process_group(const mpi_process_group& other,
+                    const receiver_type& handler,
+                    bool out_of_band_receive = false);
+
+  /**
+   * Construct a copy of the BSP process group for a new distributed
+   * data structure. This data structure will synchronize with all
+   * other members of the process group's equivalence class (including
+   * @p other), but will have its own set of tags. 
+   */
+  mpi_process_group(const mpi_process_group& other, 
+                    attach_distributed_object,
+                    bool out_of_band_receive = false);
+
+  /**
+   * Create an "empty" process group, with no information. This is an
+   * internal routine that users should never need.
+   */
+  explicit mpi_process_group(create_empty) {}
+
+  /**
+   * Destroys this copy of the process group.
+   */
+  ~mpi_process_group();
+
+  /**
+   * Replace the current message handler with a new message handler.
+   *
+   * @param handle The new message handler.
+   * @param out_of_band_receive An anachronism: remove this
+   */
+  void replace_handler(const receiver_type& handler,
+                       bool out_of_band_receive = false);
+
+  /**
+   * Turns this process group into the process group for a new
+   * distributed data structure or object, allocating its own tag
+   * block.
+   */
+  void make_distributed_object();
+
+  /**
+   * Replace the handler to be invoked at the beginning of synchronize.
+   */
+  void
+  replace_on_synchronize_handler(const on_synchronize_event_type& handler = 0);
+
+  /** 
+   * Return the block number of the current data structure. A value of
+   * 0 indicates that this particular instance of the process group is
+   * not associated with any distributed data structure.
+   */
+  int my_block_number() const { return block_num? *block_num : 0; }
+
+  /**
+   * Encode a block number/tag pair into a single encoded tag for
+   * transmission.
+   */
+  int encode_tag(int block_num, int tag) const
+  { return block_num * max_tags + tag; }
+
+  /**
+   * Decode an encoded tag into a block number/tag pair. 
+   */
+  std::pair<int, int> decode_tag(int encoded_tag) const
+  { return std::make_pair(encoded_tag / max_tags, encoded_tag % max_tags); }
+
+  // @todo Actually write up the friend declarations so these could be
+  // private.
+
+  // private:
+
+  /** Allocate a block of tags for this instance. The block should not
+   * have been allocated already, e.g., my_block_number() ==
+   * 0. Returns the newly-allocated block number.
+   */
+  int allocate_block(bool out_of_band_receive = false);
+
+  /** Potentially emit a receive event out of band. Returns true if an event 
+   *  was actually sent, false otherwise. 
+   */
+  bool maybe_emit_receive(int process, int encoded_tag) const;
+
+  /** Emit a receive event. Returns true if an event was actually
+   * sent, false otherwise. 
+   */
+  bool emit_receive(int process, int encoded_tag) const;
+
+  /** Emit an on-synchronize event to all block handlers. */
+  void emit_on_synchronize() const;
+
+  /** Retrieve a reference to the stored receiver in this block.  */
+  template<typename Receiver>
+  Receiver* get_receiver();
+
+  template<typename T>
+  void
+  send_impl(int dest, int tag, const T& value,
+            mpl::true_ /*is_mpi_datatype*/) const;
+
+  template<typename T>
+  void
+  send_impl(int dest, int tag, const T& value,
+            mpl::false_ /*is_mpi_datatype*/) const;
+
+  template<typename T>
+  typename disable_if<boost::mpi::is_mpi_datatype<T>, void>::type
+  array_send_impl(int dest, int tag, const T values[], std::size_t n) const;
+
+  template<typename T>
+  bool
+  receive_impl(int source, int tag, T& value,
+               mpl::true_ /*is_mpi_datatype*/) const;
+
+  template<typename T>
+  bool
+  receive_impl(int source, int tag, T& value,
+               mpl::false_ /*is_mpi_datatype*/) const;
+
+  // Receive an array of values
+  template<typename T>
+  typename disable_if<boost::mpi::is_mpi_datatype<T>, bool>::type
+  array_receive_impl(int source, int tag, T* values, std::size_t& n) const;
+
+  optional<std::pair<mpi_process_group::process_id_type, int> > probe() const;
+
+  void synchronize() const;
+
+  operator bool() { return impl_; }
+
+  mpi_process_group base() const;
+
+  /**
+   * Create a new trigger for a specific message tag. Triggers handle
+   * out-of-band messaging, and the handler itself will be called
+   * whenever a message is available. The handler itself accepts four
+   * arguments: the source of the message, the message tag (which will
+   * be the same as @p tag), the message data (of type @c Type), and a
+   * boolean flag that states whether the message was received
+   * out-of-band. The last will be @c true for out-of-band receives,
+   * or @c false for receives at the end of a synchronization step.
+   */
+  template<typename Type, typename Handler>
+  void trigger(int tag, const Handler& handler);
+
+  /**
+   * Create a new trigger for a specific message tag, along with a way
+   * to send a reply with data back to the sender. Triggers handle
+   * out-of-band messaging, and the handler itself will be called
+   * whenever a message is available. The handler itself accepts four
+   * arguments: the source of the message, the message tag (which will
+   * be the same as @p tag), the message data (of type @c Type), and a
+   * boolean flag that states whether the message was received
+   * out-of-band. The last will be @c true for out-of-band receives,
+   * or @c false for receives at the end of a synchronization
+   * step. The handler also returns a value, which will be routed back
+   * to the sender.
+   */
+  template<typename Type, typename Handler>
+  void trigger_with_reply(int tag, const Handler& handler);
+
+  template<typename Type, typename Handler>
+  void global_trigger(int tag, const Handler& handler, std::size_t buffer_size=0); 
+
+
+
+  /**
+   * Poll for any out-of-band messages. This routine will check if any
+   * out-of-band messages are available. Those that are available will
+   * be handled immediately, if possible.
+   *
+   * @returns if an out-of-band message has been received, but we are
+   * unable to actually receive the message, a (source, tag) pair will
+   * be returned. Otherwise, returns an empty optional.
+   *
+   * @param wait When true, we should block until a message comes in.
+   *
+   * @param synchronizing whether we are currently synchronizing the
+   *                      process group
+   */
+  optional<std::pair<int, int> > 
+  poll(bool wait = false, int block = -1, bool synchronizing = false) const;
+
+  /**
+   * Determines the context of the trigger currently executing. If
+   * multiple triggers are executing (recursively), then the context
+   * for the most deeply nested trigger will be returned. If no
+   * triggers are executing, returns @c trc_none. This might be used,
+   * for example, to determine whether a reply to a message should
+   * itself be sent out-of-band or whether it can go via the normal,
+   * slower communication route.
+   */
+  trigger_receive_context trigger_context() const;
+
+  /// INTERNAL ONLY
+  void receive_batch(process_id_type source, outgoing_messages& batch) const;
+
+  /// INTERNAL ONLY
+  ///
+  /// Determine the actual communicator and tag will be used for a
+  /// transmission with the given tag.
+  std::pair<boost::mpi::communicator, int> 
+  actual_communicator_and_tag(int tag, int block) const;
+
+  /// set the size of the message buffer used for buffered oob sends
+  
+  static void set_message_buffer_size(std::size_t s);
+
+  /// get the size of the message buffer used for buffered oob sends
+
+  static std::size_t message_buffer_size();
+  static int old_buffer_size;
+  static void* old_buffer;
+private:
+
+  void install_trigger(int tag, int block, 
+      shared_ptr<trigger_base> const& launcher); 
+
+  void poll_requests(int block=-1) const;
+
+  
+  // send a batch if the buffer is full now or would get full
+  void maybe_send_batch(process_id_type dest) const;
+
+  // actually send a batch
+  void send_batch(process_id_type dest, outgoing_messages& batch) const;
+  void send_batch(process_id_type dest) const;
+
+  void pack_headers() const;
+
+  /**
+   * Process a batch of incoming messages immediately.
+   *
+   * @param source         the source of these messages
+   */
+  void process_batch(process_id_type source) const;
+  void receive_batch(boost::mpi::status& status) const;
+
+  //void free_finished_sends() const;
+          
+  /// Status messages used internally by the process group
+  enum status_messages {
+    /// the first of the reserved message tags
+    msg_reserved_first = 126,
+    /// Sent from a processor when sending batched messages
+    msg_batch = 126,
+    /// Sent from a processor when sending large batched messages, larger than
+    /// the maximum buffer size for messages to be received by MPI_Irecv
+    msg_large_batch = 127,
+    /// Sent from a source processor to everyone else when that
+    /// processor has entered the synchronize() function.
+    msg_synchronizing = 128,
+    /// the last of the reserved message tags
+    msg_reserved_last = 128
+  };
+
+  /**
+   * Description of a block of tags associated to a particular
+   * distributed data structure. This structure will live as long as
+   * the distributed data structure is around, and will be used to
+   * help send messages to the data structure.
+   */
+  struct block_type
+  {
+    block_type() { }
+
+    /// Handler for receive events
+    receiver_type     on_receive;
+
+    /// Handler executed at the start of  synchronization 
+    on_synchronize_event_type  on_synchronize;
+
+    /// Individual message triggers. Note: at present, this vector is
+    /// indexed by the (local) tag of the trigger.  Any tags that
+    /// don't have triggers will have NULL pointers in that spot.
+    std::vector<shared_ptr<trigger_base> > triggers;
+  };
+
+  /**
+   * Data structure containing all of the blocks for the distributed
+   * data structures attached to a process group.
+   */
+  typedef std::vector<block_type*> blocks_type;
+
+  /// Iterator into @c blocks_type.
+  typedef blocks_type::iterator block_iterator;
+
+  /**
+   * Deleter used to deallocate a block when its distributed data
+   * structure is destroyed. This type will be used as the deleter for
+   * @c block_num.
+   */
+  struct deallocate_block;
+  
+  static std::vector<char> message_buffer;
+
+public:
+  /**
+   * Data associated with the process group and all of its attached
+   * distributed data structures.
+   */
+  shared_ptr<impl> impl_;
+
+  /**
+   * When non-null, indicates that this copy of the process group is
+   * associated with a particular distributed data structure. The
+   * integer value contains the block number (a value > 0) associated
+   * with that data structure. The deleter for this @c shared_ptr is a
+   * @c deallocate_block object that will deallocate the associated
+   * block in @c impl_->blocks.
+   */
+  shared_ptr<int>  block_num;
+
+  /**
+   * Rank of this process, to avoid having to call rank() repeatedly.
+   */
+  int rank;
+
+  /**
+   * Number of processes in this process group, to avoid having to
+   * call communicator::size() repeatedly.
+   */
+  int size;
+};
+
+
+
+inline mpi_process_group::process_id_type 
+process_id(const mpi_process_group& pg)
+{ return pg.rank; }
+
+inline mpi_process_group::process_size_type 
+num_processes(const mpi_process_group& pg)
+{ return pg.size; }
+
+mpi_process_group::communicator_type communicator(const mpi_process_group& pg);
+
+template<typename T>
+void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, const T& value);
+
+template<typename InputIterator>
+void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, InputIterator first, InputIterator last);
+
+template<typename T>
+inline void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, T* first, T* last)
+{ send(pg, dest, tag, first, last - first); }
+
+template<typename T>
+inline void
+send(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+     int tag, const T* first, const T* last)
+{ send(pg, dest, tag, first, last - first); }
+
+template<typename T>
+mpi_process_group::process_id_type
+receive(const mpi_process_group& pg, int tag, T& value);
+
+template<typename T>
+mpi_process_group::process_id_type
+receive(const mpi_process_group& pg,
+        mpi_process_group::process_id_type source, int tag, T& value);
+
+optional<std::pair<mpi_process_group::process_id_type, int> >
+probe(const mpi_process_group& pg);
+
+void synchronize(const mpi_process_group& pg);
+
+template<typename T, typename BinaryOperation>
+T*
+all_reduce(const mpi_process_group& pg, T* first, T* last, T* out,
+           BinaryOperation bin_op);
+
+template<typename T, typename BinaryOperation>
+T*
+scan(const mpi_process_group& pg, T* first, T* last, T* out,
+           BinaryOperation bin_op);
+
+template<typename InputIterator, typename T>
+void
+all_gather(const mpi_process_group& pg,
+           InputIterator first, InputIterator last, std::vector<T>& out);
+
+template<typename InputIterator>
+mpi_process_group
+process_subgroup(const mpi_process_group& pg,
+                 InputIterator first, InputIterator last);
+
+template<typename T>
+void
+broadcast(const mpi_process_group& pg, T& val, 
+          mpi_process_group::process_id_type root);
+
+
+/*******************************************************************
+ * Out-of-band communication                                       *
+ *******************************************************************/
+
+template<typename T>
+typename enable_if<boost::mpi::is_mpi_datatype<T> >::type
+send_oob(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+         int tag, const T& value, int block=-1)
+{
+  using boost::mpi::get_mpi_datatype;
+
+  // Determine the actual message tag we will use for the send, and which
+  // communicator we will use.
+  std::pair<boost::mpi::communicator, int> actual
+    = pg.actual_communicator_and_tag(tag, block);
+
+#ifdef SEND_OOB_BSEND
+  if (mpi_process_group::message_buffer_size()) {
+    MPI_Bsend(const_cast<T*>(&value), 1, get_mpi_datatype<T>(value), dest, 
+              actual.second, actual.first);
+    return;
+  }
+#endif
+  MPI_Request request;
+  MPI_Isend(const_cast<T*>(&value), 1, get_mpi_datatype<T>(value), dest, 
+            actual.second, actual.first, &request);
+  
+  int done=0;
+  do {
+    pg.poll();
+    MPI_Test(&request,&done,MPI_STATUS_IGNORE);
+  } while (!done);
+}
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T> >::type
+send_oob(const mpi_process_group& pg, mpi_process_group::process_id_type dest,
+         int tag, const T& value, int block=-1)
+{
+  using boost::mpi::packed_oarchive;
+
+  // Determine the actual message tag we will use for the send, and which
+  // communicator we will use.
+  std::pair<boost::mpi::communicator, int> actual
+    = pg.actual_communicator_and_tag(tag, block);
+
+  // Serialize the data into a buffer
+  packed_oarchive out(actual.first);
+  out << value;
+  std::size_t size = out.size();
+
+  // Send the actual message data
+#ifdef SEND_OOB_BSEND
+  if (mpi_process_group::message_buffer_size()) {
+    MPI_Bsend(const_cast<void*>(out.address()), size, MPI_PACKED,
+            dest, actual.second, actual.first);
+   return;
+  }
+#endif
+  MPI_Request request;
+  MPI_Isend(const_cast<void*>(out.address()), size, MPI_PACKED,
+            dest, actual.second, actual.first, &request);
+
+  int done=0;
+  do {
+    pg.poll();
+    MPI_Test(&request,&done,MPI_STATUS_IGNORE);
+  } while (!done);
+}
+
+template<typename T>
+typename enable_if<boost::mpi::is_mpi_datatype<T> >::type
+receive_oob(const mpi_process_group& pg, 
+            mpi_process_group::process_id_type source, int tag, T& value, int block=-1);
+
+template<typename T>
+typename disable_if<boost::mpi::is_mpi_datatype<T> >::type
+receive_oob(const mpi_process_group& pg, 
+            mpi_process_group::process_id_type source, int tag, T& value, int block=-1);
+
+template<typename SendT, typename ReplyT>
+typename enable_if<boost::mpi::is_mpi_datatype<ReplyT> >::type
+send_oob_with_reply(const mpi_process_group& pg, 
+                    mpi_process_group::process_id_type dest,
+                    int tag, const SendT& send_value, ReplyT& reply_value,
+                    int block = -1);
+
+template<typename SendT, typename ReplyT>
+typename disable_if<boost::mpi::is_mpi_datatype<ReplyT> >::type
+send_oob_with_reply(const mpi_process_group& pg, 
+                    mpi_process_group::process_id_type dest,
+                    int tag, const SendT& send_value, ReplyT& reply_value,
+                    int block = -1);
+
+} } } // end namespace boost::graph::distributed
+
+BOOST_IS_BITWISE_SERIALIZABLE(boost::graph::distributed::mpi_process_group::message_header)
+namespace boost { namespace mpi {
+    template<>
+    struct is_mpi_datatype<boost::graph::distributed::mpi_process_group::message_header> : mpl::true_ { };
+} } // end namespace boost::mpi
+
+namespace std {
+/// optimized swap for outgoing messages
+inline void 
+swap(boost::graph::distributed::mpi_process_group::outgoing_messages& x,
+     boost::graph::distributed::mpi_process_group::outgoing_messages& y)
+{
+  x.swap(y);
+}
+
+
+}
+
+BOOST_CLASS_IMPLEMENTATION(boost::graph::distributed::mpi_process_group::outgoing_messages,object_serializable)
+BOOST_CLASS_TRACKING(boost::graph::distributed::mpi_process_group::outgoing_messages,track_never)
+
+#include <boost/graph/distributed/detail/mpi_process_group.ipp>
+
+#endif // BOOST_PARALLEL_MPI_MPI_PROCESS_GROUP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/named_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/named_graph.hpp
new file mode 100644 (file)
index 0000000..83b0061
--- /dev/null
@@ -0,0 +1,1239 @@
+// Copyright (C) 2007 Douglas Gregor 
+// Copyright (C) 2007 Hartmut Kaiser
+
+// 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)
+
+// TODO:
+//   - Cache (some) remote vertex names?
+#ifndef BOOST_GRAPH_DISTRIBUTED_NAMED_GRAPH_HPP
+#define BOOST_GRAPH_DISTRIBUTED_NAMED_GRAPH_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/named_graph.hpp>
+#include <boost/functional/hash.hpp>
+#include <boost/variant.hpp>
+#include <boost/graph/parallel/simple_trigger.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/graph/parallel/detail/property_holders.hpp>
+
+namespace boost { namespace graph { namespace distributed {
+
+using boost::parallel::trigger_receive_context;
+using boost::detail::parallel::pair_with_property;
+
+/*******************************************************************
+ * Hashed distribution of named entities                           *
+ *******************************************************************/
+
+template<typename T>
+struct hashed_distribution
+{
+  template<typename ProcessGroup>
+  hashed_distribution(const ProcessGroup& pg, std::size_t /*num_vertices*/ = 0)
+    : n(num_processes(pg)) { }
+
+  int operator()(const T& value) const 
+  {
+    return hasher(value) % n;
+  }
+
+  std::size_t n;
+  hash<T> hasher;
+};
+
+/// Specialization for named graphs
+template <typename InDistribution, typename VertexProperty, typename VertexSize,
+          typename ProcessGroup,
+          typename ExtractName 
+            = typename internal_vertex_name<VertexProperty>::type>
+struct select_distribution
+{
+private:
+  /// The type used to name vertices in the graph
+  typedef typename remove_cv<
+            typename remove_reference<
+              typename ExtractName::result_type>::type>::type
+    vertex_name_type;
+
+public:
+  /**
+   *  The @c type field provides a distribution object that maps
+   *  vertex names to processors. The distribution object will be
+   *  constructed with the process group over which communication will
+   *  occur. The distribution object shall also be a function
+   *  object mapping from the type of the name to a processor number
+   *  in @c [0, @c p) (for @c p processors). By default, the mapping
+   *  function uses the @c boost::hash value of the name, modulo @c p.
+   */
+  typedef typename mpl::if_<is_same<InDistribution, defaultS>,
+                            hashed_distribution<vertex_name_type>,
+                            InDistribution>::type 
+    type;
+
+  /// for named graphs the default type is the same as the stored distribution 
+  /// type
+  typedef type default_type;
+};
+
+/// Specialization for non-named graphs
+template <typename InDistribution, typename VertexProperty, typename VertexSize,
+          typename ProcessGroup>
+struct select_distribution<InDistribution, VertexProperty, VertexSize, 
+                           ProcessGroup, void>
+{
+  /// the distribution type stored in the graph for non-named graphs should be
+  /// the variant_distribution type
+  typedef typename mpl::if_<is_same<InDistribution, defaultS>,
+                            boost::parallel::variant_distribution<ProcessGroup, 
+                                                                  VertexSize>,
+                            InDistribution>::type type;
+
+  /// default_type is used as the distribution functor for the
+  /// adjacency_list, it should be parallel::block by default
+  typedef typename mpl::if_<is_same<InDistribution, defaultS>,
+                            boost::parallel::block, type>::type
+    default_type;
+};
+
+
+/*******************************************************************
+ * Named graph mixin                                               *
+ *******************************************************************/
+
+/**
+ * named_graph is a mixin that provides names for the vertices of a
+ * graph, including a mapping from names to vertices. Graph types that
+ * may or may not be have vertex names (depending on the properties
+ * supplied by the user) should use maybe_named_graph.
+ *
+ * Template parameters:
+ *
+ *   Graph: the graph type that derives from named_graph
+ *
+ *   Vertex: the type of a vertex descriptor in Graph. Note: we cannot
+ *   use graph_traits here, because the Graph is not yet defined.
+ *
+ *   VertexProperty: the type of the property stored along with the
+ *   vertex.
+ *
+ *   ProcessGroup: the process group over which the distributed name
+ *   graph mixin will communicate.
+ */
+template<typename Graph, typename Vertex, typename Edge, typename Config>
+class named_graph
+{
+public:
+  /// Messages passed within the distributed named graph
+  enum message_kind {
+    /**
+     * Requests the addition of a vertex on a remote processor. The
+     * message data is a @c vertex_name_type.
+     */
+    msg_add_vertex_name,
+
+    /**
+     * Requests the addition of a vertex on a remote processor. The
+     * message data is a @c vertex_name_type. The remote processor
+     * will send back a @c msg_add_vertex_name_reply message
+     * containing the vertex descriptor.
+     */
+    msg_add_vertex_name_with_reply,
+
+    /**
+     * Requests the vertex descriptor corresponding to the given
+     * vertex name. The remote process will reply with a 
+     * @c msg_find_vertex_reply message containing the answer.
+     */
+    msg_find_vertex,
+
+    /**
+     * Requests the addition of an edge on a remote processor. The
+     * data stored in these messages is a @c pair<source, target>@,
+     * where @c source and @c target may be either names (of type @c
+     * vertex_name_type) or vertex descriptors, depending on what
+     * information we have locally.  
+     */
+    msg_add_edge_name_name,
+    msg_add_edge_vertex_name,
+    msg_add_edge_name_vertex,
+
+    /**
+     * These messages are identical to msg_add_edge_*_*, except that
+     * the process actually adding the edge will send back a @c
+     * pair<edge_descriptor,bool>
+     */
+    msg_add_edge_name_name_with_reply,
+    msg_add_edge_vertex_name_with_reply,
+    msg_add_edge_name_vertex_with_reply,
+
+    /**
+     * Requests the addition of an edge with a property on a remote
+     * processor. The data stored in these messages is a @c
+     * pair<vertex_property_type, pair<source, target>>@, where @c
+     * source and @c target may be either names (of type @c
+     * vertex_name_type) or vertex descriptors, depending on what
+     * information we have locally.
+     */
+    msg_add_edge_name_name_with_property,
+    msg_add_edge_vertex_name_with_property,
+    msg_add_edge_name_vertex_with_property,
+
+    /**
+     * These messages are identical to msg_add_edge_*_*_with_property,
+     * except that the process actually adding the edge will send back
+     * a @c pair<edge_descriptor,bool>.
+     */
+    msg_add_edge_name_name_with_reply_and_property,
+    msg_add_edge_vertex_name_with_reply_and_property,
+    msg_add_edge_name_vertex_with_reply_and_property
+  };
+
+  /// The vertex descriptor type
+  typedef Vertex vertex_descriptor;
+  
+  /// The edge descriptor type
+  typedef Edge edge_descriptor;
+
+  /// The vertex property type
+  typedef typename Config::vertex_property_type vertex_property_type;
+  
+  /// The vertex property type
+  typedef typename Config::edge_property_type edge_property_type;
+  
+  /// The type used to extract names from the property structure
+  typedef typename internal_vertex_name<vertex_property_type>::type
+    extract_name_type;
+
+  /// The type used to name vertices in the graph
+  typedef typename remove_cv<
+            typename remove_reference<
+              typename extract_name_type::result_type>::type>::type
+    vertex_name_type;
+
+  /// The type used to distribute named vertices in the graph
+  typedef typename Config::distribution_type distribution_type;
+  typedef typename Config::base_distribution_type base_distribution_type;
+
+  /// The type used for communication in the distributed structure
+  typedef typename Config::process_group_type process_group_type;
+
+  /// Type used to identify processes
+  typedef typename process_group_type::process_id_type process_id_type;
+
+  /// a reference to this class, which is used for disambiguation of the 
+  //  add_vertex function
+  typedef named_graph named_graph_type;
+  
+  /// Structure returned when adding a vertex by vertex name
+  struct lazy_add_vertex;
+  friend struct lazy_add_vertex;
+
+  /// Structure returned when adding an edge by vertex name
+  struct lazy_add_edge;
+  friend struct lazy_add_edge;
+
+  /// Structure returned when adding an edge by vertex name with a property
+  struct lazy_add_edge_with_property;
+  friend struct lazy_add_edge_with_property;
+
+  explicit named_graph(const process_group_type& pg);
+
+  named_graph(const process_group_type& pg, const base_distribution_type& distribution);
+
+  /// Set up triggers, but only for the BSP process group
+  void setup_triggers();
+
+  /// Retrieve the derived instance
+  Graph&       derived()       { return static_cast<Graph&>(*this); }
+  const Graph& derived() const { return static_cast<const Graph&>(*this); }
+
+  /// Retrieve the process group
+  process_group_type&       process_group()       { return process_group_; }
+  const process_group_type& process_group() const { return process_group_; }
+
+  // Retrieve the named distribution
+  distribution_type&       named_distribution()       { return distribution_; }
+  const distribution_type& named_distribution() const { return distribution_; }
+
+  /// Notify the named_graph that we have added the given vertex. This
+  /// is a no-op.
+  void added_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are removing the given
+  /// vertex. This is a no-op.
+  void removing_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are clearing the graph
+  void clearing_graph() { }
+
+  /// Retrieve the owner of a given vertex based on the properties
+  /// associated with that vertex. This operation just returns the
+  /// number of the local processor, adding all vertices locally.
+  process_id_type owner_by_property(const vertex_property_type&);
+
+protected:
+  void 
+  handle_add_vertex_name(int source, int tag, const vertex_name_type& msg,
+                         trigger_receive_context);
+
+  vertex_descriptor 
+  handle_add_vertex_name_with_reply(int source, int tag, 
+                                    const vertex_name_type& msg,
+                                    trigger_receive_context);
+
+  boost::parallel::detail::untracked_pair<vertex_descriptor, bool>
+  handle_find_vertex(int source, int tag, const vertex_name_type& msg,
+                     trigger_receive_context);
+
+  template<typename U, typename V>
+  void handle_add_edge(int source, int tag, const boost::parallel::detail::untracked_pair<U, V>& msg,
+                       trigger_receive_context);
+
+  template<typename U, typename V>
+  boost::parallel::detail::untracked_pair<edge_descriptor, bool> 
+  handle_add_edge_with_reply(int source, int tag, const boost::parallel::detail::untracked_pair<U, V>& msg,
+                             trigger_receive_context);
+
+  template<typename U, typename V>
+  void 
+  handle_add_edge_with_property
+    (int source, int tag, 
+     const pair_with_property<U, V, edge_property_type>& msg,
+     trigger_receive_context);
+
+  template<typename U, typename V>
+  boost::parallel::detail::untracked_pair<edge_descriptor, bool> 
+  handle_add_edge_with_reply_and_property
+    (int source, int tag, 
+     const pair_with_property<U, V, edge_property_type>& msg,
+     trigger_receive_context);
+
+  /// The process group for this distributed data structure
+  process_group_type process_group_;
+
+  /// The distribution we will use to map names to processors
+  distribution_type distribution_;
+};
+
+/// Helper macro containing the template parameters of named_graph
+#define BGL_NAMED_GRAPH_PARAMS \
+  typename Graph, typename Vertex, typename Edge, typename Config
+/// Helper macro containing the named_graph<...> instantiation
+#define BGL_NAMED_GRAPH \
+  named_graph<Graph, Vertex, Edge, Config>
+
+/**
+ * Data structure returned from add_vertex that will "lazily" add the
+ * vertex, either when it is converted to a @c vertex_descriptor or
+ * when the most recent copy has been destroyed.
+ */
+template<BGL_NAMED_GRAPH_PARAMS>
+struct BGL_NAMED_GRAPH::lazy_add_vertex
+{
+  /// Construct a new lazyily-added vertex
+  lazy_add_vertex(named_graph& self, const vertex_name_type& name)
+    : self(self), name(name), committed(false) { }
+
+  /// Transfer responsibility for adding the vertex from the source of
+  /// the copy to the newly-constructed opbject.
+  lazy_add_vertex(const lazy_add_vertex& other)
+    : self(self), name(other.name), committed(other.committed)
+  {
+    other.committed = true;
+  }
+
+  /// If the vertex has not been added yet, add it
+  ~lazy_add_vertex();
+
+  /// Add the vertex and return its descriptor. This conversion can
+  /// only occur once, and only when this object is responsible for
+  /// creating the vertex.
+  operator vertex_descriptor() const { return commit(); }
+
+  /// Add the vertex and return its descriptor. This can only be
+  /// called once, and only when this object is responsible for
+  /// creating the vertex.
+  vertex_descriptor commit() const;
+
+protected:
+  named_graph&     self;
+  vertex_name_type name;
+  mutable bool     committed;
+};
+
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::lazy_add_vertex::~lazy_add_vertex()
+{
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+
+  /// If this vertex has already been created or will be created by
+  /// someone else, or if someone threw an exception, we will not
+  /// create the vertex now.
+  if (committed || std::uncaught_exception())
+    return;
+
+  committed = true;
+
+  process_id_type owner = self.named_distribution()(name);
+  if (owner == process_id(self.process_group()))
+    /// Add the vertex locally
+    add_vertex(self.derived().base().vertex_constructor(name), self.derived()); 
+  else
+    /// Ask the owner of the vertex to add a vertex with this name
+    send(self.process_group(), owner, msg_add_vertex_name, name);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::vertex_descriptor
+BGL_NAMED_GRAPH::lazy_add_vertex::commit() const
+{
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+  assert (!committed);
+  committed = true;
+
+  process_id_type owner = self.named_distribution()(name);
+  if (owner == process_id(self.process_group()))
+    /// Add the vertex locally
+    return add_vertex(self.derived().base().vertex_constructor(name),
+                      self.derived()); 
+  else {
+    /// Ask the owner of the vertex to add a vertex with this name
+    vertex_descriptor result;
+    send_oob_with_reply(self.process_group(), owner, 
+                        msg_add_vertex_name_with_reply, name, result);
+    return result;
+  }
+}
+
+/**
+ * Data structure returned from add_edge that will "lazily" add the
+ * edge, either when it is converted to a @c
+ * pair<edge_descriptor,bool> or when the most recent copy has been
+ * destroyed.
+ */
+template<BGL_NAMED_GRAPH_PARAMS>
+struct BGL_NAMED_GRAPH::lazy_add_edge 
+{
+  /// The graph's edge descriptor
+  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+
+  /// Add an edge for the edge (u, v) based on vertex names
+  lazy_add_edge(BGL_NAMED_GRAPH& self, 
+                const vertex_name_type& u_name,
+                const vertex_name_type& v_name) 
+    : self(self), u(u_name), v(v_name), committed(false) { }
+
+  /// Add an edge for the edge (u, v) based on a vertex descriptor and name
+  lazy_add_edge(BGL_NAMED_GRAPH& self,
+                vertex_descriptor u,
+                const vertex_name_type& v_name)
+    : self(self), u(u), v(v_name), committed(false) { }
+
+  /// Add an edge for the edge (u, v) based on a vertex name and descriptor
+  lazy_add_edge(BGL_NAMED_GRAPH& self,
+                const vertex_name_type& u_name,
+                vertex_descriptor v)
+    : self(self), u(u_name), v(v), committed(false) { }
+
+  /// Add an edge for the edge (u, v) based on vertex descriptors
+  lazy_add_edge(BGL_NAMED_GRAPH& self,
+                vertex_descriptor u,
+                vertex_descriptor v)
+    : self(self), u(u), v(v), committed(false) { }
+
+  /// Copy a lazy_add_edge structure, which transfers responsibility
+  /// for adding the edge to the newly-constructed object.
+  lazy_add_edge(const lazy_add_edge& other)
+    : self(other.self), u(other.u), v(other.v), committed(other.committed)
+  {
+    other.committed = true;
+  }
+
+  /// If the edge has not yet been added, add the edge but don't wait
+  /// for a reply.
+  ~lazy_add_edge();
+
+  /// Returns commit().
+  operator std::pair<edge_descriptor, bool>() const { return commit(); }
+
+  // Add the edge. This operation will block if a remote edge is
+  // being added.
+  std::pair<edge_descriptor, bool> commit() const;
+
+protected:
+  BGL_NAMED_GRAPH& self;
+  mutable variant<vertex_descriptor, vertex_name_type> u;
+  mutable variant<vertex_descriptor, vertex_name_type> v;
+  mutable bool committed;
+
+private:
+  // No copy-assignment semantics
+  void operator=(lazy_add_edge&);
+};
+
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::lazy_add_edge::~lazy_add_edge()
+{
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+
+  using boost::parallel::detail::make_untracked_pair;
+
+  /// If this edge has already been created or will be created by
+  /// someone else, or if someone threw an exception, we will not
+  /// create the edge now.
+  if (committed || std::uncaught_exception())
+    return;
+
+  committed = true;
+
+  if (vertex_name_type* v_name = boost::get<vertex_name_type>(&v)) {
+    // We haven't resolved the target vertex to a descriptor yet, so
+    // it must not be local. Send a message to the owner of the target
+    // of the edge. If the owner of the target does not happen to own
+    // the source, it will resolve the target to a vertex descriptor
+    // and pass the message along to the owner of the source. 
+    if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
+      send(self.process_group(), self.distribution_(*v_name),
+           BGL_NAMED_GRAPH::msg_add_edge_name_name,
+           make_untracked_pair(*u_name, *v_name));
+    else
+      send(self.process_group(), self.distribution_(*v_name),
+           BGL_NAMED_GRAPH::msg_add_edge_vertex_name,
+           make_untracked_pair(boost::get<vertex_descriptor>(u), *v_name));
+  } else {
+    if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
+      // We haven't resolved the source vertex to a descriptor yet, so
+      // it must not be local. Send a message to the owner of the
+      // source vertex requesting the edge addition.
+      send(self.process_group(), self.distribution_(*u_name),
+           BGL_NAMED_GRAPH::msg_add_edge_name_vertex,
+           make_untracked_pair(*u_name, boost::get<vertex_descriptor>(v)));
+    else
+      // We have descriptors for both of the vertices, either of which
+      // may be remote or local. Tell the owner of the source vertex
+      // to add the edge (it may be us!).
+      add_edge(boost::get<vertex_descriptor>(u), 
+               boost::get<vertex_descriptor>(v), 
+               self.derived());
+  }
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
+BGL_NAMED_GRAPH::lazy_add_edge::commit() const
+{
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+  using boost::parallel::detail::make_untracked_pair;
+
+  assert(!committed);
+  committed = true;
+
+  /// The result we will return, if we are sending a message to
+  /// request that someone else add the edge.
+  boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
+
+  /// The owner of the vertex "u"
+  process_id_type u_owner;
+
+  process_id_type rank = process_id(self.process_group());
+  if (const vertex_name_type* u_name = boost::get<vertex_name_type>(&u)) {
+    /// We haven't resolved the source vertex to a descriptor yet, so
+    /// it must not be local. 
+    u_owner = self.named_distribution()(*u_name);
+
+    /// Send a message to the remote vertex requesting that it add the
+    /// edge. The message differs depending on whether we have a
+    /// vertex name or a vertex descriptor for the target.
+    if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+      send_oob_with_reply(self.process_group(), u_owner,
+                          BGL_NAMED_GRAPH::msg_add_edge_name_name_with_reply,
+                          make_untracked_pair(*u_name, *v_name), result);
+    else
+      send_oob_with_reply(self.process_group(), u_owner,
+                          BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_reply,
+                          make_untracked_pair(*u_name, 
+                                         boost::get<vertex_descriptor>(v)),
+                          result);
+  } else {
+    /// We have resolved the source vertex to a descriptor, which may
+    /// either be local or remote.
+    u_owner 
+      = get(vertex_owner, self.derived(),
+            boost::get<vertex_descriptor>(u));
+    if (u_owner == rank) {
+      /// The source is local. If we need to, resolve the target vertex.
+      if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+        v = add_vertex(*v_name, self.derived());
+
+      /// Add the edge using vertex descriptors
+      return add_edge(boost::get<vertex_descriptor>(u), 
+                      boost::get<vertex_descriptor>(v), 
+                      self.derived());
+    } else {
+      /// The source is remote. Just send a message to its owner
+      /// requesting that the owner add the new edge, either directly
+      /// or via the derived class's add_edge function.
+      if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+        send_oob_with_reply
+          (self.process_group(), u_owner,
+           BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_reply,
+           make_untracked_pair(boost::get<vertex_descriptor>(u), *v_name),
+           result);
+      else
+        return add_edge(boost::get<vertex_descriptor>(u), 
+                        boost::get<vertex_descriptor>(v), 
+                        self.derived());
+    }
+  }
+
+  // If we get here, the edge has been added remotely and "result"
+  // contains the result of that edge addition.
+  return result;
+}
+
+/**
+ * Data structure returned from add_edge that will "lazily" add the
+ * edge with a property, either when it is converted to a @c
+ * pair<edge_descriptor,bool> or when the most recent copy has been
+ * destroyed.
+ */
+template<BGL_NAMED_GRAPH_PARAMS>
+struct BGL_NAMED_GRAPH::lazy_add_edge_with_property 
+{
+  /// The graph's edge descriptor
+  typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
+
+  /// The Edge property type for our graph
+  typedef typename Config::edge_property_type edge_property_type;
+  
+  /// Add an edge for the edge (u, v) based on vertex names
+  lazy_add_edge_with_property(BGL_NAMED_GRAPH& self, 
+                              const vertex_name_type& u_name,
+                              const vertex_name_type& v_name,
+                              const edge_property_type& property) 
+    : self(self), u(u_name), v(v_name), property(property), committed(false)
+  { 
+  }
+
+  /// Add an edge for the edge (u, v) based on a vertex descriptor and name
+  lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
+                vertex_descriptor u,
+                const vertex_name_type& v_name,
+                                  const edge_property_type& property)
+    : self(self), u(u), v(v_name), property(property), committed(false) { }
+
+  /// Add an edge for the edge (u, v) based on a vertex name and descriptor
+  lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
+                              const vertex_name_type& u_name,
+                              vertex_descriptor v,
+                              const edge_property_type& property)
+    : self(self), u(u_name), v(v), property(property), committed(false) { }
+
+  /// Add an edge for the edge (u, v) based on vertex descriptors
+  lazy_add_edge_with_property(BGL_NAMED_GRAPH& self,
+                              vertex_descriptor u,
+                              vertex_descriptor v,
+                              const edge_property_type& property)
+    : self(self), u(u), v(v), property(property), committed(false) { }
+
+  /// Copy a lazy_add_edge_with_property structure, which transfers
+  /// responsibility for adding the edge to the newly-constructed
+  /// object.
+  lazy_add_edge_with_property(const lazy_add_edge_with_property& other)
+    : self(other.self), u(other.u), v(other.v), property(other.property), 
+      committed(other.committed)
+  {
+    other.committed = true;
+  }
+
+  /// If the edge has not yet been added, add the edge but don't wait
+  /// for a reply.
+  ~lazy_add_edge_with_property();
+
+  /// Returns commit().
+  operator std::pair<edge_descriptor, bool>() const { return commit(); }
+
+  // Add the edge. This operation will block if a remote edge is
+  // being added.
+  std::pair<edge_descriptor, bool> commit() const;
+
+protected:
+  BGL_NAMED_GRAPH& self;
+  mutable variant<vertex_descriptor, vertex_name_type> u;
+  mutable variant<vertex_descriptor, vertex_name_type> v;
+  edge_property_type property;
+  mutable bool committed;
+
+private:
+  // No copy-assignment semantics
+  void operator=(lazy_add_edge_with_property&);
+};
+
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::lazy_add_edge_with_property::~lazy_add_edge_with_property()
+{
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+  using boost::detail::parallel::make_pair_with_property;
+
+  /// If this edge has already been created or will be created by
+  /// someone else, or if someone threw an exception, we will not
+  /// create the edge now.
+  if (committed || std::uncaught_exception())
+    return;
+
+  committed = true;
+
+  if (vertex_name_type* v_name = boost::get<vertex_name_type>(&v)) {
+    // We haven't resolved the target vertex to a descriptor yet, so
+    // it must not be local. Send a message to the owner of the target
+    // of the edge. If the owner of the target does not happen to own
+    // the source, it will resolve the target to a vertex descriptor
+    // and pass the message along to the owner of the source. 
+    if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
+      send(self.process_group(), self.distribution_(*v_name),
+           BGL_NAMED_GRAPH::msg_add_edge_name_name_with_property,
+           make_pair_with_property(*u_name, *v_name, property));
+    else
+      send(self.process_group(), self.distribution_(*v_name),
+           BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_property,
+           make_pair_with_property(boost::get<vertex_descriptor>(u), *v_name, 
+                                   property));
+  } else {
+    if (vertex_name_type* u_name = boost::get<vertex_name_type>(&u))
+      // We haven't resolved the source vertex to a descriptor yet, so
+      // it must not be local. Send a message to the owner of the
+      // source vertex requesting the edge addition.
+      send(self.process_group(), self.distribution_(*u_name),
+           BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_property,
+           make_pair_with_property(*u_name, boost::get<vertex_descriptor>(v), 
+                                   property));
+    else
+      // We have descriptors for both of the vertices, either of which
+      // may be remote or local. Tell the owner of the source vertex
+      // to add the edge (it may be us!).
+      add_edge(boost::get<vertex_descriptor>(u), 
+               boost::get<vertex_descriptor>(v), 
+               property,
+               self.derived());
+  }
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
+BGL_NAMED_GRAPH::lazy_add_edge_with_property::commit() const
+{
+  using boost::detail::parallel::make_pair_with_property;
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+  assert(!committed);
+  committed = true;
+
+  /// The result we will return, if we are sending a message to
+  /// request that someone else add the edge.
+  boost::parallel::detail::untracked_pair<edge_descriptor, bool> result;
+
+  /// The owner of the vertex "u"
+  process_id_type u_owner;
+
+  process_id_type rank = process_id(self.process_group());
+  if (const vertex_name_type* u_name = boost::get<vertex_name_type>(&u)) {
+    /// We haven't resolved the source vertex to a descriptor yet, so
+    /// it must not be local. 
+    u_owner = self.named_distribution()(*u_name);
+
+    /// Send a message to the remote vertex requesting that it add the
+    /// edge. The message differs depending on whether we have a
+    /// vertex name or a vertex descriptor for the target.
+    if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+      send_oob_with_reply
+        (self.process_group(), u_owner,
+         BGL_NAMED_GRAPH::msg_add_edge_name_name_with_reply_and_property,
+         make_pair_with_property(*u_name, *v_name, property),
+         result);
+    else
+      send_oob_with_reply
+        (self.process_group(), u_owner,
+         BGL_NAMED_GRAPH::msg_add_edge_name_vertex_with_reply_and_property,
+         make_pair_with_property(*u_name, 
+                                 boost::get<vertex_descriptor>(v),
+                                 property),
+         result);
+  } else {
+    /// We have resolved the source vertex to a descriptor, which may
+    /// either be local or remote.
+    u_owner 
+      = get(vertex_owner, self.derived(),
+            boost::get<vertex_descriptor>(u));
+    if (u_owner == rank) {
+      /// The source is local. If we need to, resolve the target vertex.
+      if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+        v = add_vertex(*v_name, self.derived());
+
+      /// Add the edge using vertex descriptors
+      return add_edge(boost::get<vertex_descriptor>(u), 
+                      boost::get<vertex_descriptor>(v), 
+                      property,
+                      self.derived());
+    } else {
+      /// The source is remote. Just send a message to its owner
+      /// requesting that the owner add the new edge, either directly
+      /// or via the derived class's add_edge function.
+      if (const vertex_name_type* v_name = boost::get<vertex_name_type>(&v))
+        send_oob_with_reply
+          (self.process_group(), u_owner,
+           BGL_NAMED_GRAPH::msg_add_edge_vertex_name_with_reply_and_property,
+           make_pair_with_property(boost::get<vertex_descriptor>(u), *v_name,
+                                   property),
+           result);
+      else
+        return add_edge(boost::get<vertex_descriptor>(u), 
+                        boost::get<vertex_descriptor>(v), 
+                        property,
+                        self.derived());
+    }
+  }
+
+  // If we get here, the edge has been added remotely and "result"
+  // contains the result of that edge addition.
+  return result;
+}
+
+/// Construct the named_graph with a particular process group
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::named_graph(const process_group_type& pg)
+  : process_group_(pg, parallel::attach_distributed_object()),
+    distribution_(pg)
+{
+  setup_triggers();
+}
+
+/// Construct the named_graph mixin with a particular process group
+/// and distribution function
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::named_graph(const process_group_type& pg,
+                             const base_distribution_type& distribution)
+  : process_group_(pg, parallel::attach_distributed_object()),
+    distribution_(pg, distribution)
+{
+  setup_triggers();
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+void
+BGL_NAMED_GRAPH::setup_triggers()
+{
+  using boost::graph::parallel::simple_trigger;
+
+  simple_trigger(process_group_, msg_add_vertex_name, this,
+                 &named_graph::handle_add_vertex_name);
+  simple_trigger(process_group_, msg_add_vertex_name_with_reply, this,
+                 &named_graph::handle_add_vertex_name_with_reply);
+  simple_trigger(process_group_, msg_find_vertex, this, 
+                 &named_graph::handle_find_vertex);
+  simple_trigger(process_group_, msg_add_edge_name_name, this, 
+                 &named_graph::template handle_add_edge<vertex_name_type, 
+                                                        vertex_name_type>);
+  simple_trigger(process_group_, msg_add_edge_name_name_with_reply, this,
+                 &named_graph::template handle_add_edge_with_reply
+                   <vertex_name_type, vertex_name_type>);
+  simple_trigger(process_group_, msg_add_edge_name_vertex, this,
+                 &named_graph::template handle_add_edge<vertex_name_type, 
+                                                        vertex_descriptor>);
+  simple_trigger(process_group_, msg_add_edge_name_vertex_with_reply, this,
+                 &named_graph::template handle_add_edge_with_reply
+                   <vertex_name_type, vertex_descriptor>);
+  simple_trigger(process_group_, msg_add_edge_vertex_name, this,
+                 &named_graph::template handle_add_edge<vertex_descriptor, 
+                                                        vertex_name_type>);
+  simple_trigger(process_group_, msg_add_edge_vertex_name_with_reply, this,
+                 &named_graph::template handle_add_edge_with_reply
+                   <vertex_descriptor, vertex_name_type>);
+  simple_trigger(process_group_, msg_add_edge_name_name_with_property, this, 
+                 &named_graph::
+                   template handle_add_edge_with_property<vertex_name_type, 
+                                                          vertex_name_type>);
+  simple_trigger(process_group_, 
+                 msg_add_edge_name_name_with_reply_and_property, this,
+                 &named_graph::template handle_add_edge_with_reply_and_property
+                   <vertex_name_type, vertex_name_type>);
+  simple_trigger(process_group_, msg_add_edge_name_vertex_with_property, this,
+                 &named_graph::
+                   template handle_add_edge_with_property<vertex_name_type, 
+                                                          vertex_descriptor>);
+  simple_trigger(process_group_, 
+                 msg_add_edge_name_vertex_with_reply_and_property, this,
+                 &named_graph::template handle_add_edge_with_reply_and_property
+                   <vertex_name_type, vertex_descriptor>);
+  simple_trigger(process_group_, msg_add_edge_vertex_name_with_property, this,
+                 &named_graph::
+                   template handle_add_edge_with_property<vertex_descriptor, 
+                                                          vertex_name_type>);
+  simple_trigger(process_group_, 
+                 msg_add_edge_vertex_name_with_reply_and_property, this,
+                 &named_graph::template handle_add_edge_with_reply_and_property
+                   <vertex_descriptor, vertex_name_type>);
+}
+
+/// Retrieve the vertex associated with the given name
+template<BGL_NAMED_GRAPH_PARAMS>
+optional<Vertex> 
+find_vertex(typename BGL_NAMED_GRAPH::vertex_name_type const& name,
+            const BGL_NAMED_GRAPH& g)
+{
+  typedef typename Graph::local_vertex_descriptor local_vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+  // Determine the owner of this name
+  typename BGL_NAMED_GRAPH::process_id_type owner 
+    = g.named_distribution()(name);
+
+  if (owner == process_id(g.process_group())) {
+    // The vertex is local, so search for a mapping here
+    optional<local_vertex_descriptor> result 
+      = find_vertex(name, g.derived().base());
+    if (result)
+      return Vertex(owner, *result);
+    else
+      return optional<Vertex>();
+  }
+  else {
+    // Ask the ownering process for the name of this vertex
+    boost::parallel::detail::untracked_pair<vertex_descriptor, bool> result;
+    send_oob_with_reply(g.process_group(), owner, 
+                        BGL_NAMED_GRAPH::msg_find_vertex, name, result);
+    if (result.second)
+      return result.first;
+    else
+      return optional<Vertex>();
+  }
+}
+
+/// meta-function helping in figuring out if the given VertextProerty belongs to 
+/// a named graph
+template<typename VertexProperty>
+struct not_is_named_graph
+  : is_same<typename internal_vertex_name<VertexProperty>::type, void>
+{};
+
+/// Retrieve the vertex associated with the given name
+template<typename Graph>
+typename Graph::named_graph_type::lazy_add_vertex
+add_vertex(typename Graph::vertex_name_type const& name,
+           Graph& g, 
+           typename disable_if<
+              not_is_named_graph<typename Graph::vertex_property_type>, 
+              void*>::type = 0)
+{
+  return typename Graph::named_graph_type::lazy_add_vertex(g, name);
+}
+
+/// Add an edge using vertex names to refer to the vertices
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         BGL_NAMED_GRAPH& g)
+{
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+
+  process_id_type rank = process_id(g.process_group());
+  process_id_type u_owner = g.named_distribution()(u_name);
+  process_id_type v_owner = g.named_distribution()(v_name);
+
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  if (u_owner == rank && v_owner == rank)
+    return lazy_add_edge(g, add_vertex(u_name, g), add_vertex(v_name, g));
+  else if (u_owner == rank && v_owner != rank)
+    return lazy_add_edge(g, add_vertex(u_name, g), v_name);
+  else if (u_owner != rank && v_owner == rank)
+    return lazy_add_edge(g, u_name, add_vertex(v_name, g));
+  else
+    return lazy_add_edge(g, u_name, v_name);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_descriptor const& v,
+         BGL_NAMED_GRAPH& g)
+{
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
+  if (g.named_distribution()(u_name) == process_id(g.process_group()))
+    return lazy_add_edge(g, add_vertex(u_name, g), v);
+  else
+    return lazy_add_edge(g, u_name, v);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge
+add_edge(typename BGL_NAMED_GRAPH::vertex_descriptor const& u,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         BGL_NAMED_GRAPH& g)
+{
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge lazy_add_edge;
+  if (g.named_distribution()(v_name) == process_id(g.process_group()))
+    return lazy_add_edge(g, u, add_vertex(v_name, g));
+  else
+    return lazy_add_edge(g, u, v_name);
+}
+
+/// Add an edge using vertex names to refer to the vertices
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         typename Graph::edge_property_type const& property,
+         BGL_NAMED_GRAPH& g)
+{
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
+  typedef typename BGL_NAMED_GRAPH::process_id_type process_id_type;
+
+  process_id_type rank = process_id(g.process_group());
+  process_id_type u_owner = g.named_distribution()(u_name);
+  process_id_type v_owner = g.named_distribution()(v_name);
+
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  if (u_owner == rank && v_owner == rank)
+    return lazy_add_edge(g, add_vertex(u_name, g), add_vertex(v_name, g), 
+                         property);
+  else if (u_owner == rank && v_owner != rank)
+    return lazy_add_edge(g, add_vertex(u_name, g), v_name, property);
+  else if (u_owner != rank && v_owner == rank)
+    return lazy_add_edge(g, u_name, add_vertex(v_name, g), property);
+  else
+    return lazy_add_edge(g, u_name, v_name, property);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_descriptor const& v,
+         typename Graph::edge_property_type const& property,
+         BGL_NAMED_GRAPH& g)
+{
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
+  if (g.named_distribution()(u_name) == process_id(g.process_group()))
+    return lazy_add_edge(g, add_vertex(u_name, g), v, property);
+  else
+    return lazy_add_edge(g, u_name, v, property);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::lazy_add_edge_with_property
+add_edge(typename BGL_NAMED_GRAPH::vertex_descriptor const& u,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         typename Graph::edge_property_type const& property,
+         BGL_NAMED_GRAPH& g)
+{
+  // Resolve local vertex names before building the "lazy" edge
+  // addition structure.
+  typedef typename BGL_NAMED_GRAPH::lazy_add_edge_with_property lazy_add_edge;
+  if (g.named_distribution()(v_name) == process_id(g.process_group()))
+    return lazy_add_edge(g, u, add_vertex(v_name, g), property);
+  else
+    return lazy_add_edge(g, u, v_name, property);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::process_id_type 
+BGL_NAMED_GRAPH::owner_by_property(const vertex_property_type& property)
+{
+  return distribution_(derived().base().extract_name(property));
+}
+
+
+/*******************************************************************
+ * Message handlers                                                *
+ *******************************************************************/
+
+template<BGL_NAMED_GRAPH_PARAMS>
+void 
+BGL_NAMED_GRAPH::
+handle_add_vertex_name(int /*source*/, int /*tag*/, 
+                       const vertex_name_type& msg, trigger_receive_context)
+{
+  add_vertex(msg, derived());
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::vertex_descriptor
+BGL_NAMED_GRAPH::
+handle_add_vertex_name_with_reply(int source, int /*tag*/, 
+                                  const vertex_name_type& msg, 
+                                  trigger_receive_context)
+{
+  return add_vertex(msg, derived());
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::vertex_descriptor, bool>
+BGL_NAMED_GRAPH::
+handle_find_vertex(int source, int /*tag*/, const vertex_name_type& msg, 
+                   trigger_receive_context)
+{
+  using boost::parallel::detail::make_untracked_pair;
+
+  optional<vertex_descriptor> v = find_vertex(msg, derived());
+  if (v)
+    return make_untracked_pair(*v, true);
+  else
+    return make_untracked_pair(graph_traits<Graph>::null_vertex(), false);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+template<typename U, typename V>
+void
+BGL_NAMED_GRAPH::
+handle_add_edge(int source, int /*tag*/, const boost::parallel::detail::untracked_pair<U, V>& msg, 
+                trigger_receive_context)
+{
+  add_edge(msg.first, msg.second, derived());
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+template<typename U, typename V>
+boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool>
+BGL_NAMED_GRAPH::
+handle_add_edge_with_reply(int source, int /*tag*/, const boost::parallel::detail::untracked_pair<U, V>& msg,
+                           trigger_receive_context)
+{
+  std::pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool> p =
+    add_edge(msg.first, msg.second, derived());
+   return p;
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+template<typename U, typename V>
+void 
+BGL_NAMED_GRAPH::
+handle_add_edge_with_property
+  (int source, int tag, 
+   const pair_with_property<U, V, edge_property_type>& msg,
+   trigger_receive_context)
+{
+  add_edge(msg.first, msg.second, msg.get_property(), derived());
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+template<typename U, typename V>
+boost::parallel::detail::untracked_pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool>
+BGL_NAMED_GRAPH::
+handle_add_edge_with_reply_and_property
+  (int source, int tag, 
+   const pair_with_property<U, V, edge_property_type>& msg,
+   trigger_receive_context)
+{
+  std:: pair<typename BGL_NAMED_GRAPH::edge_descriptor, bool> p =
+    add_edge(msg.first, msg.second, msg.get_property(), derived());
+  return p;
+}
+
+#undef BGL_NAMED_GRAPH
+#undef BGL_NAMED_GRAPH_PARAMS
+
+/*******************************************************************
+ * Maybe named graph mixin                                         *
+ *******************************************************************/
+
+/**
+ * A graph mixin that can provide a mapping from names to vertices,
+ * and use that mapping to simplify creation and manipulation of
+ * graphs. 
+ */
+template<typename Graph, typename Vertex, typename Edge, typename Config, 
+  typename ExtractName 
+    = typename internal_vertex_name<typename Config::vertex_property_type>::type>
+struct maybe_named_graph 
+  : public named_graph<Graph, Vertex, Edge, Config> 
+{
+private:
+  typedef named_graph<Graph, Vertex, Edge, Config> inherited;
+  typedef typename Config::process_group_type process_group_type;
+  
+public:
+  /// The type used to distribute named vertices in the graph
+  typedef typename Config::distribution_type distribution_type;
+  typedef typename Config::base_distribution_type base_distribution_type;
+  
+  explicit maybe_named_graph(const process_group_type& pg) : inherited(pg) { }
+
+  maybe_named_graph(const process_group_type& pg, 
+                    const base_distribution_type& distribution)
+    : inherited(pg, distribution) { }  
+
+  distribution_type&       distribution()       { return this->distribution_; }
+  const distribution_type& distribution() const { return this->distribution_; }
+};
+
+/**
+ * A graph mixin that can provide a mapping from names to vertices,
+ * and use that mapping to simplify creation and manipulation of
+ * graphs. This partial specialization turns off this functionality
+ * when the @c VertexProperty does not have an internal vertex name.
+ */
+template<typename Graph, typename Vertex, typename Edge, typename Config>
+struct maybe_named_graph<Graph, Vertex, Edge, Config, void> 
+{ 
+private:
+  typedef typename Config::process_group_type process_group_type;
+  typedef typename Config::vertex_property_type vertex_property_type;
+  
+public:
+  typedef typename process_group_type::process_id_type process_id_type;
+
+  /// The type used to distribute named vertices in the graph
+  typedef typename Config::distribution_type distribution_type;
+  typedef typename Config::base_distribution_type base_distribution_type;
+
+  explicit maybe_named_graph(const process_group_type&)  { }
+
+  maybe_named_graph(const process_group_type& pg, 
+                    const base_distribution_type& distribution) 
+    : distribution_(pg, distribution) { }
+
+  /// Notify the named_graph that we have added the given vertex. This
+  /// is a no-op.
+  void added_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are removing the given
+  /// vertex. This is a no-op.
+  void removing_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are clearing the graph
+  void clearing_graph() { }
+
+  /// Retrieve the owner of a given vertex based on the properties
+  /// associated with that vertex. This operation just returns the
+  /// number of the local processor, adding all vertices locally.
+  process_id_type owner_by_property(const vertex_property_type&)
+  {
+    return process_id(pg);
+  }
+
+  distribution_type&       distribution()       { return distribution_; }
+  const distribution_type& distribution() const { return distribution_; }
+
+protected:
+  /// The process group of the graph
+  process_group_type pg;
+  
+  /// The distribution used for the graph
+  distribution_type distribution_;
+};
+
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_DISTRIBUTED_NAMED_GRAPH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/page_rank.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/page_rank.hpp
new file mode 100644 (file)
index 0000000..9807dff
--- /dev/null
@@ -0,0 +1,225 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+// Copyright (C) 2002 Brad King and Douglas Gregor
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+//           Brian Barrett
+#ifndef BOOST_PARALLEL_GRAPH_PAGE_RANK_HPP
+#define BOOST_PARALLEL_GRAPH_PAGE_RANK_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/page_rank.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+// #define WANT_MPI_ONESIDED 1
+
+namespace boost { namespace graph { namespace distributed {
+
+namespace detail {
+#ifdef WANT_MPI_ONESIDED
+  template<typename Graph, typename RankMap, typename owner_map_t>
+  void page_rank_step(const Graph& g, RankMap from_rank, MPI_Win to_win, 
+                      typename property_traits<RankMap>::value_type damping,
+                      owner_map_t owner)
+  {
+    typedef typename property_traits<RankMap>::value_type rank_type;
+    int me, ret;
+    MPI_Comm_rank(MPI_COMM_WORLD, &me);
+
+    // MPI_Accumulate is not required to store the value of the data
+    // being sent, only the address.  The value of the memory location
+    // must not change until the end of the access epoch, meaning the
+    // call to MPI_Fence.  We therefore store the updated value back
+    // into the from_rank map before the accumulate rather than using
+    // a temporary.  We're going to reset the values in the from_rank
+    // before the end of page_rank_step() anyway, so this isn't a huge
+    // deal.  But MPI-2 One-sided is an abomination.
+    BGL_FORALL_VERTICES_T(u, g, Graph) {
+      put(from_rank, u, (damping * get(from_rank, u) / out_degree(u, g)));
+      BGL_FORALL_ADJ_T(u, v, g, Graph) {
+        ret = MPI_Accumulate(&(from_rank[u]),
+                             1, MPI_DOUBLE,
+                             get(owner, v), local(v), 
+                             1, MPI_DOUBLE, MPI_SUM, to_win);
+        assert(MPI_SUCCESS == ret);
+      }
+    }
+    MPI_Win_fence(0, to_win);
+
+    // Set new rank maps for the other map.  Do this now to get around
+    // the stupid synchronization rules of MPI-2 One-sided
+    BGL_FORALL_VERTICES_T(v, g, Graph) put(from_rank, v, rank_type(1 - damping));
+  }
+#endif
+
+  template<typename T>
+  struct rank_accumulate_reducer {
+    BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+    template<typename K>
+    T operator()(const K&) const { return T(0); }
+
+    template<typename K>
+    T operator()(const K&, const T& x, const T& y) const { return x + y; }
+  };
+} // end namespace detail
+
+template<typename Graph, typename RankMap, typename Done, typename RankMap2>
+void
+page_rank_impl(const Graph& g, RankMap rank_map, Done done, 
+               typename property_traits<RankMap>::value_type damping,
+               typename graph_traits<Graph>::vertices_size_type n,
+               RankMap2 rank_map2)
+{
+  typedef typename property_traits<RankMap>::value_type rank_type;
+
+  int me;
+  MPI_Comm_rank(MPI_COMM_WORLD, &me);
+
+  typedef typename property_map<Graph, vertex_owner_t>
+    ::const_type vertex_owner_map;
+  typename property_map<Graph, vertex_owner_t>::const_type
+    owner = get(vertex_owner, g);
+
+  typedef typename boost::graph::parallel::process_group_type<Graph>
+    ::type process_group_type;
+  typedef typename process_group_type::process_id_type process_id_type;
+
+  process_group_type pg = process_group(g);
+  process_id_type id = process_id(pg);
+
+  assert(me == id);
+
+  rank_type initial_rank = rank_type(rank_type(1) / n);
+  BGL_FORALL_VERTICES_T(v, g, Graph) put(rank_map, v, initial_rank);
+
+#ifdef WANT_MPI_ONESIDED
+
+  assert(sizeof(rank_type) == sizeof(double));
+
+  bool to_map_2 = true;
+  MPI_Win win, win2;
+
+  MPI_Win_create(&(rank_map[*(vertices(g).first)]), 
+                 sizeof(double) * num_vertices(g),
+                 sizeof(double), 
+                 MPI_INFO_NULL, MPI_COMM_WORLD, &win);
+  MPI_Win_set_name(win, "rank_map_win");
+  MPI_Win_create(&(rank_map2[*(vertices(g).first)]), 
+                 sizeof(double) * num_vertices(g),
+                 sizeof(double), 
+                 MPI_INFO_NULL, MPI_COMM_WORLD, &win2);
+  MPI_Win_set_name(win, "rank_map2_win");
+
+  // set initial rank maps for the first iteration...
+  BGL_FORALL_VERTICES_T(v, g, Graph) put(rank_map2, v, rank_type(1 - damping));
+
+  MPI_Win_fence(0, win);
+  MPI_Win_fence(0, win2);
+
+  while ((to_map_2 && !done(rank_map, g)) ||
+         (!to_map_2 && !done(rank_map2, g))) {
+    if (to_map_2) {
+      graph::distributed::detail::page_rank_step(g, rank_map, win2, damping, owner);
+      to_map_2 = false;
+    } else {
+      graph::distributed::detail::page_rank_step(g, rank_map2, win, damping, owner);
+      to_map_2 = true;
+    }
+  }
+  synchronize(boost::graph::parallel::process_group(g));
+
+  MPI_Win_free(&win);
+  MPI_Win_free(&win2);
+
+#else  
+  // The ranks accumulate after each step.
+  rank_map.set_reduce(detail::rank_accumulate_reducer<rank_type>());
+  rank_map2.set_reduce(detail::rank_accumulate_reducer<rank_type>());
+  rank_map.set_consistency_model(boost::parallel::cm_flush | boost::parallel::cm_reset);
+  rank_map2.set_consistency_model(boost::parallel::cm_flush | boost::parallel::cm_reset);
+
+  bool to_map_2 = true;
+  while ((to_map_2 && !done(rank_map, g)) ||
+         (!to_map_2 && !done(rank_map2, g))) {
+    /**
+     * PageRank can implemented slightly more efficiently on a
+     * bidirectional graph than on an incidence graph. However,
+     * distributed PageRank requires that we have the rank of the
+     * source vertex available locally, so we force the incidence
+     * graph implementation, which pushes rank from source to
+     * target.
+     */
+    typedef incidence_graph_tag category;
+    if (to_map_2) {
+      graph::detail::page_rank_step(g, rank_map, rank_map2, damping,
+                                    category());
+      to_map_2 = false;
+    } else {
+      graph::detail::page_rank_step(g, rank_map2, rank_map, damping,
+                                    category());
+      to_map_2 = true;
+    }
+    using boost::graph::parallel::process_group;
+    synchronize(process_group(g));
+  }
+
+  rank_map.reset();
+#endif
+      
+  if (!to_map_2)
+    BGL_FORALL_VERTICES_T(v, g, Graph) put(rank_map, v, get(rank_map2, v));
+}
+
+template<typename Graph, typename RankMap, typename Done, typename RankMap2>
+void
+page_rank(const Graph& g, RankMap rank_map, Done done, 
+          typename property_traits<RankMap>::value_type damping,
+          typename graph_traits<Graph>::vertices_size_type n,
+          RankMap2 rank_map2
+          BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, distributed_graph_tag)) 
+{
+  (page_rank_impl)(g, rank_map, done, damping, n, rank_map2);
+}
+
+template<typename MutableGraph>
+void
+remove_dangling_links(MutableGraph& g
+                      BOOST_GRAPH_ENABLE_IF_MODELS_PARM(MutableGraph, 
+                                                        distributed_graph_tag))
+{
+  typename graph_traits<MutableGraph>::vertices_size_type old_n;
+  do {
+    old_n = num_vertices(g);
+
+    typename graph_traits<MutableGraph>::vertex_iterator vi, vi_end;
+    for (tie(vi, vi_end) = vertices(g); vi != vi_end; /* in loop */) {
+      typename graph_traits<MutableGraph>::vertex_descriptor v = *vi++;
+      if (out_degree(v, g) == 0) {
+        clear_vertex(v, g);
+        remove_vertex(v, g);
+      }
+    }
+  } while (num_vertices(g) < old_n);
+}
+
+} // end namespace distributed
+
+using distributed::page_rank;
+using distributed::remove_dangling_links;
+
+} } // end namespace boost::graph
+
+#endif // BOOST_PARALLEL_GRAPH_PAGE_RANK_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/queue.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/queue.hpp
new file mode 100644 (file)
index 0000000..7e84272
--- /dev/null
@@ -0,0 +1,278 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_QUEUE_HPP
+#define BOOST_GRAPH_DISTRIBUTED_QUEUE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/optional.hpp>
+#include <boost/shared_ptr.hpp>
+#include <vector>
+
+namespace boost { namespace graph { namespace distributed {
+
+/// A unary predicate that always returns "true".
+struct always_push
+{
+  template<typename T> bool operator()(const T&) const { return true; }
+};
+
+
+
+/** A distributed queue adaptor.
+ *
+ * Class template @c distributed_queue implements a distributed queue
+ * across a process group. The distributed queue is an adaptor over an
+ * existing (local) queue, which must model the @ref Buffer
+ * concept. Each process stores a distinct copy of the local queue,
+ * from which it draws or removes elements via the @ref pop and @ref
+ * top members.
+ *
+ * The value type of the local queue must be a model of the @ref
+ * GlobalDescriptor concept. The @ref push operation of the
+ * distributed queue passes (via a message) the value to its owning
+ * processor. Thus, the elements within a particular local queue are
+ * guaranteed to have the process owning that local queue as an owner.
+ *
+ * Synchronization of distributed queues occurs in the @ref empty and
+ * @ref size functions, which will only return "empty" values (true or
+ * 0, respectively) when the entire distributed queue is empty. If the
+ * local queue is empty but the distributed queue is not, the
+ * operation will block until either condition changes. When the @ref
+ * size function of a nonempty queue returns, it returns the size of
+ * the local queue. These semantics were selected so that sequential
+ * code that processes elements in the queue via the following idiom
+ * can be parallelized via introduction of a distributed queue:
+ *
+ *   distributed_queue<...> Q;
+ *   Q.push(x);
+ *   while (!Q.empty()) {
+ *     // do something, that may push a value onto Q
+ *   }
+ *
+ * In the parallel version, the initial @ref push operation will place
+ * the value @c x onto its owner's queue. All processes will
+ * synchronize at the call to empty, and only the process owning @c x
+ * will be allowed to execute the loop (@ref Q.empty() returns
+ * false). This iteration may in turn push values onto other remote
+ * queues, so when that process finishes execution of the loop body
+ * and all processes synchronize again in @ref empty, more processes
+ * may have nonempty local queues to execute. Once all local queues
+ * are empty, @ref Q.empty() returns @c false for all processes.
+ *
+ * The distributed queue can receive messages at two different times:
+ * during synchronization and when polling @ref empty. Messages are
+ * always received during synchronization, to ensure that accurate
+ * local queue sizes can be determines. However, whether @ref empty
+ * should poll for messages is specified as an option to the
+ * constructor. Polling may be desired when the order in which
+ * elements in the queue are processed is not important, because it
+ * permits fewer synchronization steps and less communication
+ * overhead. However, when more strict ordering guarantees are
+ * required, polling may be semantically incorrect. By disabling
+ * polling, one ensures that parallel execution using the idiom above
+ * will not process an element at a later "level" before an earlier
+ * "level".
+ *
+ * The distributed queue nearly models the @ref Buffer
+ * concept. However, the @ref push routine does not necessarily
+ * increase the result of @c size() by one (although the size of the
+ * global queue does increase by one).
+ */
+template<typename ProcessGroup, typename OwnerMap, typename Buffer,
+         typename UnaryPredicate = always_push>
+class distributed_queue
+{
+  typedef distributed_queue self_type;
+
+  enum {
+    /** Message indicating a remote push. The message contains a
+     * single value x of type value_type that is to be pushed on the
+     * receiver's queue.
+     */
+    msg_push,
+    /** Push many elements at once. */
+    msg_multipush
+  };
+
+ public:
+  typedef ProcessGroup                     process_group_type;
+  typedef Buffer                           buffer_type;
+  typedef typename buffer_type::value_type value_type;
+  typedef typename buffer_type::size_type  size_type;
+
+  /** Construct a new distributed queue.
+   *
+   * Build a new distributed queue that communicates over the given @p
+   * process_group, whose local queue is initialized via @p buffer and
+   * which may or may not poll for messages.
+   */
+  explicit
+  distributed_queue(const ProcessGroup& process_group,
+                    const OwnerMap& owner,
+                    const Buffer& buffer,
+                    bool polling = false);
+
+  /** Construct a new distributed queue.
+   *
+   * Build a new distributed queue that communicates over the given @p
+   * process_group, whose local queue is initialized via @p buffer and
+   * which may or may not poll for messages.
+   */
+  explicit
+  distributed_queue(const ProcessGroup& process_group = ProcessGroup(),
+                    const OwnerMap& owner = OwnerMap(),
+                    const Buffer& buffer = Buffer(),
+                    const UnaryPredicate& pred = UnaryPredicate(),
+                    bool polling = false);
+
+  /** Construct a new distributed queue.
+   *
+   * Build a new distributed queue that communicates over the given @p
+   * process_group, whose local queue is default-initalized and which
+   * may or may not poll for messages.
+   */
+  distributed_queue(const ProcessGroup& process_group, const OwnerMap& owner,
+                    const UnaryPredicate& pred, bool polling = false);
+
+  /** Virtual destructor required with virtual functions.
+   *
+   */
+  virtual ~distributed_queue() {}
+
+  /** Push an element onto the distributed queue.
+   *
+   * The element will be sent to its owner process to be added to that
+   * process's local queue. If polling is enabled for this queue and
+   * the owner process is the current process, the value will be
+   * immediately pushed onto the local queue.
+   *
+   * Complexity: O(1) messages of size O(sizeof(value_type)) will be
+   * transmitted.
+   */
+  void push(const value_type& x);
+
+  /** Pop an element off the local queue.
+   *
+   * @p @c !empty()
+   */
+  void pop() { buffer.pop(); }
+
+  /**
+   * Return the element at the top of the local queue.
+   *
+   * @p @c !empty()
+   */
+  value_type& top() { return buffer.top(); }
+
+  /**
+   * \overload
+   */
+  const value_type& top() const { return buffer.top(); }
+
+  /** Determine if the queue is empty.
+   *
+   * When the local queue is nonempty, returns @c true. If the local
+   * queue is empty, synchronizes with all other processes in the
+   * process group until either (1) the local queue is nonempty
+   * (returns @c true) (2) the entire distributed queue is empty
+   * (returns @c false).
+   */
+  bool empty() const;
+
+  /** Determine the size of the local queue.
+   *
+   * The behavior of this routine is equivalent to the behavior of
+   * @ref empty, except that when @ref empty returns true this
+   * function returns the size of the local queue and when @ref empty
+   * returns false this function returns zero.
+   */
+  size_type size() const;
+
+  // private:
+  /** Synchronize the distributed queue and determine if all queues
+   * are empty.
+   *
+   * \returns \c true when all local queues are empty, or false if at least
+   * one of the local queues is nonempty.
+   * Defined as virtual for derived classes like depth_limited_distributed_queue.
+   */
+  virtual bool do_synchronize() const;
+
+ private:
+  // Setup triggers
+  void setup_triggers();
+
+  // Message handlers
+  void 
+  handle_push(int source, int tag, const value_type& value, 
+              trigger_receive_context);
+
+  void 
+  handle_multipush(int source, int tag, const std::vector<value_type>& values, 
+                   trigger_receive_context);
+
+  mutable ProcessGroup process_group;
+  OwnerMap owner;
+  mutable Buffer buffer;
+  UnaryPredicate pred;
+  bool polling;
+
+  typedef std::vector<value_type> outgoing_buffer_t;
+  typedef std::vector<outgoing_buffer_t> outgoing_buffers_t;
+  shared_ptr<outgoing_buffers_t> outgoing_buffers;
+};
+
+/// Helper macro containing the normal names for the template
+/// parameters to distributed_queue.
+#define BOOST_DISTRIBUTED_QUEUE_PARMS                           \
+  typename ProcessGroup, typename OwnerMap, typename Buffer,    \
+  typename UnaryPredicate
+
+/// Helper macro containing the normal template-id for
+/// distributed_queue.
+#define BOOST_DISTRIBUTED_QUEUE_TYPE                                    \
+  distributed_queue<ProcessGroup, OwnerMap, Buffer, UnaryPredicate>
+
+/** Synchronize all processes involved with the given distributed queue.
+ *
+ * This function will synchronize all of the local queues for a given
+ * distributed queue, by ensuring that no additional messages are in
+ * transit. It is rarely required by the user, because most
+ * synchronization of distributed queues occurs via the @c empty or @c
+ * size methods.
+ */
+template<BOOST_DISTRIBUTED_QUEUE_PARMS>
+inline void
+synchronize(const BOOST_DISTRIBUTED_QUEUE_TYPE& Q)
+{ Q.do_synchronize(); }
+
+/// Construct a new distributed queue.
+template<typename ProcessGroup, typename OwnerMap, typename Buffer>
+inline distributed_queue<ProcessGroup, OwnerMap, Buffer>
+make_distributed_queue(const ProcessGroup& process_group,
+                       const OwnerMap& owner,
+                       const Buffer& buffer,
+                       bool polling = false)
+{
+  typedef distributed_queue<ProcessGroup, OwnerMap, Buffer> result_type;
+  return result_type(process_group, owner, buffer, polling);
+}
+
+} } } // end namespace boost::graph::distributed
+
+#include <boost/graph/distributed/detail/queue.ipp>
+
+#undef BOOST_DISTRIBUTED_QUEUE_TYPE
+#undef BOOST_DISTRIBUTED_QUEUE_PARMS
+
+#endif // BOOST_GRAPH_DISTRIBUTED_QUEUE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/reverse_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/reverse_graph.hpp
new file mode 100644 (file)
index 0000000..615aab8
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright (C) 2005-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_REVERSE_GRAPH_HPP
+#define BOOST_GRAPH_DISTRIBUTED_REVERSE_GRAPH_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/reverse_graph.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+
+namespace boost {
+  namespace graph {
+    namespace parallel {
+      /// Retrieve the process group from a reverse graph
+      template<typename Graph, typename GraphRef>
+      struct process_group_type<reverse_graph<Graph, GraphRef> >
+        : process_group_type<Graph> { };
+    }
+
+  }
+
+  /// Retrieve the process group from a reverse graph
+  template<typename Graph, typename GraphRef>
+  inline typename graph::parallel::process_group_type<Graph>::type
+  process_group(reverse_graph<Graph, GraphRef> const& g) {
+    return process_group(g.m_g);
+  }
+} // namespace boost
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/rmat_graph_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/rmat_graph_generator.hpp
new file mode 100644 (file)
index 0000000..b033e9b
--- /dev/null
@@ -0,0 +1,162 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_RMAT_GENERATOR_HPP
+#define BOOST_GRAPH_DISTRIBUTED_RMAT_GENERATOR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+
+namespace boost {
+
+  // Memory-scalable (amount of memory required will scale down
+  // linearly as the number of processes increases) generator, which
+  // requires an MPI process group.  Run-time is slightly worse than
+  // the unique rmat generator.  Edge list generated is sorted and
+  // unique.
+  template<typename ProcessGroup, typename Distribution, 
+           typename RandomGenerator, typename Graph>
+  class scalable_rmat_iterator
+  {
+      typedef typename graph_traits<Graph>::directed_category directed_category;
+      typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+      typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+  public:
+      typedef std::input_iterator_tag iterator_category;
+      typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+      typedef const value_type& reference;
+      typedef const value_type* pointer;
+      typedef void difference_type;
+
+      // No argument constructor, set to terminating condition
+      scalable_rmat_iterator()
+        : gen(), done(true)
+      { }
+
+      // Initialize for edge generation
+      scalable_rmat_iterator(ProcessGroup pg, Distribution distrib,
+                             RandomGenerator& gen, vertices_size_type n, 
+                             edges_size_type m, double a, double b, double c, 
+                             double d, bool permute_vertices = true)
+          : gen(), done(false)
+      {
+          assert(a + b + c + d == 1);
+          int id = process_id(pg);
+
+          this->gen.reset(new uniform_01<RandomGenerator>(gen));
+
+          std::vector<vertices_size_type> vertexPermutation;
+          if (permute_vertices) 
+              generate_permutation_vector(gen, vertexPermutation, n);
+
+          int SCALE = int(floor(log2(n)));
+          boost::uniform_01<RandomGenerator> prob(gen);
+      
+          std::map<value_type, bool> edge_map;
+
+          edges_size_type generated = 0, local_edges = 0;
+          do {
+              edges_size_type tossed = 0;
+              do {
+                  vertices_size_type u, v;
+                  tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+                  if (permute_vertices) {
+                      u = vertexPermutation[u];
+                      v = vertexPermutation[v];
+                  }
+
+                  // Lowest vertex number always comes first (this
+                  // means we don't have to worry about i->j and j->i
+                  // being in the edge list)
+                  if (u > v && is_same<directed_category, undirected_tag>::value)
+                      std::swap(u, v);
+
+                  if (distrib(u) == id || distrib(v) == id) {
+                      if (edge_map.find(std::make_pair(u, v)) == edge_map.end()) {
+                          edge_map[std::make_pair(u, v)] = true;
+                          local_edges++;
+                      } else {
+                          tossed++;
+
+                          // special case - if both u and v are on same
+                          // proc, ++ twice, since we divide by two (to
+                          // cover the two process case)
+                          if (distrib(u) == id && distrib(v) == id)
+                              tossed++;
+                      }
+                  }
+                  generated++;
+
+              } while (generated < m);
+              tossed = all_reduce(pg, tossed, boost::parallel::sum<vertices_size_type>());
+              generated -= (tossed / 2);
+          } while (generated < m);
+          // NGE - Asking for more than n^2 edges will result in an infinite loop here
+          //       Asking for a value too close to n^2 edges may as well
+
+          values.reserve(local_edges);
+          typename std::map<value_type, bool>::reverse_iterator em_end = edge_map.rend();
+          for (typename std::map<value_type, bool>::reverse_iterator em_i = edge_map.rbegin();
+               em_i != em_end ;
+               ++em_i) {
+              values.push_back(em_i->first);
+          }
+
+          current = values.back();
+          values.pop_back();
+      }
+
+      reference operator*() const { return current; }
+      pointer operator->() const { return &current; }
+    
+      scalable_rmat_iterator& operator++()
+      {
+          if (!values.empty()) {
+              current = values.back();
+              values.pop_back();
+          } else 
+              done = true;
+
+          return *this;
+      }
+
+      scalable_rmat_iterator operator++(int)
+      {
+          scalable_rmat_iterator temp(*this);
+          ++(*this);
+          return temp;
+      }
+
+      bool operator==(const scalable_rmat_iterator& other) const
+      {
+          return values.empty() && other.values.empty() && done && other.done;
+      }
+
+      bool operator!=(const scalable_rmat_iterator& other) const
+      { return !(*this == other); }
+
+  private:
+
+      // Parameters
+      shared_ptr<uniform_01<RandomGenerator> > gen;
+
+      // Internal data structures
+      std::vector<value_type> values;
+      value_type              current;
+      bool                    done;
+  };
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_DISTRIBUTED_RMAT_GENERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/selector.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/selector.hpp
new file mode 100644 (file)
index 0000000..2e26c16
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_SELECTOR_HPP
+#define BOOST_GRAPH_DISTRIBUTED_SELECTOR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { 
+
+  /* The default local selector for a distributedS selector. */
+  struct defaultS {};
+
+  /**
+   * Selector that specifies that the graph should be distributed
+   * among different processes organized based on the given process
+   * group.
+   */
+  template<typename ProcessGroup, typename LocalS = defaultS,
+           typename DistributionS = defaultS>
+  struct distributedS 
+  {
+    typedef ProcessGroup process_group_type;
+    typedef LocalS local_selector;
+    typedef DistributionS distribution;
+  };
+}
+
+#endif // BOOST_GRAPH_DISTRIBUTED_SELECTOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/shuffled_distribution.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/shuffled_distribution.hpp
new file mode 100644 (file)
index 0000000..92bc039
--- /dev/null
@@ -0,0 +1,113 @@
+// Copyright Daniel Wallin 2007. 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)
+
+#ifndef BOOST_SHUFFLED_DISTRIBUTION_070923_HPP
+#define BOOST_SHUFFLED_DISTRIBUTION_070923_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+# include <boost/iterator/counting_iterator.hpp>
+# include <vector>
+
+namespace boost { namespace graph { namespace distributed {
+
+template <class BaseDistribution>
+struct shuffled_distribution : BaseDistribution
+{
+    typedef std::size_t size_type;
+
+    template <class ProcessGroup>
+    shuffled_distribution(ProcessGroup const& pg, BaseDistribution const& base)
+      : BaseDistribution(base)
+      , n(num_processes(pg))
+      , mapping_(make_counting_iterator(size_type(0)), make_counting_iterator(n))
+      , reverse_mapping(mapping_)
+    {}
+
+    std::vector<size_type> const& mapping() const
+    {
+        return mapping_;
+    }
+
+    template <class InputIterator>
+    void assign_mapping(InputIterator first, InputIterator last)
+    {
+        mapping_.assign(first, last);
+        assert(mapping_.size() == n);
+        reverse_mapping.resize(mapping_.size());
+
+        for (std::vector<size_t>::iterator i(mapping_.begin());
+            i != mapping_.end(); ++i)
+        {
+            reverse_mapping[*i] = i - mapping_.begin();
+        }
+    }
+
+    BaseDistribution& base()
+    {
+        return *this;
+    }
+
+    BaseDistribution const& base() const
+    {
+        return *this;
+    }
+
+    template <class ProcessID>
+    size_type block_size(ProcessID id, size_type n) const
+    {
+        return base().block_size(reverse_mapping[id], n);
+    }
+
+    template <class T>
+    size_type operator()(T const& value) const
+    {
+        return mapping_[base()(value)];
+    }
+
+    template <class ProcessID>
+    size_type start(ProcessID id) const
+    {
+        return base().start(reverse_mapping[id]);
+    }
+
+    size_type local(size_type i) const
+    {
+        return base().local(i);
+    }
+
+    size_type global(size_type i) const
+    {
+        return base().global(i);
+    }
+
+    template <class ProcessID>
+    size_type global(ProcessID id, size_type n) const
+    {
+        return base().global(reverse_mapping[id], n);
+    }
+
+    template <class Archive>
+    void serialize(Archive& ar, unsigned long /*version*/)
+    {
+        ar & serialization::make_nvp("base", base());
+    }
+
+    void clear() 
+    {
+        base().clear();
+    }
+
+private:
+    size_type n;
+    std::vector<size_type> mapping_;
+    std::vector<size_type> reverse_mapping;
+};
+
+}}} // namespace boost::graph::distributed
+
+#endif // BOOST_SHUFFLED_DISTRIBUTION_070923_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/st_connected.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/st_connected.hpp
new file mode 100644 (file)
index 0000000..b007442
--- /dev/null
@@ -0,0 +1,186 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/two_bit_color_map.hpp>
+#include <boost/graph/distributed/queue.hpp>
+#include <boost/pending/queue.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <utility>
+#include <boost/optional.hpp>
+
+namespace boost { namespace graph { namespace distributed {
+
+namespace detail {
+  struct pair_and_or 
+  {
+    std::pair<bool, bool> 
+    operator()(std::pair<bool, bool> x, std::pair<bool, bool> y) const
+    {
+      return std::pair<bool, bool>(x.first && y.first,
+                                   x.second || y.second);
+    }
+  };
+
+} // end namespace detail
+
+template<typename DistributedGraph, typename ColorMap, typename OwnerMap>
+bool 
+st_connected(const DistributedGraph& g, 
+             typename graph_traits<DistributedGraph>::vertex_descriptor s,
+             typename graph_traits<DistributedGraph>::vertex_descriptor t,
+             ColorMap color, OwnerMap owner)
+{
+  using boost::graph::parallel::process_group;
+  using boost::graph::parallel::process_group_type;
+  using boost::parallel::all_reduce;
+
+  typedef typename property_traits<ColorMap>::value_type Color;
+  typedef color_traits<Color> ColorTraits;
+  typedef typename process_group_type<DistributedGraph>::type ProcessGroup;
+  typedef typename ProcessGroup::process_id_type ProcessID;
+  typedef typename graph_traits<DistributedGraph>::vertex_descriptor Vertex;
+
+  // Set all vertices to white (unvisited)
+  BGL_FORALL_VERTICES_T(v, g, DistributedGraph)
+    put(color, v, ColorTraits::white());
+
+  // "color" plays the role of a color map, with no synchronization.
+  set_property_map_role(vertex_color, color);
+  color.set_consistency_model(0);
+
+  // Vertices found from the source are grey
+  put(color, s, ColorTraits::gray());
+
+  // Vertices found from the target are green
+  put(color, t, ColorTraits::green());
+
+  ProcessGroup pg = process_group(g);
+  ProcessID rank = process_id(pg);
+
+  // Build a local queue
+  queue<Vertex> Q;
+  if (get(owner, s) == rank) Q.push(s);
+  if (get(owner, t) == rank) Q.push(t);
+
+  queue<Vertex> other_Q;
+
+  while (true) {
+    bool found = false;
+
+    // Process all vertices in the local queue
+    while (!found && !Q.empty()) {
+      Vertex u = Q.top(); Q.pop();
+      Color u_color = get(color, u);
+
+      BGL_FORALL_OUTEDGES_T(u, e, g, DistributedGraph) {
+        Vertex v = target(e, g);
+        Color v_color = get(color, v);
+        if (v_color == ColorTraits::white()) {
+          // We have not seen "v" before; mark it with the same color as u
+          Color u_color = get(color, u);
+          put(color, v, u_color);
+
+          // Either push v into the local queue or send it off to its
+          // owner.
+          ProcessID v_owner = get(owner, v);
+          if (v_owner == rank) 
+            other_Q.push(v);
+          else
+            send(pg, v_owner, 0, 
+                 std::make_pair(v, u_color == ColorTraits::gray()));
+        } else if (v_color != ColorTraits::black() && u_color != v_color) {
+          // Colors have collided. We're done!
+          found = true;
+          break;
+        }
+      }
+
+      // u is done, so mark it black
+      put(color, u, ColorTraits::black());
+    }
+
+    // Ensure that all transmitted messages have been received.
+    synchronize(pg);
+
+    // Move all of the send-to-self values into the local Q.
+    other_Q.swap(Q);
+
+    if (!found) {
+      // Receive all messages
+      while (optional<std::pair<ProcessID, int> > msg = probe(pg)) {
+        std::pair<Vertex, bool> data;
+        receive(pg, msg->first, msg->second, data);
+        
+        // Determine the colors of u and v, the source and target
+        // vertices (v is local).
+        Vertex v = data.first;
+        Color v_color = get(color, v);
+        Color u_color = data.second? ColorTraits::gray() : ColorTraits::green();
+        if (v_color == ColorTraits::white()) {
+          // v had no color before, so give it u's color and push it
+          // into the queue.
+          Q.push(v);
+          put(color, v, u_color);
+        } else if (v_color != ColorTraits::black() && u_color != v_color) {
+          // Colors have collided. We're done!
+          found = true;
+          break;
+        }
+      }
+    }
+
+    // Check if either all queues are empty or 
+    std::pair<bool, bool> results = all_reduce(pg, 
+            boost::parallel::detail::make_untracked_pair(Q.empty(), found),
+            detail::pair_and_or());
+
+    // If someone found the answer, we're done!
+    if (results.second)
+      return true;
+
+    // If all queues are empty, we're done.
+    if (results.first)
+      return false;
+  }
+}
+
+template<typename DistributedGraph, typename ColorMap>
+inline bool 
+st_connected(const DistributedGraph& g, 
+             typename graph_traits<DistributedGraph>::vertex_descriptor s,
+             typename graph_traits<DistributedGraph>::vertex_descriptor t,
+             ColorMap color)
+{
+  return st_connected(g, s, t, color, get(vertex_owner, g));
+}
+
+template<typename DistributedGraph>
+inline bool 
+st_connected(const DistributedGraph& g, 
+             typename graph_traits<DistributedGraph>::vertex_descriptor s,
+             typename graph_traits<DistributedGraph>::vertex_descriptor t)
+{
+  return st_connected(g, s, t, 
+                      make_two_bit_color_map(num_vertices(g),
+                                             get(vertex_index, g)));
+}
+
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/strong_components.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/strong_components.hpp
new file mode 100644 (file)
index 0000000..408cc64
--- /dev/null
@@ -0,0 +1,985 @@
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_SCC_HPP
+#define BOOST_GRAPH_DISTRIBUTED_SCC_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+// #define PBGL_SCC_DEBUG
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/caching_property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/graph/distributed/queue.hpp>
+#include <boost/graph/distributed/filtered_graph.hpp>
+#include <boost/pending/indirect_cmp.hpp>
+#include <boost/graph/breadth_first_search.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/overloading.hpp>
+#include <boost/graph/distributed/concepts.hpp>
+#include <boost/graph/distributed/local_subgraph.hpp>
+#include <boost/graph/parallel/properties.hpp>
+#include <boost/graph/named_function_params.hpp>
+#include <boost/graph/random.hpp>
+#include <boost/graph/distributed/reverse_graph.hpp>
+#include <boost/optional.hpp>
+#include <boost/graph/distributed/detail/filtered_queue.hpp>
+#include <boost/graph/distributed/adjacency_list.hpp>
+#ifdef PBGL_SCC_DEBUG
+  #include <iostream>
+  #include <cstdlib>
+  #include <iomanip>
+  #include <sys/time.h>
+  #include <boost/graph/distributed/graphviz.hpp> // for ostringstream
+#endif
+#include <vector>
+#include <map>
+#include <boost/graph/parallel/container_traits.hpp>
+
+#ifdef PBGL_SCC_DEBUG
+#  include <boost/graph/accounting.hpp>
+#endif /* PBGL_SCC_DEBUG */
+
+// If your graph is likely to have large numbers of small strongly connected
+// components then running the sequential SCC algorithm on the local subgraph
+// and filtering components with no remote edges may increase performance
+// #define FILTER_LOCAL_COMPONENTS
+
+namespace boost { namespace graph { namespace distributed { namespace detail {
+
+template<typename vertex_descriptor>
+struct v_sets{
+  std::vector<vertex_descriptor> pred, succ, intersect, ps_union;
+};
+
+/* Serialize vertex set */
+template<typename Graph>
+void
+marshal_set( std::vector<std::vector<typename graph_traits<Graph>::vertex_descriptor> > in,
+             std::vector<typename graph_traits<Graph>::vertex_descriptor>& out )
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+  for( std::size_t i = 0; i < in.size(); ++i ) {
+    out.insert( out.end(), graph_traits<Graph>::null_vertex() );
+    out.insert( out.end(), in[i].begin(), in[i].end() );
+  }
+}
+
+/* Un-serialize vertex set */
+template<typename Graph>
+void
+unmarshal_set( std::vector<typename graph_traits<Graph>::vertex_descriptor> in,
+               std::vector<std::vector<typename graph_traits<Graph>::vertex_descriptor> >& out )
+{
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+  typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+
+  while( !in.empty() ) {
+    typename std::vector<vertex_descriptor>::iterator end 
+      = std::find( in.begin(), in.end(), graph_traits<Graph>::null_vertex() );
+
+    if( end == in.begin() )
+      in.erase( in.begin() );
+    else {
+      out.push_back(std::vector<vertex_descriptor>());
+      out[out.size() - 1].insert( out[out.size() - 1].end(), in.begin(), end );
+      in.erase( in.begin(), end );
+    }
+  }
+}
+
+/* Determine if vertex is in subset */
+template <typename Set>
+struct in_subset {
+  in_subset() : m_s(0) { }
+  in_subset(const Set& s) : m_s(&s) { }
+
+  template <typename Elt>
+  bool operator()(const Elt& x) const {
+    return ((*m_s).find(x) != (*m_s).end());
+  }
+
+private:
+  const Set* m_s;
+};
+
+template<typename T>
+struct vertex_identity_property_map
+  : public boost::put_get_helper<T, vertex_identity_property_map<T> >
+{
+  typedef T key_type;
+  typedef T value_type;
+  typedef T reference;
+  typedef boost::readable_property_map_tag category;
+
+  inline value_type operator[](const key_type& v) const { return v; }
+  inline void clear() { }
+};
+
+template <typename T>
+inline void synchronize( vertex_identity_property_map<T> & ) { }
+
+/* BFS visitor for SCC */
+template<typename Graph, typename SourceMap>
+struct scc_discovery_visitor : bfs_visitor<>
+{
+  scc_discovery_visitor(SourceMap& sourceM)
+    : sourceM(sourceM) {}
+
+  template<typename Edge>
+  void tree_edge(Edge e, const Graph& g)
+  {
+    put(sourceM, target(e,g), get(sourceM, source(e,g)));
+  }
+
+ private:
+  SourceMap& sourceM;
+};
+
+} } } } /* End namespace boost::graph::distributed::detail */
+
+namespace boost { namespace graph { namespace distributed {
+    enum fhp_message_tags { fhp_edges_size_msg, fhp_add_edges_msg, fhp_pred_size_msg, 
+                            fhp_pred_msg, fhp_succ_size_msg, fhp_succ_msg };
+
+    template<typename Graph, typename ReverseGraph,
+             typename VertexComponentMap, typename IsoMapFR, typename IsoMapRF,
+             typename VertexIndexMap>
+    void
+    fleischer_hendrickson_pinar_strong_components(const Graph& g,
+                                                  VertexComponentMap c,
+                                                  const ReverseGraph& gr,
+                                                  IsoMapFR fr, IsoMapRF rf,
+                                                  VertexIndexMap vertex_index_map)
+    {
+      typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+      typedef typename graph_traits<ReverseGraph>::vertex_iterator rev_vertex_iterator;
+      typedef typename graph_traits<ReverseGraph>::vertex_descriptor rev_vertex_descriptor;
+      typedef typename boost::graph::parallel::process_group_type<Graph>::type
+        process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+      typedef iterator_property_map<typename std::vector<vertex_descriptor>::iterator,
+                                    VertexIndexMap> ParentMap;
+      typedef iterator_property_map<typename std::vector<default_color_type>::iterator,
+                                    VertexIndexMap> ColorMap;
+      typedef iterator_property_map<typename std::vector<vertex_descriptor>::iterator,
+                                    VertexIndexMap> Rev_ParentMap;
+      typedef std::vector<std::pair<vertex_descriptor, vertex_descriptor> > VertexPairVec;
+
+      typedef typename property_map<Graph, vertex_owner_t>::const_type
+        OwnerMap;
+
+      OwnerMap owner = get(vertex_owner, g);
+
+      using boost::graph::parallel::process_group;
+      process_group_type pg = process_group(g);
+      process_id_type id = process_id(pg);
+      int num_procs = num_processes(pg);
+      int n = 0;
+
+      int my_n = num_vertices(g);
+      all_reduce(pg, &my_n, &my_n+1, &n, std::plus<int>());
+
+      //
+      // Initialization
+      //
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type start = accounting::get_time();
+#endif
+
+      vertex_iterator vstart, vend;
+      rev_vertex_iterator rev_vstart, rev_vend;
+      std::vector<std::vector<vertex_descriptor> > vertex_sets, new_vertex_sets;
+
+      vertex_sets.push_back(std::vector<vertex_descriptor>());
+
+      // Remove vertices that do not have at least one in edge and one out edge
+      new_vertex_sets.push_back(std::vector<vertex_descriptor>());
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        if( out_degree( get(fr, *vstart), gr) > 0 && out_degree(*vstart, g) > 0 )
+          new_vertex_sets[0].push_back( *vstart );
+
+      // Perform sequential SCC on local subgraph, filter all components with external
+      // edges, mark remaining components and remove them from vertex_sets
+#ifdef FILTER_LOCAL_COMPONENTS  
+      // This doesn't actually speed up SCC in connected graphs it seems, but it does work
+      // and may help in the case where there are lots of small strong components.
+      {
+        local_subgraph<const Graph> ls(g);
+        typedef typename property_map<local_subgraph<const Graph>, vertex_index_t>::type
+          local_index_map_type;
+        local_index_map_type local_index = get(vertex_index, ls);
+
+        std::vector<int> ls_components_vec(num_vertices(ls));
+        typedef iterator_property_map<std::vector<int>::iterator, local_index_map_type>
+          ls_components_map_type;
+        ls_components_map_type ls_component(ls_components_vec.begin(), local_index);
+        int num_comp = boost::strong_components(ls, ls_component);
+
+        // Create map of components
+        std::map<int, std::vector<vertex_descriptor> > local_comp_map;
+        typedef typename graph_traits<local_subgraph<const Graph> >::vertex_iterator ls_vertex_iterator;
+        ls_vertex_iterator vstart, vend;
+        for( tie(vstart,vend) = vertices(ls); vstart != vend; vstart++ )
+          local_comp_map[get(ls_component, *vstart)].push_back( *vstart );
+
+        // Filter components that have no non-local edges
+        typedef typename graph_traits<Graph>::adjacency_iterator adjacency_iterator;
+        typedef typename graph_traits<ReverseGraph>::adjacency_iterator rev_adjacency_iterator;
+        adjacency_iterator abegin, aend;
+        rev_adjacency_iterator rev_abegin, rev_aend;
+        for( std::size_t i = 0; i < num_comp; ++i ) {
+          bool local = true;
+          for( std::size_t j = 0; j < local_comp_map[i].size(); j++ ) {
+            for( tie(abegin,aend) = adjacent_vertices(local_comp_map[i][j], g);
+                 abegin != aend; abegin++ )
+              if( get(owner, *abegin) != id ) {
+                local = false;
+                break;
+              }
+
+            if( local )
+              for( tie(rev_abegin,rev_aend) = adjacent_vertices(get(fr, local_comp_map[i][j]), gr);
+                   rev_abegin != rev_aend; rev_abegin++ )
+                if( get(owner, *rev_abegin) != id ) {
+                  local = false;
+                  break;
+                }
+
+            if( !local ) break;
+          }
+
+          if( local ) // Mark and remove from new_vertex_sets
+            for( std::size_t j = 0; j < local_comp_map[i].size(); j++ ) {
+              put( c, local_comp_map[i][j], local_comp_map[i][0] );
+              typename std::vector<vertex_descriptor>::iterator pos =
+                std::find(new_vertex_sets[0].begin(), new_vertex_sets[0].end(), local_comp_map[i][j]);
+              if( pos != new_vertex_sets[0].end() )
+                new_vertex_sets[0].erase(pos);
+            }
+        }
+      }
+#endif // FILTER_LOCAL_COMPONENTS
+
+      all_gather( pg, new_vertex_sets[0].begin(), new_vertex_sets[0].end(), vertex_sets[0] );
+      new_vertex_sets.clear();
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "Trim local SCCs time = " << accounting::print_time(end - start) << " seconds.\n";
+#endif
+
+      if( vertex_sets[0].empty() ) return;
+
+      //
+      // Recursively determine SCCs
+      //
+
+#ifdef PBGL_SCC_DEBUG
+  int iterations = 0;
+#endif
+
+      // Only need to be able to map starting vertices for BFS from now on
+      fr.clear();
+
+      do {
+
+#ifdef PBGL_SCC_DEBUG
+  if(id == 0) {
+    printf("\n\nIteration %d:\n\n", iterations++);
+
+    if( iterations > 1 ) {
+      end = accounting::get_time();
+      std::cerr << "Running main loop destructors time = " << accounting::print_time(end - start) << " seconds.\n";
+    }
+
+    start = accounting::get_time();
+  }
+#endif
+
+        // Get forward->reverse mappings for BFS start vertices
+       for (std::size_t i = 0; i < vertex_sets.size(); ++i)
+          get(fr, vertex_sets[i][0]);
+        synchronize(fr);
+
+        // Determine local vertices to start BFS from
+        std::vector<vertex_descriptor> local_start;
+        for( std::size_t i = id; i < vertex_sets.size(); i += num_procs )
+          local_start.push_back(vertex_sets[i][0]);
+
+        if( local_start.empty() )
+          local_start.push_back(vertex_sets[0][0]);
+
+
+        // Make filtered graphs
+        typedef std::set<vertex_descriptor> VertexSet;
+        typedef std::set<rev_vertex_descriptor> Rev_VertexSet;
+
+        VertexSet filter_set_g;
+        Rev_VertexSet filter_set_gr;
+        typename VertexSet::iterator fs;
+
+        int active_vertices = 0;
+        for (std::size_t i = 0; i < vertex_sets.size(); i++)
+          active_vertices += vertex_sets[i].size();
+
+        // This is a completely random bound
+        if ( active_vertices < 0.05*n ) {
+          // TODO: This set insertion is ridiculously inefficient, make it an in-place-merge?
+          for (std::size_t i = 0; i < vertex_sets.size(); i++)
+            filter_set_g.insert(vertex_sets[i].begin(), vertex_sets[i].end());
+
+          for (fs = filter_set_g.begin(); fs != filter_set_g.end(); ++fs )
+            filter_set_gr.insert(get(fr, *fs));
+        }
+
+        filtered_graph<const Graph, keep_all, detail::in_subset<VertexSet> >
+          fg(g, keep_all(), detail::in_subset<VertexSet>(filter_set_g));
+
+        filtered_graph<const ReverseGraph, keep_all, detail::in_subset<VertexSet> >
+          fgr(gr, keep_all(), detail::in_subset<VertexSet>(filter_set_gr));
+
+        // Add additional starting vertices to BFS queue
+        typedef filtered_queue<queue<vertex_descriptor>, boost::detail::has_not_been_seen<VertexIndexMap> >
+          local_queue_type;
+        typedef boost::graph::distributed::distributed_queue<process_group_type, OwnerMap, local_queue_type>
+          queue_t;
+
+        typedef typename property_map<ReverseGraph, vertex_owner_t>::const_type
+          RevOwnerMap;
+
+        typedef filtered_queue<queue<rev_vertex_descriptor>, boost::detail::has_not_been_seen<VertexIndexMap> >
+          rev_local_queue_type;
+        typedef boost::graph::distributed::distributed_queue<process_group_type, RevOwnerMap, rev_local_queue_type>
+          rev_queue_t;
+
+        queue_t Q(process_group(g),
+                  owner,
+                  make_filtered_queue(queue<vertex_descriptor>(),
+                                      boost::detail::has_not_been_seen<VertexIndexMap>
+                                      (num_vertices(g), vertex_index_map)),
+                  false);
+
+        rev_queue_t Qr(process_group(gr),
+                       get(vertex_owner, gr),
+                       make_filtered_queue(queue<rev_vertex_descriptor>(),
+                                           boost::detail::has_not_been_seen<VertexIndexMap>
+                                           (num_vertices(gr), vertex_index_map)),
+                       false);
+
+        for( std::size_t i = 1; i < local_start.size(); ++i ) {
+          Q.push(local_start[i]);
+          Qr.push(get(fr, local_start[i]));
+        }
+
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Initialize BFS time = " << accounting::print_time(end - start) << " seconds.\n";
+  start = accounting::get_time();
+#endif
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type start2 = accounting::get_time();
+#endif
+
+        // Forward BFS
+        std::vector<default_color_type> color_map_s(num_vertices(g));
+        ColorMap color_map(color_map_s.begin(), vertex_index_map);
+        std::vector<vertex_descriptor> succ_map_s(num_vertices(g), graph_traits<Graph>::null_vertex());
+        ParentMap succ_map(succ_map_s.begin(), vertex_index_map);
+
+        for( std::size_t i = 0; i < vertex_sets.size(); ++i )
+          put(succ_map, vertex_sets[i][0], vertex_sets[i][0]);
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type end2 = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Initialize forward BFS time = " << accounting::print_time(end2 - start2) << " seconds.\n";
+#endif
+
+        if (active_vertices < 0.05*n)
+          breadth_first_search(fg, local_start[0], Q,
+                               detail::scc_discovery_visitor<filtered_graph<const Graph, keep_all,
+                                                                            detail::in_subset<VertexSet> >, ParentMap>
+                               (succ_map),
+                               color_map);
+        else
+          breadth_first_search(g, local_start[0], Q,
+                               detail::scc_discovery_visitor<const Graph, ParentMap>(succ_map),
+                               color_map);
+
+#ifdef PBGL_SCC_DEBUG
+  start2 = accounting::get_time();
+#endif
+
+        // Reverse BFS
+        color_map.clear(); // reuse color map since g and gr have same vertex index
+        std::vector<vertex_descriptor> pred_map_s(num_vertices(gr), graph_traits<Graph>::null_vertex());
+        Rev_ParentMap pred_map(pred_map_s.begin(), vertex_index_map);
+
+        for( std::size_t i = 0; i < vertex_sets.size(); ++i )
+          put(pred_map, get(fr, vertex_sets[i][0]), vertex_sets[i][0]);
+
+#ifdef PBGL_SCC_DEBUG
+  end2 = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Initialize reverse BFS time = " << accounting::print_time(end2 - start2) << " seconds.\n";
+#endif
+
+        if (active_vertices < 0.05*n)
+          breadth_first_search(fgr, get(fr, local_start[0]),
+                               Qr,
+                               detail::scc_discovery_visitor<filtered_graph<const ReverseGraph, keep_all,
+                                                                            detail::in_subset<Rev_VertexSet> >, Rev_ParentMap>
+                               (pred_map),
+                               color_map);
+        else
+          breadth_first_search(gr, get(fr, local_start[0]),
+                               Qr,
+                               detail::scc_discovery_visitor<const ReverseGraph, Rev_ParentMap>(pred_map),
+                               color_map);
+
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Perform forward and reverse BFS time = " << accounting::print_time(end - start) << " seconds.\n";
+  start = accounting::get_time();
+#endif
+
+        // Send predecessors and successors discovered by this proc to the proc responsible for
+        // this BFS tree
+        typedef struct detail::v_sets<vertex_descriptor> Vsets;
+        std::map<vertex_descriptor, Vsets> set_map;
+
+        std::map<vertex_descriptor, int> dest_map;
+
+        std::vector<VertexPairVec> successors(num_procs);
+        std::vector<VertexPairVec> predecessors(num_procs);
+
+        // Calculate destinations for messages
+        for (std::size_t i = 0; i < vertex_sets.size(); ++i)
+          dest_map[vertex_sets[i][0]] = i % num_procs;
+
+        for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ ) {
+          vertex_descriptor v = get(succ_map, *vstart);
+          if( v != graph_traits<Graph>::null_vertex() )
+            if (dest_map[v] == id)
+              set_map[v].succ.push_back(*vstart);
+            else
+              successors[dest_map[v]].push_back( std::make_pair(v, *vstart) );
+        }
+
+        for( tie(rev_vstart, rev_vend) = vertices(gr); rev_vstart != rev_vend; rev_vstart++ ) {
+          vertex_descriptor v = get(pred_map, *rev_vstart);
+          if( v != graph_traits<Graph>::null_vertex() )
+            if (dest_map[v] == id)
+              set_map[v].pred.push_back(get(rf, *rev_vstart));
+            else
+              predecessors[dest_map[v]].push_back( std::make_pair(v, get(rf, *rev_vstart)) );
+        }
+
+        // Send predecessor and successor messages
+        for (process_id_type i = 0; i < num_procs; ++i) {
+          if (!successors[i].empty()) {
+            send(pg, i, fhp_succ_size_msg, successors[i].size());
+            send(pg, i, fhp_succ_msg, &successors[i][0], successors[i].size());
+          }
+          if (!predecessors[i].empty()) {
+            send(pg, i, fhp_pred_size_msg, predecessors[i].size());
+            send(pg, i, fhp_pred_msg, &predecessors[i][0], predecessors[i].size());
+          }
+        }
+        synchronize(pg);
+
+        // Receive predecessor and successor messages and handle them
+        while (optional<std::pair<process_id_type, int> > m = probe(pg)) {
+          assert(m->second == fhp_succ_size_msg || m->second == fhp_pred_size_msg);
+          std::size_t num_requests;
+          receive(pg, m->first, m->second, num_requests);
+          VertexPairVec requests(num_requests);
+          if (m->second == fhp_succ_size_msg) {
+            receive(pg, m->first, fhp_succ_msg, &requests[0],
+                    num_requests);
+
+            std::map<vertex_descriptor, int> added;
+            for (std::size_t i = 0; i < requests.size(); ++i) {
+              set_map[requests[i].first].succ.push_back(requests[i].second);
+              added[requests[i].first]++;
+            }
+
+            // If order of vertex traversal in vertices() is std::less<vertex_descriptor>,
+            // then the successor sets will be in order
+            for (std::size_t i = 0; i < local_start.size(); ++i)
+              if (added[local_start[i]] > 0)
+                  std::inplace_merge(set_map[local_start[i]].succ.begin(),
+                                     set_map[local_start[i]].succ.end() - added[local_start[i]],
+                                     set_map[local_start[i]].succ.end(),
+                                     std::less<vertex_descriptor>());
+
+          } else {
+            receive(pg, m->first, fhp_pred_msg, &requests[0],
+                    num_requests);
+
+            std::map<vertex_descriptor, int> added;
+            for (std::size_t i = 0; i < requests.size(); ++i) {
+              set_map[requests[i].first].pred.push_back(requests[i].second);
+              added[requests[i].first]++;
+            }
+
+            if (boost::is_same<detail::vertex_identity_property_map<vertex_descriptor>, IsoMapRF>::value)
+              for (std::size_t i = 0; i < local_start.size(); ++i)
+                if (added[local_start[i]] > 0)
+                  std::inplace_merge(set_map[local_start[i]].pred.begin(),
+                                     set_map[local_start[i]].pred.end() - added[local_start[i]],
+                                     set_map[local_start[i]].pred.end(),
+                                     std::less<vertex_descriptor>());
+          }
+        }
+
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  All gather successors and predecessors time = " << accounting::print_time(end - start) << " seconds.\n";
+  start = accounting::get_time();
+#endif
+
+        //
+        // Filter predecessor and successor sets and perform set arithmetic
+        //
+        new_vertex_sets.clear();
+
+        if( std::size_t(id) < vertex_sets.size() ) { //If this proc has one or more unique starting points
+
+          for( std::size_t i = 0; i < local_start.size(); ++i ) {
+
+            vertex_descriptor v = local_start[i];
+
+            // Replace this sort with an in-place merges during receive step if possible
+            if (!boost::is_same<detail::vertex_identity_property_map<vertex_descriptor>, IsoMapRF>::value) 
+              std::sort(set_map[v].pred.begin(), set_map[v].pred.end(), std::less<vertex_descriptor>());
+
+            // Limit predecessor and successor sets to members of the original set
+            std::vector<vertex_descriptor> temp;
+
+            std::set_intersection( vertex_sets[id + i*num_procs].begin(), vertex_sets[id + i*num_procs].end(),
+                                   set_map[v].pred.begin(), set_map[v].pred.end(),
+                                   back_inserter(temp),
+                                   std::less<vertex_descriptor>());
+            set_map[v].pred.clear();
+            std::swap(set_map[v].pred, temp);
+
+            std::set_intersection( vertex_sets[id + i*num_procs].begin(), vertex_sets[id + i*num_procs].end(),
+                                   set_map[v].succ.begin(), set_map[v].succ.end(),
+                                   back_inserter(temp),
+                                   std::less<vertex_descriptor>());
+            set_map[v].succ.clear();
+            std::swap(set_map[v].succ, temp);
+
+            // Intersection(pred, succ)
+            std::set_intersection(set_map[v].pred.begin(), set_map[v].pred.end(),
+                                    set_map[v].succ.begin(), set_map[v].succ.end(),
+                                    back_inserter(set_map[v].intersect),
+                                    std::less<vertex_descriptor>());
+
+            // Union(pred, succ)
+            std::set_union(set_map[v].pred.begin(), set_map[v].pred.end(),
+                           set_map[v].succ.begin(), set_map[v].succ.end(),
+                           back_inserter(set_map[v].ps_union),
+                           std::less<vertex_descriptor>());
+
+            new_vertex_sets.push_back(std::vector<vertex_descriptor>());
+            // Original set - Union(pred, succ)
+            std::set_difference(vertex_sets[id + i*num_procs].begin(), vertex_sets[id + i*num_procs].end(),
+                                set_map[v].ps_union.begin(), set_map[v].ps_union.end(),
+                                back_inserter(new_vertex_sets[new_vertex_sets.size() - 1]),
+                                std::less<vertex_descriptor>());
+
+            set_map[v].ps_union.clear();
+
+            new_vertex_sets.push_back(std::vector<vertex_descriptor>());
+            // Pred - Intersect(pred, succ)
+            std::set_difference(set_map[v].pred.begin(), set_map[v].pred.end(),
+                                set_map[v].intersect.begin(), set_map[v].intersect.end(),
+                                back_inserter(new_vertex_sets[new_vertex_sets.size() - 1]),
+                                std::less<vertex_descriptor>());
+
+            set_map[v].pred.clear();
+
+            new_vertex_sets.push_back(std::vector<vertex_descriptor>());
+            // Succ - Intersect(pred, succ)
+            std::set_difference(set_map[v].succ.begin(), set_map[v].succ.end(),
+                                set_map[v].intersect.begin(), set_map[v].intersect.end(),
+                                back_inserter(new_vertex_sets[new_vertex_sets.size() - 1]),
+                                std::less<vertex_descriptor>());
+
+            set_map[v].succ.clear();
+
+            // Label SCC just identified with the 'first' vertex in that SCC
+            for( std::size_t j = 0; j < set_map[v].intersect.size(); j++ )
+              put(c, set_map[v].intersect[j], set_map[v].intersect[0]);
+
+            set_map[v].intersect.clear();
+          }
+        }
+
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Perform set arithemetic time = " << accounting::print_time(end - start) << " seconds.\n";
+  start = accounting::get_time();
+#endif
+
+        // Remove sets of size 1 from new_vertex_sets
+        typename std::vector<std::vector<vertex_descriptor> >::iterator vviter;
+        for( vviter = new_vertex_sets.begin(); vviter != new_vertex_sets.end(); /*in loop*/ )
+          if( (*vviter).size() < 2 )
+            vviter = new_vertex_sets.erase( vviter );
+          else
+            vviter++;
+
+        // All gather new sets and recur (gotta marshal and unmarshal sets first)
+        vertex_sets.clear();
+        std::vector<vertex_descriptor> serial_sets, all_serial_sets;
+        detail::marshal_set<Graph>( new_vertex_sets, serial_sets );
+        all_gather( pg, serial_sets.begin(), serial_sets.end(), all_serial_sets );
+        detail::unmarshal_set<Graph>( all_serial_sets, vertex_sets );
+
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0) {
+    std::cerr << "  Serialize and gather new vertex sets time = " << accounting::print_time(end - start) << " seconds.\n\n\n";
+
+    printf("Vertex sets: %d\n", (int)vertex_sets.size() );
+    for( std::size_t i = 0; i < vertex_sets.size(); ++i )
+      printf("  %d: %d\n", i, (int)vertex_sets[i].size() );
+  }
+  start = accounting::get_time();
+#endif
+
+        // HACK!?!  --  This would be more properly implemented as a topological sort
+        // Remove vertices without an edge to another vertex in the set and an edge from another
+        // vertex in the set
+       typedef typename graph_traits<Graph>::out_edge_iterator out_edge_iterator;
+       out_edge_iterator estart, eend;
+       typedef typename graph_traits<ReverseGraph>::out_edge_iterator r_out_edge_iterator;
+       r_out_edge_iterator restart, reend;
+       for (std::size_t i = 0; i < vertex_sets.size(); ++i) {
+         std::vector<vertex_descriptor> new_set;
+         for (std::size_t j = 0; j < vertex_sets[i].size(); ++j) {
+           vertex_descriptor v = vertex_sets[i][j];
+           if (get(owner, v) == id) {
+             tie(estart, eend) = out_edges(v, g);
+             while (estart != eend && find(vertex_sets[i].begin(), vertex_sets[i].end(),
+                                           target(*estart,g)) == vertex_sets[i].end()) estart++;
+             if (estart != eend) {
+               tie(restart, reend) = out_edges(get(fr, v), gr);
+               while (restart != reend && find(vertex_sets[i].begin(), vertex_sets[i].end(),
+                                               get(rf, target(*restart,g))) == vertex_sets[i].end()) restart++;
+               if (restart != reend)
+                 new_set.push_back(v);
+             }
+           }
+         }
+         vertex_sets[i].clear();
+         all_gather(pg, new_set.begin(), new_set.end(), vertex_sets[i]);
+         std::sort(vertex_sets[i].begin(), vertex_sets[i].end(), std::less<vertex_descriptor>());
+       }
+#ifdef PBGL_SCC_DEBUG
+  end = accounting::get_time();
+  if(id == 0)
+    std::cerr << "  Trim vertex sets time = " << accounting::print_time(end - start) << " seconds.\n\n\n";
+  start = accounting::get_time();
+#endif
+
+      } while ( !vertex_sets.empty() );
+
+
+      // Label vertices not in a SCC as their own SCC
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        if( get(c, *vstart) == graph_traits<Graph>::null_vertex() )
+          put(c, *vstart, *vstart);
+
+      synchronize(c);
+    }
+
+    template<typename Graph, typename ReverseGraph, typename IsoMap>
+    void
+    build_reverse_graph( const Graph& g, ReverseGraph& gr, IsoMap& fr, IsoMap& rf )
+    {
+      typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+      typedef typename graph_traits<Graph>::out_edge_iterator out_edge_iterator;
+      typedef typename boost::graph::parallel::process_group_type<Graph>::type process_group_type;
+      typedef typename process_group_type::process_id_type process_id_type;
+      typedef std::vector<std::pair<vertex_descriptor, vertex_descriptor> > VertexPairVec;
+
+      typedef typename graph_traits<Graph>::directed_category directed_category;
+
+      typename property_map<Graph, vertex_owner_t>::const_type
+        owner = get(vertex_owner, g);
+
+      process_group_type pg = process_group(g);
+      process_id_type id = process_id(pg);
+
+      int n;
+      vertex_iterator vstart, vend;
+      int num_procs = num_processes(pg);
+
+      vertex_descriptor v;
+      out_edge_iterator oestart, oeend;
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        {
+          v = add_vertex(gr);
+          put(fr, *vstart, v);
+          put(rf, v, *vstart);
+        }
+
+      gr.distribution() = g.distribution();
+
+      int my_n = num_vertices(g);
+      all_reduce(pg, &my_n, &my_n+1, &n, std::plus<int>());
+
+      for (int i = 0; i < n; ++i)
+        get(fr, vertex(i,g));
+      synchronize(fr);
+
+      // Add edges to gr
+      std::vector<std::pair<vertex_descriptor, vertex_descriptor> > new_edges;
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        for( tie(oestart, oeend) = out_edges(*vstart, g); oestart != oeend; oestart++ )
+          new_edges.push_back( std::make_pair(get(fr, target(*oestart,g)), get(fr, source(*oestart, g))) );
+
+      std::vector<VertexPairVec> edge_requests(num_procs);
+
+      typename std::vector<std::pair<vertex_descriptor, vertex_descriptor> >::iterator iter;
+      for( iter = new_edges.begin(); iter != new_edges.end(); iter++ ) {
+        std::pair<vertex_descriptor, vertex_descriptor> p1 = *iter;
+        if( get(owner,  p1.first ) == id )
+          add_edge( p1.first, p1.second, gr );
+        else
+          edge_requests[get(owner, p1.first)].push_back(p1);
+      }
+      new_edges.clear();
+
+      // Send edge addition requests
+      for (process_id_type p = 0; p < num_procs; ++p) {
+        if (!edge_requests[p].empty()) {
+          VertexPairVec reqs(edge_requests[p].begin(), edge_requests[p].end());
+          send(pg, p, fhp_edges_size_msg, reqs.size());
+          send(pg, p, fhp_add_edges_msg, &reqs[0], reqs.size());
+        }
+      }
+      synchronize(pg);
+
+      // Receive edge addition requests and handle them
+      while (optional<std::pair<process_id_type, int> > m = probe(pg)) {
+        assert(m->second == fhp_edges_size_msg);
+        std::size_t num_requests;
+        receive(pg, m->first, m->second, num_requests);
+        VertexPairVec requests(num_requests);
+        receive(pg, m->first, fhp_add_edges_msg, &requests[0],
+                num_requests);
+        for( std::size_t i = 0; i < requests.size(); ++i )
+          add_edge( requests[i].first, requests[i].second, gr );
+      }
+          synchronize(gr);
+    }
+
+    template<typename Graph, typename VertexComponentMap, typename ComponentMap>
+    typename property_traits<ComponentMap>::value_type
+    number_components(const Graph& g, VertexComponentMap r, ComponentMap c)
+    {
+      typedef typename boost::graph::parallel::process_group_type<Graph>::type process_group_type;
+      typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+      typedef typename property_traits<ComponentMap>::value_type ComponentMapType;
+      std::vector<vertex_descriptor> my_roots, all_roots;
+      vertex_iterator vstart, vend;
+
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        if( find( my_roots.begin(), my_roots.end(), get(r, *vstart) ) == my_roots.end() )
+          my_roots.push_back( get(r, *vstart) );
+
+      all_gather( process_group(g), my_roots.begin(), my_roots.end(), all_roots );
+
+      /* Number components */
+      std::map<vertex_descriptor, ComponentMapType> comp_numbers;
+      ComponentMapType c_num = 0;
+
+      // Compute component numbers
+      for (std::size_t i = 0; i < all_roots.size(); ++i )
+        if ( comp_numbers.count(all_roots[i]) == 0 )
+          comp_numbers[all_roots[i]] = c_num++;
+
+      // Broadcast component numbers
+      for( tie(vstart, vend) = vertices(g); vstart != vend; vstart++ )
+        put( c, *vstart, comp_numbers[get(r,*vstart)] );
+
+      // Broadcast number of components
+      if (process_id(process_group(g)) == 0) {
+        typedef typename process_group_type::process_size_type
+          process_size_type;
+        for (process_size_type dest = 1, n = num_processes(process_group(g));
+              dest != n; ++dest)
+          send(process_group(g), dest, 0, c_num);
+      }
+
+      synchronize(process_group(g));
+
+      if (process_id(process_group(g)) != 0) receive(process_group(g), 0, 0, c_num);
+
+      synchronize(c);
+      return c_num;
+    }
+
+
+    template<typename Graph, typename ComponentMap, typename VertexComponentMap,
+             typename VertexIndexMap>
+    typename property_traits<ComponentMap>::value_type
+    fleischer_hendrickson_pinar_strong_components_impl
+      (const Graph& g,
+       ComponentMap c,
+       VertexComponentMap r,
+       VertexIndexMap vertex_index_map,
+       incidence_graph_tag)
+    {
+      typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+      typedef iterator_property_map<typename std::vector<vertex_descriptor>::iterator,
+                                    VertexIndexMap> IsoMap;
+      typename boost::graph::parallel::process_group_type<Graph>::type pg = process_group(g);
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type start = accounting::get_time();
+#endif
+
+      typedef adjacency_list<listS,
+                             distributedS<typename boost::graph::parallel::process_group_type<Graph>::type, vecS>,
+                             directedS > ReverseGraph;
+
+      ReverseGraph gr(0, pg);
+      std::vector<vertex_descriptor> fr_s(num_vertices(g));
+      std::vector<vertex_descriptor> rf_s(num_vertices(g));
+      IsoMap fr(fr_s.begin(), vertex_index_map);  // fr = forward->reverse
+      IsoMap rf(rf_s.begin(), vertex_index_map); // rf = reverse->forward
+
+      build_reverse_graph(g, gr, fr, rf);
+
+#ifdef PBGL_SCC_DEBUG
+  accounting::time_type end = accounting::get_time();
+  if(process_id(process_group(g)) == 0)
+    std::cerr << "Reverse graph initialization time = " << accounting::print_time(end - start) << " seconds.\n";
+#endif
+
+  fleischer_hendrickson_pinar_strong_components(g, r, gr, fr, rf, 
+                                                vertex_index_map);
+
+      typename property_traits<ComponentMap>::value_type c_num = number_components(g, r, c);
+
+      return c_num;
+    }
+
+    template<typename Graph, typename ComponentMap, typename VertexComponentMap,
+             typename VertexIndexMap>
+    typename property_traits<ComponentMap>::value_type
+    fleischer_hendrickson_pinar_strong_components_impl
+      (const Graph& g,
+       ComponentMap c,
+       VertexComponentMap r,
+       VertexIndexMap vertex_index_map,
+       bidirectional_graph_tag)
+    {
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+      reverse_graph<Graph> gr(g);
+      detail::vertex_identity_property_map<vertex_descriptor> fr, rf;
+
+      fleischer_hendrickson_pinar_strong_components(g, r, gr, fr, rf, 
+                                                    vertex_index_map);
+
+      typename property_traits<ComponentMap>::value_type c_num
+        = number_components(g, r, c);
+
+      return c_num;
+    }
+
+    template<typename Graph, typename ComponentMap, typename VertexIndexMap>
+    inline typename property_traits<ComponentMap>::value_type
+    fleischer_hendrickson_pinar_strong_components
+      (const Graph& g,
+       ComponentMap c,
+       VertexIndexMap vertex_index_map)
+    {
+      typedef typename graph_traits<Graph>::vertex_descriptor
+        vertex_descriptor;
+      typedef iterator_property_map<typename std::vector<vertex_descriptor>::iterator,
+                                    VertexIndexMap> VertexComponentMap;
+      typename boost::graph::parallel::process_group_type<Graph>::type pg 
+        = process_group(g);
+
+      if (num_processes(pg) == 1) {
+        local_subgraph<const Graph> ls(g);
+        return boost::strong_components(ls, c);
+      }
+
+      // Create a VertexComponentMap for intermediate labeling of SCCs
+      std::vector<vertex_descriptor> r_s(num_vertices(g), graph_traits<Graph>::null_vertex());
+      VertexComponentMap r(r_s.begin(), vertex_index_map);
+
+      return fleischer_hendrickson_pinar_strong_components_impl
+               (g, c, r, vertex_index_map,
+                typename graph_traits<Graph>::traversal_category());
+    }
+
+    template<typename Graph, typename ComponentMap>
+    inline typename property_traits<ComponentMap>::value_type
+    fleischer_hendrickson_pinar_strong_components(const Graph& g,
+                                                  ComponentMap c)
+    {
+      return fleischer_hendrickson_pinar_strong_components(g, c, get(vertex_index, g));
+    }
+
+}  // end namespace distributed
+
+using distributed::fleischer_hendrickson_pinar_strong_components;
+
+} // end namespace graph
+
+template<class Graph, class ComponentMap, class P, class T, class R>
+inline typename property_traits<ComponentMap>::value_type
+strong_components
+ (const Graph& g, ComponentMap comp,
+  const bgl_named_params<P, T, R>&
+  BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, distributed_graph_tag))
+{
+  return graph::fleischer_hendrickson_pinar_strong_components(g, comp);
+}
+
+template<class Graph, class ComponentMap>
+inline typename property_traits<ComponentMap>::value_type
+strong_components
+ (const Graph& g, ComponentMap comp
+  BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, distributed_graph_tag))
+{
+  return graph::fleischer_hendrickson_pinar_strong_components(g, comp);
+}
+
+} /* end namespace boost */
+
+#endif // BOOST_GRAPH_DISTRIBUTED_SCC_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/two_bit_color_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/two_bit_color_map.hpp
new file mode 100644 (file)
index 0000000..eb8e29e
--- /dev/null
@@ -0,0 +1,116 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Jeremiah Willcock
+//           Andrew Lumsdaine
+
+// Distributed version of the two-bit color map
+#ifndef BOOST_DISTRIBUTED_TWO_BIT_COLOR_MAP_HPP
+#define BOOST_DISTRIBUTED_TWO_BIT_COLOR_MAP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/two_bit_color_map.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+
+namespace boost {
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+class two_bit_color_map<local_property_map<ProcessGroup,GlobalMap,StorageMap> >
+  : public parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                              two_bit_color_map<StorageMap> >
+{
+  typedef two_bit_color_map<StorageMap> local_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             local_map >
+    inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap>
+    index_map_type;
+
+public:
+  two_bit_color_map(std::size_t inital_size, 
+                    const index_map_type& index = index_map_type())
+    : inherited(index.process_group(),  index.global(),
+                local_map(inital_size, index.base())) { }
+
+  inherited&       base()       { return *this; }
+  const inherited& base() const { return *this; }
+};
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline two_bit_color_type
+get(two_bit_color_map<local_property_map<ProcessGroup,GlobalMap,StorageMap> >
+      const& pm,
+    typename two_bit_color_map<GlobalMap>::key_type key)
+{
+  return get(pm.base(), key);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline void
+put(two_bit_color_map<local_property_map<ProcessGroup,GlobalMap,StorageMap> >
+      const& pm, 
+    typename two_bit_color_map<GlobalMap>::key_type key,
+    two_bit_color_type value)
+{
+  put(pm.base(), key, value);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+class two_bit_color_map<parallel::distributed_property_map<
+                          ProcessGroup, GlobalMap, StorageMap> > 
+  : public parallel::distributed_property_map<
+             ProcessGroup, GlobalMap, two_bit_color_map<StorageMap> >
+{
+  typedef two_bit_color_map<StorageMap> local_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup,GlobalMap,local_map>
+    inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,  
+                                             StorageMap>
+    index_map_type;
+
+public:
+  two_bit_color_map(std::size_t inital_size, 
+                    const index_map_type& index = index_map_type())
+    : inherited(index.process_group(),  index.global(),
+                local_map(inital_size, index.base())) { }
+
+  inherited&       base()       { return *this; }
+  const inherited& base() const { return *this; }
+};
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline two_bit_color_type
+get(two_bit_color_map<
+      parallel::distributed_property_map<
+        ProcessGroup, GlobalMap, two_bit_color_map<StorageMap> > > const& pm,
+    typename two_bit_color_map<GlobalMap>::key_type key)
+{
+  return get(pm.base(), key);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline void
+put(two_bit_color_map<
+      parallel::distributed_property_map<
+        ProcessGroup, GlobalMap, two_bit_color_map<StorageMap> > > const& pm, 
+    typename two_bit_color_map<GlobalMap>::key_type key,
+    two_bit_color_type value)
+{
+  put(pm.base(), key, value);
+}
+
+} // end namespace boost
+
+#endif // BOOST_DISTRIBUTED_TWO_BIT_COLOR_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/unsafe_serialize.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/unsafe_serialize.hpp
new file mode 100644 (file)
index 0000000..1dccef8
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+// This file contains the "unsafe_serialize" routine, which transforms
+// types they may not be serializable (such as void*) into
+// serializable equivalents.
+#ifndef PBGL_UNSAFE_SERIALIZE_HPP
+#define PBGL_UNSAFE_SERIALIZE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/mpi/datatype.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <utility>
+
+BOOST_IS_BITWISE_SERIALIZABLE(void*)
+namespace boost { namespace mpi {
+    template<> struct is_mpi_datatype<void*> : mpl::true_ { };
+} } // end namespace boost::mpi
+
+namespace boost {
+  typedef mpl::if_c<(sizeof(int) == sizeof(void*)), 
+                    int, 
+                    mpl::if_c<(sizeof(long) == sizeof(void*)), long, void>::type
+                    >::type ptr_serialize_type;
+    
+  template<typename T> inline T& unsafe_serialize(T& x) { return x; }
+
+  inline ptr_serialize_type& unsafe_serialize(void*& x)
+  { return reinterpret_cast<ptr_serialize_type&>(x); }
+
+  // Force Boost.MPI to serialize a void* like a ptr_serialize_type
+  namespace mpi {
+    template<> inline MPI_Datatype get_mpi_datatype<void*>(void* const& x)
+    {
+      return get_mpi_datatype<ptr_serialize_type>();
+    }
+  }
+
+  template<typename T, typename U>
+  struct unsafe_pair
+  {
+    unsafe_pair() { }
+    unsafe_pair(const T& t, const U& u) : first(t), second(u) { }
+    unsafe_pair(const std::pair<T, U>& p) : first(p.first), second(p.second) { }
+    T first;
+    U second;
+
+    template<typename Archiver>
+    void serialize(Archiver& ar, const unsigned /*version*/)
+    {
+      ar & unsafe_serialize(first) & unsafe_serialize(second);
+    }
+  };
+
+  template<typename T, typename U>
+  bool operator<(unsafe_pair<T,U> const& x, unsafe_pair<T,U> const& y)
+  {
+    return std::make_pair(x.first, x.second) < 
+      std::make_pair(y.first, y.second);  
+  }
+
+} // end namespace boost
+
+#endif // PBGL_UNSAFE_SERIALIZE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/vertex_list_adaptor.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/distributed/vertex_list_adaptor.hpp
new file mode 100644 (file)
index 0000000..8928479
--- /dev/null
@@ -0,0 +1,403 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_VERTEX_LIST_ADAPTOR_HPP
+#define BOOST_VERTEX_LIST_ADAPTOR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/graph_traits.hpp>
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/parallel/algorithm.hpp>
+#include <boost/graph/parallel/container_traits.hpp>
+#include <boost/property_map/vector_property_map.hpp>
+
+namespace boost { namespace graph {
+
+// --------------------------------------------------------------------------
+// Global index map built from a distribution 
+// --------------------------------------------------------------------------
+template<typename Distribution, typename OwnerPropertyMap, 
+         typename LocalPropertyMap>
+class distribution_global_index_map
+{
+ public:
+  typedef std::size_t value_type;
+  typedef value_type reference;
+  typedef typename property_traits<OwnerPropertyMap>::key_type key_type;
+  typedef readable_property_map_tag category;
+
+  distribution_global_index_map(const Distribution& distribution,
+                                const OwnerPropertyMap& owner,
+                                const LocalPropertyMap& local)
+    : distribution_(distribution), owner(owner), local(local) { }
+
+  Distribution distribution_;
+  OwnerPropertyMap owner;
+  LocalPropertyMap local;
+};
+
+template<typename Distribution, typename OwnerPropertyMap, 
+         typename LocalPropertyMap>
+inline 
+typename distribution_global_index_map<Distribution, OwnerPropertyMap,
+                                       LocalPropertyMap>::value_type
+get(const distribution_global_index_map<Distribution, OwnerPropertyMap,
+                                        LocalPropertyMap>& p,
+    typename distribution_global_index_map<Distribution, OwnerPropertyMap,
+                                           LocalPropertyMap>::key_type x)
+{ 
+  using boost::get;
+  return p.distribution_.global(get(p.owner, x), get(p.local, x));
+}
+
+template<typename Graph, typename Distribution>
+inline
+distribution_global_index_map<
+  Distribution, 
+  typename property_map<Graph, vertex_owner_t>::const_type,
+  typename property_map<Graph, vertex_local_t>::const_type>
+make_distribution_global_index_map(const Graph& g, const Distribution& d)
+{
+  typedef distribution_global_index_map<
+            Distribution, 
+            typename property_map<Graph, vertex_owner_t>::const_type,
+            typename property_map<Graph, vertex_local_t>::const_type> 
+    result_type;
+  return result_type(d, get(vertex_owner, g), get(vertex_local, g));
+}
+
+// --------------------------------------------------------------------------
+// Global index map built from a distributed index map and list of vertices
+// --------------------------------------------------------------------------
+template<typename IndexMap>
+class stored_global_index_map : public IndexMap
+{
+ public:
+  typedef readable_property_map_tag category;
+
+  stored_global_index_map(const IndexMap& index_map) : IndexMap(index_map) { 
+    // When we have a global index, we need to always have the indices
+    // of every key we've seen
+    this->set_max_ghost_cells(0);
+  }
+};
+
+// --------------------------------------------------------------------------
+// Global index map support code
+// --------------------------------------------------------------------------
+namespace detail {
+  template<typename PropertyMap, typename ForwardIterator>
+  inline void 
+  initialize_global_index_map(const PropertyMap&, 
+                              ForwardIterator, ForwardIterator) 
+  { }
+
+  template<typename IndexMap, typename ForwardIterator>
+  void 
+  initialize_global_index_map(stored_global_index_map<IndexMap>& p,
+                              ForwardIterator first, ForwardIterator last)
+  {
+    using std::distance;
+
+    typedef typename property_traits<IndexMap>::value_type size_t;
+
+    size_t n = distance(first, last);
+    for (size_t i = 0; i < n; ++i, ++first) local_put(p, *first, i);
+  }
+}
+
+// --------------------------------------------------------------------------
+// Adapts a Distributed Vertex List Graph to a Vertex List Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+class vertex_list_adaptor : public graph_traits<Graph>
+{
+  typedef graph_traits<Graph> inherited;
+
+  typedef typename inherited::traversal_category base_traversal_category;
+  
+ public:
+  typedef typename inherited::vertex_descriptor vertex_descriptor;
+  typedef typename std::vector<vertex_descriptor>::iterator vertex_iterator;
+  typedef typename std::vector<vertex_descriptor>::size_type
+    vertices_size_type;
+
+  struct traversal_category 
+    : public virtual base_traversal_category,
+      public virtual vertex_list_graph_tag {};
+
+  vertex_list_adaptor(const Graph& g, 
+                      const GlobalIndexMap& index_map = GlobalIndexMap())
+    : g(&g), index_map(index_map)
+  {
+    using boost::vertices;
+
+    all_vertices_.reset(new std::vector<vertex_descriptor>());
+    all_gather(process_group(), vertices(g).first, vertices(g).second,
+               *all_vertices_);
+    detail::initialize_global_index_map(this->index_map, 
+                                        all_vertices_->begin(),
+                                        all_vertices_->end());
+  }
+
+  const Graph& base() const { return *g; }
+
+  // --------------------------------------------------------------------------
+  // Distributed Container
+  // --------------------------------------------------------------------------
+  typedef typename boost::graph::parallel::process_group_type<Graph>::type 
+    process_group_type;
+
+  process_group_type process_group() const 
+  { 
+    using boost::graph::parallel::process_group;
+    return process_group(*g); 
+  }
+
+  std::pair<vertex_iterator, vertex_iterator> vertices() const
+  { return std::make_pair(all_vertices_->begin(), all_vertices_->end()); }
+
+  vertices_size_type num_vertices() const { return all_vertices_->size(); }
+
+  GlobalIndexMap get_index_map() const { return index_map; }
+
+ private:
+  const Graph* g;
+  GlobalIndexMap index_map;
+  shared_ptr<std::vector<vertex_descriptor> > all_vertices_;
+};
+
+template<typename Graph, typename GlobalIndexMap>
+inline vertex_list_adaptor<Graph, GlobalIndexMap>
+make_vertex_list_adaptor(const Graph& g, const GlobalIndexMap& index_map)
+{ return vertex_list_adaptor<Graph, GlobalIndexMap>(g, index_map); }
+
+namespace detail {
+  template<typename Graph>
+  class default_global_index_map
+  {
+    typedef typename graph_traits<Graph>::vertices_size_type value_type;
+    typedef typename property_map<Graph, vertex_index_t>::const_type local_map;
+
+  public:
+    typedef vector_property_map<value_type, local_map> distributed_map;
+    typedef stored_global_index_map<distributed_map> type;
+  };
+}
+
+template<typename Graph>
+inline 
+vertex_list_adaptor<Graph, 
+                    typename detail::default_global_index_map<Graph>::type>
+make_vertex_list_adaptor(const Graph& g)
+{ 
+  typedef typename detail::default_global_index_map<Graph>::type 
+    GlobalIndexMap;
+  typedef typename detail::default_global_index_map<Graph>::distributed_map
+    DistributedMap;
+  typedef vertex_list_adaptor<Graph, GlobalIndexMap> result_type;
+  return result_type(g, 
+                     GlobalIndexMap(DistributedMap(num_vertices(g), 
+                                                   get(vertex_index, g))));
+}
+
+// --------------------------------------------------------------------------
+// Incidence Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor
+source(typename vertex_list_adaptor<Graph, GlobalIndexMap>::edge_descriptor e,
+       const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return source(e, g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor
+target(typename vertex_list_adaptor<Graph, GlobalIndexMap>::edge_descriptor e,
+       const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return target(e, g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::out_edge_iterator,
+          typename vertex_list_adaptor<Graph, GlobalIndexMap>::out_edge_iterator>
+out_edges(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+          const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return out_edges(v, g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::degree_size_type
+out_degree(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+          const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return out_degree(v, g.base()); }
+
+// --------------------------------------------------------------------------
+// Bidirectional Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::in_edge_iterator,
+          typename vertex_list_adaptor<Graph, GlobalIndexMap>::in_edge_iterator>
+in_edges(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+         const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return in_edges(v, g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::degree_size_type
+in_degree(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+          const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return in_degree(v, g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::degree_size_type
+degree(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+       const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return degree(v, g.base()); }
+
+// --------------------------------------------------------------------------
+// Adjacency Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::adjacency_iterator,
+          typename vertex_list_adaptor<Graph, GlobalIndexMap>::adjacency_iterator>
+adjacent_vertices(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+                  const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return adjacent_vertices(v, g.base()); }
+
+
+// --------------------------------------------------------------------------
+// Vertex List Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_iterator,
+          typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_iterator>
+vertices(const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return g.vertices(); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline
+typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertices_size_type
+num_vertices(const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return g.num_vertices(); }
+
+// --------------------------------------------------------------------------
+// Edge List Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::edge_iterator,
+          typename vertex_list_adaptor<Graph, GlobalIndexMap>::edge_iterator>
+edges(const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return edges(g.base()); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline
+typename vertex_list_adaptor<Graph, GlobalIndexMap>::edges_size_type
+num_edges(const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return num_edges(g.base()); }
+
+// --------------------------------------------------------------------------
+// Property Graph
+// --------------------------------------------------------------------------
+template<typename PropertyTag, typename Graph, typename GlobalIndexMap>
+inline typename property_map<Graph, PropertyTag>::type
+get(PropertyTag p, vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return get(p, g.base()); }
+
+template<typename PropertyTag, typename Graph, typename GlobalIndexMap>
+inline typename property_map<Graph, PropertyTag>::const_type
+get(PropertyTag p, const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return get(p, g.base()); }
+
+template<typename PropertyTag, typename Graph, typename GlobalIndexMap>
+inline typename property_traits<
+                  typename property_map<Graph, PropertyTag>::type
+                >::value_type
+get(PropertyTag p, const vertex_list_adaptor<Graph, GlobalIndexMap>& g,
+    typename property_traits<
+               typename property_map<Graph, PropertyTag>::type
+             >::key_type const& x)
+{ return get(p, g.base(), x); }
+
+template<typename PropertyTag, typename Graph, typename GlobalIndexMap>
+inline void
+put(PropertyTag p, vertex_list_adaptor<Graph, GlobalIndexMap>& g,
+    typename property_traits<
+               typename property_map<Graph, PropertyTag>::type
+             >::key_type const& x,
+    typename property_traits<
+               typename property_map<Graph, PropertyTag>::type
+             >::value_type const& v)
+{ return put(p, g.base(), x, v); }
+
+// --------------------------------------------------------------------------
+// Property Graph: vertex_index property
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+inline GlobalIndexMap
+get(vertex_index_t, const vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return g.get_index_map(); }
+
+template<typename Graph, typename GlobalIndexMap>
+inline typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertices_size_type
+get(vertex_index_t, const vertex_list_adaptor<Graph, GlobalIndexMap>& g,
+    typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor x)
+{ return get(g.get_index_map(), x); }
+
+// --------------------------------------------------------------------------
+// Adjacency Matrix Graph
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+std::pair<typename vertex_list_adaptor<Graph, GlobalIndexMap>::edge_descriptor,
+          bool>
+edge(typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor u,
+     typename vertex_list_adaptor<Graph, GlobalIndexMap>::vertex_descriptor v,
+     vertex_list_adaptor<Graph, GlobalIndexMap>& g)
+{ return edge(u, v, g.base()); }
+
+} } // end namespace boost::graph
+
+namespace boost {
+
+// --------------------------------------------------------------------------
+// Property Graph: vertex_index property
+// --------------------------------------------------------------------------
+template<typename Graph, typename GlobalIndexMap>
+class property_map<vertex_index_t, 
+                   graph::vertex_list_adaptor<Graph, GlobalIndexMap> >
+{
+public:
+  typedef GlobalIndexMap type;
+  typedef type const_type;
+};
+
+template<typename Graph, typename GlobalIndexMap>
+class property_map<vertex_index_t, 
+                   const graph::vertex_list_adaptor<Graph, GlobalIndexMap> >
+{
+public:
+  typedef GlobalIndexMap type;
+  typedef type const_type;
+};
+
+using graph::distribution_global_index_map;
+using graph::make_distribution_global_index_map;
+using graph::stored_global_index_map;
+using graph::make_vertex_list_adaptor;
+using graph::vertex_list_adaptor;
+
+} // end namespace boost
+
+#endif // BOOST_VERTEX_LIST_ADAPTOR_HPP
similarity index 95%
rename from deal.II/contrib/boost/include/boost/graph/dominator_tree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/dominator_tree.hpp
index bb34bbe96af3ba660e04f3a279b70bf922d2aa4a..cf0d310ef8333000be5bd6c0e79ee5628f22207e 100644 (file)
@@ -1,11 +1,11 @@
 //=======================================================================
-// Copyright (C) 2005 Jong Soo Park <jongsoo.park -at- gmail.com>
+// Copyright (C) 2005-2009 Jongsoo Park <jongsoo.park -at- gmail.com>
 //
 // 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)
 //=======================================================================
-// Dominator tree computation
+
 #ifndef BOOST_GRAPH_DOMINATOR_HPP
 #define BOOST_GRAPH_DOMINATOR_HPP
 
@@ -14,6 +14,8 @@
 #include <set>
 #include <boost/graph/depth_first_search.hpp>
 
+// Dominator tree computation
+
 namespace boost {
   namespace detail {
     /**
@@ -26,13 +28,13 @@ namespace boost {
     {
     public :
       typedef Tag event_filter;
-      time_stamper_with_vertex_vector(TimeMap timeMap, VertexVector& v, 
+      time_stamper_with_vertex_vector(TimeMap timeMap, VertexVector& v,
                                       TimeT& t)
         : timeStamper_(timeMap, t), v_(v) { }
 
       template<class Graph>
-      void 
-      operator()(const typename property_traits<TimeMap>::key_type& v, 
+      void
+      operator()(const typename property_traits<TimeMap>::key_type& v,
                  const Graph& g)
       {
         timeStamper_(v, g);
@@ -52,7 +54,7 @@ namespace boost {
     stamp_times_with_vertex_vector(TimeMap timeMap, VertexVector& v, TimeT& t,
                                    Tag)
     {
-      return time_stamper_with_vertex_vector<TimeMap, VertexVector, TimeT, 
+      return time_stamper_with_vertex_vector<TimeMap, VertexVector, TimeT,
                                              Tag>(timeMap, v, t);
     }
 
@@ -76,29 +78,29 @@ namespace boost {
           ancestor_(num_vertices(g), graph_traits<Graph>::null_vertex()),
           samedom_(ancestor_),
           best_(semi_),
-          semiMap_(make_iterator_property_map(semi_.begin(), 
+          semiMap_(make_iterator_property_map(semi_.begin(),
                                               get(vertex_index, g))),
-          ancestorMap_(make_iterator_property_map(ancestor_.begin(), 
+          ancestorMap_(make_iterator_property_map(ancestor_.begin(),
                                                   get(vertex_index, g))),
-          bestMap_(make_iterator_property_map(best_.begin(), 
+          bestMap_(make_iterator_property_map(best_.begin(),
                                               get(vertex_index, g))),
           buckets_(num_vertices(g)),
-          bucketMap_(make_iterator_property_map(buckets_.begin(), 
+          bucketMap_(make_iterator_property_map(buckets_.begin(),
                                                 get(vertex_index, g))),
           entry_(entry),
           domTreePredMap_(domTreePredMap),
-          samedomMap(make_iterator_property_map(samedom_.begin(), 
+          numOfVertices_(num_vertices(g)),
+          samedomMap(make_iterator_property_map(samedom_.begin(),
                                                 get(vertex_index, g)))
       {
       }
-                
-      void 
-      operator()(const Vertex& n, const TimeMap& dfnumMap, 
+
+      void
+      operator()(const Vertex& n, const TimeMap& dfnumMap,
                  const PredMap& parentMap, const Graph& g)
       {
         if (n == entry_) return;
 
-        const VerticesSizeType numOfVertices = num_vertices(g);
         const Vertex p(get(parentMap, n));
         Vertex s(p);
 
@@ -113,14 +115,14 @@ namespace boost {
         //    Let semi(u) be a candidate for semi(n)
         //   of all these candidates, the one with lowest dfnum is
         //   the semidominator of n.
-                                
+
         // For each predecessor of n
         typename graph_traits<Graph>::in_edge_iterator inItr, inEnd;
         for (tie(inItr, inEnd) = in_edges(n, g); inItr != inEnd; ++inItr)
           {
             const Vertex v = source(*inItr, g);
             // To deal with unreachable nodes
-            if (get(dfnumMap, v) < 0 || get(dfnumMap, v) >= numOfVertices)
+            if (get(dfnumMap, v) < 0 || get(dfnumMap, v) >= numOfVertices_)
               continue;
 
             Vertex s2;
@@ -147,7 +149,7 @@ namespace boost {
         // * Dominator thm. : On the spanning-tree path below semi(n) and
         //   above or including n, let y be the node
         //   with the smallest-numbered semidominator. Then,
-        //      
+        //
         //  idom(n) = semi(n) if semi(y)=semi(n) or
         //            idom(y) if semi(y) != semi(n)
         typename std::deque<Vertex>::iterator buckItr;
@@ -171,7 +173,7 @@ namespace boost {
       /**
        * Evaluate function in Tarjan's path compression
        */
-      const Vertex 
+      const Vertex
       ancestor_with_lowest_semi_(const Vertex& v, const TimeMap& dfnumMap)
       {
         const Vertex a(get(ancestorMap_, v));
@@ -199,9 +201,10 @@ namespace boost {
 
       const Vertex& entry_;
       DomTreePredMap domTreePredMap_;
+      const VerticesSizeType numOfVertices_;
 
     public :
-                        
+
       PredMap samedomMap;
     };
 
@@ -219,7 +222,7 @@ namespace boost {
    *      graph_traits<Graph>::null_vertex in parentMap.
    * @pre Unreachable nodes must be masked as
    *      (std::numeric_limits<VerticesSizeType>::max)() in dfnumMap.
-   * 
+   *
    * @param domTreePredMap [out] : immediate dominator map (parent map
    * in dom. tree)
    *
@@ -227,7 +230,7 @@ namespace boost {
    *
    * @todo : Optimization in Finding Dominators in Practice, Loukas Georgiadis
    */
-  template<class Graph, class IndexMap, class TimeMap, class PredMap, 
+  template<class Graph, class IndexMap, class TimeMap, class PredMap,
            class VertexVector, class DomTreePredMap>
   void
   lengauer_tarjan_dominator_tree_without_dfs
@@ -274,7 +277,7 @@ namespace boost {
           }
       }
   }
-  
+
   /**
    * Unlike lengauer_tarjan_dominator_tree_without_dfs,
    * dfs is run in this function and
@@ -283,7 +286,7 @@ namespace boost {
    * If the result of dfs required after this algorithm,
    * this function can eliminate the need of rerunning dfs.
    */
-  template<class Graph, class IndexMap, class TimeMap, class PredMap, 
+  template<class Graph, class IndexMap, class TimeMap, class PredMap,
            class VertexVector, class DomTreePredMap>
   void
   lengauer_tarjan_dominator_tree
@@ -304,7 +307,7 @@ namespace boost {
 
     VerticesSizeType time =
       (std::numeric_limits<VerticesSizeType>::max)();
-    std::vector<default_color_type> 
+    std::vector<default_color_type>
       colors(numOfVertices, color_traits<default_color_type>::white());
     depth_first_visit
       (g, entry,
@@ -315,8 +318,8 @@ namespace boost {
        make_iterator_property_map(colors.begin(), indexMap));
 
     // 2. Run main algorithm.
-    lengauer_tarjan_dominator_tree_without_dfs(g, entry, indexMap, dfnumMap, 
-                                               parentMap, verticesByDFNum, 
+    lengauer_tarjan_dominator_tree_without_dfs(g, entry, indexMap, dfnumMap,
+                                               parentMap, verticesByDFNum,
                                                domTreePredMap);
   }
 
@@ -353,7 +356,7 @@ namespace boost {
     std::vector<VerticesSizeType> dfnum(numOfVertices, 0);
     TimeMap dfnumMap(make_iterator_property_map(dfnum.begin(), indexMap));
 
-    std::vector<Vertex> parent(numOfVertices, 
+    std::vector<Vertex> parent(numOfVertices,
                                graph_traits<Graph>::null_vertex());
     PredMap parentMap(make_iterator_property_map(parent.begin(), indexMap));
 
@@ -361,7 +364,7 @@ namespace boost {
 
     // Run main algorithm
     lengauer_tarjan_dominator_tree(g, entry,
-                                   indexMap, dfnumMap, parentMap, 
+                                   indexMap, dfnumMap, parentMap,
                                    verticesByDFNum, domTreePredMap);
   }
 
@@ -397,7 +400,7 @@ namespace boost {
     const std::set<Vertex> N(vi, viend);
 
     bool change = true;
-                
+
     std::vector< std::set<Vertex> > dom(numOfVertices, N);
     vertexSetMap domMap(make_iterator_property_map(dom.begin(), indexMap));
     get(domMap, entry).clear();
@@ -411,15 +414,15 @@ namespace boost {
             if (*vi == entry) continue;
 
             std::set<Vertex> T(N);
-                                
+
             typename graph_traits<Graph>::in_edge_iterator inItr, inEnd;
             for (tie(inItr, inEnd) = in_edges(*vi, g); inItr != inEnd; ++inItr)
               {
                 const Vertex p = source(*inItr, g);
 
                 std::set<Vertex> tempSet;
-                std::set_intersection(T.begin(), T.end(), 
-                                      get(domMap, p).begin(), 
+                std::set_intersection(T.begin(), T.end(),
+                                      get(domMap, p).begin(),
                                       get(domMap, p).end(),
                                       std::inserter(tempSet, tempSet.begin()));
                 T.swap(tempSet);
@@ -480,7 +483,7 @@ namespace boost {
   {
     typename property_map<Graph, vertex_index_t>::const_type
       indexMap = get(vertex_index, g);
-    
+
     iterative_bit_vector_dominator_tree(g, entry, indexMap, domTreePredMap);
   }
 } // namespace boost
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/eccentricity.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/eccentricity.hpp
new file mode 100644 (file)
index 0000000..4d4ddbc
--- /dev/null
@@ -0,0 +1,111 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_ECCENTRICITY_HPP
+#define BOOST_GRAPH_ECCENTRICITY_HPP
+
+#include <boost/utility.hpp>
+#include <boost/config.hpp>
+#include <boost/graph/detail/geodesic.hpp>
+
+namespace boost
+{
+template <typename Graph,
+            typename DistanceMap,
+            typename Combinator>
+inline typename property_traits<DistanceMap>::value_type
+eccentricity(const Graph& g, DistanceMap dist, Combinator combine)
+{
+    function_requires< GraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+
+    return detail::combine_distances(g, dist, combine, Distance(0));
+}
+
+template <typename Graph, typename DistanceMap>
+inline typename property_traits<DistanceMap>::value_type
+eccentricity(const Graph& g, DistanceMap dist)
+{
+    function_requires< GraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMap,Vertex> >();
+    typedef typename property_traits<DistanceMap>::value_type Distance;
+
+    return eccentricity(g, dist, detail::maximize<Distance>());
+}
+
+template <typename Graph, typename DistanceMatrix, typename EccentricityMap>
+inline std::pair<typename property_traits<EccentricityMap>::value_type,
+                    typename property_traits<EccentricityMap>::value_type>
+all_eccentricities(const Graph& g, const DistanceMatrix& dist, EccentricityMap ecc)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< ReadablePropertyMapConcept<DistanceMatrix,Vertex> >();
+    typedef typename property_traits<DistanceMatrix>::value_type DistanceMap;
+    function_requires< WritablePropertyMapConcept<EccentricityMap,Vertex> >();
+    typedef typename property_traits<EccentricityMap>::value_type Eccentricity;
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+
+    Eccentricity
+            r = numeric_values<Eccentricity>::infinity(),
+            d = numeric_values<Eccentricity>::zero();
+    VertexIterator i, end;
+    tie(i, end) = vertices(g);
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        DistanceMap dm = get(dist, *i);
+        Eccentricity e = eccentricity(g, dm);
+        put(ecc, *i, e);
+
+        // track the radius and diameter at the same time
+        r = min BOOST_PREVENT_MACRO_SUBSTITUTION (r, e);
+        d = max BOOST_PREVENT_MACRO_SUBSTITUTION (d, e);
+    }
+    return make_pair(r, d);
+}
+
+template <typename Graph, typename EccentricityMap>
+inline std::pair<typename property_traits<EccentricityMap>::value_type,
+                    typename property_traits<EccentricityMap>::value_type>
+radius_and_diameter(const Graph& g, EccentricityMap ecc)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< ReadablePropertyMapConcept<EccentricityMap, Vertex> >();
+    typedef typename property_traits<EccentricityMap>::value_type Eccentricity;
+
+    VertexIterator i, end;
+    tie(i, end) = vertices(g);
+    Eccentricity radius = get(ecc, *i);
+    Eccentricity diameter = get(ecc, *i);
+    for(i = boost::next(i); i != end; ++i) {
+        Eccentricity cur = get(ecc, *i);
+        radius = min BOOST_PREVENT_MACRO_SUBSTITUTION (radius, cur);
+        diameter = max BOOST_PREVENT_MACRO_SUBSTITUTION (diameter, cur);
+    }
+    return std::make_pair(radius, diameter);
+}
+
+
+template <typename Graph, typename EccentricityMap>
+inline typename property_traits<EccentricityMap>::value_type
+radius(const Graph& g, EccentricityMap ecc)
+{ return radius_and_diameter(g, ecc).first; }
+
+
+template <typename Graph, typename EccentricityMap>
+inline typename property_traits<EccentricityMap>::value_type
+diameter(const Graph& g, EccentricityMap ecc)
+{ return radius_and_diameter(g, ecc).second; }
+
+} /* namespace boost */
+
+#endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/edge_connectivity.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/edge_connectivity.hpp
index d78e3ee41a322edfd4c9a2c1aa0e3f97effaf802..383ad6351e31d5593c394ae26a9795c8aa73dd59 100644 (file)
@@ -16,7 +16,7 @@
 #include <vector>
 #include <set>
 #include <algorithm>
-#include <boost/graph/edmunds_karp_max_flow.hpp>
+#include <boost/graph/edmonds_karp_max_flow.hpp>
 
 namespace boost {
 
@@ -132,14 +132,15 @@ namespace boost {
     detail::neighbors(g, S.begin(), S.end(), 
                       std::inserter(neighbor_S, neighbor_S.begin()));
 
-    std::set_difference(vertices(g).first, vertices(g).second,
+    tie(vi, vi_end) = vertices(g);
+    std::set_difference(vi, vi_end,
                         neighbor_S.begin(), neighbor_S.end(),
                         std::back_inserter(non_neighbor_S));
 
     while (!non_neighbor_S.empty()) { // at most n - 1 times
       k = non_neighbor_S.front();
 
-      alpha_S_k = edmunds_karp_max_flow
+      alpha_S_k = edmonds_karp_max_flow
         (flow_g, p, k, cap, res_cap, rev_edge, &color[0], &pred[0]);
 
       if (alpha_S_k < alpha_star) {
@@ -153,7 +154,8 @@ namespace boost {
       neighbor_S.insert(k);
       detail::neighbors(g, k, std::inserter(neighbor_S, neighbor_S.begin()));
       non_neighbor_S.clear();
-      std::set_difference(vertices(g).first, vertices(g).second,
+      tie(vi, vi_end) = vertices(g);
+      std::set_difference(vi, vi_end,
                           neighbor_S.begin(), neighbor_S.end(),
                           std::back_inserter(non_neighbor_S));
     }
similarity index 91%
rename from deal.II/contrib/boost/include/boost/graph/edmunds_karp_max_flow.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/edmonds_karp_max_flow.hpp
index ddb49dc6d6680189a8d4b4934b0a4e5fa0baae5b..fed4d69fbefd2671ad43ef951be29b647d996a5b 100644 (file)
@@ -7,15 +7,15 @@
 // http://www.boost.org/LICENSE_1_0.txt)
 //=======================================================================
 
-#ifndef EDMUNDS_KARP_MAX_FLOW_HPP
-#define EDMUNDS_KARP_MAX_FLOW_HPP
+#ifndef EDMONDS_KARP_MAX_FLOW_HPP
+#define EDMONDS_KARP_MAX_FLOW_HPP
 
 #include <boost/config.hpp>
 #include <vector>
 #include <algorithm> // for std::min and std::max
 #include <boost/config.hpp>
 #include <boost/pending/queue.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/filtered_graph.hpp>
@@ -25,7 +25,7 @@ namespace boost {
 
   // The "labeling" algorithm from "Network Flows" by Ahuja, Magnanti,
   // Orlin.  I think this is the same as or very similar to the original
-  // Edmunds-Karp algorithm.  This solves the maximum flow problem.
+  // Edmonds-Karp algorithm.  This solves the maximum flow problem.
 
   namespace detail {
 
@@ -76,7 +76,7 @@ namespace boost {
             class CapacityEdgeMap, class ResidualCapacityEdgeMap,
             class ReverseEdgeMap, class ColorMap, class PredEdgeMap>
   typename property_traits<CapacityEdgeMap>::value_type
-  edmunds_karp_max_flow
+  edmonds_karp_max_flow
     (Graph& g, 
      typename graph_traits<Graph>::vertex_descriptor src,
      typename graph_traits<Graph>::vertex_descriptor sink,
@@ -111,7 +111,7 @@ namespace boost {
     for (tie(ei, e_end) = out_edges(src, g); ei != e_end; ++ei)
       flow += (cap[*ei] - res[*ei]);
     return flow;
-  } // edmunds_karp_max_flow()
+  } // edmonds_karp_max_flow()
   
   namespace detail {
     //-------------------------------------------------------------------------
@@ -119,7 +119,7 @@ namespace boost {
 
     // use of class here is a VC++ workaround
     template <class ColorMap>
-    struct edmunds_karp_dispatch2 {
+    struct edmonds_karp_dispatch2 {
       template <class Graph, class PredMap, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
       apply
@@ -130,7 +130,7 @@ namespace boost {
        const bgl_named_params<P, T, R>& params,
        ColorMap color)
       {
-        return edmunds_karp_max_flow
+        return edmonds_karp_max_flow
           (g, src, sink, 
            choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
            choose_pmap(get_param(params, edge_residual_capacity), 
@@ -140,7 +140,7 @@ namespace boost {
       }
     };
     template<>
-    struct edmunds_karp_dispatch2<detail::error_property_not_found> {
+    struct edmonds_karp_dispatch2<detail::error_property_not_found> {
       template <class Graph, class PredMap, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
       apply
@@ -156,7 +156,7 @@ namespace boost {
         size_type n = is_default_param(get_param(params, vertex_color)) ?
           num_vertices(g) : 1;
         std::vector<default_color_type> color_vec(n);
-        return edmunds_karp_max_flow
+        return edmonds_karp_max_flow
           (g, src, sink, 
            choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
            choose_pmap(get_param(params, edge_residual_capacity), 
@@ -174,7 +174,7 @@ namespace boost {
 
     // use of class here is a VC++ workaround
     template <class PredMap>
-    struct edmunds_karp_dispatch1 {
+    struct edmonds_karp_dispatch1 {
       template <class Graph, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
       apply(Graph& g,
@@ -184,12 +184,12 @@ namespace boost {
             PredMap pred)
       {
         typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
-        return edmunds_karp_dispatch2<C>::apply
+        return edmonds_karp_dispatch2<C>::apply
           (g, src, sink, pred, params, get_param(params, vertex_color));
       }
     };
     template<>
-    struct edmunds_karp_dispatch1<detail::error_property_not_found> {
+    struct edmonds_karp_dispatch1<detail::error_property_not_found> {
 
       template <class Graph, class P, class T, class R>
       static typename edge_capacity_value<Graph, P, T, R>::type
@@ -207,7 +207,7 @@ namespace boost {
         std::vector<edge_descriptor> pred_vec(n);
         
         typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
-        return edmunds_karp_dispatch2<C>::apply
+        return edmonds_karp_dispatch2<C>::apply
           (g, src, sink, 
            make_iterator_property_map(pred_vec.begin(), choose_const_pmap
                                       (get_param(params, vertex_index),
@@ -221,14 +221,14 @@ namespace boost {
 
   template <class Graph, class P, class T, class R>
   typename detail::edge_capacity_value<Graph, P, T, R>::type
-  edmunds_karp_max_flow
+  edmonds_karp_max_flow
     (Graph& g,
      typename graph_traits<Graph>::vertex_descriptor src,
      typename graph_traits<Graph>::vertex_descriptor sink,
      const bgl_named_params<P, T, R>& params)
   {
     typedef typename property_value< bgl_named_params<P,T,R>, vertex_predecessor_t>::type Pred;
-    return detail::edmunds_karp_dispatch1<Pred>::apply
+    return detail::edmonds_karp_dispatch1<Pred>::apply
       (g, src, sink, params, get_param(params, vertex_predecessor));
   }
 
@@ -236,15 +236,15 @@ namespace boost {
   typename property_traits<
     typename property_map<Graph, edge_capacity_t>::const_type
   >::value_type
-  edmunds_karp_max_flow
+  edmonds_karp_max_flow
     (Graph& g,
      typename graph_traits<Graph>::vertex_descriptor src,
      typename graph_traits<Graph>::vertex_descriptor sink)
   {
     bgl_named_params<int, buffer_param_t> params(0);
-    return edmunds_karp_max_flow(g, src, sink, params);
+    return edmonds_karp_max_flow(g, src, sink, params);
   }
 
 } // namespace boost
 
-#endif // EDMUNDS_KARP_MAX_FLOW_HPP
+#endif // EDMONDS_KARP_MAX_FLOW_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/edmunds_karp_max_flow.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/edmunds_karp_max_flow.hpp
new file mode 100644 (file)
index 0000000..3697db2
--- /dev/null
@@ -0,0 +1,19 @@
+//=======================================================================
+// (c) Copyright Juergen Hunold 2008
+// 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)
+//=======================================================================
+
+#ifndef BOOST_DEPRECATED_INCLUDE_EDMONDS_KARP_MAX_FLOW_HPP
+#define BOOST_DEPRECATED_INCLUDE_EDMONDS_KARP_MAX_FLOW_HPP
+
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/graph/edmonds_karp_max_flow.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/graph/edmonds_karp_max_flow.hpp"
+#endif
+
+#include <boost/graph/edmonds_karp_max_flow.hpp>
+
+#endif // BOOST_DEPRECATED_INCLUDE_EDMONDS_KARP_MAX_FLOW_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/erdos_renyi_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/erdos_renyi_generator.hpp
new file mode 100644 (file)
index 0000000..a459441
--- /dev/null
@@ -0,0 +1,195 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Jeremiah Willcock
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
+#define BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
+
+#include <cassert>
+#include <iterator>
+#include <utility>
+#include <boost/shared_ptr.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/random/geometric_distribution.hpp>
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+
+namespace boost {
+
+  template<typename RandomGenerator, typename Graph>
+  class erdos_renyi_iterator
+    : public iterator_facade<
+               erdos_renyi_iterator<RandomGenerator, Graph>,
+               std::pair<typename graph_traits<Graph>::vertices_size_type,
+                         typename graph_traits<Graph>::vertices_size_type>,
+               std::input_iterator_tag,
+               const 
+                 std::pair<typename graph_traits<Graph>::vertices_size_type,
+                           typename graph_traits<Graph>::vertices_size_type>&>
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+    BOOST_STATIC_CONSTANT
+      (bool,
+       is_undirected = (is_base_of<undirected_tag, directed_category>::value));
+
+  public:
+    erdos_renyi_iterator() : gen(), n(0), edges(0), allow_self_loops(false) {}
+    erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
+                         double fraction = 0.0, bool allow_self_loops = false)
+      : gen(&gen), n(n), edges(edges_size_type(fraction * n * n)),
+        allow_self_loops(allow_self_loops)
+    {
+      if (is_undirected) edges = edges / 2;
+      next();
+    }
+
+    erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
+                         edges_size_type m, bool allow_self_loops = false)
+      : gen(&gen), n(n), edges(m),
+        allow_self_loops(allow_self_loops)
+    {
+      next();
+    }
+
+    const std::pair<vertices_size_type, vertices_size_type>&
+    dereference() const { return current; }
+
+    void increment() {
+      --edges;
+      next();
+    }
+
+    bool equal(const erdos_renyi_iterator& other) const
+    { return edges == other.edges; }
+
+  private:
+    void next()
+    {
+      uniform_int<vertices_size_type> rand_vertex(0, n-1);
+      current.first = rand_vertex(*gen);
+      do {
+        current.second = rand_vertex(*gen);
+      } while (current.first == current.second && !allow_self_loops);
+    }
+
+    RandomGenerator* gen;
+    vertices_size_type n;
+    edges_size_type edges;
+    bool allow_self_loops;
+    std::pair<vertices_size_type, vertices_size_type> current;
+  };
+
+  template<typename RandomGenerator, typename Graph>
+  class sorted_erdos_renyi_iterator
+    : public iterator_facade<
+               sorted_erdos_renyi_iterator<RandomGenerator, Graph>,
+               std::pair<typename graph_traits<Graph>::vertices_size_type,
+                         typename graph_traits<Graph>::vertices_size_type>,
+               std::input_iterator_tag,
+               const 
+                 std::pair<typename graph_traits<Graph>::vertices_size_type,
+                           typename graph_traits<Graph>::vertices_size_type>&>
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+    BOOST_STATIC_CONSTANT
+      (bool,
+       is_undirected = (is_base_of<undirected_tag, directed_category>::value));
+
+  public:
+    sorted_erdos_renyi_iterator()
+      : gen(), rand_vertex(0.5), n(0), allow_self_loops(false)
+      , src((std::numeric_limits<vertices_size_type>::max)()),
+        tgt_index(vertices_size_type(-1)), prob(.5)
+    { }
+
+    // NOTE: The default probability has been changed to be the same as that
+    // used by the geometic distribution. It was previously 0.0, which would
+    // cause an assertion.
+    sorted_erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
+                                double prob = 0.5,
+                                bool loops = false)
+      : gen(), rand_vertex(1. - prob), n(n), allow_self_loops(loops), src(0)
+      , tgt_index(vertices_size_type(-1)), prob(prob)
+    {
+      this->gen.reset(new uniform_01<RandomGenerator*>(&gen));
+
+      if (prob == 0.0) {src = (std::numeric_limits<vertices_size_type>::max)(); return;}
+      next();
+    }
+
+    const std::pair<vertices_size_type, vertices_size_type>&
+    dereference() const {
+      return current;
+    }
+
+    bool equal(const sorted_erdos_renyi_iterator& o) const {
+      return src == o.src && tgt_index == o.tgt_index;
+    }
+
+    void increment() {
+      next();
+    }
+
+  private:
+    void next()
+    {
+      // In order to get the edges from the generator in sorted order, one
+      // effective (but slow) procedure would be to use a
+      // bernoulli_distribution for each legal (src, tgt_index) pair.  Because of
+      // the O(|V|^2) cost of that, a geometric distribution is used.  The
+      // geometric distribution tells how many times the
+      // bernoulli_distribution would need to be run until it returns true.
+      // Thus, this distribution can be used to step through the edges
+      // which are actually present.
+      assert (src != (std::numeric_limits<vertices_size_type>::max)() &&
+              src != n);
+      while (src != n) {
+        vertices_size_type increment = rand_vertex(*gen);
+        size_t tgt_index_limit =
+                 (is_undirected ? src + 1 : n) +
+                 (allow_self_loops ? 0 : -1);
+        if (tgt_index + increment >= tgt_index_limit) {
+          // Overflowed this source; go to the next one and try again.
+          ++src;
+          // This bias is because the geometric distribution always returns
+          // values >=1, and we want to allow 0 as a valid target.
+          tgt_index = vertices_size_type(-1);
+          continue;
+        } else {
+          tgt_index += increment;
+          current.first = src;
+          current.second =
+            tgt_index +
+            (!allow_self_loops && !is_undirected && tgt_index >= src ? 1 : 0);
+          break;
+        }
+      }
+      if (src == n) src = (std::numeric_limits<vertices_size_type>::max)();
+    }
+
+    shared_ptr<uniform_01<RandomGenerator*> > gen;
+    geometric_distribution<vertices_size_type> rand_vertex;
+    vertices_size_type n;
+    bool allow_self_loops;
+    vertices_size_type src, tgt_index;
+    std::pair<vertices_size_type, vertices_size_type> current;
+    double prob;
+  };
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/exception.hpp
new file mode 100644 (file)
index 0000000..382d671
--- /dev/null
@@ -0,0 +1,55 @@
+//=======================================================================
+// Copyright 2002 Indiana University.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_EXCEPTION_HPP
+#define BOOST_GRAPH_EXCEPTION_HPP
+
+#include <stdexcept>
+#include <string>
+
+namespace boost {
+
+    struct bad_graph : public std::invalid_argument {
+        bad_graph(const std::string& what_arg)
+            : std::invalid_argument(what_arg) { }
+    };
+
+    struct not_a_dag : public bad_graph {
+        not_a_dag()
+            : bad_graph("The graph must be a DAG.")
+        { }
+    };
+
+    struct negative_edge : public bad_graph {
+        negative_edge()
+            : bad_graph("The graph may not contain an edge with negative weight.")
+        { }
+    };
+
+    struct negative_cycle : public bad_graph {
+        negative_cycle()
+            : bad_graph("The graph may not contain negative cycles.")
+        { }
+    };
+
+    struct not_connected : public bad_graph {
+        not_connected()
+            : bad_graph("The graph must be connected.")
+        { }
+    };
+
+   struct not_complete : public bad_graph {
+       not_complete()
+           : bad_graph("The graph must be complete.")
+       { }
+   };
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/exterior_property.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/exterior_property.hpp
new file mode 100644 (file)
index 0000000..af6df81
--- /dev/null
@@ -0,0 +1,117 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_EXTERIOR_PROPERTY_HPP
+#define BOOST_GRAPH_EXTERIOR_PROPERTY_HPP
+
+#include <vector>
+#include <boost/graph/property_maps/container_property_map.hpp>
+#include <boost/graph/property_maps/matrix_property_map.hpp>
+
+namespace boost {
+namespace detail {
+    // The vector matrix provides a little abstraction over vector
+    // types that makes matrices easier to work with. Note that it's
+    // non-copyable, meaning you should be passing it by value.
+    template <typename Value>
+    struct vector_matrix
+    {
+        typedef std::vector<Value> container_type;
+        typedef std::vector<container_type> matrix_type;
+
+        typedef container_type value_type;
+        typedef container_type& reference;
+        typedef const container_type const_reference;
+        typedef container_type* pointer;
+        typedef typename matrix_type::size_type size_type;
+
+        // Instantiate the matrix over n elements (creates an nxn matrix).
+        // The graph has to be passed in order to ensure the index maps
+        // are constructed correctly when returning indexible elements.
+        inline vector_matrix(size_type n)
+            : m_matrix(n, container_type(n))
+        { }
+
+        inline reference operator [](size_type n)
+        { return m_matrix[n]; }
+
+        inline const_reference operator [](size_type n) const
+        { return m_matrix[n]; }
+
+        matrix_type m_matrix;
+    };
+} /* namespace detail */
+
+/**
+ * The exterior_property metafunction defines an appropriate set of types for
+ * creating an exterior property. An exterior property is comprised of a both
+ * a container and a property map that acts as its abstraction. An extension
+ * of this metafunction will select an appropriate "matrix" property that
+ * records values for pairs of vertices.
+ *
+ * @todo This does not currently support the ability to define exterior
+ * properties for graph types that do not model the IndexGraph concepts. A
+ * solution should not be especially difficult, but will require an extension
+ * of type traits to affect the type selection.
+ */
+template <typename Graph, typename Key, typename Value>
+struct exterior_property
+{
+    typedef Key key_type;
+    typedef Value value_type;
+
+    typedef std::vector<Value> container_type;
+    typedef container_property_map<Graph, Key, container_type> map_type;
+
+    typedef detail::vector_matrix<Value> matrix_type;
+    typedef matrix_property_map<Graph, Key, matrix_type> matrix_map_type;
+
+private:
+    exterior_property() { }
+    exterior_property(const exterior_property&) { }
+};
+
+/**
+ * Define a the container and property map types requried to create an exterior
+ * vertex property for the given value type. The Graph parameter is required to
+ * model the VertexIndexGraph concept.
+ */
+template <typename Graph, typename Value>
+struct exterior_vertex_property
+{
+    typedef exterior_property<
+            Graph, typename graph_traits<Graph>::vertex_descriptor, Value
+        > property_type;
+    typedef typename property_type::key_type key_type;
+    typedef typename property_type::value_type value_type;
+    typedef typename property_type::container_type container_type;
+    typedef typename property_type::map_type map_type;
+    typedef typename property_type::matrix_type matrix_type;
+    typedef typename property_type::matrix_map_type matrix_map_type;
+};
+
+/**
+ * Define a the container and property map types requried to create an exterior
+ * edge property for the given value type. The Graph parameter is required to
+ * model the EdgeIndexGraph concept.
+ */
+template <typename Graph, typename Value>
+struct exterior_edge_property
+{
+    typedef exterior_property<
+            Graph, typename graph_traits<Graph>::edge_descriptor, Value
+        > property_type;
+    typedef typename property_type::key_type key_type;
+    typedef typename property_type::value_type value_type;
+    typedef typename property_type::container_type container_type;
+    typedef typename property_type::map_type map_type;
+    typedef typename property_type::matrix_type matrix_type;
+    typedef typename property_type::matrix_map_type matrix_map_type;
+};
+
+} /* namespace boost */
+
+#endif
similarity index 97%
rename from deal.II/contrib/boost/include/boost/graph/filtered_graph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/filtered_graph.hpp
index 2a30a7127c5c661819a6db6ce1a7f11ec43d22e1..94b634dff2a80c87dbe4894bd4e623047e087f7b 100644 (file)
@@ -500,6 +500,23 @@ namespace boost {
     return Filter(g, keep_all(), p);
   }
 
+  // Filter that uses a property map whose value_type is a boolean
+  template <typename PropertyMap>
+  struct property_map_filter {
+    
+    property_map_filter() { }
+      
+    property_map_filter(const PropertyMap& property_map) :
+      m_property_map(property_map) { }
+    
+    template <typename Key>
+    bool operator()(const Key& key) const {
+      return (get(m_property_map, key));
+    }
+    
+  private :
+    PropertyMap m_property_map;
+  };
 
 } // namespace boost
 
similarity index 95%
rename from deal.II/contrib/boost/include/boost/graph/floyd_warshall_shortest.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/floyd_warshall_shortest.hpp
index 6204ca0e327feb9fa0466a8722a5d41c8a307e7f..d57f13c1ec94c6e358d020759159205434194710 100644 (file)
@@ -29,7 +29,7 @@
 #ifndef BOOST_GRAPH_FLOYD_WARSHALL_HPP
 #define BOOST_GRAPH_FLOYD_WARSHALL_HPP
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/named_function_params.hpp>
 #include <boost/graph/graph_concepts.hpp>
@@ -59,13 +59,13 @@ namespace boost
       
       for (tie(k, lastk) = vertices(g); k != lastk; k++)
         for (tie(i, lasti) = vertices(g); i != lasti; i++)
-         if(d[*i][*k] != inf)
-           for (tie(j, lastj) = vertices(g); j != lastj; j++)
-             if(d[*k][*j] != inf)
-               d[*i][*j] = 
-                 detail::min_with_compare(d[*i][*j], 
-                                          combine(d[*i][*k], d[*k][*j]),
-                                          compare);
+          if(d[*i][*k] != inf)
+            for (tie(j, lastj) = vertices(g); j != lastj; j++)
+              if(d[*k][*j] != inf)
+                d[*i][*j] = 
+                  detail::min_with_compare(d[*i][*j], 
+                                           combine(d[*i][*k], d[*k][*j]),
+                                           compare);
       
       
       for (tie(i, lasti) = vertices(g); i != lasti; i++)
similarity index 52%
rename from deal.II/contrib/boost/include/boost/graph/fruchterman_reingold.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/fruchterman_reingold.hpp
index f5ea6af7b33075fbd5696f3c08f171d50e4aaea1..0da35167c3d51ed5fc4e4b8994c0b60606ec6b15 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright 2004 The Trustees of Indiana University.
+// Copyright 2004, 2005 The Trustees of Indiana University.
 
 // Distributed under the Boost Software License, Version 1.0.
 // (See accompanying file LICENSE_1_0.txt or copy at
 #include <boost/config/no_tr1/cmath.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/named_function_params.hpp>
-#include <boost/graph/simple_point.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/topology.hpp> // For topology concepts
 #include <vector>
 #include <list>
 #include <algorithm> // for std::min and std::max
+#include <numeric> // for std::accumulate
+#include <cmath> // for std::sqrt and std::fabs
+#include <functional>
 
 namespace boost {
 
@@ -84,18 +88,20 @@ struct all_force_pairs
   }
 };
 
-template<typename Dim, typename PositionMap>
+template<typename Topology, typename PositionMap>
 struct grid_force_pairs
 {
+  typedef typename property_traits<PositionMap>::value_type Point;
+  BOOST_STATIC_ASSERT (Point::dimensions == 2);
+  typedef typename Topology::point_difference_type point_difference_type;
+
   template<typename Graph>
   explicit
-  grid_force_pairs(Dim width, Dim height, PositionMap position, const Graph& g)
-    : width(width), height(height), position(position)
+  grid_force_pairs(const Topology& topology,
+                   PositionMap position, const Graph& g)
+    : topology(topology), position(position)
   {
-#ifndef BOOST_NO_STDC_NAMESPACE
-    using std::sqrt;
-#endif // BOOST_NO_STDC_NAMESPACE
-    two_k = Dim(2) * sqrt(width*height / num_vertices(g));
+    two_k = 2. * this->topology.volume(this->topology.extent()) / std::sqrt((double)num_vertices(g));
   }
 
   template<typename Graph, typename ApplyForce >
@@ -106,13 +112,15 @@ struct grid_force_pairs
     typedef std::list<vertex_descriptor> bucket_t;
     typedef std::vector<bucket_t> buckets_t;
 
-    std::size_t columns = std::size_t(width / two_k + Dim(1));
-    std::size_t rows = std::size_t(height / two_k + Dim(1));
+    std::size_t columns = std::size_t(topology.extent()[0] / two_k + 1.);
+    std::size_t rows = std::size_t(topology.extent()[1] / two_k + 1.);
     buckets_t buckets(rows * columns);
     vertex_iterator v, v_end;
     for (tie(v, v_end) = vertices(g); v != v_end; ++v) {
-      std::size_t column = std::size_t((position[*v].x + width  / 2) / two_k);
-      std::size_t row    = std::size_t((position[*v].y + height / 2) / two_k);
+      std::size_t column =
+        std::size_t((get(position, *v)[0] + topology.extent()[0] / 2) / two_k);
+      std::size_t row    =
+        std::size_t((get(position, *v)[1] + topology.extent()[1] / 2) / two_k);
 
       if (column >= columns) column = columns - 1;
       if (row >= rows) row = rows - 1;
@@ -137,146 +145,162 @@ struct grid_force_pairs
           std::size_t adj_end_column = column == columns - 1? column : column + 1;
           for (std::size_t other_row = adj_start_row; other_row <= adj_end_row;
                ++other_row)
-            for (std::size_t other_column = adj_start_column; 
+            for (std::size_t other_column = adj_start_column;
                  other_column <= adj_end_column; ++other_column)
               if (other_row != row || other_column != column) {
                 // Repulse vertices in this bucket
-                bucket_t& other_bucket 
+                bucket_t& other_bucket
                   = buckets[other_row * columns + other_column];
-                for (v = other_bucket.begin(); v != other_bucket.end(); ++v)
-                  apply_force(*u, *v);
+                for (v = other_bucket.begin(); v != other_bucket.end(); ++v) {
+                  double dist =
+                    topology.distance(get(position, *u), get(position, *v));
+                  if (dist < two_k) apply_force(*u, *v);
+                }
               }
         }
       }
   }
 
  private:
-  Dim width;
-  Dim height;
+  const Topology& topology;
   PositionMap position;
-  Dim two_k;
+  double two_k;
 };
 
-template<typename Dim, typename PositionMap, typename Graph>
-inline grid_force_pairs<Dim, PositionMap>
-make_grid_force_pairs(Dim width, Dim height, const PositionMap& position,
-                      const Graph& g)
-{ return grid_force_pairs<Dim, PositionMap>(width, height, position, g); }
+template<typename PositionMap, typename Topology, typename Graph>
+inline grid_force_pairs<Topology, PositionMap>
+make_grid_force_pairs
+  (const Topology& topology,
+   const PositionMap& position, const Graph& g)
+{ return grid_force_pairs<Topology, PositionMap>(topology, position, g); }
 
-template<typename Graph, typename PositionMap, typename Dim>
+template<typename Graph, typename PositionMap, typename Topology>
 void
-scale_graph(const Graph& g, PositionMap position,
-            Dim left, Dim top, Dim right, Dim bottom)
+scale_graph(const Graph& g, PositionMap position, const Topology& topology,
+            typename Topology::point_type upper_left, typename Topology::point_type lower_right)
 {
   if (num_vertices(g) == 0) return;
 
-  if (bottom > top) {
-    using std::swap;
-    swap(bottom, top);
-  }
-
-  typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
+  typedef typename Topology::point_type Point;
+  typedef typename Topology::point_difference_type point_difference_type;
 
   // Find min/max ranges
-  Dim minX = position[*vertices(g).first].x, maxX = minX;
-  Dim minY = position[*vertices(g).first].y, maxY = minY;
-  vertex_iterator vi, vi_end;
-  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
-    BOOST_USING_STD_MIN();
-    BOOST_USING_STD_MAX();
-    minX = min BOOST_PREVENT_MACRO_SUBSTITUTION (minX, position[*vi].x);
-    maxX = max BOOST_PREVENT_MACRO_SUBSTITUTION (maxX, position[*vi].x);
-    minY = min BOOST_PREVENT_MACRO_SUBSTITUTION (minY, position[*vi].y);
-    maxY = max BOOST_PREVENT_MACRO_SUBSTITUTION (maxY, position[*vi].y);
+  Point min_point = get(position, *vertices(g).first), max_point = min_point;
+  BGL_FORALL_VERTICES_T(v, g, Graph) {
+    min_point = topology.pointwise_min(min_point, get(position, v));
+    max_point = topology.pointwise_max(max_point, get(position, v));
   }
 
+  Point old_origin = topology.move_position_toward(min_point, 0.5, max_point);
+  Point new_origin = topology.move_position_toward(upper_left, 0.5, lower_right);
+  point_difference_type old_size = topology.difference(max_point, min_point);
+  point_difference_type new_size = topology.difference(lower_right, upper_left);
+
   // Scale to bounding box provided
-  for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
-    position[*vi].x = ((position[*vi].x - minX) / (maxX - minX))
-                    * (right - left) + left;
-    position[*vi].y = ((position[*vi].y - minY) / (maxY - minY))
-                    * (top - bottom) + bottom;
+  BGL_FORALL_VERTICES_T(v, g, Graph) {
+    point_difference_type relative_loc = topology.difference(get(position, v), old_origin);
+    relative_loc = (relative_loc / old_size) * new_size;
+    put(position, v, topology.adjust(new_origin, relative_loc));
   }
 }
 
 namespace detail {
-  template<typename PositionMap, typename DisplacementMap,
-           typename RepulsiveForce, typename Dim, typename Graph>
+  template<typename Topology, typename PropMap, typename Vertex>
+  void 
+  maybe_jitter_point(const Topology& topology,
+                     const PropMap& pm, Vertex v,
+                     const typename Topology::point_type& p2)
+  {
+    double too_close = topology.norm(topology.extent()) / 10000.;
+    if (topology.distance(get(pm, v), p2) < too_close) {
+      put(pm, v, 
+          topology.move_position_toward(get(pm, v), 1./200,
+                                        topology.random_point()));
+    }
+  }
+
+  template<typename Topology, typename PositionMap, typename DisplacementMap,
+           typename RepulsiveForce, typename Graph>
   struct fr_apply_force
   {
     typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+    typedef typename Topology::point_type Point;
+    typedef typename Topology::point_difference_type PointDiff;
 
-    fr_apply_force(const PositionMap& position,
+    fr_apply_force(const Topology& topology,
+                   const PositionMap& position,
                    const DisplacementMap& displacement,
-                   RepulsiveForce repulsive_force, Dim k, const Graph& g)
-      : position(position), displacement(displacement),
+                   RepulsiveForce repulsive_force, double k, const Graph& g)
+      : topology(topology), position(position), displacement(displacement),
         repulsive_force(repulsive_force), k(k), g(g)
     { }
 
     void operator()(vertex_descriptor u, vertex_descriptor v)
     {
-#ifndef BOOST_NO_STDC_NAMESPACE
-      using std::sqrt;
-#endif // BOOST_NO_STDC_NAMESPACE
       if (u != v) {
-        Dim delta_x = position[v].x - position[u].x;
-        Dim delta_y = position[v].y - position[u].y;
-        Dim dist = sqrt(delta_x * delta_x + delta_y * delta_y);
-        Dim fr = repulsive_force(u, v, k, dist, g);
-        displacement[v].x += delta_x / dist * fr;
-        displacement[v].y += delta_y / dist * fr;
+        // When the vertices land on top of each other, move the
+        // first vertex away from the boundaries.
+        maybe_jitter_point(topology, position, u, get(position, v));
+
+        double dist = topology.distance(get(position, u), get(position, v));
+        typename Topology::point_difference_type dispv = get(displacement, v);
+        if (dist == 0.) {
+          for (std::size_t i = 0; i < Point::dimensions; ++i) {
+            dispv[i] += 0.01;
+          }
+        } else {
+          double fr = repulsive_force(u, v, k, dist, g);
+          dispv += (fr / dist) *
+                   topology.difference(get(position, v), get(position, u));
+        }
+        put(displacement, v, dispv);
       }
     }
 
   private:
+    const Topology& topology;
     PositionMap position;
     DisplacementMap displacement;
     RepulsiveForce repulsive_force;
-    Dim k;
+    double k;
     const Graph& g;
   };
 
 } // end namespace detail
 
-template<typename Graph, typename PositionMap, typename Dim,
+template<typename Topology, typename Graph, typename PositionMap, 
          typename AttractiveForce, typename RepulsiveForce,
          typename ForcePairs, typename Cooling, typename DisplacementMap>
 void
 fruchterman_reingold_force_directed_layout
  (const Graph&    g,
   PositionMap     position,
-  Dim             width,
-  Dim             height,
+  const Topology& topology,
   AttractiveForce attractive_force,
   RepulsiveForce  repulsive_force,
   ForcePairs      force_pairs,
   Cooling         cool,
   DisplacementMap displacement)
 {
+  typedef typename Topology::point_type Point;
   typedef typename graph_traits<Graph>::vertex_iterator   vertex_iterator;
   typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
   typedef typename graph_traits<Graph>::edge_iterator     edge_iterator;
 
-#ifndef BOOST_NO_STDC_NAMESPACE
-  using std::sqrt;
-#endif // BOOST_NO_STDC_NAMESPACE
+  double volume = topology.volume(topology.extent());
 
-  Dim area = width * height;
   // assume positions are initialized randomly
-  Dim k = sqrt(area / num_vertices(g));
+  double k = pow(volume / num_vertices(g), 1. / (double)(Topology::point_difference_type::dimensions));
 
-  detail::fr_apply_force<PositionMap, DisplacementMap,
-                         RepulsiveForce, Dim, Graph>
-    apply_force(position, displacement, repulsive_force, k, g);
+  detail::fr_apply_force<Topology, PositionMap, DisplacementMap,
+                         RepulsiveForce, Graph>
+    apply_force(topology, position, displacement, repulsive_force, k, g);
 
-  Dim temp = cool();
-  if (temp) do {
+  do {
     // Calculate repulsive forces
     vertex_iterator v, v_end;
-    for (tie(v, v_end) = vertices(g); v != v_end; ++v) {
-      displacement[*v].x = 0;
-      displacement[*v].y = 0;
-    }
+    for (tie(v, v_end) = vertices(g); v != v_end; ++v)
+      put(displacement, *v, typename Topology::point_difference_type());
     force_pairs(g, apply_force);
 
     // Calculate attractive forces
@@ -284,52 +308,47 @@ fruchterman_reingold_force_directed_layout
     for (tie(e, e_end) = edges(g); e != e_end; ++e) {
       vertex_descriptor v = source(*e, g);
       vertex_descriptor u = target(*e, g);
-      Dim delta_x = position[v].x - position[u].x;
-      Dim delta_y = position[v].y - position[u].y;
-      Dim dist = sqrt(delta_x * delta_x + delta_y * delta_y);
-      Dim fa = attractive_force(*e, k, dist, g);
-
-      displacement[v].x -= delta_x / dist * fa;
-      displacement[v].y -= delta_y / dist * fa;
-      displacement[u].x += delta_x / dist * fa;
-      displacement[u].y += delta_y / dist * fa;
+
+      // When the vertices land on top of each other, move the
+      // first vertex away from the boundaries.
+      ::boost::detail::maybe_jitter_point(topology, position, u, get(position, v));
+
+      typename Topology::point_difference_type delta =
+        topology.difference(get(position, v), get(position, u));
+      double dist = topology.distance(get(position, u), get(position, v));
+      double fa = attractive_force(*e, k, dist, g);
+
+      put(displacement, v, get(displacement, v) - (fa / dist) * delta);
+      put(displacement, u, get(displacement, u) + (fa / dist) * delta);
     }
 
-    // Update positions
-    for (tie(v, v_end) = vertices(g); v != v_end; ++v) {
-      BOOST_USING_STD_MIN();
-      BOOST_USING_STD_MAX();
-      Dim disp_size = sqrt(displacement[*v].x * displacement[*v].x
-                           + displacement[*v].y * displacement[*v].y);
-      position[*v].x += displacement[*v].x / disp_size 
-                     * min BOOST_PREVENT_MACRO_SUBSTITUTION (disp_size, temp);
-      position[*v].y += displacement[*v].y / disp_size 
-                     * min BOOST_PREVENT_MACRO_SUBSTITUTION (disp_size, temp);
-      position[*v].x = min BOOST_PREVENT_MACRO_SUBSTITUTION 
-                         (width / 2, 
-                          max BOOST_PREVENT_MACRO_SUBSTITUTION(-width / 2, 
-                                                               position[*v].x));
-      position[*v].y = min BOOST_PREVENT_MACRO_SUBSTITUTION
-                         (height / 2, 
-                          max BOOST_PREVENT_MACRO_SUBSTITUTION(-height / 2, 
-                                                               position[*v].y));
+    if (double temp = cool()) {
+      // Update positions
+      BGL_FORALL_VERTICES_T (v, g, Graph) {
+        BOOST_USING_STD_MIN();
+        BOOST_USING_STD_MAX();
+        double disp_size = topology.norm(get(displacement, v));
+        put(position, v, topology.adjust(get(position, v), get(displacement, v) * (min BOOST_PREVENT_MACRO_SUBSTITUTION (disp_size, temp) / disp_size)));
+        put(position, v, topology.bound(get(position, v)));
+      }
+    } else {
+      break;
     }
-  } while (temp = cool());
+  } while (true);
 }
 
 namespace detail {
   template<typename DisplacementMap>
   struct fr_force_directed_layout
   {
-    template<typename Graph, typename PositionMap, typename Dim,
+    template<typename Topology, typename Graph, typename PositionMap, 
              typename AttractiveForce, typename RepulsiveForce,
              typename ForcePairs, typename Cooling,
              typename Param, typename Tag, typename Rest>
     static void
     run(const Graph&    g,
         PositionMap     position,
-        Dim             width,
-        Dim             height,
+        const Topology& topology,
         AttractiveForce attractive_force,
         RepulsiveForce  repulsive_force,
         ForcePairs      force_pairs,
@@ -338,7 +357,7 @@ namespace detail {
         const bgl_named_params<Param, Tag, Rest>&)
     {
       fruchterman_reingold_force_directed_layout
-        (g, position, width, height, attractive_force, repulsive_force,
+        (g, position, topology, attractive_force, repulsive_force,
          force_pairs, cool, displacement);
     }
   };
@@ -346,15 +365,14 @@ namespace detail {
   template<>
   struct fr_force_directed_layout<error_property_not_found>
   {
-    template<typename Graph, typename PositionMap, typename Dim,
+    template<typename Topology, typename Graph, typename PositionMap, 
              typename AttractiveForce, typename RepulsiveForce,
              typename ForcePairs, typename Cooling,
              typename Param, typename Tag, typename Rest>
     static void
     run(const Graph&    g,
         PositionMap     position,
-        Dim             width,
-        Dim             height,
+        const Topology& topology,
         AttractiveForce attractive_force,
         RepulsiveForce  repulsive_force,
         ForcePairs      force_pairs,
@@ -362,59 +380,63 @@ namespace detail {
         error_property_not_found,
         const bgl_named_params<Param, Tag, Rest>& params)
     {
-      std::vector<simple_point<Dim> > displacements(num_vertices(g));
+      typedef typename Topology::point_difference_type PointDiff;
+      std::vector<PointDiff> displacements(num_vertices(g));
       fruchterman_reingold_force_directed_layout
-        (g, position, width, height, attractive_force, repulsive_force,
+        (g, position, topology, attractive_force, repulsive_force,
          force_pairs, cool,
          make_iterator_property_map
          (displacements.begin(),
           choose_const_pmap(get_param(params, vertex_index), g,
                             vertex_index),
-          simple_point<Dim>()));
+          PointDiff()));
     }
   };
 
 } // end namespace detail
 
-template<typename Graph, typename PositionMap, typename Dim, typename Param,
+template<typename Topology, typename Graph, typename PositionMap, typename Param,
          typename Tag, typename Rest>
 void
 fruchterman_reingold_force_directed_layout
   (const Graph&    g,
    PositionMap     position,
-   Dim             width,
-   Dim             height,
+   const Topology& topology,
    const bgl_named_params<Param, Tag, Rest>& params)
 {
   typedef typename property_value<bgl_named_params<Param,Tag,Rest>,
                                   vertex_displacement_t>::type D;
 
   detail::fr_force_directed_layout<D>::run
-    (g, position, width, height,
+    (g, position, topology, 
      choose_param(get_param(params, attractive_force_t()),
                   square_distance_attractive_force()),
      choose_param(get_param(params, repulsive_force_t()),
                   square_distance_repulsive_force()),
      choose_param(get_param(params, force_pairs_t()),
-                  make_grid_force_pairs(width, height, position, g)),
+                  make_grid_force_pairs(topology, position, g)),
      choose_param(get_param(params, cooling_t()),
-                  linear_cooling<Dim>(100)),
+                  linear_cooling<double>(100)),
      get_param(params, vertex_displacement_t()),
      params);
 }
 
-template<typename Graph, typename PositionMap, typename Dim>
+template<typename Topology, typename Graph, typename PositionMap>
 void
-fruchterman_reingold_force_directed_layout(const Graph&    g,
-                                           PositionMap     position,
-                                           Dim             width,
-                                           Dim             height)
+fruchterman_reingold_force_directed_layout
+  (const Graph&    g,
+   PositionMap     position,
+   const Topology& topology)
 {
   fruchterman_reingold_force_directed_layout
-    (g, position, width, height,
+    (g, position, topology,
      attractive_force(square_distance_attractive_force()));
 }
 
 } // end namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/fruchterman_reingold.hpp>
+#endif
+
 #endif // BOOST_GRAPH_FRUCHTERMAN_REINGOLD_FORCE_DIRECTED_LAYOUT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/geodesic_distance.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/geodesic_distance.hpp
new file mode 100644 (file)
index 0000000..042d39e
--- /dev/null
@@ -0,0 +1,210 @@
+// (C) Copyright Andrew Sutton 2007
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_GEODESIC_DISTANCE_HPP
+#define BOOST_GRAPH_GEODESIC_DISTANCE_HPP
+
+#include <boost/graph/detail/geodesic.hpp>
+#include <boost/graph/exterior_property.hpp>
+
+namespace boost
+{
+template <typename Graph,
+          typename DistanceType,
+          typename ResultType,
+          typename Divides = std::divides<ResultType> >
+struct mean_geodesic_measure
+    : public geodesic_measure<Graph, DistanceType, ResultType>
+{
+    typedef geodesic_measure<Graph, DistanceType, ResultType> base_type;
+    typedef typename base_type::distance_type distance_type;
+    typedef typename base_type::result_type result_type;
+
+    result_type operator ()(distance_type d, const Graph& g)
+    {
+        function_requires< VertexListGraphConcept<Graph> >();
+        function_requires< NumericValueConcept<DistanceType> >();
+        function_requires< NumericValueConcept<ResultType> >();
+        function_requires< AdaptableBinaryFunctionConcept<Divides,ResultType,ResultType,ResultType> >();
+
+        return (d == base_type::infinite_distance())
+            ? base_type::infinite_result()
+            : div(result_type(d), result_type(num_vertices(g) - 1));
+    }
+    Divides div;
+};
+
+template <typename Graph, typename DistanceMap>
+inline mean_geodesic_measure<Graph, typename property_traits<DistanceMap>::value_type, double>
+measure_mean_geodesic(const Graph&, DistanceMap)
+{
+    return mean_geodesic_measure<Graph, typename property_traits<DistanceMap>::value_type, double>();
+}
+
+template <typename T, typename Graph, typename DistanceMap>
+inline mean_geodesic_measure<Graph, typename property_traits<DistanceMap>::value_type, T>
+measure_mean_geodesic(const Graph&, DistanceMap)
+{
+    return mean_geodesic_measure<Graph, typename property_traits<DistanceMap>::value_type, T>();
+}
+
+// This is a little different because it's expected that the result type
+// should (must?) be the same as the distance type. There's a type of
+// transitivity in this thinking... If the average of distances has type
+// X then the average of x's should also be type X. Is there a case where this
+// is not true?
+//
+// This type is a little under-genericized... It needs generic parameters
+// for addition and division.
+template <typename Graph, typename DistanceType>
+struct mean_graph_distance_measure
+    : public geodesic_measure<Graph, DistanceType, DistanceType>
+{
+    typedef geodesic_measure<Graph, DistanceType, DistanceType> base_type;
+    typedef typename base_type::distance_type distance_type;
+    typedef typename base_type::result_type result_type;
+
+    inline result_type operator ()(distance_type d, const Graph& g)
+    {
+        function_requires< VertexListGraphConcept<Graph> >();
+        function_requires< NumericValueConcept<DistanceType> >();
+
+        if(d == base_type::infinite_distance()) {
+            return base_type::infinite_result();
+        }
+        else {
+            return d / result_type(num_vertices(g));
+        }
+    }
+};
+
+template <typename Graph, typename DistanceMap>
+inline mean_graph_distance_measure<Graph, typename property_traits<DistanceMap>::value_type>
+measure_graph_mean_geodesic(const Graph& g, DistanceMap dist)
+{
+    typedef typename property_traits<DistanceMap>::value_type T;
+    return mean_graph_distance_measure<Graph, T>();
+}
+
+template <typename Graph,
+          typename DistanceMap,
+          typename Measure,
+          typename Combinator>
+inline typename Measure::result_type
+mean_geodesic(const Graph& g,
+                DistanceMap dist,
+                Measure measure,
+                Combinator combine)
+{
+    function_requires< DistanceMeasureConcept<Measure,Graph> >();
+    typedef typename Measure::distance_type Distance;
+
+    Distance n = detail::combine_distances(g, dist, combine, Distance(0));
+    return measure(n, g);
+}
+
+template <typename Graph,
+            typename DistanceMap,
+            typename Measure>
+inline typename Measure::result_type
+mean_geodesic(const Graph& g, DistanceMap dist, Measure measure)
+{
+    function_requires< DistanceMeasureConcept<Measure,Graph> >();
+    typedef typename Measure::distance_type Distance;
+
+    return mean_geodesic(g, dist, measure, std::plus<Distance>());
+}
+
+template <typename Graph, typename DistanceMap>
+inline double
+mean_geodesic(const Graph& g, DistanceMap dist)
+{ return mean_geodesic(g, dist, measure_mean_geodesic(g, dist)); }
+
+template <typename T, typename Graph, typename DistanceMap>
+inline T
+mean_geodesic(const Graph& g, DistanceMap dist)
+{ return mean_geodesic(g, dist, measure_mean_geodesic<T>(g, dist)); }
+
+
+template <typename Graph,
+            typename DistanceMatrixMap,
+            typename GeodesicMap,
+            typename Measure>
+inline typename property_traits<GeodesicMap>::value_type
+all_mean_geodesics(const Graph& g,
+                    DistanceMatrixMap dist,
+                    GeodesicMap geo,
+                    Measure measure)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    function_requires< ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> >();
+    typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
+    function_requires< DistanceMeasureConcept<Measure,Graph> >();
+    typedef typename Measure::result_type Result;
+    function_requires< WritablePropertyMapConcept<GeodesicMap,Vertex> >();
+    function_requires< NumericValueConcept<Result> >();
+
+    // NOTE: We could compute the mean geodesic here by performing additional
+    // computations (i.e., adding and dividing). However, I don't really feel
+    // like fully genericizing the entire operation yet so I'm not going to.
+
+    Result inf = numeric_values<Result>::infinity();
+    Result sum = numeric_values<Result>::zero();
+    VertexIterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        DistanceMap dm = get(dist, *i);
+        Result r = mean_geodesic(g, dm, measure);
+        put(geo, *i, r);
+
+        // compute the sum along with geodesics
+        if(r == inf) {
+            sum = inf;
+        }
+        else if(sum != inf) {
+            sum += r;
+        }
+    }
+
+    // return the average of averages.
+    return sum / Result(num_vertices(g));
+}
+
+template <typename Graph, typename DistanceMatrixMap, typename GeodesicMap>
+inline typename property_traits<GeodesicMap>::value_type
+all_mean_geodesics(const Graph& g, DistanceMatrixMap dist, GeodesicMap geo)
+{
+    function_requires< GraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    function_requires< ReadablePropertyMapConcept<DistanceMatrixMap,Vertex> >();
+    typedef typename property_traits<DistanceMatrixMap>::value_type DistanceMap;
+    function_requires< WritablePropertyMapConcept<GeodesicMap,Vertex> >();
+    typedef typename property_traits<GeodesicMap>::value_type Result;
+
+    return all_mean_geodesics(g, dist, geo, measure_mean_geodesic<Result>(g, DistanceMap()));
+}
+
+
+template <typename Graph, typename GeodesicMap, typename Measure>
+inline typename Measure::result_type
+small_world_distance(const Graph& g, GeodesicMap geo, Measure measure)
+{
+    function_requires< DistanceMeasureConcept<Measure,Graph> >();
+    typedef typename Measure::result_type Result;
+
+    Result sum = detail::combine_distances(g, geo, std::plus<Result>(), Result(0));
+    return measure(sum, g);
+}
+
+template <typename Graph, typename GeodesicMap>
+inline typename property_traits<GeodesicMap>::value_type
+small_world_distance(const Graph& g, GeodesicMap geo)
+{ return small_world_distance(g, geo, measure_graph_mean_geodesic(g, geo)); }
+
+}
+
+#endif
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/graph_archetypes.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/graph_archetypes.hpp
index ce4c85fd08fd6075f4ac098ac90b1596d82b5c0d..9b364bb814c4a29080fb7b20dc6e7212de223557 100644 (file)
 #ifndef BOOST_GRAPH_ARCHETYPES_HPP
 #define BOOST_GRAPH_ARCHETYPES_HPP
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/concept_archetype.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
 
 namespace boost { // should use a different namespace for this
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/graph_as_tree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/graph_as_tree.hpp
index 7619dfcc0a425b6cf29a4ec46da3c27da49c1f0f..3758c3f009ee3c5edef8188461f6bff9608718b1 100644 (file)
@@ -13,7 +13,7 @@
 
 #include <vector>
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/tree_traits.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/breadth_first_search.hpp>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_concepts.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_concepts.hpp
new file mode 100644 (file)
index 0000000..fe33133
--- /dev/null
@@ -0,0 +1,626 @@
+//
+//=======================================================================
+// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
+//
+// Copyright 2009, Andrew Sutton
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+//
+#ifndef BOOST_GRAPH_CONCEPTS_HPP
+#define BOOST_GRAPH_CONCEPTS_HPP
+
+#include <boost/config.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/graph/numeric_values.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/concept/detail/concept_def.hpp>
+namespace boost
+{
+// dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+// you want to use vector_as_graph, it is!  I'm sure the graph
+// library leaves these out all over the place.  Probably a
+// redesign involving specializing a template with a static
+// member function is in order :(
+//
+// It is needed in order to allow us to write using boost::vertices as
+// needed for ADL when using vector_as_graph below.
+#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)            \
+ && !BOOST_WORKAROUND(__GNUC__, <= 2)                       \
+ && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+# define BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+#endif
+
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+template <class T>
+typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&);
+#endif
+
+    namespace concepts {
+    BOOST_concept(MultiPassInputIterator,(T)) {
+        BOOST_CONCEPT_USAGE(MultiPassInputIterator) {
+            BOOST_CONCEPT_ASSERT((InputIterator<T>));
+        }
+    };
+
+    BOOST_concept(Graph,(G))
+    {
+        typedef typename graph_traits<G>::vertex_descriptor vertex_descriptor;
+        typedef typename graph_traits<G>::directed_category directed_category;
+        typedef typename graph_traits<G>::edge_parallel_category
+        edge_parallel_category;
+
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(Graph)
+        {
+            BOOST_CONCEPT_ASSERT((DefaultConstructible<vertex_descriptor>));
+            BOOST_CONCEPT_ASSERT((EqualityComparable<vertex_descriptor>));
+            BOOST_CONCEPT_ASSERT((Assignable<vertex_descriptor>));
+        }
+        G g;
+    };
+
+    BOOST_concept(IncidenceGraph,(G))
+        : Graph<G>
+    {
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+        typedef typename graph_traits<G>::out_edge_iterator
+        out_edge_iterator;
+
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(IncidenceGraph) {
+            BOOST_CONCEPT_ASSERT((MultiPassInputIterator<out_edge_iterator>));
+            BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
+            BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
+            BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
+            BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+                                    incidence_graph_tag>));
+
+            p = out_edges(u, g);
+            n = out_degree(u, g);
+            e = *p.first;
+            u = source(e, g);
+            v = target(e, g);
+            const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+            p = out_edges(u, cg);
+            n = out_degree(u, cg);
+            e = *p.first;
+            u = source(e, cg);
+            v = target(e, cg);
+        }
+        std::pair<out_edge_iterator, out_edge_iterator> p;
+        typename graph_traits<G>::vertex_descriptor u, v;
+        typename graph_traits<G>::edge_descriptor e;
+        typename graph_traits<G>::degree_size_type n;
+        G g;
+    };
+
+    BOOST_concept(BidirectionalGraph,(G))
+        : IncidenceGraph<G>
+    {
+        typedef typename graph_traits<G>::in_edge_iterator
+        in_edge_iterator;
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(BidirectionalGraph) {
+        BOOST_CONCEPT_ASSERT((MultiPassInputIterator<in_edge_iterator>));
+        BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+            bidirectional_graph_tag>));
+
+        p = in_edges(v, g);
+        n = in_degree(v, g);
+        e = *p.first;
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+        p = in_edges(v, cg);
+        n = in_degree(v, cg);
+        e = *p.first;
+        }
+        std::pair<in_edge_iterator, in_edge_iterator> p;
+        typename graph_traits<G>::vertex_descriptor v;
+        typename graph_traits<G>::edge_descriptor e;
+        typename graph_traits<G>::degree_size_type n;
+        G g;
+    };
+
+    BOOST_concept(AdjacencyGraph,(G))
+        : Graph<G>
+    {
+        typedef typename graph_traits<G>::adjacency_iterator
+        adjacency_iterator;
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(AdjacencyGraph) {
+        BOOST_CONCEPT_ASSERT((MultiPassInputIterator<adjacency_iterator>));
+        BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+            adjacency_graph_tag>));
+
+        p = adjacent_vertices(v, g);
+        v = *p.first;
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+        p = adjacent_vertices(v, cg);
+        }
+        std::pair<adjacency_iterator,adjacency_iterator> p;
+        typename graph_traits<G>::vertex_descriptor v;
+        G g;
+    };
+
+    BOOST_concept(VertexListGraph,(G))
+        : Graph<G>
+    {
+        typedef typename graph_traits<G>::vertex_iterator vertex_iterator;
+        typedef typename graph_traits<G>::vertices_size_type vertices_size_type;
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(VertexListGraph) {
+        BOOST_CONCEPT_ASSERT((MultiPassInputIterator<vertex_iterator>));
+        BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+            vertex_list_graph_tag>));
+
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+        // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+        // you want to use vector_as_graph, it is!  I'm sure the graph
+        // library leaves these out all over the place.  Probably a
+        // redesign involving specializing a template with a static
+        // member function is in order :(
+        using boost::vertices;
+#endif
+        p = vertices(g);
+        v = *p.first;
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
+        // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
+        // you want to use vector_as_graph, it is!  I'm sure the graph
+        // library leaves these out all over the place.  Probably a
+        // redesign involving specializing a template with a static
+        // member function is in order :(
+        using boost::vertices;
+#endif
+
+        p = vertices(cg);
+        v = *p.first;
+        V = num_vertices(cg);
+        }
+        std::pair<vertex_iterator,vertex_iterator> p;
+        typename graph_traits<G>::vertex_descriptor v;
+        G g;
+        vertices_size_type V;
+    };
+
+    BOOST_concept(EdgeListGraph,(G))
+        : Graph<G>
+    {
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+        typedef typename graph_traits<G>::edge_iterator edge_iterator;
+        typedef typename graph_traits<G>::edges_size_type edges_size_type;
+        typedef typename graph_traits<G>::traversal_category
+        traversal_category;
+
+        BOOST_CONCEPT_USAGE(EdgeListGraph) {
+        BOOST_CONCEPT_ASSERT((MultiPassInputIterator<edge_iterator>));
+        BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
+        BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
+        BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
+        BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
+            edge_list_graph_tag>));
+
+        p = edges(g);
+        e = *p.first;
+        u = source(e, g);
+        v = target(e, g);
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+        p = edges(cg);
+        E = num_edges(cg);
+        e = *p.first;
+        u = source(e, cg);
+        v = target(e, cg);
+        }
+        std::pair<edge_iterator,edge_iterator> p;
+        typename graph_traits<G>::vertex_descriptor u, v;
+        typename graph_traits<G>::edge_descriptor e;
+        edges_size_type E;
+        G g;
+    };
+
+    BOOST_concept(VertexAndEdgeListGraph,(G))
+        : VertexListGraph<G>
+        , EdgeListGraph<G>
+    {
+    };
+
+    // Where to put the requirement for this constructor?
+    //      G g(n_vertices);
+    // Not in mutable graph, then LEDA graph's can't be models of
+    // MutableGraph.
+    BOOST_concept(EdgeMutableGraph,(G))
+    {
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+
+        BOOST_CONCEPT_USAGE(EdgeMutableGraph) {
+        p = add_edge(u, v, g);
+        remove_edge(u, v, g);
+        remove_edge(e, g);
+        clear_vertex(v, g);
+        }
+        G g;
+        edge_descriptor e;
+        std::pair<edge_descriptor, bool> p;
+        typename graph_traits<G>::vertex_descriptor u, v;
+    };
+
+    BOOST_concept(VertexMutableGraph,(G))
+    {
+
+        BOOST_CONCEPT_USAGE(VertexMutableGraph) {
+        v = add_vertex(g);
+        remove_vertex(v, g);
+        }
+        G g;
+        typename graph_traits<G>::vertex_descriptor u, v;
+    };
+
+    BOOST_concept(MutableGraph,(G))
+        : EdgeMutableGraph<G>
+        , VertexMutableGraph<G>
+    {
+    };
+
+    template <class edge_descriptor>
+    struct dummy_edge_predicate {
+        bool operator()(const edge_descriptor&) const {
+        return false;
+        }
+    };
+
+    BOOST_concept(MutableIncidenceGraph,(G))
+        : MutableGraph<G>
+    {
+        BOOST_CONCEPT_USAGE(MutableIncidenceGraph) {
+        remove_edge(iter, g);
+        remove_out_edge_if(u, p, g);
+        }
+        G g;
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+        dummy_edge_predicate<edge_descriptor> p;
+        typename boost::graph_traits<G>::vertex_descriptor u;
+        typename boost::graph_traits<G>::out_edge_iterator iter;
+    };
+
+    BOOST_concept(MutableBidirectionalGraph,(G))
+        : MutableIncidenceGraph<G>
+    {
+        BOOST_CONCEPT_USAGE(MutableBidirectionalGraph)
+        {
+            remove_in_edge_if(u, p, g);
+        }
+        G g;
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+        dummy_edge_predicate<edge_descriptor> p;
+        typename boost::graph_traits<G>::vertex_descriptor u;
+    };
+
+    BOOST_concept(MutableEdgeListGraph,(G))
+        : EdgeMutableGraph<G>
+    {
+        BOOST_CONCEPT_USAGE(MutableEdgeListGraph) {
+        remove_edge_if(p, g);
+        }
+        G g;
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+        dummy_edge_predicate<edge_descriptor> p;
+    };
+
+    BOOST_concept(VertexMutablePropertyGraph,(G))
+        : VertexMutableGraph<G>
+    {
+        BOOST_CONCEPT_USAGE(VertexMutablePropertyGraph) {
+        v = add_vertex(vp, g);
+        }
+        G g;
+        typename graph_traits<G>::vertex_descriptor v;
+        typename vertex_property<G>::type vp;
+    };
+
+    BOOST_concept(EdgeMutablePropertyGraph,(G))
+        : EdgeMutableGraph<G>
+    {
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+
+        BOOST_CONCEPT_USAGE(EdgeMutablePropertyGraph) {
+        p = add_edge(u, v, ep, g);
+        }
+        G g;
+        std::pair<edge_descriptor, bool> p;
+        typename graph_traits<G>::vertex_descriptor u, v;
+        typename edge_property<G>::type ep;
+    };
+
+    BOOST_concept(AdjacencyMatrix,(G))
+        : Graph<G>
+    {
+        typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
+
+        BOOST_CONCEPT_USAGE(AdjacencyMatrix) {
+        p = edge(u, v, g);
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+        p = edge(u, v, cg);
+        }
+        typename graph_traits<G>::vertex_descriptor u, v;
+        std::pair<edge_descriptor, bool> p;
+        G g;
+    };
+
+    BOOST_concept(ReadablePropertyGraph,(G)(X)(Property))
+        : Graph<G>
+    {
+        typedef typename property_map<G, Property>::const_type const_Map;
+
+        BOOST_CONCEPT_USAGE(ReadablePropertyGraph)
+        {
+        BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<const_Map, X>));
+
+        const_constraints(g);
+        }
+        void const_constraints(const G& cg) {
+        const_Map pmap = get(Property(), cg);
+        pval = get(Property(), cg, x);
+        ignore_unused_variable_warning(pmap);
+        }
+        G g;
+        X x;
+        typename property_traits<const_Map>::value_type pval;
+    };
+
+    BOOST_concept(PropertyGraph,(G)(X)(Property))
+        : ReadablePropertyGraph<G, X, Property>
+    {
+        typedef typename property_map<G, Property>::type Map;
+        BOOST_CONCEPT_USAGE(PropertyGraph) {
+        BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<Map, X>));
+
+        Map pmap = get(Property(), g);
+        pval = get(Property(), g, x);
+        put(Property(), g, x, pval);
+        ignore_unused_variable_warning(pmap);
+        }
+        G g;
+        X x;
+        typename property_traits<Map>::value_type pval;
+    };
+
+    BOOST_concept(LvaluePropertyGraph,(G)(X)(Property))
+        : ReadablePropertyGraph<G, X, Property>
+    {
+        typedef typename property_map<G, Property>::type Map;
+        typedef typename property_map<G, Property>::const_type const_Map;
+
+        BOOST_CONCEPT_USAGE(LvaluePropertyGraph) {
+        BOOST_CONCEPT_ASSERT((LvaluePropertyMapConcept<const_Map, X>));
+
+        pval = get(Property(), g, x);
+        put(Property(), g, x, pval);
+        }
+        G g;
+        X x;
+        typename property_traits<Map>::value_type pval;
+    };
+
+    // The *IndexGraph concepts are "semantic" graph concpepts. These can be
+    // applied to describe any graph that has an index map that can be accessed
+    // using the get(*_index, g) method. For example, adjacency lists with
+    // VertexSet == vecS are implicitly models of this concept.
+    //
+    // NOTE: We could require an associated type vertex_index_type, but that
+    // would mean propagating that type name into graph_traits and all of the
+    // other graph implementations. Much easier to simply call it unsigned.
+
+    BOOST_concept(VertexIndexGraph,(Graph))
+    {
+        BOOST_CONCEPT_USAGE(VertexIndexGraph)
+        {
+            typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+            typedef typename property_map<Graph, vertex_index_t>::type Map;
+            typedef unsigned Index; // This could be Graph::vertex_index_type
+            Map m = get(vertex_index, g);
+            Index x = get(vertex_index, g, Vertex());
+            ignore_unused_variable_warning(x);
+
+            // This is relaxed
+            renumber_vertex_indices(g);
+
+            const_constraints(g);
+        }
+        void const_constraints(const Graph& g)
+        {
+            typedef typename property_map<Graph, vertex_index_t>::const_type Map;
+            Map m = get(vertex_index, g);
+            ignore_unused_variable_warning(m);
+        }
+    private:
+        Graph g;
+    };
+
+    BOOST_concept(EdgeIndexGraph,(Graph))
+    {
+        BOOST_CONCEPT_USAGE(EdgeIndexGraph)
+        {
+            typedef typename graph_traits<Graph>::edge_descriptor Edge;
+            typedef typename property_map<Graph, edge_index_t>::type Map;
+            typedef unsigned Index; // This could be Graph::vertex_index_type
+            Map m = get(edge_index, g);
+            Index x = get(edge_index, g, Edge());
+            ignore_unused_variable_warning(x);
+
+            // This is relaxed
+            renumber_edge_indices(g);
+
+            const_constraints(g);
+        }
+        void const_constraints(const Graph& g)
+        {
+            typedef typename property_map<Graph, edge_index_t>::const_type Map;
+            Map m = get(edge_index, g);
+            ignore_unused_variable_warning(m);
+        }
+    private:
+        Graph g;
+    };
+
+    // This needs to move out of the graph library
+    BOOST_concept(Buffer,(B))
+    {
+        BOOST_CONCEPT_USAGE(Buffer) {
+        b.push(t);
+        b.pop();
+        typename B::value_type& v = b.top();
+        const_constraints(b);
+        ignore_unused_variable_warning(v);
+        }
+        void const_constraints(const B& cb) {
+        const typename B::value_type& v = cb.top();
+        n = cb.size();
+        bool e = cb.empty();
+        ignore_unused_variable_warning(v);
+        ignore_unused_variable_warning(e);
+        }
+        typename B::size_type n;
+        typename B::value_type t;
+        B b;
+    };
+
+    BOOST_concept(ColorValue,(C))
+        : EqualityComparable<C>
+        , DefaultConstructible<C>
+    {
+        BOOST_CONCEPT_USAGE(ColorValue) {
+        c = color_traits<C>::white();
+        c = color_traits<C>::gray();
+        c = color_traits<C>::black();
+        }
+        C c;
+    };
+
+    BOOST_concept(BasicMatrix,(M)(I)(V))
+    {
+        BOOST_CONCEPT_USAGE(BasicMatrix) {
+        V& elt = A[i][j];
+        const_constraints(A);
+        ignore_unused_variable_warning(elt);
+        }
+        void const_constraints(const M& cA) {
+        const V& elt = cA[i][j];
+        ignore_unused_variable_warning(elt);
+        }
+        M A;
+        I i, j;
+    };
+
+    // The following concepts describe aspects of numberic values and measure
+    // functions. We're extending the notion of numeric values to include
+    // emulation for zero and infinity.
+
+    BOOST_concept(NumericValue,(Numeric))
+    {
+        BOOST_CONCEPT_USAGE(NumericValue)
+        {
+            function_requires< DefaultConstructible<Numeric> >();
+            function_requires< CopyConstructible<Numeric> >();
+            numeric_values<Numeric>::zero();
+            numeric_values<Numeric>::infinity();
+        }
+    };
+
+    BOOST_concept(DegreeMeasure,(Measure)(Graph))
+    {
+        BOOST_CONCEPT_USAGE(DegreeMeasure)
+        {
+            typedef typename Measure::degree_type Degree;
+            typedef typename Measure::vertex_type Vertex;
+
+            Degree d = m(Vertex(), g);
+            ignore_unused_variable_warning(d);
+        }
+    private:
+        Measure m;
+        Graph g;
+    };
+
+    BOOST_concept(DistanceMeasure,(Measure)(Graph))
+    {
+        BOOST_CONCEPT_USAGE(DistanceMeasure)
+        {
+            typedef typename Measure::distance_type Distance;
+            typedef typename Measure::result_type Result;
+            Result r = m(Distance(), g);
+            ignore_unused_variable_warning(r);
+        }
+    private:
+        Measure m;
+        Graph g;
+    };
+
+} /* namespace concepts */
+
+using boost::concepts::MultiPassInputIteratorConcept;
+
+// Graph concepts
+using boost::concepts::GraphConcept;
+using boost::concepts::IncidenceGraphConcept;
+using boost::concepts::BidirectionalGraphConcept;
+using boost::concepts::AdjacencyGraphConcept;
+using boost::concepts::VertexListGraphConcept;
+using boost::concepts::EdgeListGraphConcept;
+using boost::concepts::VertexAndEdgeListGraphConcept;
+using boost::concepts::EdgeMutableGraphConcept;
+using boost::concepts::VertexMutableGraphConcept;
+using boost::concepts::MutableGraphConcept;
+using boost::concepts::MutableIncidenceGraphConcept;
+using boost::concepts::MutableBidirectionalGraphConcept;
+using boost::concepts::MutableEdgeListGraphConcept;
+using boost::concepts::VertexMutablePropertyGraphConcept;
+using boost::concepts::EdgeMutablePropertyGraphConcept;
+using boost::concepts::AdjacencyMatrixConcept;
+using boost::concepts::ReadablePropertyGraphConcept;
+using boost::concepts::PropertyGraphConcept;
+using boost::concepts::LvaluePropertyGraphConcept;
+using boost::concepts::VertexIndexGraphConcept;
+using boost::concepts::EdgeIndexGraphConcept;
+
+// Utility concepts
+using boost::concepts::BufferConcept;
+using boost::concepts::ColorValueConcept;
+using boost::concepts::BasicMatrixConcept;
+using boost::concepts::NumericValueConcept;
+using boost::concepts::DistanceMeasureConcept;
+using boost::concepts::DegreeMeasureConcept;
+
+
+} /* namespace boost */
+#include <boost/concept/detail/concept_undef.hpp>
+
+#endif /* BOOST_GRAPH_CONCEPTS_H */
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_mutability_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_mutability_traits.hpp
new file mode 100644 (file)
index 0000000..726d8d1
--- /dev/null
@@ -0,0 +1,204 @@
+// Copyright (C) 2009 Andrew Sutton
+//
+// 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)
+
+#ifndef BOOST_GRAPH_MUTABILITY_TRAITS_HPP
+#define BOOST_GRAPH_MUTABILITY_TRAITS_HPP
+
+#include <boost/config.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost {
+
+// The mutabiltiy categories classify graphs by their mutating operations
+// on the edge and vertex sets. This is a substantially more refined
+// categorization than the MutableGraph and MutablePropertyGraph denote.
+// Currently, this framework is only used in the graph tests to help
+// dispatch test to the correct places. However, there are probably some
+// constructive or destructive algorithms (i.e., graph generators) that
+// may use these to describe requirements on graph inputs.
+
+struct add_vertex_tag { };
+struct add_vertex_property_tag : virtual add_vertex_tag { };
+struct add_edge_tag { };
+struct add_edge_property_tag : virtual add_edge_tag { };
+struct remove_vertex_tag { };
+struct remove_edge_tag { };
+
+struct mutable_vertex_graph_tag
+    : virtual add_vertex_tag, virtual remove_vertex_tag
+{ };
+struct mutable_vertex_property_graph_tag
+    : virtual add_vertex_property_tag, virtual remove_vertex_tag
+{ };
+
+struct mutable_edge_graph_tag
+    : virtual add_edge_tag, virtual remove_edge_tag
+{ };
+struct mutable_edge_property_graph_tag
+    : virtual add_edge_property_tag, virtual remove_edge_tag
+{ };
+
+struct mutable_graph_tag
+    : virtual mutable_vertex_graph_tag
+    , virtual mutable_edge_graph_tag
+{ };
+struct mutable_property_graph_tag
+    : virtual mutable_vertex_property_graph_tag
+    , virtual mutable_edge_property_graph_tag
+{ };
+
+// Some graphs just don't like to be torn down. Note this only restricts
+// teardown to the set of vertices, not the vertex set.
+// TODO: Find a better name for this tag.
+struct add_only_property_graph_tag
+    : virtual add_vertex_property_tag
+    , virtual mutable_edge_property_graph_tag
+{ };
+
+/**
+ * The graph_mutability_traits provide methods for determining the
+ * interfaces supported by graph classes for adding and removing vertices
+ * and edges.
+ */
+template <typename Graph>
+struct graph_mutability_traits {
+    typedef typename Graph::mutability_category category;
+};
+
+template <typename Graph>
+struct graph_has_add_vertex
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            add_vertex_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_vertex_with_property
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            add_vertex_property_tag
+        >::value
+    >
+{ };
+
+
+template <typename Graph>
+struct graph_has_remove_vertex
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            remove_vertex_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_edge
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            add_edge_tag
+        >::value
+    >
+{ };
+
+template <typename Graph>
+struct graph_has_add_edge_with_property
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            add_edge_property_tag
+        >::value
+    >
+{ };
+
+
+template <typename Graph>
+struct graph_has_remove_edge
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            remove_edge_tag
+        >::value
+    >
+{ };
+
+
+template <typename Graph>
+struct is_mutable_vertex_graph
+    : mpl::and_<
+        graph_has_add_vertex<Graph>,
+        graph_has_remove_vertex<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_mutable_vertex_property_graph
+    : mpl::and_<
+        graph_has_add_vertex_with_property<Graph>,
+        graph_has_remove_vertex<Graph>
+    >
+{ };
+
+
+template <typename Graph>
+struct is_mutable_edge_graph
+    : mpl::and_<
+        graph_has_add_edge<Graph>,
+        graph_has_remove_edge<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_mutable_edge_property_graph
+    : mpl::and_<
+        graph_has_add_edge_with_property<Graph>,
+        graph_has_remove_edge<Graph>
+    >
+{ };
+
+
+template <typename Graph>
+struct is_mutable_graph
+    : mpl::and_<
+        is_mutable_vertex_graph<Graph>,
+        is_mutable_edge_graph<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_mutable_property_graph
+    : mpl::and_<
+        is_mutable_vertex_property_graph<Graph>,
+        is_mutable_edge_property_graph<Graph>
+    >
+{ };
+
+template <typename Graph>
+struct is_add_only_property_graph
+    : mpl::bool_<
+        is_convertible<
+            typename graph_mutability_traits<Graph>::category,
+            add_only_property_graph_tag
+        >::value
+    >
+{ };
+
+/** @name Mutability Traits Specializations */
+//@{
+
+//@}
+
+} // namespace boost
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_stats.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_stats.hpp
new file mode 100644 (file)
index 0000000..47c0502
--- /dev/null
@@ -0,0 +1,136 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Alex Breuer
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_GRAPH_STATS_HPP
+#define BOOST_GRAPH_GRAPH_STATS_HPP
+
+#include <map>
+#include <list>
+#include <boost/graph/iteration_macros.hpp>
+
+namespace boost { namespace graph {
+
+template<typename Graph>
+struct  sort_edge_by_origin {
+public:
+  typedef typename graph_traits<Graph>::edge_descriptor edge_type;
+
+  explicit sort_edge_by_origin( Graph& g ) : g(g) {} 
+
+  inline bool operator()( edge_type a, edge_type b ) {
+    return source( a, g ) == source( b, g ) ? target( a, g ) < target( b, g ) :
+      source( a, g ) < source( b, g );
+  }
+
+private:
+  Graph& g;
+};
+
+template<typename Graph>
+struct  equal_edge {
+public:
+  typedef typename graph_traits<Graph>::edge_descriptor edge_type;
+
+  explicit equal_edge( Graph& g ) : g(g) {} 
+
+  inline bool operator()( edge_type a, edge_type b ) {
+    return source( a, g ) == source( b, g ) &&
+      target( a, g ) == target( b, g );
+  }
+
+private:
+  Graph& g;
+};
+
+template<typename Graph>
+unsigned long num_dup_edges( Graph& g ) {
+  typedef typename graph_traits<Graph>::edge_iterator e_iterator_type;
+  typedef typename graph_traits<Graph>::edge_descriptor edge_type;
+
+  std::list<edge_type> all_edges;
+  
+  BGL_FORALL_EDGES_T( e, g, Graph ) {
+    all_edges.push_back( e );
+  }
+    
+  sort_edge_by_origin<Graph> cmp1( g );
+  all_edges.sort( cmp1 );
+  equal_edge<Graph> cmp2( g );
+  all_edges.unique( cmp2 );
+
+  return num_edges( g ) - all_edges.size();
+}
+
+
+template<typename Graph>
+std::map<unsigned long, unsigned long> dup_edge_dist( Graph& g ) {
+  std::map<unsigned long, unsigned long> dist;
+  typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
+
+  
+  BGL_FORALL_VERTICES_T( v, g, Graph ) {
+    std::list<vertex_type> front_neighbors;
+    a_iterator_type a_iter, a_end;
+    for( tie( a_iter, a_end ) = adjacent_vertices( v, g );
+         a_iter != a_end; ++a_iter ) {
+      front_neighbors.push_back( *a_iter );
+    }
+    
+    front_neighbors.sort();
+    front_neighbors.unique();
+    dist[out_degree( v, g ) - front_neighbors.size()] += 1;
+  }
+  return dist;
+}
+
+template<typename Graph>
+std::map<unsigned long, unsigned long> degree_dist( Graph& g ) {
+  std::map<unsigned long, unsigned long> dist;
+  typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
+  
+  BGL_FORALL_VERTICES_T( v, g, Graph ) {
+    dist[out_degree( v, g )] += 1;
+  }
+
+  return dist;
+}
+
+template<typename Graph>
+std::map<unsigned long, double> weight_degree_dist( Graph& g ) {
+  std::map<unsigned long, double> dist, n;
+  typedef typename graph_traits<Graph>::adjacency_iterator a_iterator_type;
+  typedef typename graph_traits<Graph>::vertex_descriptor vertex_type;
+  typedef typename property_map<Graph, edge_weight_t>::const_type edge_map_type;
+  typedef typename property_traits<edge_map_type>::value_type 
+    edge_weight_type;
+
+  typename property_map<Graph, edge_weight_t>::type  em = get( edge_weight, g );
+  
+  BGL_FORALL_VERTICES_T( v, g, Graph ) {
+      edge_weight_type tmp = 0;
+      BGL_FORALL_OUTEDGES_T( v, e, g, Graph ) {
+        tmp += em[e];
+      }
+      n[out_degree( v, g )] += 1.;
+      dist[out_degree( v, g )] += tmp;
+  }
+
+  for( std::map<unsigned long, double>::iterator iter = dist.begin();
+       iter != dist.end(); ++iter ) {
+    assert( n[iter->first] != 0 );
+    dist[iter->first] /= n[iter->first];
+  }
+
+  return dist;
+}
+
+}}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/graph_traits.hpp
new file mode 100644 (file)
index 0000000..b86ef0a
--- /dev/null
@@ -0,0 +1,319 @@
+//=======================================================================
+// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_TRAITS_HPP
+#define BOOST_GRAPH_TRAITS_HPP
+
+#include <boost/config.hpp>
+#include <iterator>
+#include <boost/tuple/tuple.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/iterator/iterator_categories.hpp>
+#include <boost/iterator/iterator_adaptor.hpp>
+#include <boost/pending/property.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost {
+
+    template <typename G>
+    struct graph_traits {
+        typedef typename G::vertex_descriptor      vertex_descriptor;
+        typedef typename G::edge_descriptor        edge_descriptor;
+        typedef typename G::adjacency_iterator     adjacency_iterator;
+        typedef typename G::out_edge_iterator      out_edge_iterator;
+        typedef typename G::in_edge_iterator       in_edge_iterator;
+        typedef typename G::vertex_iterator        vertex_iterator;
+        typedef typename G::edge_iterator          edge_iterator;
+
+        typedef typename G::directed_category      directed_category;
+        typedef typename G::edge_parallel_category edge_parallel_category;
+        typedef typename G::traversal_category     traversal_category;
+
+        typedef typename G::vertices_size_type     vertices_size_type;
+        typedef typename G::edges_size_type        edges_size_type;
+        typedef typename G::degree_size_type       degree_size_type;
+
+        static inline vertex_descriptor null_vertex();
+    };
+
+    template <typename G>
+    inline typename graph_traits<G>::vertex_descriptor
+    graph_traits<G>::null_vertex()
+    { return G::null_vertex(); }
+
+    // directed_category tags
+    struct directed_tag { };
+    struct undirected_tag { };
+    struct bidirectional_tag : public directed_tag { };
+
+    namespace detail {
+        inline bool is_directed(directed_tag) { return true; }
+        inline bool is_directed(undirected_tag) { return false; }
+    }
+
+    /** Return true if the given graph is directed. */
+    template <typename Graph>
+    bool is_directed(const Graph&) {
+        typedef typename graph_traits<Graph>::directed_category Cat;
+        return detail::is_directed(Cat());
+    }
+
+    /** Return false if the given graph is undirected. */
+    template <typename Graph>
+    bool is_undirected(const Graph& g) {
+        return !is_directed(g);
+    }
+
+    /** @name Directed/Undirected Graph Traits */
+    //@{
+    namespace graph_detail {
+        template <typename Tag>
+        struct is_directed_tag
+            : mpl::bool_<is_convertible<Tag, directed_tag>::value>
+        { };
+    } // namespace graph_detail
+
+    template <typename Graph>
+    struct is_directed_graph
+        : graph_detail::is_directed_tag<
+            typename graph_traits<Graph>::directed_category
+        >
+    { };
+
+    template <typename Graph>
+    struct is_undirected_graph
+        : mpl::not_< is_directed_graph<Graph> >
+    { };
+    //@}
+
+    // edge_parallel_category tags
+    struct allow_parallel_edge_tag { };
+    struct disallow_parallel_edge_tag { };
+
+    namespace detail {
+        inline bool allows_parallel(allow_parallel_edge_tag) { return true; }
+        inline bool allows_parallel(disallow_parallel_edge_tag) { return false; }
+    }
+
+    template <typename Graph>
+    bool allows_parallel_edges(const Graph&) {
+        typedef typename graph_traits<Graph>::edge_parallel_category Cat;
+        return detail::allows_parallel(Cat());
+    }
+
+    /** @name Parallel Edges Traits */
+    //@{
+    /**
+     * The is_multigraph metafunction returns true if the graph allows
+     * parallel edges. Technically, a multigraph is a simple graph that
+     * allows parallel edges, but since there are no traits for the allowance
+     * or disallowance of loops, this is a moot point.
+     */
+    template <typename Graph>
+    struct is_multigraph
+        : mpl::bool_<
+            is_same<
+                typename graph_traits<Graph>::edge_parallel_category,
+                allow_parallel_edge_tag
+            >::value
+        >
+    { };
+    //@}
+
+    // traversal_category tags
+    struct incidence_graph_tag { };
+    struct adjacency_graph_tag { };
+    struct bidirectional_graph_tag : virtual incidence_graph_tag { };
+    struct vertex_list_graph_tag { };
+    struct edge_list_graph_tag { };
+    struct adjacency_matrix_tag { };
+
+    /** @name Taversal Category Traits
+     * These traits classify graph types by their supported methods of
+     * vertex and edge traversal.
+     */
+    //@{
+    template <typename Graph>
+    struct is_incidence_graph
+        : mpl::bool_<
+            is_convertible<
+                typename graph_traits<Graph>::traversal_category,
+                incidence_graph_tag
+            >::value
+        >
+    { };
+
+    template <typename Graph>
+    struct is_bidirectional_graph
+        : mpl::bool_<
+            is_convertible<
+                typename graph_traits<Graph>::traversal_category,
+                bidirectional_graph_tag
+            >::value
+        >
+    { };
+
+    template <typename Graph>
+    struct is_vertex_list_graph
+        : mpl::bool_<
+            is_convertible<
+                typename graph_traits<Graph>::traversal_category,
+                vertex_list_graph_tag
+            >::value
+        >
+    { };
+
+    template <typename Graph>
+    struct is_edge_list_graph
+        : mpl::bool_<
+            is_convertible<
+                typename graph_traits<Graph>::traversal_category,
+                edge_list_graph_tag
+            >::value
+        >
+    { };
+    //@}
+
+    /** @name Directed Graph Traits
+     * These metafunctions are used to fully classify directed vs. undirected
+     * graphs. Recall that an undirected graph is also bidirectional, but it
+     * cannot be both undirected and directed at the same time.
+     */
+    //@{
+    template <typename Graph>
+    struct is_directed_unidirectional_graph
+        : mpl::and_<
+            is_directed_graph<Graph>, mpl::not_< is_bidirectional_graph<Graph> >
+        >
+    { };
+
+    template <typename Graph>
+    struct is_directed_bidirectional_graph
+        : mpl::and_<
+            is_directed_graph<Graph>, is_bidirectional_graph<Graph>
+        >
+    { };
+    //@}
+
+    //?? not the right place ?? Lee
+    typedef boost::forward_traversal_tag multi_pass_input_iterator_tag;
+
+    template <typename G>
+    struct edge_property_type {
+        typedef typename G::edge_property_type type;
+    };
+    template <typename G>
+    struct vertex_property_type {
+        typedef typename G::vertex_property_type type;
+    };
+    template <typename G>
+    struct graph_property_type {
+        typedef typename G::graph_property_type type;
+    };
+
+    struct no_bundle { };
+    struct no_vertex_bundle : no_bundle { };
+    struct no_edge_bundle : no_bundle { };
+
+    template<typename G>
+    struct vertex_bundle_type {
+        typedef typename G::vertex_bundled type;
+    };
+
+    template<typename G>
+    struct edge_bundle_type {
+        typedef typename G::edge_bundled type;
+    };
+
+    namespace graph { namespace detail {
+        template<typename Graph, typename Descriptor>
+        class bundled_result {
+            typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+            typedef typename mpl::if_c<(is_same<Descriptor, Vertex>::value),
+                                        vertex_bundle_type<Graph>,
+                                        edge_bundle_type<Graph> >::type bundler;
+        public:
+            typedef typename bundler::type type;
+        };
+
+    } } // namespace graph::detail
+
+    namespace graph_detail {
+        // A helper metafunction for determining whether or not a type is
+        // bundled.
+        template <typename T>
+        struct is_no_bundle
+            : mpl::bool_<is_convertible<T, no_bundle>::value>
+        { };
+    } // namespace graph_detail
+
+    /** @name Graph Property Traits
+     * These metafunctions (along with those above), can be used to access the
+     * vertex and edge properties (bundled or otherwise) of vertices and
+     * edges.
+     */
+    //@{
+    template <typename Graph>
+    struct has_vertex_property
+        : mpl::not_<
+            typename detail::is_no_property<typename vertex_property_type<Graph>::type>
+        >::type
+    { };
+    template <typename Graph>
+    struct has_edge_property
+        : mpl::not_<
+            typename detail::is_no_property<typename edge_property_type<Graph>::type>
+        >::type
+    { };
+    template <typename Graph>
+    struct has_bundled_vertex_property
+        : mpl::not_<
+            graph_detail::is_no_bundle<typename vertex_bundle_type<Graph>::type>
+        >
+    { };
+    template <typename Graph>
+    struct has_bundled_edge_property
+        : mpl::not_<
+            graph_detail::is_no_bundle<typename edge_bundle_type<Graph>::type>
+        >
+    { };
+    //@}
+
+} // namespace boost
+
+// Since pair is in namespace std, Koenig lookup will find source and
+// target if they are also defined in namespace std.  This is illegal,
+// but the alternative is to put source and target in the global
+// namespace which causes name conflicts with other libraries (like
+// SUIF).
+namespace std {
+
+  /* Some helper functions for dealing with pairs as edges */
+  template <class T, class G>
+  T source(pair<T,T> p, const G&) { return p.first; }
+
+  template <class T, class G>
+  T target(pair<T,T> p, const G&) { return p.second; }
+
+}
+
+#if defined(__GNUC__) && defined(__SGI_STL_PORT)
+// For some reason g++ with STLport does not see the above definition
+// of source() and target() unless we bring them into the boost
+// namespace.
+namespace boost {
+  using std::source;
+  using std::target;
+}
+#endif
+
+#endif // BOOST_GRAPH_TRAITS_HPP
similarity index 84%
rename from deal.II/contrib/boost/include/boost/graph/graph_utility.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/graph_utility.hpp
index 018442b91be2751ce1b0bbcda52eb70d545cf16a..9976074c1aed4cab9e03c92a6830181ecf5fb541 100644 (file)
@@ -420,6 +420,91 @@ namespace boost {
   make_list(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
     { return std::make_pair(t1, std::make_pair(t2, std::make_pair(t3, std::make_pair(t4, t5)))); }
 
+  namespace graph {
+    
+    // Functor for remove_parallel_edges: edge property of the removed edge is added to the remaining
+    template <typename EdgeProperty>
+    struct add_removed_edge_property
+    {
+      add_removed_edge_property(EdgeProperty ep) : ep(ep) {}
+      
+      template <typename Edge>
+      void operator() (Edge stay, Edge away)
+      {
+        put(ep, stay, get(ep, stay) + get(ep, away));
+      }
+      EdgeProperty  ep;
+    };
+
+    // Same as above: edge property is capacity here
+    template <typename Graph>
+    struct add_removed_edge_capacity
+      : add_removed_edge_property<typename property_map<Graph, edge_capacity_t>::type>
+    {
+      typedef add_removed_edge_property<typename property_map<Graph, edge_capacity_t>::type> base;
+      add_removed_edge_capacity(Graph& g) : base(get(edge_capacity, g)) {}
+    };    
+
+    template <typename Graph>
+    bool has_no_vertices(const Graph& g) {
+      typedef typename boost::graph_traits<Graph>::vertex_iterator vi;
+      std::pair<vi, vi> p = vertices(g);
+      return (p.first == p.second);
+    }
+
+    template <typename Graph>
+    bool has_no_edges(const Graph& g) {
+      typedef typename boost::graph_traits<Graph>::edge_iterator ei;
+      std::pair<ei, ei> p = edges(g);
+      return (p.first == p.second);
+    }
+
+    template <typename Graph>
+    bool has_no_out_edges(const typename boost::graph_traits<Graph>::vertex_descriptor& v, const Graph& g) {
+      typedef typename boost::graph_traits<Graph>::out_edge_iterator ei;
+      std::pair<ei, ei> p = out_edges(v, g);
+      return (p.first == p.second);
+    }
+
+  } // namespace graph
+
+  #include <boost/graph/iteration_macros.hpp>
+
+  template <class PropertyIn, class PropertyOut, class Graph>
+  void copy_vertex_property(PropertyIn p_in, PropertyOut p_out, Graph& g)
+  {
+    BGL_FORALL_VERTICES_T(u, g, Graph)
+      put(p_out, u, get(p_in, g));
+  }
+
+  template <class PropertyIn, class PropertyOut, class Graph>
+  void copy_edge_property(PropertyIn p_in, PropertyOut p_out, Graph& g)
+  {
+    BGL_FORALL_EDGES_T(e, g, Graph)
+      put(p_out, e, get(p_in, g));
+  }
+
+  // Return true if property_map1 and property_map2 differ
+  // for any of the vertices in graph.
+  template <typename PropertyMapFirst,
+            typename PropertyMapSecond,
+            typename Graph>
+  bool are_property_maps_different
+  (const PropertyMapFirst property_map1,
+   const PropertyMapSecond property_map2,
+   const Graph& graph) {
+  
+    BGL_FORALL_VERTICES_T(vertex, graph, Graph) {
+      if (get(property_map1, vertex) !=
+          get(property_map2, vertex)) {
+
+        return (true);
+      }
+    }
+
+    return (false);
+  }
+
 } /* namespace boost */
 
 #endif /* BOOST_GRAPH_UTILITY_HPP*/
similarity index 74%
rename from deal.II/contrib/boost/include/boost/graph/graphml.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/graphml.hpp
index be7a804e3f15fe2143a4aa95188c268f02b67762..f6256a0fe26906417cb53a513c60de37e453bad3 100644 (file)
 #include <boost/mpl/vector.hpp>
 #include <boost/mpl/find.hpp>
 #include <boost/mpl/for_each.hpp>
+#if 0 // Change this back later
+#include <boost/property_tree/detail/xml_parser_utils.hpp>
+#endif
 #include <exception>
 #include <sstream>
 
-namespace boost 
+namespace boost
 {
 
+  // FIXME: Remove this once property_tree is stable
+  namespace graph_detail_from_property_tree {
+
+// ----------------------------------------------------------------------------
+// Copyright (C) 2002-2006 Marcin Kalicinski
+//
+// 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)
+//
+// For more information, see www.boost.org
+// ----------------------------------------------------------------------------
+
+    // Naively convert narrow string to another character type
+    template<class Ch>
+    std::basic_string<Ch> widen(const char *text)
+    {
+        std::basic_string<Ch> result;
+        while (*text)
+        {
+            result += Ch(*text);
+            ++text;
+        }
+        return result;
+    }
+
+    template<class Ch>
+    std::basic_string<Ch> encode_char_entities(const std::basic_string<Ch> &s)
+    {
+        typedef typename std::basic_string<Ch> Str;
+        Str r;
+        typename Str::const_iterator end = s.end();
+        for (typename Str::const_iterator it = s.begin(); it != end; ++it)
+        {
+            switch (*it)
+            {
+                case Ch('<'): r += boost::graph_detail_from_property_tree::widen<Ch>("&lt;"); break;
+                case Ch('>'): r += boost::graph_detail_from_property_tree::widen<Ch>("&gt;"); break;
+                case Ch('&'): r += boost::graph_detail_from_property_tree::widen<Ch>("&amp;"); break;
+                case Ch('"'): r += boost::graph_detail_from_property_tree::widen<Ch>("&quot;"); break;
+                case Ch('\''): r += boost::graph_detail_from_property_tree::widen<Ch>("&apos;"); break;
+                default: r += *it; break;
+            }
+        }
+        return r;
+    }
+    
+  }
+
 /////////////////////////////////////////////////////////////////////////////
 // Graph reader exceptions
 /////////////////////////////////////////////////////////////////////////////
-struct parse_error: public graph_exception 
+struct parse_error: public graph_exception
 {
-    parse_error(const std::string& error) {statement = "parse error: " + error;}        
+    parse_error(const std::string& err) {error = err; statement = "parse error: " + error;}
     virtual ~parse_error() throw() {}
     virtual const char* what() const throw() {return statement.c_str();}
     std::string statement;
+    std::string error;
 };
 
 
@@ -48,14 +101,14 @@ public:
 
     virtual boost::any do_add_vertex() = 0;
     virtual std::pair<boost::any,bool> do_add_edge(boost::any source, boost::any target) = 0;
-    
-    virtual void 
+
+    virtual void
     set_graph_property(const std::string& name, const std::string& value, const std::string& value_type) = 0;
 
-    virtual void 
+    virtual void
     set_vertex_property(const std::string& name, boost::any vertex, const std::string& value, const std::string& value_type) = 0;
-    
-    virtual void 
+
+    virtual void
     set_edge_property(const std::string& name, boost::any edge, const std::string& value, const std::string& value_type) = 0;
 };
 
@@ -87,27 +140,27 @@ class mutate_graph_impl : public mutate_graph
         return std::make_pair(any(retval.first), retval.second);
     }
 
-    virtual void 
+    virtual void
     set_graph_property(const std::string& name, const std::string& value, const std::string& value_type)
     {
         bool type_found = false;
         try
         {
             mpl::for_each<value_types>(put_property<MutableGraph,value_types>
-                                       (name, m_dp, m_g, value, value_type, m_type_names, type_found));            
+                                       (name, m_dp, m_g, value, value_type, m_type_names, type_found));
         }
         catch (bad_lexical_cast)
         {
-            throw parse_error("invalid value \"" + value + "\" for key " + 
+            throw parse_error("invalid value \"" + value + "\" for key " +
                               name + " of type " + value_type);
         }
         if (!type_found)
-            throw  parse_error("unrecognized type \"" + value_type + 
+            throw  parse_error("unrecognized type \"" + value_type +
                                "\" for key " + name);
-            
+
     }
-    
-    virtual void 
+
+    virtual void
     set_vertex_property(const std::string& name, any vertex, const std::string& value, const std::string& value_type)
     {
         bool type_found = false;
@@ -115,20 +168,20 @@ class mutate_graph_impl : public mutate_graph
         {
             mpl::for_each<value_types>(put_property<vertex_descriptor,value_types>
                                        (name, m_dp, any_cast<vertex_descriptor>(vertex),
-                                        value, value_type, m_type_names, type_found));            
+                                        value, value_type, m_type_names, type_found));
         }
         catch (bad_lexical_cast)
         {
-            throw parse_error("invalid value \"" + value + "\" for key " + 
+            throw parse_error("invalid value \"" + value + "\" for key " +
                               name + " of type " + value_type);
         }
         if (!type_found)
-            throw  parse_error("unrecognized type \"" + value_type + 
+            throw  parse_error("unrecognized type \"" + value_type +
                                "\" for key " + name);
-            
+
     }
-    
-    virtual void 
+
+    virtual void
     set_edge_property(const std::string& name, any edge, const std::string& value, const std::string& value_type)
     {
         bool type_found = false;
@@ -136,15 +189,15 @@ class mutate_graph_impl : public mutate_graph
         {
             mpl::for_each<value_types>(put_property<edge_descriptor,value_types>
                                        (name, m_dp, any_cast<edge_descriptor>(edge),
-                                        value, value_type, m_type_names, type_found));            
+                                        value, value_type, m_type_names, type_found));
         }
         catch (bad_lexical_cast)
         {
-            throw parse_error("invalid value \"" + value + "\" for key " + 
+            throw parse_error("invalid value \"" + value + "\" for key " +
                               name + " of type " + value_type);
         }
         if (!type_found)
-            throw  parse_error("unrecognized type \"" + value_type + 
+            throw  parse_error("unrecognized type \"" + value_type +
                                "\" for key " + name);
     }
 
@@ -152,11 +205,11 @@ class mutate_graph_impl : public mutate_graph
     class put_property
     {
     public:
-        put_property(const std::string& name, dynamic_properties& dp, const Key& key, 
-                     const std::string& value, const std::string& value_type, 
-                     char** type_names, bool& type_found)
-            : m_name(name), m_dp(dp), m_key(key), m_value(value), 
-              m_value_type(value_type), m_type_names(type_names), 
+        put_property(const std::string& name, dynamic_properties& dp, const Key& key,
+                     const std::string& value, const std::string& value_type,
+                     const char** type_names, bool& type_found)
+            : m_name(name), m_dp(dp), m_key(key), m_value(value),
+              m_value_type(value_type), m_type_names(type_names),
               m_type_found(type_found) {}
         template <class Value>
         void operator()(Value)
@@ -173,27 +226,27 @@ class mutate_graph_impl : public mutate_graph
         const Key& m_key;
         const std::string& m_value;
         const std::string& m_value_type;
-        char** m_type_names;
+        const char** m_type_names;
         bool& m_type_found;
-    };    
-    
+    };
+
 protected:
     MutableGraph& m_g;
     dynamic_properties& m_dp;
     typedef mpl::vector<bool, int, long, float, double, std::string> value_types;
-    static char* m_type_names[]; 
+    static const char* m_type_names[];
 };
 
 template<typename MutableGraph>
-char* mutate_graph_impl<MutableGraph>::m_type_names[] = {"boolean", "int", "long", "float", "double", "string"};
+const char* mutate_graph_impl<MutableGraph>::m_type_names[] = {"boolean", "int", "long", "float", "double", "string"};
 
-void
+void BOOST_GRAPH_DECL
 read_graphml(std::istream& in, mutate_graph& g);
 
 template<typename MutableGraph>
 void
 read_graphml(std::istream& in, MutableGraph& g, dynamic_properties& dp)
-{    
+{
     mutate_graph_impl<MutableGraph> mg(g,dp);
     read_graphml(in, mg);
 }
@@ -202,7 +255,7 @@ template <typename Types>
 class get_type_name
 {
 public:
-    get_type_name(const std::type_info& type, char** type_names, std::string& type_name)
+    get_type_name(const std::type_info& type, const char** type_names, std::string& type_name)
         : m_type(type), m_type_names(type_names), m_type_name(type_name) {}
     template <typename Type>
     void operator()(Type)
@@ -212,7 +265,7 @@ public:
     }
 private:
     const std::type_info &m_type;
-    char** m_type_names;
+    const char** m_type_names;
     std::string &m_type_name;
 };
 
@@ -226,22 +279,25 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
     typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
     typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
 
-    BOOST_STATIC_CONSTANT(bool, 
-                          graph_is_directed = 
+    // using boost::property_tree::xml_parser::encode_char_entities;
+    using boost::graph_detail_from_property_tree::encode_char_entities;
+
+    BOOST_STATIC_CONSTANT(bool,
+                          graph_is_directed =
                           (is_convertible<directed_category*, directed_tag*>::value));
 
     out << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
         << "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">\n";
 
     typedef mpl::vector<bool, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long, float, double, long double, std::string> value_types;
-    char* type_names[] = {"boolean", "int", "int", "int", "int", "long", "long", "long", "long", "float", "double", "double", "string"};    
+    const char* type_names[] = {"boolean", "int", "int", "int", "int", "long", "long", "long", "long", "float", "double", "double", "string"};
     std::map<std::string, std::string> graph_key_ids;
     std::map<std::string, std::string> vertex_key_ids;
     std::map<std::string, std::string> edge_key_ids;
     int key_count = 0;
 
     // Output keys
-    for (dynamic_properties::const_iterator i = dp.begin(); i != dp.end(); ++i) 
+    for (dynamic_properties::const_iterator i = dp.begin(); i != dp.end(); ++i)
     {
         std::string key_id = "key" + lexical_cast<std::string>(key_count++);
         if (i->second->key() == typeid(Graph))
@@ -254,14 +310,14 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
             continue;
         std::string type_name = "string";
         mpl::for_each<value_types>(get_type_name<value_types>(i->second->value(), type_names, type_name));
-        out << "  <key id=\"" << key_id << "\" for=\"" 
+        out << "  <key id=\"" << encode_char_entities(key_id) << "\" for=\""
             << (i->second->key() == typeid(Graph) ? "graph" : (i->second->key() == typeid(vertex_descriptor) ? "node" : "edge")) << "\""
             << " attr.name=\"" << i->first << "\""
             << " attr.type=\"" << type_name << "\""
             << " />\n";
     }
 
-    out << "  <graph id=\"G\" edgedefault=\"" 
+    out << "  <graph id=\"G\" edgedefault=\""
         << (graph_is_directed ? "directed" : "undirected") << "\""
         << " parse.nodeids=\"" << (ordered_vertices ? "canonical" : "free") << "\""
         << " parse.edgeids=\"canonical\" parse.order=\"nodesfirst\">\n";
@@ -269,13 +325,13 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
     // Output graph data
     for (dynamic_properties::const_iterator i = dp.begin(); i != dp.end(); ++i)
     {
-        if (i->second->key() == typeid(Graph)) 
+        if (i->second->key() == typeid(Graph))
         {
             out << "   <data key=\"" << graph_key_ids[i->first] << "\">"
-                << i->second->get_string(g) << "</data>\n";
+                << encode_char_entities(i->second->get_string(g)) << "</data>\n";
         }
     }
-    
+
     typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
     vertex_iterator v, v_end;
     for (tie(v, v_end) = vertices(g); v != v_end; ++v)
@@ -284,10 +340,10 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
         // Output data
         for (dynamic_properties::const_iterator i = dp.begin(); i != dp.end(); ++i)
         {
-            if (i->second->key() == typeid(vertex_descriptor)) 
+            if (i->second->key() == typeid(vertex_descriptor))
             {
                 out << "      <data key=\"" << vertex_key_ids[i->first] << "\">"
-                    << i->second->get_string(*v) << "</data>\n";
+                    << encode_char_entities(i->second->get_string(*v)) << "</data>\n";
             }
         }
         out << "    </node>\n";
@@ -296,7 +352,7 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
     typedef typename graph_traits<Graph>::edge_iterator edge_iterator;
     edge_iterator e, e_end;
     typename graph_traits<Graph>::edges_size_type edge_count = 0;
-    for (tie(e, e_end) = edges(g); e != e_end; ++e) 
+    for (tie(e, e_end) = edges(g); e != e_end; ++e)
     {
         out << "    <edge id=\"e" << edge_count++ << "\" source=\"n"
             << get(vertex_index, source(*e, g)) << "\" target=\"n"
@@ -305,10 +361,10 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
         // Output data
         for (dynamic_properties::const_iterator i = dp.begin(); i != dp.end(); ++i)
         {
-            if (i->second->key() == typeid(edge_descriptor)) 
+            if (i->second->key() == typeid(edge_descriptor))
             {
                 out << "      <data key=\"" << edge_key_ids[i->first] << "\">"
-                    << i->second->get_string(*e) << "</data>\n";
+                    << encode_char_entities(i->second->get_string(*e)) << "</data>\n";
             }
         }
         out << "    </edge>\n";
@@ -321,7 +377,7 @@ write_graphml(std::ostream& out, const Graph& g, VertexIndexMap vertex_index,
 
 template <typename Graph>
 void
-write_graphml(std::ostream& out, const Graph& g, const dynamic_properties& dp, 
+write_graphml(std::ostream& out, const Graph& g, const dynamic_properties& dp,
               bool ordered_vertices=false)
 {
     write_graphml(out, g, get(vertex_index, g), dp, ordered_vertices);
similarity index 87%
rename from deal.II/contrib/boost/include/boost/graph/graphviz.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/graphviz.hpp
index b010dd845016ded2a3a50d5fbc67188b43e21e81..c1f87375bed780606df67c76e52089365df390f2 100644 (file)
@@ -1,7 +1,7 @@
 //=======================================================================
 // Copyright 2001 University of Notre Dame.
 // Copyright 2003 Jeremy Siek
-// Authors: Lie-Quan Lee and Jeremy Siek
+// Authors: Lie-Quan Lee, Jeremy Siek, and Douglas Gregor
 //
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
 #include <iostream>
 #include <fstream>
 #include <stdio.h> // for FILE
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/tuple/tuple.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/subgraph.hpp>
 #include <boost/graph/adjacency_list.hpp>
-#include <boost/dynamic_property_map.hpp>
+#include <boost/property_map/dynamic_property_map.hpp>
+#include <boost/graph/overloading.hpp>
 
 #ifdef BOOST_HAS_DECLSPEC
 #  if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_GRAPH_DYN_LINK)
@@ -236,12 +237,17 @@ namespace boost {
   template <typename Graph, typename VertexPropertiesWriter,
             typename EdgePropertiesWriter, typename GraphPropertiesWriter,
             typename VertexID>
-  inline void write_graphviz(std::ostream& out, const Graph& g,
-                             VertexPropertiesWriter vpw,
-                             EdgePropertiesWriter epw,
-                             GraphPropertiesWriter gpw,
-                             VertexID vertex_id)
+  inline void
+  write_graphviz
+    (std::ostream& out, const Graph& g,
+     VertexPropertiesWriter vpw,
+     EdgePropertiesWriter epw,
+     GraphPropertiesWriter gpw,
+     VertexID vertex_id
+     BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
   {
+    BOOST_CONCEPT_ASSERT((EdgeListGraphConcept<Graph>));
+
     typedef typename graph_traits<Graph>::directed_category cat_type;
     typedef graphviz_io_traits<cat_type> Traits;
     std::string name = "G";
@@ -267,17 +273,21 @@ namespace boost {
 
   template <typename Graph, typename VertexPropertiesWriter,
             typename EdgePropertiesWriter, typename GraphPropertiesWriter>
-  inline void write_graphviz(std::ostream& out, const Graph& g,
-                             VertexPropertiesWriter vpw,
-                             EdgePropertiesWriter epw,
-                             GraphPropertiesWriter gpw)
+  inline void
+  write_graphviz(std::ostream& out, const Graph& g,
+                 VertexPropertiesWriter vpw,
+                 EdgePropertiesWriter epw,
+                 GraphPropertiesWriter gpw
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
   { write_graphviz(out, g, vpw, epw, gpw, get(vertex_index, g)); }
 
 #if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
   // ambiguous overload problem with VC++
   template <typename Graph>
   inline void
-  write_graphviz(std::ostream& out, const Graph& g) {
+  write_graphviz(std::ostream& out, const Graph& g
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
+  {
     default_writer dw;
     default_writer gw;
     write_graphviz(out, g, dw, dw, gw);
@@ -286,7 +296,9 @@ namespace boost {
 
   template <typename Graph, typename VertexWriter>
   inline void
-  write_graphviz(std::ostream& out, const Graph& g, VertexWriter vw) {
+  write_graphviz(std::ostream& out, const Graph& g, VertexWriter vw
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
+  {
     default_writer dw;
     default_writer gw;
     write_graphviz(out, g, vw, dw, gw);
@@ -295,7 +307,9 @@ namespace boost {
   template <typename Graph, typename VertexWriter, typename EdgeWriter>
   inline void
   write_graphviz(std::ostream& out, const Graph& g,
-                 VertexWriter vw, EdgeWriter ew) {
+                 VertexWriter vw, EdgeWriter ew
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
+  {
     default_writer gw;
     write_graphviz(out, g, vw, ew, gw);
   }
@@ -404,7 +418,7 @@ namespace boost {
 
     detail::write_graphviz_subgraph(out, g,
                                     vertex_marker.begin(),
-                                    edge_marker.begin(), 
+                                    edge_marker.begin(),
                                     get(vertex_index, g));
   }
 
@@ -422,20 +436,20 @@ namespace boost {
 
   template <typename Graph, typename VertexID>
   void write_graphviz(std::ostream& out, const subgraph<Graph>& g,
-                      VertexID vertex_id) 
+                      VertexID vertex_id)
   {
     std::vector<bool> edge_marker(num_edges(g), true);
     std::vector<bool> vertex_marker(num_vertices(g), true);
 
     detail::write_graphviz_subgraph(out, g,
                                     vertex_marker.begin(),
-                                    edge_marker.begin(), 
+                                    edge_marker.begin(),
                                     vertex_id);
   }
 
   template <typename Graph, typename VertexID>
   void write_graphviz(const std::string& filename, const subgraph<Graph>& g,
-                      VertexID vertex_id) 
+                      VertexID vertex_id)
   {
     std::ofstream out(filename.c_str());
     std::vector<bool> edge_marker(num_edges(g), true);
@@ -479,11 +493,12 @@ namespace boost {
 
   // These four require linking the BGL-Graphviz library: libbgl-viz.a
   // from the /src directory.
-  extern void read_graphviz(const std::string& file, GraphvizDigraph& g);
-  extern void read_graphviz(FILE* file, GraphvizDigraph& g);
-
-  extern void read_graphviz(const std::string& file, GraphvizGraph& g);
-  extern void read_graphviz(FILE* file, GraphvizGraph& g);
+  // Library has not existed for a while
+  // extern void read_graphviz(const std::string& file, GraphvizDigraph& g);
+  // extern void read_graphviz(FILE* file, GraphvizDigraph& g);
+  //
+  // extern void read_graphviz(const std::string& file, GraphvizGraph& g);
+  // extern void read_graphviz(FILE* file, GraphvizGraph& g);
 
   class dynamic_properties_writer
   {
@@ -494,7 +509,7 @@ namespace boost {
     void operator()(std::ostream& out, Descriptor key) const
     {
       bool first = true;
-      for (dynamic_properties::const_iterator i = dp->begin(); 
+      for (dynamic_properties::const_iterator i = dp->begin();
            i != dp->end(); ++i) {
         if (typeid(key) == i->second->key()) {
           if (first) out << " [";
@@ -516,14 +531,14 @@ namespace boost {
   {
   public:
     dynamic_vertex_properties_writer(const dynamic_properties& dp,
-                                     const std::string& node_id) 
+                                     const std::string& node_id)
       : dp(&dp), node_id(&node_id) { }
 
     template<typename Descriptor>
     void operator()(std::ostream& out, Descriptor key) const
     {
       bool first = true;
-      for (dynamic_properties::const_iterator i = dp->begin(); 
+      for (dynamic_properties::const_iterator i = dp->begin();
            i != dp->end(); ++i) {
         if (typeid(key) == i->second->key()
             && i->first != *node_id) {
@@ -564,8 +579,8 @@ namespace boost {
     };
 
     template<typename Vertex>
-    inline std::string 
-    get(node_id_property_map<Vertex> pm, 
+    inline std::string
+    get(node_id_property_map<Vertex> pm,
         typename node_id_property_map<Vertex>::key_type v)
     { return get(*pm.node_id, *pm.dp, v); }
 
@@ -574,8 +589,9 @@ namespace boost {
   template<typename Graph>
   inline void
   write_graphviz(std::ostream& out, const Graph& g,
-                 const dynamic_properties& dp, 
-                 const std::string& node_id = "node_id")
+                 const dynamic_properties& dp,
+                 const std::string& node_id = "node_id"
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
   {
     typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
     write_graphviz(out, g, dp, node_id,
@@ -586,7 +602,8 @@ namespace boost {
   void
   write_graphviz(std::ostream& out, const Graph& g,
                  const dynamic_properties& dp, const std::string& node_id,
-                 VertexID id)
+                 VertexID id
+                 BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph,vertex_list_graph_tag))
   {
     write_graphviz
       (out, g,
@@ -640,6 +657,14 @@ struct undirected_graph_error : public graph_exception {
   }
 };
 
+struct bad_graphviz_syntax: public graph_exception {
+  std::string errmsg;
+  bad_graphviz_syntax(const std::string& errmsg)
+    : errmsg(errmsg) {}
+  const char* what() const throw () {return errmsg.c_str();}
+  ~bad_graphviz_syntax() throw () {};
+};
+
 namespace detail { namespace graph {
 
 typedef std::string id_t;
@@ -654,7 +679,7 @@ public:
     static int idx = 0;
     return edge_t(idx++);
   };
-  
+
   bool operator==(const edge_t& rhs) const {
     return idx_ == rhs.idx_;
   }
@@ -670,14 +695,14 @@ class mutate_graph
   virtual bool is_directed() const = 0;
   virtual void do_add_vertex(const node_t& node) = 0;
 
-  virtual void 
+  virtual void
   do_add_edge(const edge_t& edge, const node_t& source, const node_t& target)
     = 0;
 
-  virtual void 
+  virtual void
   set_node_property(const id_t& key, const node_t& node, const id_t& value) = 0;
 
-  virtual void 
+  virtual void
   set_edge_property(const id_t& key, const edge_t& edge, const id_t& value) = 0;
 
   virtual void  // RG: need new second parameter to support BGL subgraphs
@@ -699,7 +724,7 @@ class mutate_graph_impl : public mutate_graph
 
   bool is_directed() const
   {
-    return 
+    return
       boost::is_convertible<
         typename boost::graph_traits<MutableGraph>::directed_category,
         boost::directed_tag>::value;
@@ -712,20 +737,20 @@ class mutate_graph_impl : public mutate_graph
 
     // Set up a mapping from name to BGL vertex.
     bgl_nodes.insert(std::make_pair(node, v));
-    
+
     // node_id_prop_ allows the caller to see the real id names for nodes.
     put(node_id_prop_, dp_, v, node);
   }
 
-  void 
+  void
   do_add_edge(const edge_t& edge, const node_t& source, const node_t& target)
   {
     std::pair<bgl_edge_t, bool> result =
      add_edge(bgl_nodes[source], bgl_nodes[target], graph_);
-    
+
     if(!result.second) {
       // In the case of no parallel edges allowed
-      throw bad_parallel_edge(source, target);
+        boost::throw_exception(bad_parallel_edge(source, target));
     } else {
       bgl_edges.insert(std::make_pair(edge, result.first));
     }
@@ -750,7 +775,7 @@ class mutate_graph_impl : public mutate_graph
     put(key, dp_, &graph_, value);
   }
 
-    
+
  protected:
   MutableGraph& graph_;
   dynamic_properties& dp_;
@@ -768,16 +793,29 @@ bool read_graphviz(std::istream& in, mutate_graph& graph);
 template <typename MutableGraph>
 bool read_graphviz(std::istream& in, MutableGraph& graph,
                    dynamic_properties& dp,
-                   std::string const& node_id = "node_id") 
+                   std::string const& node_id = "node_id")
 {
-  detail::graph::mutate_graph_impl<MutableGraph> m_graph(graph, dp, node_id);
-  return detail::graph::read_graphviz(in, m_graph);
+  std::string data;
+  in >> std::noskipws;
+  std::copy(std::istream_iterator<char>(in),
+            std::istream_iterator<char>(),
+            std::back_inserter(data));
+  return read_graphviz(data,graph,dp,node_id);
 }
 
 } // namespace boost
 
-#ifdef BOOST_GRAPH_READ_GRAPHVIZ_ITERATORS
+#ifdef BOOST_GRAPH_USE_SPIRIT_PARSER
+#  ifndef BOOST_GRAPH_READ_GRAPHVIZ_ITERATORS
+#    define BOOST_GRAPH_READ_GRAPHVIZ_ITERATORS
+#  endif
 #  include <boost/graph/detail/read_graphviz_spirit.hpp>
-#endif // BOOST_GRAPH_READ_GRAPHVIZ_ITERATORS
+#else // New default parser
+#  include <boost/graph/detail/read_graphviz_new.hpp>
+#endif // BOOST_GRAPH_USE_SPIRIT_PARSER
+
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/graphviz.hpp>
+#endif
 
 #endif // BOOST_GRAPHVIZ_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/grid_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/grid_graph.hpp
new file mode 100644 (file)
index 0000000..27cc256
--- /dev/null
@@ -0,0 +1,991 @@
+//=======================================================================
+// Copyright 2009 Trustees of Indiana University.
+// Authors: Michael Hansen, Andrew Lumsdaine
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_GRID_GRAPH_HPP
+#define BOOST_GRAPH_GRID_GRAPH_HPP
+
+#include <cmath>
+#include <functional>
+#include <numeric>
+
+#include <boost/array.hpp>
+#include <boost/bind.hpp>
+#include <boost/limits.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/property_map/property_map.hpp>
+
+#define BOOST_GRID_GRAPH_TEMPLATE_PARAMS \
+  std::size_t DimensionsT, typename VertexIndexT, \
+    typename EdgeIndexT
+
+#define BOOST_GRID_GRAPH_TYPE \
+  grid_graph<DimensionsT, VertexIndexT, EdgeIndexT>
+
+#define BOOST_GRID_GRAPH_TYPE_MEM typename BOOST_GRID_GRAPH_TYPE::
+
+#define BOOST_GRID_GRAPH_TYPE_TD(mem) \
+  typedef typename BOOST_GRID_GRAPH_TYPE::mem mem
+
+#define BOOST_GRID_GRAPH_TRAITS_T \
+  typename graph_traits<BOOST_GRID_GRAPH_TYPE >
+
+namespace boost {
+
+  // Class prototype for grid_graph
+  template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+  class grid_graph;
+
+  //===================
+  // Index Property Map
+  //===================
+
+  template <typename Graph,
+            typename Descriptor,
+            typename Index>
+  struct grid_graph_index_map {
+  public:
+    typedef Index value_type;
+    typedef Index reference_type;
+    typedef reference_type reference;
+    typedef Descriptor key_type;
+    typedef readable_property_map_tag category;
+
+    grid_graph_index_map() { }
+
+    grid_graph_index_map(const Graph& graph) :
+      m_graph(make_shared<Graph>(graph)) { }
+
+    value_type operator[](key_type key) const {
+      return (m_graph->index_of(key));
+    }
+
+  protected:
+    shared_ptr<Graph> m_graph;
+  };
+
+  template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+  struct property_map<BOOST_GRID_GRAPH_TYPE, vertex_index_t> {
+    typedef grid_graph_index_map<BOOST_GRID_GRAPH_TYPE,
+                                 BOOST_GRID_GRAPH_TRAITS_T::vertex_descriptor,
+                                 BOOST_GRID_GRAPH_TRAITS_T::vertices_size_type> type;
+    typedef type const_type;
+  };
+
+  template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+  struct property_map<BOOST_GRID_GRAPH_TYPE, edge_index_t> {
+    typedef grid_graph_index_map<BOOST_GRID_GRAPH_TYPE,
+                                 BOOST_GRID_GRAPH_TRAITS_T::edge_descriptor,
+                                 BOOST_GRID_GRAPH_TRAITS_T::edges_size_type> type;
+    typedef type const_type;
+  };
+
+  //=================
+  // Function Objects
+  //=================
+
+  namespace detail {
+
+    // vertex_at
+    template <typename Graph>
+    struct grid_graph_vertex_at {
+
+      typedef typename graph_traits<Graph>::vertex_descriptor result_type;
+
+      grid_graph_vertex_at(const Graph* graph) :
+        m_graph(graph) { }
+
+      result_type
+      operator()
+      (typename graph_traits<Graph>::vertices_size_type vertex_index) const {
+        return (vertex(vertex_index, *m_graph));
+      }
+
+    private:
+      const Graph* m_graph;
+    };
+
+    // out_edge_at
+    template <typename Graph>
+    struct grid_graph_out_edge_at {
+
+    private:
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+    public:
+      typedef typename graph_traits<Graph>::edge_descriptor result_type;
+
+      grid_graph_out_edge_at(vertex_descriptor source_vertex,
+                             const Graph* graph) :
+        m_vertex(source_vertex),
+        m_graph(graph) { }
+
+      result_type
+      operator()
+      (typename graph_traits<Graph>::degree_size_type out_edge_index) const {
+        return (out_edge_at(m_vertex, out_edge_index, *m_graph));
+      }
+
+    private:
+      vertex_descriptor m_vertex;
+      const Graph* m_graph;
+    };
+
+    // in_edge_at
+    template <typename Graph>
+    struct grid_graph_in_edge_at {
+
+    private:
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
+
+    public:
+      typedef typename graph_traits<Graph>::edge_descriptor result_type;
+
+      grid_graph_in_edge_at(vertex_descriptor target_vertex,
+                            const Graph* graph) :
+        m_vertex(target_vertex),
+        m_graph(graph) { }
+
+      result_type
+      operator()
+      (typename graph_traits<Graph>::degree_size_type in_edge_index) const {
+        return (in_edge_at(m_vertex, in_edge_index, *m_graph));
+      }
+
+    private:
+      vertex_descriptor m_vertex;
+      const Graph* m_graph;
+    };
+
+    // edge_at
+    template <typename Graph>
+    struct grid_graph_edge_at {
+
+      typedef typename graph_traits<Graph>::edge_descriptor result_type;
+
+      grid_graph_edge_at(const Graph* graph) :
+        m_graph(graph) { }
+
+      result_type
+      operator()
+      (typename graph_traits<Graph>::edges_size_type edge_index) const {
+        return (edge_at(edge_index, *m_graph));
+      }
+
+    private:
+      const Graph* m_graph;
+    };
+
+    // adjacent_vertex_at
+    template <typename Graph>
+    struct grid_graph_adjacent_vertex_at {
+
+    public:
+      typedef typename graph_traits<Graph>::vertex_descriptor result_type;
+
+      grid_graph_adjacent_vertex_at(result_type source_vertex,
+                                    const Graph* graph) :
+        m_vertex(source_vertex),
+        m_graph(graph) { }
+
+      result_type
+      operator()
+      (typename graph_traits<Graph>::degree_size_type adjacent_index) const {
+        return (target(out_edge_at(m_vertex, adjacent_index, *m_graph), *m_graph));
+      }
+
+    private:
+      result_type m_vertex;
+      const Graph* m_graph;
+    };
+
+  }; // namespace detail
+
+  //===========
+  // Grid Graph
+  //===========
+
+  template <std::size_t Dimensions,
+            typename VertexIndex = std::size_t,
+            typename EdgeIndex = VertexIndex> 
+  class grid_graph {
+
+  private:
+    typedef boost::array<bool, Dimensions> WrapDimensionArray;
+    grid_graph() { };
+
+  public:
+
+    typedef grid_graph<Dimensions, VertexIndex, EdgeIndex> type;
+
+    // sizes
+    typedef VertexIndex vertices_size_type;
+    typedef EdgeIndex edges_size_type;
+    typedef EdgeIndex degree_size_type;
+
+    // descriptors
+    typedef boost::array<VertexIndex, Dimensions> vertex_descriptor;
+    typedef std::pair<vertex_descriptor, vertex_descriptor> edge_descriptor;
+
+    // vertex_iterator
+    typedef counting_iterator<vertices_size_type> vertex_index_iterator;
+    typedef detail::grid_graph_vertex_at<type> vertex_function;
+    typedef transform_iterator<vertex_function, vertex_index_iterator> vertex_iterator;
+
+    // edge_iterator
+    typedef counting_iterator<edges_size_type> edge_index_iterator;
+    typedef detail::grid_graph_edge_at<type> edge_function;
+    typedef transform_iterator<edge_function, edge_index_iterator> edge_iterator;
+
+    // out_edge_iterator
+    typedef counting_iterator<degree_size_type> degree_iterator;
+    typedef detail::grid_graph_out_edge_at<type> out_edge_function;
+    typedef transform_iterator<out_edge_function, degree_iterator> out_edge_iterator;
+
+    // in_edge_iterator
+    typedef detail::grid_graph_in_edge_at<type> in_edge_function;
+    typedef transform_iterator<in_edge_function, degree_iterator> in_edge_iterator;
+
+    // adjacency_iterator
+    typedef detail::grid_graph_adjacent_vertex_at<type> adjacent_vertex_function;
+    typedef transform_iterator<adjacent_vertex_function, degree_iterator> adjacency_iterator;
+
+    // categories
+    typedef undirected_tag directed_category;
+    typedef disallow_parallel_edge_tag edge_parallel_category;    
+    struct traversal_category : virtual public incidence_graph_tag,
+                                virtual public adjacency_graph_tag,
+                                virtual public vertex_list_graph_tag,
+                                virtual public edge_list_graph_tag,
+                                virtual public bidirectional_graph_tag,
+                                virtual public adjacency_matrix_tag { };
+
+    static inline vertex_descriptor null_vertex()
+    {
+      vertex_descriptor maxed_out_vertex;
+      std::fill(maxed_out_vertex.begin(), maxed_out_vertex.end(),
+                (std::numeric_limits<vertices_size_type>::max)());
+
+      return (maxed_out_vertex);
+    }
+
+    // Constructor that defaults to no wrapping for all dimensions.
+    grid_graph(vertex_descriptor dimension_lengths) :
+      m_dimension_lengths(dimension_lengths) {
+
+      std::fill(m_wrap_dimension.begin(),
+                m_wrap_dimension.end(), false);
+
+      precalculate();
+    }
+
+    // Constructor that allows for wrapping to be specified for all
+    // dimensions at once.
+    grid_graph(vertex_descriptor dimension_lengths,
+               bool wrap_all_dimensions) :
+      m_dimension_lengths(dimension_lengths) {
+      
+      std::fill(m_wrap_dimension.begin(),
+                m_wrap_dimension.end(),
+                wrap_all_dimensions);
+
+      precalculate();
+    }
+
+    // Constructor that allows for individual dimension wrapping to be
+    // specified.
+    grid_graph(vertex_descriptor dimension_lengths,
+               WrapDimensionArray wrap_dimension) :
+      m_dimension_lengths(dimension_lengths),
+      m_wrap_dimension(wrap_dimension) {
+
+      precalculate();
+    }
+
+    // Returns the number of dimensions in the graph
+    inline std::size_t dimensions() const {
+      return (Dimensions);
+    }
+
+    // Returns the length of dimension [dimension_index]
+    inline vertices_size_type length(std::size_t dimension) const {
+      return (m_dimension_lengths[dimension]);
+    }
+
+    // Returns a value indicating if dimension [dimension_index] wraps
+    inline bool wrapped(std::size_t dimension) const {
+      return (m_wrap_dimension[dimension]);
+    }
+
+    // Gets the vertex that is [distance] units ahead of [vertex] in
+    // dimension [dimension_index].
+    vertex_descriptor next
+    (vertex_descriptor vertex,
+     std::size_t dimension_index,
+     vertices_size_type distance = 1) const {
+
+      vertices_size_type new_position =
+        vertex[dimension_index] + distance;
+
+      if (wrapped(dimension_index)) {
+        new_position %= length(dimension_index);
+      }
+      else {
+        // Stop at the end of this dimension if necessary.
+        new_position =
+          (std::min)(new_position,
+                     length(dimension_index) - 1);
+      }
+
+      vertex[dimension_index] = new_position;
+
+      return (vertex);    
+    }
+
+    // Gets the vertex that is [distance] units behind [vertex] in
+    // dimension [dimension_index].
+    vertex_descriptor previous
+    (vertex_descriptor vertex,
+     std::size_t dimension_index,
+     vertices_size_type distance = 1) const {
+    
+      // We're assuming that vertices_size_type is unsigned, so we
+      // need to be careful about the math.
+      vertex[dimension_index] =
+        (distance > vertex[dimension_index]) ?
+        (wrapped(dimension_index) ?
+         (length(dimension_index) - (distance % length(dimension_index))) : 0) :
+        vertex[dimension_index] - distance;
+
+      return (vertex);    
+    }
+
+  protected:
+
+    // Returns the number of vertices in the graph
+    inline vertices_size_type num_vertices() const {
+      return (m_num_vertices);
+    }
+    
+    // Returns the number of edges in the graph
+    inline edges_size_type num_edges() const {
+      return (m_num_edges);
+    }
+
+    // Returns the number of edges in dimension [dimension_index]
+    inline edges_size_type num_edges
+    (std::size_t dimension_index) const {
+      return (m_edge_count[dimension_index]);
+    }
+
+    // Returns the index of [vertex] (See also vertex_at)
+    vertices_size_type index_of(vertex_descriptor vertex) const {
+
+      vertices_size_type vertex_index = 0;
+      vertices_size_type index_multiplier = 1;
+
+      for (std::size_t dimension_index = 0;
+           dimension_index < Dimensions;
+           ++dimension_index) {
+
+        vertex_index += (vertex[dimension_index] * index_multiplier);
+        index_multiplier *= length(dimension_index);
+      }
+
+      return (vertex_index);
+    }
+
+    // Returns the vertex whose index is [vertex_index] (See also
+    // index_of(vertex_descriptor))
+    vertex_descriptor vertex_at
+    (vertices_size_type vertex_index) const {
+    
+      array<vertices_size_type, Dimensions> vertex;
+      vertices_size_type index_divider = 1;
+
+      for (std::size_t dimension_index = 0;
+           dimension_index < Dimensions;
+           ++dimension_index) {
+
+        vertex[dimension_index] = (vertex_index / index_divider) %
+          length(dimension_index);
+
+        index_divider *= length(dimension_index);
+      }
+
+      return (vertex);
+    }    
+
+    // Returns the edge whose index is [edge_index] (See also
+    // index_of(edge_descriptor)).  NOTE: The index mapping is
+    // dependent upon dimension wrapping.
+    edge_descriptor edge_at(edges_size_type edge_index) const {
+
+      // Edge indices are sorted into bins by dimension
+      std::size_t dimension_index = 0;
+      edges_size_type dimension_edges = num_edges(0);
+
+      while (edge_index >= dimension_edges) {
+        edge_index -= dimension_edges;
+        ++dimension_index;
+        dimension_edges = num_edges(dimension_index);
+      }
+
+      vertex_descriptor vertex_source, vertex_target;
+      bool is_forward = ((edge_index / (num_edges(dimension_index) / 2)) == 0);
+
+      if (wrapped(dimension_index)) {
+        vertex_source = vertex_at(edge_index % num_vertices());
+        vertex_target = is_forward ?
+          next(vertex_source, dimension_index) :
+          previous(vertex_source, dimension_index);
+      }
+      else {
+
+        // Dimensions can wrap arbitrarily, so an index needs to be
+        // computed in a more complex manner.  This is done by
+        // grouping the edges for each dimension together into "bins"
+        // and considering [edge_index] as an offset into the bin.
+        // Each bin consists of two parts: the "forward" looking edges
+        // and the "backward" looking edges for the dimension.
+
+        edges_size_type vertex_offset = edge_index % num_edges(dimension_index);
+
+        // Consider vertex_offset an index into the graph's vertex
+        // space but with the dimension [dimension_index] reduced in
+        // size by one.
+        vertices_size_type index_divider = 1;
+
+        for (std::size_t dimension_index_iter = 0;
+             dimension_index_iter < Dimensions;
+             ++dimension_index_iter) {
+
+          std::size_t dimension_length = (dimension_index_iter == dimension_index) ?
+            length(dimension_index_iter) - 1 :
+            length(dimension_index_iter);
+
+          vertex_source[dimension_index_iter] = (vertex_offset / index_divider) %
+            dimension_length;
+
+          index_divider *= dimension_length;
+        }
+
+        if (is_forward) {
+          vertex_target = next(vertex_source, dimension_index);
+        }
+        else {
+          // Shift forward one more unit in the dimension for backward
+          // edges since the algorithm above will leave us one behind.
+          vertex_target = vertex_source;
+          ++vertex_source[dimension_index];
+        }
+
+      } // if (wrapped(dimension_index))
+      
+      return (std::make_pair(vertex_source, vertex_target));
+    }
+    
+    // Returns the index for [edge] (See also edge_at)
+    edges_size_type index_of(edge_descriptor edge) const {
+      vertex_descriptor source_vertex = source(edge, *this);
+      vertex_descriptor target_vertex = target(edge, *this);
+
+      // Determine the dimension where the source and target vertices
+      // differ (should only be one if this is a valid edge).
+      std::size_t different_dimension_index = 0;
+
+      while (source_vertex[different_dimension_index] ==
+             target_vertex[different_dimension_index]) {
+
+        ++different_dimension_index; 
+      }
+
+      edges_size_type edge_index = 0;
+      
+      // Offset the edge index into the appropriate "bin" (see edge_at
+      // for a more in-depth description).
+      for (std::size_t dimension_index = 0;
+           dimension_index < different_dimension_index;
+           ++dimension_index) {
+
+        edge_index += num_edges(dimension_index);      
+      }
+
+      // Get the position of both vertices in the differing dimension.
+      vertices_size_type source_position = source_vertex[different_dimension_index];
+      vertices_size_type target_position = target_vertex[different_dimension_index];
+
+      // Determine if edge is forward or backward
+      bool is_forward = true;
+        
+      if (wrapped(different_dimension_index)) {
+
+        // If the dimension is wrapped, an edge is going backward if
+        // either A: its target precedes the source in the differing
+        // dimension and the vertices are adjacent or B: its source
+        // precedes the target and they're not adjacent.
+        if (((target_position < source_position) &&
+             ((source_position - target_position) == 1)) ||
+            ((source_position < target_position) &&
+             ((target_position - source_position) > 1))) {
+
+          is_forward = false;
+        }
+      }
+      else if (target_position < source_position) {
+        is_forward = false;
+      }
+
+      // "Backward" edges are in the second half of the bin.
+      if (!is_forward) {
+        edge_index += (num_edges(different_dimension_index) / 2);
+      }
+
+      // Finally, apply the vertex offset
+      if (wrapped(different_dimension_index)) {
+        edge_index += index_of(source_vertex);
+      }
+      else {
+        vertices_size_type index_multiplier = 1;
+
+        if (!is_forward) {
+          --source_vertex[different_dimension_index];
+        }
+
+        for (std::size_t dimension_index = 0;
+             dimension_index < Dimensions;
+             ++dimension_index) {
+
+          edge_index += (source_vertex[dimension_index] * index_multiplier);
+          index_multiplier *= (dimension_index == different_dimension_index) ?
+            length(dimension_index) - 1 :
+            length(dimension_index);
+        }
+      }
+
+      return (edge_index);
+    }
+
+    // Returns the number of out-edges for [vertex]
+    degree_size_type out_degree(vertex_descriptor vertex) const {
+
+      degree_size_type out_edge_count = 0;
+
+      for (std::size_t dimension_index = 0;
+           dimension_index < Dimensions;
+           ++dimension_index) {
+
+        // If the vertex is on the edge of this dimension, then its
+        // number of out edges is dependent upon whether the dimension
+        // wraps or not.
+        if ((vertex[dimension_index] == 0) ||
+            (vertex[dimension_index] == (length(dimension_index) - 1))) {
+          out_edge_count += (wrapped(dimension_index) ? 2 : 1);
+        }
+        else {
+          // Next and previous edges, regardless or wrapping
+          out_edge_count += 2;
+        }
+      }
+
+      return (out_edge_count);
+    }
+
+    // Returns an out-edge for [vertex] by index. Indices are in the
+    // range [0, out_degree(vertex)).
+    edge_descriptor out_edge_at
+    (vertex_descriptor vertex,
+     degree_size_type out_edge_index) const {
+
+      edges_size_type edges_left = out_edge_index + 1;
+      std::size_t dimension_index = 0;
+      bool is_forward = false;
+
+      // Walks the out edges of [vertex] and accommodates for dimension
+      // wrapping.
+      while (edges_left > 0) {
+
+        if (!wrapped(dimension_index)) {
+          if (!is_forward && (vertex[dimension_index] == 0)) {
+            is_forward = true;
+            continue;
+          }
+          else if (is_forward &&
+                   (vertex[dimension_index] == (length(dimension_index) - 1))) {
+            is_forward = false;
+            ++dimension_index;
+            continue;
+          }
+        }
+
+        --edges_left;
+
+        if (edges_left > 0) {
+          is_forward = !is_forward;
+        
+          if (!is_forward) {
+            ++dimension_index;
+          }
+        }
+      }
+
+      return (std::make_pair(vertex, is_forward ?
+                             next(vertex, dimension_index) :
+                             previous(vertex, dimension_index)));
+    }
+
+    // Returns the number of in-edges for [vertex]
+    inline degree_size_type in_degree(vertex_descriptor vertex) const {
+      return (out_degree(vertex));
+    }
+
+    // Returns an in-edge for [vertex] by index. Indices are in the
+    // range [0, in_degree(vertex)).
+    edge_descriptor in_edge_at
+    (vertex_descriptor vertex,
+     edges_size_type in_edge_index) const {
+
+      edge_descriptor out_edge = out_edge_at(vertex, in_edge_index);
+      return (std::make_pair(target(out_edge, *this), source(out_edge, *this)));
+
+    }
+
+    // Pre-computes the number of vertices and edges
+    void precalculate() {
+      m_num_vertices =
+        std::accumulate(m_dimension_lengths.begin(),
+                        m_dimension_lengths.end(), 1,
+                        std::multiplies<vertices_size_type>());
+
+      // Calculate number of edges in each dimension
+      m_num_edges = 0;
+
+      for (std::size_t dimension_index = 0;
+           dimension_index < Dimensions;
+           ++dimension_index) {
+
+        if (wrapped(dimension_index)) {
+          m_edge_count[dimension_index] = num_vertices() * 2;
+        }
+        else {
+          m_edge_count[dimension_index] =
+            (num_vertices() - (num_vertices() / length(dimension_index))) * 2;
+        }
+
+        m_num_edges += num_edges(dimension_index);
+      }
+    }
+
+    const vertex_descriptor m_dimension_lengths;
+    WrapDimensionArray m_wrap_dimension;
+    vertices_size_type m_num_vertices;
+
+    boost::array<edges_size_type, Dimensions> m_edge_count;
+    edges_size_type m_num_edges;
+
+  public:
+
+    //================
+    // VertexListGraph
+    //================
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline std::pair<BOOST_GRID_GRAPH_TYPE_MEM vertex_iterator,
+                            BOOST_GRID_GRAPH_TYPE_MEM vertex_iterator> 
+    vertices(const BOOST_GRID_GRAPH_TYPE& graph) {
+      BOOST_GRID_GRAPH_TYPE_TD(vertex_iterator);
+      BOOST_GRID_GRAPH_TYPE_TD(vertex_function);
+      BOOST_GRID_GRAPH_TYPE_TD(vertex_index_iterator);
+
+      return (std::make_pair
+              (vertex_iterator(vertex_index_iterator(0),
+                               vertex_function(&graph)),
+               vertex_iterator(vertex_index_iterator(graph.num_vertices()),
+                               vertex_function(&graph))));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline  BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type
+    num_vertices(const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.num_vertices());
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor
+    vertex(BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type vertex_index,
+           const BOOST_GRID_GRAPH_TYPE& graph) {
+
+      return (graph.vertex_at(vertex_index));
+    }
+
+    //===============
+    // IncidenceGraph
+    //===============
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline std::pair<BOOST_GRID_GRAPH_TYPE_MEM out_edge_iterator,
+                            BOOST_GRID_GRAPH_TYPE_MEM out_edge_iterator>
+    out_edges(BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+              const BOOST_GRID_GRAPH_TYPE& graph) {
+      BOOST_GRID_GRAPH_TYPE_TD(degree_iterator);
+      BOOST_GRID_GRAPH_TYPE_TD(out_edge_function);
+      BOOST_GRID_GRAPH_TYPE_TD(out_edge_iterator);
+
+      return (std::make_pair
+              (out_edge_iterator(degree_iterator(0),
+                                 out_edge_function(vertex, &graph)),
+               out_edge_iterator(degree_iterator(graph.out_degree(vertex)),
+                                 out_edge_function(vertex, &graph))));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM degree_size_type
+    out_degree
+    (BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+     const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.out_degree(vertex));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor
+    out_edge_at(BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+                BOOST_GRID_GRAPH_TYPE_MEM degree_size_type out_edge_index,
+                const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.out_edge_at(vertex, out_edge_index));
+    }
+
+    //===============
+    // AdjacencyGraph
+    //===============
+
+    template <BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend typename std::pair<BOOST_GRID_GRAPH_TYPE_MEM adjacency_iterator,
+                              BOOST_GRID_GRAPH_TYPE_MEM adjacency_iterator>
+    adjacent_vertices (BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+                       const BOOST_GRID_GRAPH_TYPE& graph) {
+      BOOST_GRID_GRAPH_TYPE_TD(degree_iterator);
+      BOOST_GRID_GRAPH_TYPE_TD(adjacent_vertex_function);
+      BOOST_GRID_GRAPH_TYPE_TD(adjacency_iterator);
+
+      return (std::make_pair
+              (adjacency_iterator(degree_iterator(0),
+                                 adjacent_vertex_function(vertex, &graph)),
+               adjacency_iterator(degree_iterator(graph.out_degree(vertex)),
+                                 adjacent_vertex_function(vertex, &graph))));
+    }
+
+    //==============
+    // EdgeListGraph
+    //==============
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM edges_size_type
+    num_edges(const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.num_edges());
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor
+    edge_at(BOOST_GRID_GRAPH_TYPE_MEM edges_size_type edge_index,
+            const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.edge_at(edge_index));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline std::pair<BOOST_GRID_GRAPH_TYPE_MEM edge_iterator,
+                            BOOST_GRID_GRAPH_TYPE_MEM edge_iterator>
+    edges(const BOOST_GRID_GRAPH_TYPE& graph) {
+      BOOST_GRID_GRAPH_TYPE_TD(edge_index_iterator);
+      BOOST_GRID_GRAPH_TYPE_TD(edge_function);
+      BOOST_GRID_GRAPH_TYPE_TD(edge_iterator);
+
+      return (std::make_pair
+              (edge_iterator(edge_index_iterator(0),
+                             edge_function(&graph)),
+               edge_iterator(edge_index_iterator(graph.num_edges()),
+                             edge_function(&graph))));
+    }
+
+    //===================
+    // BiDirectionalGraph
+    //===================
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline std::pair<BOOST_GRID_GRAPH_TYPE_MEM in_edge_iterator,
+                            BOOST_GRID_GRAPH_TYPE_MEM in_edge_iterator>
+    in_edges(BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+             const BOOST_GRID_GRAPH_TYPE& graph) {
+      BOOST_GRID_GRAPH_TYPE_TD(in_edge_function);
+      BOOST_GRID_GRAPH_TYPE_TD(degree_iterator);
+      BOOST_GRID_GRAPH_TYPE_TD(in_edge_iterator);
+
+      return (std::make_pair
+              (in_edge_iterator(degree_iterator(0),
+                                in_edge_function(vertex, &graph)),
+               in_edge_iterator(degree_iterator(graph.in_degree(vertex)),
+                                in_edge_function(vertex, &graph))));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM degree_size_type
+    in_degree (BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+               const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.in_degree(vertex));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM degree_size_type
+    degree (BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+            const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.out_degree(vertex) * 2);
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor
+    in_edge_at(BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex,
+               BOOST_GRID_GRAPH_TYPE_MEM degree_size_type in_edge_index,
+               const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (graph.in_edge_at(vertex, in_edge_index));
+    }
+
+
+    //==================
+    // Adjacency Matrix
+    //==================
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend std::pair<BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor, bool>
+    edge (BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor source_vertex,
+          BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor destination_vertex,
+          const BOOST_GRID_GRAPH_TYPE& graph) {
+
+      std::pair<BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor, bool> edge_exists =
+        std::make_pair(std::make_pair(source_vertex, destination_vertex), false);
+
+      for (std::size_t dimension_index = 0;
+           dimension_index < Dimensions;
+           ++dimension_index) {
+
+        BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type dim_difference = 0;
+        BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type
+          source_dim = source_vertex[dimension_index],
+          dest_dim = destination_vertex[dimension_index];
+
+        dim_difference = (source_dim > dest_dim) ?
+          (source_dim - dest_dim) : (dest_dim - source_dim);
+
+        if (dim_difference > 0) {
+
+          // If we've already found a valid edge, this would mean that
+          // the vertices are really diagonal across dimensions and
+          // therefore not connected.
+          if (edge_exists.second) {
+            edge_exists.second = false;
+            break;
+          }
+
+          // If the difference is one, the vertices are right next to
+          // each other and the edge is valid.  The edge is still
+          // valid, though, if the dimension wraps and the vertices
+          // are on opposite ends.
+          if ((dim_difference == 1) ||
+              (graph.wrapped(dimension_index) &&
+               (((source_dim == 0) && (dest_dim == (graph.length(dimension_index) - 1))) ||
+                ((dest_dim == 0) && (source_dim == (graph.length(dimension_index) - 1)))))) {
+
+            edge_exists.second = true;
+            // Stay in the loop to check for diagonal vertices.
+          }
+          else {
+
+            // Stop checking - the vertices are too far apart.
+            edge_exists.second = false;
+            break;
+          }
+        }
+
+      } // for dimension_index
+
+      return (edge_exists);
+    }
+
+
+    //=============================
+    // Index Property Map Functions
+    //=============================
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type
+    get(vertex_index_t,
+        const BOOST_GRID_GRAPH_TYPE& graph,
+        BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor vertex) {
+      return (graph.index_of(vertex));
+    }
+
+    template<BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline BOOST_GRID_GRAPH_TYPE_MEM edges_size_type
+    get(edge_index_t,
+        const BOOST_GRID_GRAPH_TYPE& graph,
+        BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor edge) {
+      return (graph.index_of(edge));
+    }
+
+    template <BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline grid_graph_index_map<
+                    BOOST_GRID_GRAPH_TYPE,
+                    BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor,
+                    BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type>
+    get(vertex_index_t, const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (grid_graph_index_map<
+                BOOST_GRID_GRAPH_TYPE,
+                BOOST_GRID_GRAPH_TYPE_MEM vertex_descriptor,
+                BOOST_GRID_GRAPH_TYPE_MEM vertices_size_type>(graph));
+    }
+
+    template <BOOST_GRID_GRAPH_TEMPLATE_PARAMS>
+    friend inline grid_graph_index_map<
+                    BOOST_GRID_GRAPH_TYPE,
+                    BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor,
+                    BOOST_GRID_GRAPH_TYPE_MEM edges_size_type>
+    get(edge_index_t, const BOOST_GRID_GRAPH_TYPE& graph) {
+      return (grid_graph_index_map<
+                BOOST_GRID_GRAPH_TYPE,
+                BOOST_GRID_GRAPH_TYPE_MEM edge_descriptor,
+                BOOST_GRID_GRAPH_TYPE_MEM edges_size_type>(graph));
+    }                                       
+
+    template<typename Graph,
+             typename Descriptor,
+             typename Index>
+    friend inline Index
+    get(const grid_graph_index_map<Graph, Descriptor, Index>& index_map,
+        const typename grid_graph_index_map<Graph, Descriptor, Index>::key_type& key)
+    {
+      return (index_map[key]);
+    }
+
+    template<typename Graph,
+             typename Descriptor,
+             typename Index>
+    friend struct grid_graph_index_map;
+
+  }; // grid_graph
+
+} // namespace boost
+
+#undef BOOST_GRID_GRAPH_TYPE
+#undef BOOST_GRID_GRAPH_TYPE_TD
+#undef BOOST_GRID_GRAPH_TYPE_MEM
+#undef BOOST_GRID_GRAPH_TEMPLATE_PARAMS
+#undef BOOST_GRID_GRAPH_TRAITS_T
+
+#endif // BOOST_GRAPH_GRID_GRAPH_HPP
similarity index 63%
rename from deal.II/contrib/boost/include/boost/graph/gursoy_atun_layout.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/gursoy_atun_layout.hpp
index 7cc1f9738dbac7c2184e7798c8813fb4edafe4e2..ed5e0509e3854df2e724e27e02e62a18eb4722f9 100644 (file)
@@ -28,6 +28,7 @@
 #include <boost/graph/breadth_first_search.hpp>
 #include <boost/graph/dijkstra_shortest_paths.hpp>
 #include <boost/graph/named_function_params.hpp>
+#include <boost/graph/topology.hpp>
 
 namespace boost { 
 
@@ -351,281 +352,6 @@ gursoy_atun_layout(const VertexListAndIncidenceGraph& graph,
                                   dummy_property_map()));
 }
 
-/***********************************************************
- * Topologies                                              *
- ***********************************************************/
-template<std::size_t Dims>
-class convex_topology 
-{
-  struct point 
-  {
-    point() { }
-    double& operator[](std::size_t i) {return values[i];}
-    const double& operator[](std::size_t i) const {return values[i];}
-
-  private:
-    double values[Dims];
-  };
-
- public:
-  typedef point point_type;
-
-  double distance(point a, point b) const 
-  {
-    double dist = 0;
-    for (std::size_t i = 0; i < Dims; ++i) {
-      double diff = b[i] - a[i];
-      dist += diff * diff;
-    }
-    // Exact properties of the distance are not important, as long as
-    // < on what this returns matches real distances
-    return dist;
-  }
-
-  point move_position_toward(point a, double fraction, point b) const 
-  {
-    point result;
-    for (std::size_t i = 0; i < Dims; ++i)
-      result[i] = a[i] + (b[i] - a[i]) * fraction;
-    return result;
-  }
-};
-
-template<std::size_t Dims,
-         typename RandomNumberGenerator = minstd_rand>
-class hypercube_topology : public convex_topology<Dims>
-{
-  typedef uniform_01<RandomNumberGenerator, double> rand_t;
-
- public:
-  typedef typename convex_topology<Dims>::point_type point_type;
-
-  explicit hypercube_topology(double scaling = 1.0) 
-    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), 
-      scaling(scaling) 
-  { }
-
-  hypercube_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
-    : gen_ptr(), rand(new rand_t(gen)), scaling(scaling) { }
-                     
-  point_type random_point() const 
-  {
-    point_type p;
-    for (std::size_t i = 0; i < Dims; ++i)
-      p[i] = (*rand)() * scaling;
-    return p;
-  }
-
- private:
-  shared_ptr<RandomNumberGenerator> gen_ptr;
-  shared_ptr<rand_t> rand;
-  double scaling;
-};
-
-template<typename RandomNumberGenerator = minstd_rand>
-class square_topology : public hypercube_topology<2, RandomNumberGenerator>
-{
-  typedef hypercube_topology<2, RandomNumberGenerator> inherited;
-
- public:
-  explicit square_topology(double scaling = 1.0) : inherited(scaling) { }
-  
-  square_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
-    : inherited(gen, scaling) { }
-};
-
-template<typename RandomNumberGenerator = minstd_rand>
-class cube_topology : public hypercube_topology<3, RandomNumberGenerator>
-{
-  typedef hypercube_topology<3, RandomNumberGenerator> inherited;
-
- public:
-  explicit cube_topology(double scaling = 1.0) : inherited(scaling) { }
-  
-  cube_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
-    : inherited(gen, scaling) { }
-};
-
-template<std::size_t Dims,
-         typename RandomNumberGenerator = minstd_rand>
-class ball_topology : public convex_topology<Dims>
-{
-  typedef uniform_01<RandomNumberGenerator, double> rand_t;
-
- public:
-  typedef typename convex_topology<Dims>::point_type point_type;
-
-  explicit ball_topology(double radius = 1.0) 
-    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), 
-      radius(radius) 
-  { }
-
-  ball_topology(RandomNumberGenerator& gen, double radius = 1.0) 
-    : gen_ptr(), rand(new rand_t(gen)), radius(radius) { }
-                     
-  point_type random_point() const 
-  {
-    point_type p;
-    double dist_sum;
-    do {
-      dist_sum = 0.0;
-      for (std::size_t i = 0; i < Dims; ++i) {
-        double x = (*rand)() * 2*radius - radius;
-        p[i] = x;
-        dist_sum += x * x;
-      }
-    } while (dist_sum > radius*radius);
-    return p;
-  }
-
- private:
-  shared_ptr<RandomNumberGenerator> gen_ptr;
-  shared_ptr<rand_t> rand;
-  double radius;
-};
-
-template<typename RandomNumberGenerator = minstd_rand>
-class circle_topology : public ball_topology<2, RandomNumberGenerator>
-{
-  typedef ball_topology<2, RandomNumberGenerator> inherited;
-
- public:
-  explicit circle_topology(double radius = 1.0) : inherited(radius) { }
-  
-  circle_topology(RandomNumberGenerator& gen, double radius = 1.0) 
-    : inherited(gen, radius) { }
-};
-
-template<typename RandomNumberGenerator = minstd_rand>
-class sphere_topology : public ball_topology<3, RandomNumberGenerator>
-{
-  typedef ball_topology<3, RandomNumberGenerator> inherited;
-
- public:
-  explicit sphere_topology(double radius = 1.0) : inherited(radius) { }
-  
-  sphere_topology(RandomNumberGenerator& gen, double radius = 1.0) 
-    : inherited(gen, radius) { }
-};
-
-template<typename RandomNumberGenerator = minstd_rand>
-class heart_topology 
-{
-  // Heart is defined as the union of three shapes:
-  // Square w/ corners (+-1000, -1000), (0, 0), (0, -2000)
-  // Circle centered at (-500, -500) radius 500*sqrt(2)
-  // Circle centered at (500, -500) radius 500*sqrt(2)
-  // Bounding box (-1000, -2000) - (1000, 500*(sqrt(2) - 1))
-
-  struct point 
-  {
-    point() { values[0] = 0.0; values[1] = 0.0; }
-    point(double x, double y) { values[0] = x; values[1] = y; }
-
-    double& operator[](std::size_t i)       { return values[i]; }
-    double  operator[](std::size_t i) const { return values[i]; }
-
-  private:
-    double values[2];
-  };
-
-  bool in_heart(point p) const 
-  {
-#ifndef BOOST_NO_STDC_NAMESPACE
-    using std::abs;
-    using std::pow;
-#endif
-
-    if (p[1] < abs(p[0]) - 2000) return false; // Bottom
-    if (p[1] <= -1000) return true; // Diagonal of square
-    if (pow(p[0] - -500, 2) + pow(p[1] - -500, 2) <= 500000)
-      return true; // Left circle
-    if (pow(p[0] - 500, 2) + pow(p[1] - -500, 2) <= 500000)
-      return true; // Right circle
-    return false;
-  }
-
-  bool segment_within_heart(point p1, point p2) const 
-  {
-    // Assumes that p1 and p2 are within the heart
-    if ((p1[0] < 0) == (p2[0] < 0)) return true; // Same side of symmetry line
-    if (p1[0] == p2[0]) return true; // Vertical
-    double slope = (p2[1] - p1[1]) / (p2[0] - p1[0]);
-    double intercept = p1[1] - p1[0] * slope;
-    if (intercept > 0) return false; // Crosses between circles
-    return true;
-  }
-
-  typedef uniform_01<RandomNumberGenerator, double> rand_t;
-
- public:
-  typedef point point_type;
-
-  heart_topology() 
-    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)) { }
-
-  heart_topology(RandomNumberGenerator& gen) 
-    : gen_ptr(), rand(new rand_t(gen)) { }
-
-  point random_point() const 
-  {
-#ifndef BOOST_NO_STDC_NAMESPACE
-    using std::sqrt;
-#endif
-
-    point result;
-    double sqrt2 = sqrt(2.);
-    do {
-      result[0] = (*rand)() * (1000 + 1000 * sqrt2) - (500 + 500 * sqrt2);
-      result[1] = (*rand)() * (2000 + 500 * (sqrt2 - 1)) - 2000;
-    } while (!in_heart(result));
-    return result;
-  }
-
-  double distance(point a, point b) const 
-  {
-#ifndef BOOST_NO_STDC_NAMESPACE
-    using std::sqrt;
-#endif
-    if (segment_within_heart(a, b)) {
-      // Straight line
-      return sqrt((b[0] - a[0]) * (b[0] - a[0]) + (b[1] - a[1]) * (b[1] - a[1]));
-    } else {
-      // Straight line bending around (0, 0)
-      return sqrt(a[0] * a[0] + a[1] * a[1]) + sqrt(b[0] * b[0] + b[1] * b[1]);
-    }
-  }
-
-  point move_position_toward(point a, double fraction, point b) const 
-  {
-#ifndef BOOST_NO_STDC_NAMESPACE
-    using std::sqrt;
-#endif
-
-    if (segment_within_heart(a, b)) {
-      // Straight line
-      return point(a[0] + (b[0] - a[0]) * fraction,
-                   a[1] + (b[1] - a[1]) * fraction);
-    } else {
-      double distance_to_point_a = sqrt(a[0] * a[0] + a[1] * a[1]);
-      double distance_to_point_b = sqrt(b[0] * b[0] + b[1] * b[1]);
-      double location_of_point = distance_to_point_a / 
-                                   (distance_to_point_a + distance_to_point_b);
-      if (fraction < location_of_point)
-        return point(a[0] * (1 - fraction / location_of_point), 
-                     a[1] * (1 - fraction / location_of_point));
-      else
-        return point(
-          b[0] * ((fraction - location_of_point) / (1 - location_of_point)),
-          b[1] * ((fraction - location_of_point) / (1 - location_of_point)));
-    }
-  }
-
- private:
-  shared_ptr<RandomNumberGenerator> gen_ptr;
-  shared_ptr<rand_t> rand;
-};
-
 } // namespace boost
 
 #endif // BOOST_GRAPH_GURSOY_ATUN_LAYOUT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/howard_cycle_ratio.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/howard_cycle_ratio.hpp
new file mode 100644 (file)
index 0000000..709499f
--- /dev/null
@@ -0,0 +1,634 @@
+// Copyright (C) 2006-2009 Dmitry Bufistov and Andrey Parfenov
+
+// 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)
+
+#ifndef BOOST_GRAPH_CYCLE_RATIO_HOWARD_HPP
+#define BOOST_GRAPH_CYCLE_RATIO_HOWARD_HPP
+
+#include <vector>
+#include <list>
+#include <algorithm>
+#include <limits>
+
+#include <boost/bind.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/pending/queue.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_concepts.hpp>
+
+/** @file howard_cycle_ratio.hpp
+ * @brief The implementation of the maximum/minimum cycle ratio/mean algorithm.
+ * @author Dmitry Bufistov
+ * @author Andrey Parfenov
+ */
+
+namespace boost {
+
+  /**
+   * The mcr_float is like numeric_limits, but only for floating point types
+   * and only defines infinity() and epsilon(). This class is primarily used
+   * to encapsulate a less-precise epsilon than natively supported by the
+   * floating point type.
+   */
+  template <typename Float = double> struct mcr_float {
+    typedef Float value_type;
+
+    static Float infinity()
+    { return std::numeric_limits<value_type>::infinity(); }
+
+    static Float epsilon()
+    { return Float(-0.005); }
+  };
+
+  namespace detail {
+
+    template <typename FloatTraits> struct
+    min_comparator_props {
+      typedef std::greater<typename FloatTraits::value_type> comparator;
+      static const int multiplier = 1;
+    };
+
+    template <typename FloatTraits> struct
+    max_comparator_props {
+      typedef std::less<typename FloatTraits::value_type> comparator;
+      static const int multiplier = -1;
+    };
+
+    template <typename FloatTraits, typename ComparatorProps>
+    struct float_wrapper {
+      typedef typename FloatTraits::value_type value_type;
+      typedef ComparatorProps comparator_props_t;
+      typedef typename ComparatorProps::comparator comparator;
+
+      static value_type infinity()
+      { return FloatTraits::infinity() * ComparatorProps::multiplier; }
+
+      static value_type epsilon()
+      { return FloatTraits::epsilon() * ComparatorProps::multiplier; }
+
+    };
+
+    /*! @class mcr_howard
+     * @brief Calculates optimum (maximum/minimum) cycle ratio of a directed graph.
+     * Uses  Howard's iteration policy algorithm. </br>(It is described in the paper
+     * "Experimental Analysis of the Fastest Optimum Cycle Ratio and Mean Algorithm"
+     * by Ali Dasdan).
+     */
+    template <typename FloatTraits,
+              typename Graph, typename VertexIndexMap,
+              typename EdgeWeight1, typename EdgeWeight2>
+    class mcr_howard
+    {
+    public:
+      typedef typename FloatTraits::value_type float_t;
+      typedef typename FloatTraits::comparator_props_t cmp_props_t;
+      typedef typename FloatTraits::comparator comparator_t;
+      typedef enum{ my_white = 0, my_black } my_color_type;
+      typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
+      typedef typename graph_traits<Graph>::edge_descriptor edge_t;
+      typedef typename graph_traits<Graph>::vertices_size_type vn_t;
+      typedef std::vector<float_t> vp_t;
+      typedef typename boost::iterator_property_map<
+        typename vp_t::iterator, VertexIndexMap
+      > distance_map_t; //V -> float_t
+
+      typedef typename std::vector<edge_t> ve_t;
+      typedef std::vector<my_color_type> vcol_t;
+      typedef typename ::boost::iterator_property_map<
+        typename ve_t::iterator, VertexIndexMap
+      > policy_t; //Vertex -> Edge
+      typedef typename ::boost::iterator_property_map<
+        typename vcol_t::iterator, VertexIndexMap
+      > color_map_t;
+
+      typedef typename std::list<vertex_t> pinel_t;// The in_edges list of the policy graph
+      typedef typename std::vector<pinel_t> inedges1_t;
+      typedef typename ::boost::iterator_property_map<
+        typename inedges1_t::iterator, VertexIndexMap
+      > inedges_t;
+      typedef typename std::vector<edge_t> critical_cycle_t;
+
+      //Bad  vertex flag. If true, then the vertex is "bad".
+      // Vertex is "bad" if its out_degree is equal to zero.
+      typedef typename boost::iterator_property_map<
+        std::vector<int>::iterator, VertexIndexMap
+      > badv_t;
+
+      /*!
+       * Constructor
+       * \param g = (V, E) - a directed multigraph.
+       * \param vim  Vertex Index Map. Read property Map: V -> [0, num_vertices(g)).
+       * \param ewm  edge weight map. Read property map: E -> R
+       * \param ew2m  edge weight map. Read property map: E -> R+
+       * \param infty A big enough value to guaranty that there exist a cycle with
+       *  better ratio.
+       * \param cmp The compare operator for float_ts.
+       */
+      mcr_howard(const Graph &g, VertexIndexMap vim,
+                  EdgeWeight1 ewm, EdgeWeight2 ew2m) :
+        m_g(g), m_vim(vim), m_ew1m(ewm), m_ew2m(ew2m),
+        m_bound(mcr_bound()),
+        m_cr(m_bound),
+        m_V(num_vertices(m_g)),
+        m_dis(m_V, 0), m_dm(m_dis.begin(), m_vim),
+        m_policyc(m_V), m_policy(m_policyc.begin(), m_vim),
+        m_inelc(m_V), m_inel(m_inelc.begin(), m_vim),
+        m_badvc(m_V, false), m_badv(m_badvc.begin(), m_vim),
+        m_colcv(m_V),
+        m_col_bfs(m_V)
+      { }
+
+      /*!
+       * \return maximum/minimum_{for all cycles C}
+       *         [sum_{e in C} w1(e)] / [sum_{e in C} w2(e)],
+       * or FloatTraits::infinity() if graph has no cycles.
+       */
+      float_t ocr_howard()
+      {
+        construct_policy_graph();
+        int k = 0;
+        float_t mcr = 0;
+        do
+          {
+            mcr = policy_mcr();
+            ++k;
+          }
+        while (try_improve_policy(mcr) && k < 100); //To avoid infinite loop
+
+        const float_t eps_ =  -0.00000001 * cmp_props_t::multiplier;
+        if (m_cmp(mcr, m_bound + eps_))
+          {
+            return FloatTraits::infinity();
+          }
+        else
+          {
+            return  mcr;
+          }
+      }
+      virtual ~mcr_howard() {}
+
+    protected:
+      virtual void store_critical_edge(edge_t ed, critical_cycle_t &cc) {}
+      virtual void store_critical_cycle(critical_cycle_t &cc) {}
+
+    private:
+      /*!
+       * \return lower/upper bound for the maximal/minimal cycle ratio
+       */
+      float_t mcr_bound()
+      {
+        typename  graph_traits<Graph>::vertex_iterator  vi, vie;
+        typename  graph_traits<Graph>::out_edge_iterator  oei, oeie;
+        float_t cz = (std::numeric_limits<float_t>::max)(); //Closest to zero value
+        float_t s = 0;
+        const float_t eps_ = std::numeric_limits<float_t>::epsilon();
+        for (tie(vi, vie) = vertices(m_g); vi != vie; ++vi)
+          {
+            for (tie(oei, oeie) = out_edges(*vi, m_g); oei != oeie; ++oei)
+              {
+                s += std::abs(m_ew1m[*oei]);
+                float_t a = std::abs(m_ew2m[*oei]);
+                if ( a > eps_ && a < cz)
+                {
+                  cz = a;
+                }
+              }
+          }
+        return  cmp_props_t::multiplier * (s / cz);
+      }
+
+
+      /*!
+       *  Constructs an arbitrary policy graph.
+       */
+      void construct_policy_graph()
+      {
+        m_sink = graph_traits<Graph>().null_vertex();
+        typename  graph_traits<Graph>::vertex_iterator  vi, vie;
+        typename  graph_traits<Graph>::out_edge_iterator  oei, oeie;
+        for ( tie(vi, vie) = vertices(m_g); vi != vie; ++vi )
+          {
+            tie(oei, oeie) = out_edges(*vi, m_g);
+            typename graph_traits<Graph>::out_edge_iterator mei =
+              std::max_element(oei, oeie,
+                               bind(m_cmp,
+                                    bind(&EdgeWeight1::operator[], m_ew1m, _1),
+                                    bind(&EdgeWeight1::operator[], m_ew1m, _2)
+                                    )
+                               );
+            if (mei == oeie)
+              {
+                if (m_sink == graph_traits<Graph>().null_vertex())
+                  {
+                    m_sink = *vi;
+                  }
+                m_badv[*vi] = true;
+                m_inel[m_sink].push_back(*vi);
+              }
+            else
+              {
+                m_inel[target(*mei, m_g)].push_back(*vi);
+                m_policy[*vi] = *mei;
+              }
+          }
+      }
+      /*! Sets the distance value for all vertices "v" such that there is
+       * a path from "v" to "sv". It does "inverse" breadth first visit of the policy
+       * graph, starting from the vertex "sv".
+       */
+      void mcr_bfv(vertex_t sv, float_t cr, color_map_t c)
+      {
+        boost::queue<vertex_t> Q;
+        c[sv] = my_black;
+        Q.push(sv);
+        while (!Q.empty())
+          {
+            vertex_t v = Q.top(); Q.pop();
+            for (typename pinel_t::const_iterator itr = m_inel[v].begin();
+                 itr != m_inel[v].end(); ++itr)
+              //For all in_edges of the policy graph
+              {
+                if (*itr != sv)
+                  {
+                    if (m_badv[*itr])
+                      {
+                        m_dm[*itr] = m_dm[v] + m_bound - cr;
+                      }
+                    else
+                      {
+                        m_dm[*itr] = m_dm[v] + m_ew1m[m_policy[*itr]] -
+                          m_ew2m[m_policy[*itr]] * cr;
+                      }
+                    c[*itr] = my_black;
+                    Q.push(*itr);
+                  }
+              }
+          }
+      }
+
+      /*!
+       * \param sv an arbitrary (undiscovered) vertex of the policy graph.
+       * \return a vertex in the policy graph that belongs to a cycle.
+       * Performs a depth first visit until a cycle edge is found.
+       */
+      vertex_t find_cycle_vertex(vertex_t sv)
+      {
+        vertex_t gv = sv;
+        std::fill(m_colcv.begin(), m_colcv.end(), my_white);
+        color_map_t cm(m_colcv.begin(), m_vim);
+        do
+          {
+            cm[gv] = my_black;
+            if (! m_badv[gv])
+              {
+                gv = target(m_policy[gv], m_g);
+              }
+            else
+              {
+                gv = m_sink;
+              }
+          }
+        while (cm[gv] != my_black);
+        return gv;
+      }
+
+      /*!
+       * \param sv - vertex that belongs to a cycle in the policy graph.
+       */
+      float_t cycle_ratio(vertex_t sv)
+      {
+        if (sv == m_sink) return m_bound;
+        std::pair<float_t, float_t> sums_(float_t(0), float_t(0));
+        vertex_t v = sv;
+        critical_cycle_t cc;
+        do
+          {
+            store_critical_edge(m_policy[v], cc);
+            sums_.first += m_ew1m[m_policy[v]];
+            sums_.second += m_ew2m[m_policy[v]];
+            v = target(m_policy[v], m_g);
+          }
+        while (v != sv);
+        float_t cr = sums_.first / sums_.second;
+        if ( m_cmp(m_cr, cr) )
+          {
+            m_cr = cr;
+            store_critical_cycle(cc);
+          }
+        return cr;
+      }
+
+      /*!
+       *  Finds the optimal cycle ratio of the policy graph
+       */
+      float_t policy_mcr()
+      {
+        std::fill(m_col_bfs.begin(), m_col_bfs.end(), my_white);
+        color_map_t vcm_ = color_map_t(m_col_bfs.begin(), m_vim);
+        typename graph_traits<Graph>::vertex_iterator uv_itr, vie;
+        tie(uv_itr, vie) = vertices(m_g);
+        float_t mcr = m_bound;
+        while ( (uv_itr = std::find_if(uv_itr, vie,
+                                       bind(std::equal_to<my_color_type>(),
+                                            my_white,
+                                            bind(&color_map_t::operator[], vcm_, _1)
+                                            )
+                                       )
+                 ) != vie )
+          ///While there are undiscovered vertices
+          {
+            vertex_t gv = find_cycle_vertex(*uv_itr);
+            float_t cr = cycle_ratio(gv) ;
+            mcr_bfv(gv, cr, vcm_);
+            if ( m_cmp(mcr, cr) )  mcr = cr;
+            ++uv_itr;
+          }
+        return mcr;
+      }
+
+      /*!
+       * Changes the edge m_policy[s] to the new_edge.
+       */
+      void improve_policy(vertex_t s, edge_t new_edge)
+      {
+        vertex_t t = target(m_policy[s], m_g);
+        typename property_traits<VertexIndexMap>::value_type ti = m_vim[t];
+        m_inelc[ti].erase( std::find(m_inelc[ti].begin(), m_inelc[ti].end(), s));
+        m_policy[s] = new_edge;
+        t = target(new_edge, m_g);
+        m_inel[t].push_back(s); ///Maintain in_edge list
+      }
+
+      /*!
+       * A negative cycle detector.
+       */
+      bool try_improve_policy(float_t cr)
+      {
+        bool improved = false;
+        typename  graph_traits<Graph>::vertex_iterator  vi, vie;
+        typename  graph_traits<Graph>::out_edge_iterator  oei, oeie;
+        const float_t eps_ =  FloatTraits::epsilon();
+        for (tie(vi, vie) = vertices(m_g); vi != vie; ++vi)
+          {
+            if (!m_badv[*vi])
+              {
+                for (tie(oei, oeie) = out_edges(*vi, m_g); oei != oeie; ++oei)
+                  {
+                    vertex_t t = target(*oei, m_g);
+                    //Current distance from *vi to some vertex
+                    float_t dis_ = m_ew1m[*oei] - m_ew2m[*oei] * cr + m_dm[t];
+                    if ( m_cmp(m_dm[*vi] + eps_, dis_) )
+                      {
+                        improve_policy(*vi, *oei);
+                        m_dm[*vi] = dis_;
+                        improved = true;
+                      }
+                  }
+              }
+            else
+              {
+                float_t dis_ = m_bound - cr + m_dm[m_sink];
+                if ( m_cmp(m_dm[*vi] + eps_, dis_) )
+                  {
+                    m_dm[*vi] = dis_;
+                  }
+              }
+          }
+        return improved;
+      }
+    private:
+      const Graph &m_g;
+      VertexIndexMap m_vim;
+      EdgeWeight1 m_ew1m;
+      EdgeWeight2 m_ew2m;
+      comparator_t m_cmp;
+      float_t m_bound; //> The lower/upper bound to the maximal/minimal cycle ratio
+      float_t m_cr; //>The best cycle ratio that has been found so far
+
+      vn_t m_V; //>The number of the vertices in the graph
+      vp_t m_dis; //>Container for the distance map
+      distance_map_t m_dm; //>Distance map
+
+      ve_t m_policyc; //>Container for the policy graph
+      policy_t m_policy; //>The interface for the policy graph
+
+      inedges1_t m_inelc; //>Container fot in edges list
+      inedges_t m_inel; //>Policy graph, input edges list
+
+      std::vector<int> m_badvc;
+      badv_t m_badv; //Marks "bad" vertices
+
+      vcol_t m_colcv, m_col_bfs; //Color maps
+      vertex_t m_sink; //To convert any graph to "good"
+    };
+
+    /*! \class mcr_howard1
+  * \brief Finds optimum cycle raio and a critical cycle
+     */
+    template <typename FloatTraits,
+              typename Graph, typename VertexIndexMap,
+              typename EdgeWeight1, typename EdgeWeight2>
+    class mcr_howard1  : public
+    mcr_howard<FloatTraits, Graph, VertexIndexMap,
+               EdgeWeight1, EdgeWeight2>
+    {
+    public:
+      typedef mcr_howard<FloatTraits, Graph, VertexIndexMap,
+        EdgeWeight1, EdgeWeight2> inhr_t;
+      mcr_howard1(const Graph &g, VertexIndexMap vim,
+        EdgeWeight1 ewm, EdgeWeight2 ew2m) :
+        inhr_t(g, vim, ewm, ew2m)
+      { }
+
+      void get_critical_cycle(typename inhr_t::critical_cycle_t &cc)
+      { return cc.swap(m_cc); }
+
+    protected:
+      void store_critical_edge(typename inhr_t::edge_t ed,
+        typename inhr_t::critical_cycle_t &cc)
+      { cc.push_back(ed); }
+
+      void store_critical_cycle(typename inhr_t::critical_cycle_t &cc)
+      { m_cc.swap(cc); }
+
+    private:
+      typename inhr_t::critical_cycle_t m_cc; //Critical cycle
+    };
+
+    /*!
+     * \param g a directed multigraph.
+     * \param vim Vertex Index Map. A map V->[0, num_vertices(g))
+     * \param ewm Edge weight1 map.
+     * \param ew2m Edge weight2 map.
+     * \param pcc  pointer to the critical edges list.
+     * \return Optimum cycle ratio of g or FloatTraits::infinity() if g has no cycles.
+     */
+    template <typename FT,
+              typename TG, typename TVIM,
+              typename TEW1, typename TEW2,
+              typename EV>
+    typename FT::value_type
+ optimum_cycle_ratio(const TG &g, TVIM vim, TEW1 ewm, TEW2 ew2m, EV* pcc)
+    {
+      typedef typename graph_traits<TG>::directed_category DirCat;
+      BOOST_STATIC_ASSERT((is_convertible<DirCat*, directed_tag*>::value == true));
+      function_requires< IncidenceGraphConcept<TG> >();
+      function_requires< VertexListGraphConcept<TG> >();
+      typedef typename graph_traits<TG>::vertex_descriptor Vertex;
+      function_requires< ReadablePropertyMapConcept<TVIM, Vertex> >();
+      typedef typename graph_traits<TG>::edge_descriptor Edge;
+      function_requires< ReadablePropertyMapConcept<TEW1, Edge> >();
+      function_requires< ReadablePropertyMapConcept<TEW2, Edge> >();
+
+      if(pcc == 0) {
+          return detail::mcr_howard<FT,TG, TVIM, TEW1, TEW2>(
+            g, vim, ewm, ew2m
+          ).ocr_howard();
+      }
+
+      detail::mcr_howard1<FT, TG, TVIM, TEW1, TEW2> obj(g, vim, ewm, ew2m);
+      double ocr = obj.ocr_howard();
+      obj.get_critical_cycle(*pcc);
+      return ocr;
+    }
+  } // namespace detail
+
+// Algorithms
+// Maximum Cycle Ratio
+
+template <
+    typename FloatTraits,
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeight1Map,
+    typename EdgeWeight2Map>
+inline typename FloatTraits::value_type
+maximum_cycle_ratio(const Graph &g, VertexIndexMap vim, EdgeWeight1Map ew1m,
+                    EdgeWeight2Map ew2m,
+                    std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0,
+                    FloatTraits = FloatTraits())
+{
+    typedef detail::float_wrapper<
+        FloatTraits, detail::max_comparator_props<FloatTraits>
+    > Traits;
+    return detail::optimum_cycle_ratio<Traits>(g, vim, ew1m, ew2m, pcc);
+}
+
+template <
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeight1Map,
+    typename EdgeWeight2Map>
+inline double
+maximum_cycle_ratio(const Graph &g, VertexIndexMap vim,
+                    EdgeWeight1Map ew1m, EdgeWeight2Map ew2m,
+                    std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0)
+{ return maximum_cycle_ratio(g, vim, ew1m, ew2m, pcc, mcr_float<>()); }
+
+// Minimum Cycle Ratio
+
+template <
+    typename FloatTraits,
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeight1Map,
+    typename EdgeWeight2Map>
+typename FloatTraits::value_type
+minimum_cycle_ratio(const Graph &g, VertexIndexMap vim,
+                    EdgeWeight1Map ew1m, EdgeWeight2Map ew2m,
+                    std::vector<typename graph_traits<Graph>::edge_descriptor> *pcc = 0,
+                    FloatTraits = FloatTraits())
+{
+    typedef detail::float_wrapper<
+        FloatTraits, detail::min_comparator_props<FloatTraits>
+    > Traits;
+    return detail::optimum_cycle_ratio<Traits>(g, vim, ew1m, ew2m, pcc);
+}
+
+template <
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeight1Map,
+    typename EdgeWeight2Map>
+inline double
+minimum_cycle_ratio(const Graph &g, VertexIndexMap vim,
+                    EdgeWeight1Map ew1m, EdgeWeight2Map ew2m,
+                    std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0)
+{ return minimum_cycle_ratio(g, vim, ew1m, ew2m, pcc, mcr_float<>()); }
+
+// Maximum Cycle Mean
+
+template <
+    typename FloatTraits,
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeightMap,
+    typename EdgeIndexMap>
+inline typename FloatTraits::value_type
+maximum_cycle_mean(const Graph &g, VertexIndexMap vim,
+                   EdgeWeightMap ewm, EdgeIndexMap eim,
+                   std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0,
+                   FloatTraits ft = FloatTraits())
+{
+    typedef typename remove_const<
+        typename property_traits<EdgeWeightMap>::value_type
+    >::type Weight;
+    typename std::vector<Weight> ed_w2(boost::num_edges(g), 1);
+    return maximum_cycle_ratio(g, vim, ewm,
+                               make_iterator_property_map(ed_w2.begin(), eim),
+                               pcc, ft);
+}
+
+template <
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeightMap,
+    typename EdgeIndexMap>
+inline double
+maximum_cycle_mean(const Graph& g, VertexIndexMap vim,
+                   EdgeWeightMap ewm, EdgeIndexMap eim,
+                   std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0)
+{ return maximum_cycle_mean(g, vim, ewm, eim, pcc, mcr_float<>()); }
+
+// Minimum Cycle Mean
+
+template <
+    typename FloatTraits,
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeightMap,
+    typename EdgeIndexMap>
+inline typename FloatTraits::value_type
+minimum_cycle_mean(const Graph &g, VertexIndexMap vim,
+                   EdgeWeightMap ewm, EdgeIndexMap eim,
+                   std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0,
+                   FloatTraits ft = FloatTraits())
+{
+    typedef typename remove_const<
+        typename property_traits<EdgeWeightMap>::value_type
+    >::type Weight;
+    typename std::vector<Weight> ed_w2(boost::num_edges(g), 1);
+    return minimum_cycle_ratio(g, vim, ewm,
+                               make_iterator_property_map(ed_w2.begin(), eim),
+                               pcc, ft);
+}
+
+template <
+    typename Graph,
+    typename VertexIndexMap,
+    typename EdgeWeightMap,
+    typename EdgeIndexMap>
+inline double
+minimum_cycle_mean(const Graph &g, VertexIndexMap vim,
+                   EdgeWeightMap ewm, EdgeIndexMap eim,
+                   std::vector<typename graph_traits<Graph>::edge_descriptor>* pcc = 0)
+{ return minimum_cycle_mean(g, vim, ewm, eim, pcc, mcr_float<>()); }
+
+} //namespace boost
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/incremental_components.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/incremental_components.hpp
new file mode 100644 (file)
index 0000000..43cc2a8
--- /dev/null
@@ -0,0 +1,230 @@
+//
+//=======================================================================
+// Copyright 1997-2001 University of Notre Dame.
+// Copyright 2009 Trustees of Indiana University.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek, Michael Hansen
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+//
+
+#ifndef BOOST_INCREMENTAL_COMPONENTS_HPP
+#define BOOST_INCREMENTAL_COMPONENTS_HPP
+
+#include <boost/detail/iterator.hpp>
+#include <boost/graph/detail/incremental_components.hpp>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/pending/disjoint_sets.hpp>
+
+namespace boost {
+
+  // A connected component algorithm for the case when dynamically
+  // adding (but not removing) edges is common.  The
+  // incremental_components() function is a preparing operation. Call
+  // same_component to check whether two vertices are in the same
+  // component, or use disjoint_set::find_set to determine the
+  // representative for a vertex.
+
+  // This version of connected components does not require a full
+  // Graph. Instead, it just needs an edge list, where the vertices of
+  // each edge need to be of integer type. The edges are assumed to
+  // be undirected. The other difference is that the result is stored in
+  // a container, instead of just a decorator.  The container should be
+  // empty before the algorithm is called. It will grow during the
+  // course of the algorithm. The container must be a model of
+  // BackInsertionSequence and RandomAccessContainer
+  // (std::vector is a good choice). After running the algorithm the
+  // index container will map each vertex to the representative
+  // vertex of the component to which it belongs.
+  //
+  // Adapted from an implementation by Alex Stepanov. The disjoint
+  // sets data structure is from Tarjan's "Data Structures and Network
+  // Algorithms", and the application to connected components is
+  // similar to the algorithm described in Ch. 22 of "Intro to
+  // Algorithms" by Cormen, et. all.
+  //  
+
+  // An implementation of disjoint sets can be found in
+  // boost/pending/disjoint_sets.hpp
+  
+  template <class EdgeListGraph, class DisjointSets>
+  void incremental_components(EdgeListGraph& g, DisjointSets& ds)
+  {
+    typename graph_traits<EdgeListGraph>::edge_iterator e, end;
+    for (tie(e,end) = edges(g); e != end; ++e)
+      ds.union_set(source(*e,g),target(*e,g));
+  }
+  
+  template <class ParentIterator>
+  void compress_components(ParentIterator first, ParentIterator last)
+  {
+    for (ParentIterator current = first; current != last; ++current) 
+      detail::find_representative_with_full_compression(first, current-first);
+  }
+  
+  template <class ParentIterator>
+  typename boost::detail::iterator_traits<ParentIterator>::difference_type
+  component_count(ParentIterator first, ParentIterator last)
+  {
+    std::ptrdiff_t count = 0;
+    for (ParentIterator current = first; current != last; ++current) 
+      if (*current == current - first) ++count; 
+    return count;
+  }
+  
+  // This algorithm can be applied to the result container of the
+  // connected_components algorithm to normalize
+  // the components.
+  template <class ParentIterator>
+  void normalize_components(ParentIterator first, ParentIterator last)
+  {
+    for (ParentIterator current = first; current != last; ++current) 
+      detail::normalize_node(first, current - first);
+  }
+  
+  template <class VertexListGraph, class DisjointSets> 
+  void initialize_incremental_components(VertexListGraph& G, DisjointSets& ds)
+  {
+    typename graph_traits<VertexListGraph>
+      ::vertex_iterator v, vend;
+    for (tie(v, vend) = vertices(G); v != vend; ++v)
+      ds.make_set(*v);
+  }
+
+  template <class Vertex, class DisjointSet>
+  inline bool same_component(Vertex u, Vertex v, DisjointSet& ds)
+  {
+    return ds.find_set(u) == ds.find_set(v);
+  }
+
+  // Class that builds a quick-access indexed linked list that allows
+  // for fast iterating through a parent component's children.
+  template <typename IndexType>
+  class component_index {
+
+  private:
+    typedef std::vector<IndexType> IndexContainer;
+
+  public:
+    typedef counting_iterator<IndexType> iterator;
+    typedef iterator const_iterator;
+    typedef IndexType value_type;
+    typedef IndexType size_type;
+
+    typedef detail::component_index_iterator<typename IndexContainer::iterator>
+      component_iterator;
+
+  public:
+    template <typename ParentIterator,
+              typename ElementIndexMap>
+    component_index(ParentIterator parent_start,
+                    ParentIterator parent_end,
+                    const ElementIndexMap& index_map) :
+      m_num_elements(std::distance(parent_start, parent_end)),
+      m_components(make_shared<IndexContainer>()),
+      m_index_list(make_shared<IndexContainer>(m_num_elements)) {
+
+      build_index_lists(parent_start, index_map);
+      
+    } // component_index
+
+    template <typename ParentIterator>
+    component_index(ParentIterator parent_start,
+                    ParentIterator parent_end) :
+      m_num_elements(std::distance(parent_start, parent_end)),
+      m_components(make_shared<IndexContainer>()),
+      m_index_list(make_shared<IndexContainer>(m_num_elements)) {
+
+      build_index_lists(parent_start, boost::identity_property_map());
+
+    } // component_index
+
+    // Returns the number of components
+    inline std::size_t size() const {
+      return (m_components->size());
+    }
+
+    // Beginning iterator for component indices
+    iterator begin() const {
+      return (iterator(0));
+    }
+
+    // End iterator for component indices
+    iterator end() const {
+      return (iterator(this->size()));
+    }
+
+    // Returns a pair of begin and end iterators for the child
+    // elements of component [component_index].
+    std::pair<component_iterator, component_iterator>
+    operator[](IndexType component_index) const {
+
+      IndexType first_index = (*m_components)[component_index];
+
+      return (std::make_pair
+              (component_iterator(m_index_list->begin(), first_index),
+               component_iterator(m_num_elements)));
+    }
+
+  private:
+    template <typename ParentIterator,
+              typename ElementIndexMap>
+    void build_index_lists(ParentIterator parent_start,
+                           const ElementIndexMap& index_map) {
+
+      typedef typename ParentIterator::value_type Element;
+      typename IndexContainer::iterator index_list =
+        m_index_list->begin();
+
+      // First pass - find root elements, construct index list
+      for (IndexType element_index = 0; element_index < m_num_elements;
+           ++element_index) {
+
+        Element parent_element = parent_start[element_index];
+        IndexType parent_index = get(index_map, parent_element);
+
+        if (element_index != parent_index) {
+          index_list[element_index] = parent_index;
+        }
+        else {
+          m_components->push_back(element_index);
+
+          // m_num_elements is the linked list terminator
+          index_list[element_index] = m_num_elements;
+        }
+      }
+
+      // Second pass - build linked list
+      for (IndexType element_index = 0; element_index < m_num_elements;
+           ++element_index) {
+
+        Element parent_element = parent_start[element_index];
+        IndexType parent_index = get(index_map, parent_element);
+
+        if (element_index != parent_index) {
+
+          // Follow list until a component parent is found
+          while (index_list[parent_index] != m_num_elements) {
+            parent_index = index_list[parent_index];
+          }
+
+          // Push element to the front of the linked list
+          index_list[element_index] = index_list[parent_index];
+          index_list[parent_index] = element_index;
+        }
+      }
+
+    } // build_index_lists
+
+  protected:
+    IndexType m_num_elements;
+    shared_ptr<IndexContainer> m_components, m_index_list;
+
+  }; // class component_index
+} // namespace boost
+
+#endif // BOOST_INCREMENTAL_COMPONENTS_HPP
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/is_kuratowski_subgraph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/is_kuratowski_subgraph.hpp
index c510c3ab7b76359d574b893802bdcf59ed9ee427..fab0b0246f79d123c39799fecd7f9a3c73f94e9e 100644 (file)
@@ -11,7 +11,7 @@
 #include <boost/config.hpp>
 #include <boost/utility.hpp> //for next/prior
 #include <boost/tuple/tuple.hpp>   //for tie
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/isomorphism.hpp>
 #include <boost/graph/adjacency_list.hpp>
@@ -97,6 +97,8 @@ namespace boost
 
     }
 
+    enum target_graph_t { tg_k_3_3, tg_k_5};
+
   } // namespace detail
 
 
@@ -123,9 +125,7 @@ namespace boost
 
     typedef adjacency_list<vecS, vecS, undirectedS> small_graph_t;
 
-    enum target_graph_t { k_3_3, k_5};
-
-    target_graph_t target_graph = k_3_3; //unless we decide otherwise later
+    detail::target_graph_t target_graph = detail::tg_k_3_3; //unless we decide otherwise later
 
     static small_graph_t K_5(detail::make_K_5<small_graph_t>());
 
@@ -245,11 +245,11 @@ namespace boost
             for(tie(vi,vi_end) = vertices(g); vi != vi_end; ++vi)
               if (neighbors[*vi].size() == 4)
                 {
-                  target_graph = k_5;
+                  target_graph = detail::tg_k_5;
                   break;
                 }
 
-            if (target_graph == k_3_3)
+            if (target_graph == detail::tg_k_3_3)
               break;
           }
         
@@ -299,11 +299,11 @@ namespace boost
           }
       }
     
-    if (target_graph == k_5)
+    if (target_graph == detail::tg_k_5)
       {
         return isomorphism(K_5,contracted_graph);
       }
-    else //target_graph == k_3_3
+    else //target_graph == tg_k_3_3
       {
         return isomorphism(K_3_3,contracted_graph);
       }
similarity index 87%
rename from deal.II/contrib/boost/include/boost/graph/is_straight_line_drawing.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/is_straight_line_drawing.hpp
index f533bce2dfd941e36d20c1bc3d36deb11c422396..1377e3e9e84483d1cec8ab270e68b5d965716c97 100644 (file)
@@ -12,7 +12,7 @@
 #include <boost/utility.hpp> //for next and prior
 #include <boost/tuple/tuple.hpp>
 #include <boost/tuple/tuple_comparison.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/planar_detail/bucket_sort.hpp>
 
@@ -164,7 +164,7 @@ namespace boost
         edge_t e(get<0>(*itr));
         vertex_t source_v(source(e,g));
         vertex_t target_v(target(e,g));
-        if (drawing[source_v].x > drawing[target_v].x)
+        if (drawing[source_v].y > drawing[target_v].y)
           std::swap(source_v, target_v);
 
         active_map_key_t key(get(drawing, source_v).y,
@@ -185,14 +185,34 @@ namespace boost
               before = active_edges.end();
             else
               before = prior(a_itr);
-            after = next(a_itr);
+            after = boost::next(a_itr);
 
-            if (after != active_edges.end() || before != active_edges.end())
+            if (before != active_edges.end())
               {
                 
-                edge_t f = after != active_edges.end() ? 
-                  after->second : before->second;
+                edge_t f = before->second;
+                vertex_t e_source(source(e,g));
+                vertex_t e_target(target(e,g));
+                vertex_t f_source(source(f,g));
+                vertex_t f_target(target(f,g));
 
+                if (intersects(drawing[e_source].x, 
+                               drawing[e_source].y,
+                               drawing[e_target].x,
+                               drawing[e_target].y,
+                               drawing[f_source].x, 
+                               drawing[f_source].y,
+                               drawing[f_target].x,
+                               drawing[f_target].y
+                               )
+                    )
+                  return false;
+              }
+
+            if (after != active_edges.end())
+              {
+                
+                edge_t f = after->second;
                 vertex_t e_source(source(e,g));
                 vertex_t e_target(target(e,g));
                 vertex_t f_source(source(f,g));
similarity index 97%
rename from deal.II/contrib/boost/include/boost/graph/isomorphism.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/isomorphism.hpp
index 842f914356cd1b99569eae8d9b9989629da9865d..29f6ef2c58e72b859218ba0b71030a52fe507581 100644 (file)
@@ -237,7 +237,7 @@ namespace boost {
                 num_edges_on_k = 1;
                 BOOST_USING_STD_MAX();
                 int next_k = max BOOST_PREVENT_MACRO_SUBSTITUTION(dfs_num_k, max BOOST_PREVENT_MACRO_SUBSTITUTION(dfs_num[i], dfs_num[j]));
-                if (match(next(iter), next_k))
+                if (match(boost::next(iter), next_k))
                   return true;
                 in_S[v] = false;
               }
@@ -247,7 +247,7 @@ namespace boost {
           else {
             if (container_contains(adjacent_vertices(f[i], G2), f[j])) {
               ++num_edges_on_k;
-              if (match(next(iter), dfs_num_k))
+              if (match(boost::next(iter), dfs_num_k))
                 return true;
             }
                 
@@ -439,13 +439,11 @@ namespace boost {
       return false;
 #endif
   
-    for (typename graph_traits<Graph1>::edge_iterator e1 = edges(g1).first;
-         e1 != edges(g1).second; ++e1) {
+    BGL_FORALL_EDGES_T(e1, g1, Graph1) {
       bool found_edge = false;
-      for (typename graph_traits<Graph2>::edge_iterator e2 = edges(g2).first;
-           e2 != edges(g2).second && !found_edge; ++e2) {
-        if (source(*e2, g2) == get(iso_map, source(*e1, g1)) &&
-            target(*e2, g2) == get(iso_map, target(*e1, g1))) {
+      BGL_FORALL_EDGES_T(e2, g2, Graph2) {
+        if (source(e2, g2) == get(iso_map, source(e1, g1)) &&
+            target(e2, g2) == get(iso_map, target(e1, g1))) {
           found_edge = true;
         }
       }
similarity index 64%
rename from deal.II/contrib/boost/include/boost/graph/iteration_macros.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/iteration_macros.hpp
index 850e887518f1208a20adde41ca7ad742aff4b7ce..2bf40f958080fa4acbcb3890d60abe87ea96fbe9 100644 (file)
 #ifndef BOOST_GRAPH_ITERATION_MACROS_HPP
 #define BOOST_GRAPH_ITERATION_MACROS_HPP
 
+#include <utility>
+
 #define BGL_CAT(x,y) x ## y
-#define BGL_FIRST(linenum) BGL_CAT(bgl_first_,linenum)
-#define BGL_LAST(linenum) BGL_CAT(bgl_last_,linenum)
+#define BGL_RANGE(linenum) BGL_CAT(bgl_range_,linenum)
+#define BGL_FIRST(linenum) (BGL_RANGE(linenum).first)
+#define BGL_LAST(linenum) (BGL_RANGE(linenum).second)
 
 /*
   BGL_FORALL_VERTICES_T(v, g, graph_t)  // This is on line 9
@@ -22,7 +25,7 @@
            bgl_first_9 = vertices(g).first, bgl_last_9 = vertices(g).second;
        bgl_first_9 != bgl_last_9; bgl_first_9 = bgl_last_9)
     for (typename boost::graph_traits<graph_t>::vertex_descriptor v;
-         bgl_first_9 != bgl_last ? (v = *bgl_first_9, true) : false;
+         bgl_first_9 != bgl_last_9 ? (v = *bgl_first_9, true) : false;
          ++bgl_first_9)
 
   The purpose of having two for-loops is just to provide a place to
   Use the _T versions when the graph type is a template parameter or
   dependent on a template parameter. Otherwise use the non _T versions.
   
+  -----------------------
+  6/9/09 THK
+  
+  The above contains two calls to the vertices function. I modified these
+  macros to expand to
+  
+    for (std::pair<typename boost::graph_traits<graph_t>::vertex_iterator,
+                   typename boost::graph_traits<graph_t>::vertex_iterator> bgl_range_9 = vertices(g);
+       bgl_range_9.first != bgl_range_9.second;
+       bgl_range_9.first = bgl_range_9.second)
+    for (typename boost::graph_traits<graph_t>::vertex_descriptor v;
+         bgl_range_9.first != bgl_range_9.second ? (v = *bgl_range_9.first, true) : false;
+         ++bgl_range_9.first)
+  
  */
 
 
 #define BGL_FORALL_VERTICES_T(VNAME, GNAME, GraphType) \
-for (typename boost::graph_traits<GraphType>::vertex_iterator \
-  BGL_FIRST(__LINE__) = vertices(GNAME).first, BGL_LAST(__LINE__) = vertices(GNAME).second; \
+for (std::pair<typename boost::graph_traits<GraphType>::vertex_iterator, \
+               typename boost::graph_traits<GraphType>::vertex_iterator> BGL_RANGE(__LINE__) = vertices(GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
   for (typename boost::graph_traits<GraphType>::vertex_descriptor VNAME; \
     BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true):false; \
      ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_VERTICES(VNAME, GNAME, GraphType) \
-for (boost::graph_traits<GraphType>::vertex_iterator \
-  BGL_FIRST(__LINE__) = vertices(GNAME).first, BGL_LAST(__LINE__) = vertices(GNAME).second; \
+for (std::pair<boost::graph_traits<GraphType>::vertex_iterator, \
+               boost::graph_traits<GraphType>::vertex_iterator> BGL_RANGE(__LINE__) = vertices(GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
   for (boost::graph_traits<GraphType>::vertex_descriptor VNAME; \
     BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true):false; \
      ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_EDGES_T(ENAME, GNAME, GraphType) \
-for (typename boost::graph_traits<GraphType>::edge_iterator \
-  BGL_FIRST(__LINE__) = edges(GNAME).first, BGL_LAST(__LINE__) = edges(GNAME).second; \
+for (std::pair<typename boost::graph_traits<GraphType>::edge_iterator, \
+               typename boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
   for (typename boost::graph_traits<GraphType>::edge_descriptor ENAME; \
     BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
      ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_EDGES(ENAME, GNAME, GraphType) \
-for (boost::graph_traits<GraphType>::edge_iterator \
-  BGL_FIRST(__LINE__) = edges(GNAME).first, BGL_LAST(__LINE__) = edges(GNAME).second; \
+for (std::pair<boost::graph_traits<GraphType>::edge_iterator, \
+               boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
   for (boost::graph_traits<GraphType>::edge_descriptor ENAME; \
      BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
      ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_ADJ_T(UNAME, VNAME, GNAME, GraphType) \
-for (typename boost::graph_traits<GraphType>::adjacency_iterator \
-  BGL_FIRST(__LINE__) = adjacent_vertices(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = adjacent_vertices(UNAME, GNAME).second; \
+for (std::pair<typename boost::graph_traits<GraphType>::adjacency_iterator, \
+               typename boost::graph_traits<GraphType>::adjacency_iterator> BGL_RANGE(__LINE__) = adjacent_vertices(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (typename boost::graph_traits<GraphType>::vertex_descriptor VNAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true) : false; \
    ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_ADJ(UNAME, VNAME, GNAME, GraphType) \
-for (boost::graph_traits<GraphType>::adjacency_iterator \
-  BGL_FIRST(__LINE__) = adjacent_vertices(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = adjacent_vertices(UNAME, GNAME).second; \
+for (std::pair<boost::graph_traits<GraphType>::adjacency_iterator, \
+               boost::graph_traits<GraphType>::adjacency_iterator> BGL_RANGE(__LINE__) = adjacent_vertices(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (boost::graph_traits<GraphType>::vertex_descriptor VNAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true) : false; \
    ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_OUTEDGES_T(UNAME, ENAME, GNAME, GraphType) \
-for (typename boost::graph_traits<GraphType>::out_edge_iterator \
-  BGL_FIRST(__LINE__) = out_edges(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = out_edges(UNAME, GNAME).second; \
+for (std::pair<typename boost::graph_traits<GraphType>::out_edge_iterator, \
+               typename boost::graph_traits<GraphType>::out_edge_iterator> BGL_RANGE(__LINE__) = out_edges(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (typename boost::graph_traits<GraphType>::edge_descriptor ENAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \
    ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_OUTEDGES(UNAME, ENAME, GNAME, GraphType) \
-for (boost::graph_traits<GraphType>::out_edge_iterator \
-  BGL_FIRST(__LINE__) = out_edges(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = out_edges(UNAME, GNAME).second; \
+for (std::pair<boost::graph_traits<GraphType>::out_edge_iterator, \
+               boost::graph_traits<GraphType>::out_edge_iterator> BGL_RANGE(__LINE__) = out_edges(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (boost::graph_traits<GraphType>::edge_descriptor ENAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \
    ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_INEDGES_T(UNAME, ENAME, GNAME, GraphType) \
-for (typename boost::graph_traits<GraphType>::in_edge_iterator \
-  BGL_FIRST(__LINE__) = in_edges(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = in_edges(UNAME, GNAME).second; \
+for (std::pair<typename boost::graph_traits<GraphType>::in_edge_iterator, \
+               typename boost::graph_traits<GraphType>::in_edge_iterator> BGL_RANGE(__LINE__) = in_edges(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (typename boost::graph_traits<GraphType>::edge_descriptor ENAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \
    ++BGL_FIRST(__LINE__))
 
 #define BGL_FORALL_INEDGES(UNAME, ENAME, GNAME, GraphType) \
-for (boost::graph_traits<GraphType>::in_edge_iterator \
-  BGL_FIRST(__LINE__) = in_edges(UNAME, GNAME).first,\
-  BGL_LAST(__LINE__) = in_edges(UNAME, GNAME).second; \
+for (std::pair<boost::graph_traits<GraphType>::in_edge_iterator, \
+               boost::graph_traits<GraphType>::in_edge_iterator> BGL_RANGE(__LINE__) = in_edges(UNAME, GNAME); \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
 for (boost::graph_traits<GraphType>::edge_descriptor ENAME; \
   BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \
similarity index 94%
rename from deal.II/contrib/boost/include/boost/graph/johnson_all_pairs_shortest.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/johnson_all_pairs_shortest.hpp
index 45a8cf2c95e6b6a0f23c3a8bf8033c35d14af724..0720411c5a82694d24d19a9c2f2f0d25ce2fc9d5 100644 (file)
@@ -23,7 +23,8 @@
 #define BOOST_GRAPH_JOHNSON_HPP
 
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/shared_array_property_map.hpp>
 #include <boost/graph/bellman_ford_shortest_paths.hpp>
 #include <boost/graph/dijkstra_shortest_paths.hpp>
 #include <boost/graph/adjacency_list.hpp>
@@ -94,12 +95,10 @@ namespace boost {
     }
     typename Traits2::vertex_iterator v, v_end, u, u_end;
     typename Traits2::edge_iterator e, e_end;
-    std::vector<DT> h_vec(num_vertices(g2));
-    typedef typename std::vector<DT>::iterator iter_t;
-    iterator_property_map<iter_t,VertexID2,DT,DT&> h(h_vec.begin(), id2);
+    shared_array_property_map<DT,VertexID2> h(num_vertices(g2), id2);
 
     for (tie(v, v_end) = vertices(g2); v != v_end; ++v)
-      d[*v] = inf;
+      put(d, *v, inf);
 
     put(d, s, zero);
     // Using the non-named parameter versions of bellman_ford and
@@ -113,7 +112,7 @@ namespace boost {
       for (tie(e, e_end) = edges(g2); e != e_end; ++e) {
         typename Traits2::vertex_descriptor a = source(*e, g2),
           b = target(*e, g2);
-        put(w_hat, *e, get(w, *e) + get(h, a) - get(h, b));
+        put(w_hat, *e, combine(get(w, *e), (get(h, a) - get(h, b))));
       }
       for (tie(u, u_end) = vertices(g2); u != u_end; ++u) {
         dijkstra_visitor<> dvis;
@@ -122,8 +121,8 @@ namespace boost {
         for (tie(v, v_end) = vertices(g2); v != v_end; ++v) {
           if (*u != s && *v != s) {
             typename Traits1::vertex_descriptor u1, v1;
-            u1 = verts1[id2[*u]]; v1 = verts1[id2[*v]];
-            D[id2[*u]-1][id2[*v]-1] = get(d, *v) + get(h, *v) - get(h, *u);
+            u1 = verts1[get(id2, *u)]; v1 = verts1[get(id2, *v)];
+            D[get(id2, *u)-1][get(id2, *v)-1] = combine(get(d, *v), (get(h, *v) - get(h, *u)));
           }
         }
       }
similarity index 72%
rename from deal.II/contrib/boost/include/boost/graph/kamada_kawai_spring_layout.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/kamada_kawai_spring_layout.hpp
index 00dbcb76ead718b75246cf7ea727d17df94e5bb9..0262e1fc28caed5d3677bdf3714a23addc58a838 100644 (file)
@@ -10,6 +10,8 @@
 #define BOOST_GRAPH_KAMADA_KAWAI_SPRING_LAYOUT_HPP
 
 #include <boost/graph/graph_traits.hpp>
+#include <boost/graph/topology.hpp>
+#include <boost/graph/iteration_macros.hpp>
 #include <boost/graph/johnson_all_pairs_shortest.hpp>
 #include <boost/type_traits/is_convertible.hpp>
 #include <utility>
@@ -67,22 +69,82 @@ namespace boost {
       return length.value / result;
     }
 
+    /**
+     * Dense linear solver for fixed-size matrices.
+     */
+    template <std::size_t Size>
+    struct linear_solver {
+      // Indices in mat are (row, column)
+      // template <typename Vec>
+      // static Vec solve(double mat[Size][Size], Vec rhs);
+    };
+
+    template <>
+    struct linear_solver<1> {
+      template <typename Vec>
+      static Vec solve(double mat[1][1], Vec rhs) {
+        return rhs / mat[0][0];
+      }
+    };
+
+    // These are from http://en.wikipedia.org/wiki/Cramer%27s_rule
+    template <>
+    struct linear_solver<2> {
+      template <typename Vec>
+      static Vec solve(double mat[2][2], Vec rhs) {
+        double denom = mat[0][0] * mat[1][1] - mat[1][0] * mat[0][1];
+        double x_num = rhs[0]    * mat[1][1] - rhs[1]    * mat[0][1];
+        double y_num = mat[0][0] * rhs[1]    - mat[1][0] * rhs[0]   ;
+        Vec result;
+        result[0] = x_num / denom;
+        result[1] = y_num / denom;
+        return result;
+      }
+    };
+
+    template <>
+    struct linear_solver<3> {
+      template <typename Vec>
+      static Vec solve(double mat[2][2], Vec rhs) {
+        double denom = mat[0][0] * (mat[1][1] * mat[2][2] - mat[2][1] * mat[1][2])
+                     - mat[1][0] * (mat[0][1] * mat[2][2] - mat[2][1] * mat[0][2])
+                     + mat[2][0] * (mat[0][1] * mat[1][2] - mat[1][1] * mat[0][2]);
+        double x_num = rhs[0]    * (mat[1][1] * mat[2][2] - mat[2][1] * mat[1][2])
+                     - rhs[1]    * (mat[0][1] * mat[2][2] - mat[2][1] * mat[0][2])
+                     + rhs[2]    * (mat[0][1] * mat[1][2] - mat[1][1] * mat[0][2]);
+        double y_num = mat[0][0] * (rhs[1]    * mat[2][2] - rhs[2]    * mat[1][2])
+                     - mat[1][0] * (rhs[0]    * mat[2][2] - rhs[2]    * mat[0][2])
+                     + mat[2][0] * (rhs[0]    * mat[1][2] - rhs[1]    * mat[0][2]);
+        double z_num = mat[0][0] * (mat[1][1] * rhs[2]    - mat[2][1] * rhs[1]   )
+                     - mat[1][0] * (mat[0][1] * rhs[2]    - mat[2][1] * rhs[0]   )
+                     + mat[2][0] * (mat[0][1] * rhs[1]    - mat[1][1] * rhs[0]   );
+        Vec result;
+        result[0] = x_num / denom;
+        result[1] = y_num / denom;
+        result[2] = z_num / denom;
+        return result;
+      }
+    };
+
     /**
      * Implementation of the Kamada-Kawai spring layout algorithm.
      */
-    template<typename Graph, typename PositionMap, typename WeightMap,
+    template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
              typename EdgeOrSideLength, typename Done,
              typename VertexIndexMap, typename DistanceMatrix,
              typename SpringStrengthMatrix, typename PartialDerivativeMap>
     struct kamada_kawai_spring_layout_impl
     {
       typedef typename property_traits<WeightMap>::value_type weight_type;
-      typedef std::pair<weight_type, weight_type> deriv_type;
+      typedef typename Topology::point_type Point;
+      typedef typename Topology::point_difference_type point_difference_type;
+      typedef point_difference_type deriv_type;
       typedef typename graph_traits<Graph>::vertex_iterator vertex_iterator;
       typedef typename graph_traits<Graph>::vertex_descriptor
         vertex_descriptor;
 
       kamada_kawai_spring_layout_impl(
+        const Topology& topology,
         const Graph& g, 
         PositionMap position,
         WeightMap weight, 
@@ -93,7 +155,7 @@ namespace boost {
         DistanceMatrix distance,
         SpringStrengthMatrix spring_strength,
         PartialDerivativeMap partial_derivatives)
-        : g(g), position(position), weight(weight), 
+        : topology(topology), g(g), position(position), weight(weight), 
           edge_or_side_length(edge_or_side_length), done(done),
           spring_constant(spring_constant), index(index), distance(distance),
           spring_strength(spring_strength), 
@@ -108,15 +170,12 @@ namespace boost {
         using std::sqrt;
 #endif // BOOST_NO_STDC_NAMESPACE
 
-        deriv_type result(0, 0);
+        deriv_type result;
         if (i != m) {
-          weight_type x_diff = position[m].x - position[i].x;
-          weight_type y_diff = position[m].y - position[i].y;
-          weight_type dist = sqrt(x_diff * x_diff + y_diff * y_diff);
-          result.first = spring_strength[get(index, m)][get(index, i)] 
-            * (x_diff - distance[get(index, m)][get(index, i)]*x_diff/dist);
-          result.second = spring_strength[get(index, m)][get(index, i)] 
-            * (y_diff - distance[get(index, m)][get(index, i)]*y_diff/dist);
+          point_difference_type diff = topology.difference(position[m], position[i]);
+          weight_type dist = topology.norm(diff);
+          result = spring_strength[get(index, m)][get(index, i)] 
+            * (diff - distance[get(index, m)][get(index, i)]/dist*diff);
         }
 
         return result;
@@ -130,15 +189,12 @@ namespace boost {
         using std::sqrt;
 #endif // BOOST_NO_STDC_NAMESPACE
 
-        deriv_type result(0, 0);
+        deriv_type result;
 
         // TBD: looks like an accumulate to me
-        std::pair<vertex_iterator, vertex_iterator> verts = vertices(g);
-        for (/* no init */; verts.first != verts.second; ++verts.first) {
-          vertex_descriptor i = *verts.first;
+        BGL_FORALL_VERTICES_T(i, g, Graph) {
           deriv_type deriv = compute_partial_derivative(m, i);
-          result.first += deriv.first;
-          result.second += deriv.second;
+          result += deriv;
         }
 
         return result;
@@ -185,8 +241,7 @@ namespace boost {
           deriv_type deriv = compute_partial_derivatives(*ui);
           put(partial_derivatives, *ui, deriv);
 
-          weight_type delta = 
-            sqrt(deriv.first*deriv.first + deriv.second*deriv.second);
+          weight_type delta = topology.norm(deriv);
 
           if (delta > delta_p) {
             p = *ui;
@@ -206,47 +261,48 @@ namespace boost {
           }
 
           do {
-            // Compute the 4 elements of the Jacobian
-            weight_type dE_dx_dx = 0, dE_dx_dy = 0, dE_dy_dx = 0, dE_dy_dy = 0;
+            // Compute the elements of the Jacobian
+            // From
+            // http://www.cs.panam.edu/~rfowler/papers/1994_kumar_fowler_A_Spring_UTPACSTR.pdf
+            // with the bugs fixed in the off-diagonal case
+            weight_type dE_d_d[Point::dimensions][Point::dimensions];
+            for (std::size_t i = 0; i < Point::dimensions; ++i)
+              for (std::size_t j = 0; j < Point::dimensions; ++j)
+                dE_d_d[i][j] = 0.;
             for (ui = vertices(g).first; ui != end; ++ui) {
               vertex_descriptor i = *ui;
               if (i != p) {
-                weight_type x_diff = position[p].x - position[i].x;
-                weight_type y_diff = position[p].y - position[i].y;
-                weight_type dist = sqrt(x_diff * x_diff + y_diff * y_diff);
-                weight_type dist_cubed = dist * dist * dist;
+                point_difference_type diff = topology.difference(position[p], position[i]);
+                weight_type dist = topology.norm(diff);
+                weight_type dist_squared = dist * dist;
+                weight_type inv_dist_cubed = 1. / (dist_squared * dist);
                 weight_type k_mi = spring_strength[get(index,p)][get(index,i)];
                 weight_type l_mi = distance[get(index, p)][get(index, i)];
-                dE_dx_dx += k_mi * (1 - (l_mi * y_diff * y_diff)/dist_cubed);
-                dE_dx_dy += k_mi * l_mi * x_diff * y_diff / dist_cubed;
-                dE_dy_dx += k_mi * l_mi * x_diff * y_diff / dist_cubed;
-                dE_dy_dy += k_mi * (1 - (l_mi * x_diff * x_diff)/dist_cubed);
+                for (std::size_t i = 0; i < Point::dimensions; ++i) {
+                  for (std::size_t j = 0; j < Point::dimensions; ++j) {
+                    if (i == j) {
+                      dE_d_d[i][i] += k_mi * (1 + (l_mi * (diff[i] * diff[i] - dist_squared) * inv_dist_cubed));
+                    } else {
+                      dE_d_d[i][j] += k_mi * l_mi * diff[i] * diff[j] * inv_dist_cubed;
+                    }
+                  }
+                }
               }
             }
 
-            // Solve for delta_x and delta_y
-            weight_type dE_dx = get(partial_derivatives, p).first;
-            weight_type dE_dy = get(partial_derivatives, p).second;
-
-            weight_type delta_x = 
-              (dE_dx_dy * dE_dy - dE_dy_dy * dE_dx)
-              / (dE_dx_dx * dE_dy_dy - dE_dx_dy * dE_dy_dx);
+            deriv_type dE_d = get(partial_derivatives, p);
 
-            weight_type delta_y = 
-              (dE_dx_dx * dE_dy - dE_dy_dx * dE_dx)
-              / (dE_dy_dx * dE_dx_dy - dE_dx_dx * dE_dy_dy);
+            // Solve dE_d_d * delta = dE_d to get delta
+            point_difference_type delta = -linear_solver<Point::dimensions>::solve(dE_d_d, dE_d);
 
-
-            // Move p by (delta_x, delta_y)
-            position[p].x += delta_x;
-            position[p].y += delta_y;
+            // Move p by delta
+            position[p] = topology.adjust(position[p], delta);
 
             // Recompute partial derivatives and delta_p
             deriv_type deriv = compute_partial_derivatives(p);
             put(partial_derivatives, p, deriv);
 
-            delta_p = 
-              sqrt(deriv.first*deriv.first + deriv.second*deriv.second);
+            delta_p = topology.norm(deriv);
           } while (!done(delta_p, p, g, false));
 
           // Select new p by updating each partial derivative and delta
@@ -257,12 +313,10 @@ namespace boost {
               compute_partial_derivative(*ui, old_p);
             deriv_type deriv = get(partial_derivatives, *ui);
 
-            deriv.first += old_p_partial.first - old_deriv_p.first;
-            deriv.second += old_p_partial.second - old_deriv_p.second;
+            deriv += old_p_partial - old_deriv_p;
 
             put(partial_derivatives, *ui, deriv);
-            weight_type delta = 
-              sqrt(deriv.first*deriv.first + deriv.second*deriv.second);
+            weight_type delta = topology.norm(deriv);
 
             if (delta > delta_p) {
               p = *ui;
@@ -274,6 +328,7 @@ namespace boost {
         return true;
       }
 
+      const Topology& topology;
       const Graph& g; 
       PositionMap position;
       WeightMap weight; 
@@ -373,6 +428,9 @@ namespace boost {
    * \param weight (IN) must be a model of Readable Property Map,
    * which provides the weight of each edge in the graph @p g.
    *
+   * \param topology (IN) must be a topology object (see topology.hpp),
+   * which provides operations on points and differences between them.
+   *
    * \param edge_or_side_length (IN) provides either the unit length
    * @c e of an edge in the layout or the length of a side @c s of the
    * display area, and must be either @c boost::edge_length(e) or @c
@@ -417,7 +475,7 @@ namespace boost {
    * \returns @c true if layout was successful or @c false if a
    * negative weight cycle was detected.
    */
-  template<typename Graph, typename PositionMap, typename WeightMap,
+  template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
            typename T, bool EdgeOrSideLength, typename Done,
            typename VertexIndexMap, typename DistanceMatrix,
            typename SpringStrengthMatrix, typename PartialDerivativeMap>
@@ -426,6 +484,7 @@ namespace boost {
     const Graph& g, 
     PositionMap position,
     WeightMap weight, 
+    const Topology& topology,
     detail::graph::edge_or_side<EdgeOrSideLength, T> edge_or_side_length,
     Done done,
     typename property_traits<WeightMap>::value_type spring_constant,
@@ -440,10 +499,10 @@ namespace boost {
                          >::value));
 
     detail::graph::kamada_kawai_spring_layout_impl<
-      Graph, PositionMap, WeightMap, 
+      Topology, Graph, PositionMap, WeightMap, 
       detail::graph::edge_or_side<EdgeOrSideLength, T>, Done, VertexIndexMap, 
       DistanceMatrix, SpringStrengthMatrix, PartialDerivativeMap>
-      alg(g, position, weight, edge_or_side_length, done, spring_constant,
+      alg(topology, g, position, weight, edge_or_side_length, done, spring_constant,
           index, distance, spring_strength, partial_derivatives);
     return alg.run();
   }
@@ -451,7 +510,7 @@ namespace boost {
   /**
    * \overload
    */
-  template<typename Graph, typename PositionMap, typename WeightMap,
+  template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
            typename T, bool EdgeOrSideLength, typename Done, 
            typename VertexIndexMap>
   bool 
@@ -459,6 +518,7 @@ namespace boost {
     const Graph& g, 
     PositionMap position,
     WeightMap weight, 
+    const Topology& topology,
     detail::graph::edge_or_side<EdgeOrSideLength, T> edge_or_side_length,
     Done done,
     typename property_traits<WeightMap>::value_type spring_constant,
@@ -471,32 +531,33 @@ namespace boost {
 
     std::vector<weight_vec> distance(n, weight_vec(n));
     std::vector<weight_vec> spring_strength(n, weight_vec(n));
-    std::vector<std::pair<weight_type, weight_type> > partial_derivatives(n);
+    std::vector<typename Topology::point_difference_type> partial_derivatives(n);
 
     return 
       kamada_kawai_spring_layout(
-        g, position, weight, edge_or_side_length, done, spring_constant, index,
+        g, position, weight, topology, edge_or_side_length, done, spring_constant, index,
         distance.begin(),
         spring_strength.begin(),
         make_iterator_property_map(partial_derivatives.begin(), index,
-                                   std::pair<weight_type, weight_type>()));
+                                   typename Topology::point_difference_type()));
   }
 
   /**
    * \overload
    */
-  template<typename Graph, typename PositionMap, typename WeightMap,
+  template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
            typename T, bool EdgeOrSideLength, typename Done>
   bool 
   kamada_kawai_spring_layout(
     const Graph& g, 
     PositionMap position,
     WeightMap weight, 
+    const Topology& topology,
     detail::graph::edge_or_side<EdgeOrSideLength, T> edge_or_side_length,
     Done done,
     typename property_traits<WeightMap>::value_type spring_constant)
   {
-    return kamada_kawai_spring_layout(g, position, weight, edge_or_side_length,
+    return kamada_kawai_spring_layout(g, position, weight, topology, edge_or_side_length,
                                       done, spring_constant, 
                                       get(vertex_index, g));
   }
@@ -504,35 +565,37 @@ namespace boost {
   /**
    * \overload
    */
-  template<typename Graph, typename PositionMap, typename WeightMap,
+  template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
            typename T, bool EdgeOrSideLength, typename Done>
   bool 
   kamada_kawai_spring_layout(
     const Graph& g, 
     PositionMap position,
     WeightMap weight, 
+    const Topology& topology,
     detail::graph::edge_or_side<EdgeOrSideLength, T> edge_or_side_length,
     Done done)
   {
     typedef typename property_traits<WeightMap>::value_type weight_type;
-    return kamada_kawai_spring_layout(g, position, weight, edge_or_side_length,
+    return kamada_kawai_spring_layout(g, position, weight, topology, edge_or_side_length,
                                       done, weight_type(1)); 
   }
 
   /**
    * \overload
    */
-  template<typename Graph, typename PositionMap, typename WeightMap,
+  template<typename Topology, typename Graph, typename PositionMap, typename WeightMap,
            typename T, bool EdgeOrSideLength>
   bool 
   kamada_kawai_spring_layout(
     const Graph& g, 
     PositionMap position,
     WeightMap weight, 
+    const Topology& topology,
     detail::graph::edge_or_side<EdgeOrSideLength, T> edge_or_side_length)
   {
     typedef typename property_traits<WeightMap>::value_type weight_type;
-    return kamada_kawai_spring_layout(g, position, weight, edge_or_side_length,
+    return kamada_kawai_spring_layout(g, position, weight, topology, edge_or_side_length,
                                       layout_tolerance<weight_type>(),
                                       weight_type(1.0), 
                                       get(vertex_index, g));
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/king_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/king_ordering.hpp
index dadd963f861072cabafb2684b8a253a3936bf2ad..774972732a795e15ba2ac391814c0300ec88dcf2 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <boost/config.hpp>
 #include <boost/graph/detail/sparse_ordering.hpp>
+#include <boost/graph/graph_utility.hpp>
 
 /*
   King Algorithm for matrix reordering
@@ -262,7 +263,7 @@ namespace boost {
   king_ordering(const Graph& G, OutputIterator permutation, 
                 ColorMap color, DegreeMap degree, VertexIndexMap index_map)
   {
-    if (vertices(G).first == vertices(G).second)
+    if (has_no_vertices(G))
       return permutation;
 
     typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;
@@ -298,7 +299,7 @@ namespace boost {
   king_ordering(const Graph& G, OutputIterator permutation, 
                 VertexIndexMap index_map)
   {
-    if (vertices(G).first == vertices(G).second)
+    if (has_no_vertices(G))
       return permutation;
 
     typedef out_degree_property_map<Graph> DegreeMap;
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/kolmogorov_max_flow.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/kolmogorov_max_flow.hpp
index e74796d34e80a46cf8a4e8c3ff6ec0f1f66899f7..328bd3034175bdfad19c7f3ec47372368138f9de 100644 (file)
@@ -42,7 +42,7 @@
 
 #include <boost/pending/queue.hpp>
 #include <boost/limits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/none_t.hpp>
 #include <boost/graph/graph_concepts.hpp>
 #include <boost/graph/named_function_params.hpp>
@@ -344,7 +344,7 @@ namespace boost {
 
           /**
            * returns the bottleneck of a s->t path (end_of_path is last vertex in source-tree, begin_of_path is first vertex in sink-tree)
-           */          
+           */
           inline tEdgeVal find_bottleneck(edge_descriptor e){
             BOOST_USING_STD_MIN();
             tEdgeVal minimum_cap = m_res_cap_map[e];
@@ -467,7 +467,7 @@ namespace boost {
 
           /**
           * return next active vertex if there is one, otherwise a null_vertex
-          */   
+          */    
           inline vertex_descriptor get_next_active_node(){
             while(true){
               if(m_active_nodes.empty())
@@ -486,7 +486,7 @@ namespace boost {
 
           /**
           * adds v as an active vertex, but only if its not in the list already
-          */           
+          */            
           inline void add_active_node(vertex_descriptor v){
             assert(get_tree(v) != tColorTraits::gray());
             if(m_in_active_list_map[v]){
@@ -545,7 +545,7 @@ namespace boost {
 
           /**
            * sets edge to parent vertex of v; 
-          */           
+          */            
           inline void set_edge_to_parent(vertex_descriptor v, edge_descriptor f_edge_to_parent){
             assert(m_res_cap_map[f_edge_to_parent] > 0);
             m_pre_map[v] = f_edge_to_parent;
@@ -676,7 +676,7 @@ namespace boost {
   /**
    * non-named-parameter version, given everything
    * this is the catch all version
-   */                  
+   */                   
   template <class Graph, class CapacityEdgeMap, class ResidualCapacityEdgeMap, class ReverseEdgeMap, 
     class PredecessorMap, class ColorMap, class DistanceMap, class IndexMap>
   typename property_traits<CapacityEdgeMap>::value_type
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/kruskal_min_spanning_tree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/kruskal_min_spanning_tree.hpp
index 50fc8049f8e8d8784ddb493c7a620b5c84f1a0a4..a847e3f156a9eb0390727942572df94849cdecd4 100644 (file)
@@ -23,7 +23,7 @@
 #include <queue>
 #include <functional>
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_concepts.hpp>
 #include <boost/graph/named_function_params.hpp>
 #include <boost/pending/disjoint_sets.hpp>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/labeled_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/labeled_graph.hpp
new file mode 100644 (file)
index 0000000..c7f4026
--- /dev/null
@@ -0,0 +1,811 @@
+// Copyright (C) 2009 Andrew Sutton
+
+// 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)
+
+#ifndef BOOST_GRAPH_LABELED_GRAPH_HPP
+#define BOOST_GRAPH_LABELED_GRAPH_HPP
+
+#include <boost/config.hpp>
+#include <vector>
+#include <map>
+
+#include <boost/static_assert.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/unordered_map.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/pending/container_traits.hpp>
+#include <boost/graph/graph_traits.hpp>
+
+// This file implements a utility for creating mappings from arbitrary
+// identifers to the vertices of a graph.
+
+namespace boost {
+
+// A type selector that denotes the use of some default value.
+struct defaultS { };
+
+/** @internal */
+namespace graph_detail {
+    /** Returns true if the selector is the default selector. */
+    template <typename Selector>
+    struct is_default
+        : mpl::bool_<is_same<Selector, defaultS>::value>
+    { };
+
+    /**
+     * Choose the default map instance. If Label is an unsigned integral type
+     * the we can use a vector to store the information.
+     */
+    template <typename Label, typename Vertex>
+    struct choose_default_map {
+        typedef typename mpl::if_<
+            is_unsigned<Label>,
+            std::vector<Vertex>,
+            std::map<Label, Vertex> // TODO: Should use unordered_map?
+        >::type type;
+    };
+
+    /**
+     * @name Generate Label Map
+     * These type generators are responsible for instantiating an associative
+     * container for the the labeled graph. Note that the Selector must be
+     * select a pair associative container or a vecS, which is only valid if
+     * Label is an integral type.
+     */
+    //@{
+    template <typename Selector, typename Label, typename Vertex>
+    struct generate_label_map { };
+
+    template <typename Label, typename Vertex>
+    struct generate_label_map<vecS, Label, Vertex>
+    { typedef std::vector<Vertex> type; };
+
+    template <typename Label, typename Vertex>
+    struct generate_label_map<mapS, Label, Vertex>
+    { typedef std::map<Label, Vertex> type; };
+
+    template <typename Label, typename Vertex>
+    struct generate_label_map<multimapS, Label, Vertex>
+    { typedef std::multimap<Label, Vertex> type; };
+
+#if !defined BOOST_NO_HASH
+    template <typename Label, typename Vertex>
+    struct generate_label_map<hash_mapS, Label, Vertex>
+    { typedef boost::unordered_map<Label, Vertex> type; };
+
+    template <typename Label, typename Vertex>
+    struct generate_label_map<hash_multimapS, Label, Vertex>
+    { typedef boost::unordered_multimap<Label, Vertex> type; };
+#endif
+    template <typename Selector, typename Label, typename Vertex>
+    struct choose_custom_map {
+        typedef typename generate_label_map<Selector, Label, Vertex>::type type;
+    };
+    //@}
+
+    /**
+     * Choose and instantiate an "associative" container. Note that this can
+     * also choose vector.
+     */
+    template <typename Selector, typename Label, typename Vertex>
+    struct choose_map {
+        typedef typename mpl::eval_if<
+            is_default<Selector>,
+            choose_default_map<Label, Vertex>,
+            choose_custom_map<Selector, Label, Vertex>
+        >::type type;
+    };
+
+    /** @name Insert Labeled Vertex */
+    //@{
+    // Tag dispatch on random access containers (i.e., vectors). This function
+    // basically requires a) that Container is vector<Label> and that Label
+    // is an unsigned integral value. Note that this will resize the vector
+    // to accomodate indices.
+    template <typename Container, typename Graph, typename Label, typename Prop>
+    std::pair<typename graph_traits<Graph>::vertex_descriptor, bool>
+    insert_labeled_vertex(Container& c, Graph& g, Label const& l, Prop const& p,
+                          random_access_container_tag)
+    {
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+        // If the label is out of bounds, resize the vector to accomodate.
+        // Resize by 2x the index so we don't cause quadratic insertions over
+        // time.
+        if(l >= c.size()) {
+            c.resize((l + 1) * 2);
+        }
+        Vertex v = add_vertex(p, g);
+        c[l] = v;
+        return std::make_pair(c[l], true);
+    }
+
+    // Tag dispatch on multi associative containers (i.e. multimaps).
+    template <typename Container, typename Graph, typename Label, typename Prop>
+    std::pair<typename graph_traits<Graph>::vertex_descriptor, bool>
+    insert_labeled_vertex(Container& c, Graph& g, Label const& l, Prop const& p,
+                          multiple_associative_container_tag const&)
+    {
+        // Note that insertion always succeeds so we can add the vertex first
+        // and then the mapping to the label.
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        Vertex v = add_vertex(g);
+        c.insert(std::make_pair(l, v));
+        return std::make_pair(v, true);
+    }
+
+    // Tag dispatch on unique associative containers (i.e. maps).
+    template <typename Container, typename Graph, typename Label, typename Prop>
+    std::pair<typename graph_traits<Graph>::vertex_descriptor, bool>
+    insert_labeled_vertex(Container& c, Graph& g, Label const& l, Prop const& p,
+                          unique_associative_container_tag)
+    {
+        // Here, we actually have to try the insertion first, and only add
+        // the vertex if we get a new element.
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        typedef typename Container::iterator Iterator;
+        std::pair<Iterator, bool> x = c.insert(std::make_pair(l, Vertex()));
+        if(x.second) {
+            x.first->second = add_vertex(g);
+        }
+        return std::make_pair(x.first->second, x.second);
+    }
+
+    // Dispatcher
+    template <typename Container, typename Graph, typename Label, typename Prop>
+    std::pair<typename graph_traits<Graph>::vertex_descriptor, bool>
+    insert_labeled_vertex(Container& c, Graph& g, Label const& l, Prop const& p)
+    { return insert_labeled_vertex(c, g, l, p, container_category(c)); }
+    //@}
+
+    /** @name Find Labeled Vertex */
+    //@{
+    // Tag dispatch for sequential maps (i.e., vectors).
+    template <typename Container, typename Graph, typename Label>
+    typename graph_traits<Graph>::vertex_descriptor
+    find_labeled_vertex(Container const& c, Graph const&, Label const& l,
+                        random_access_container_tag)
+    { return l < c.size() ? c[l] : graph_traits<Graph>::null_vertex(); }
+
+    // Tag dispatch for pair associative maps (more or less).
+    template <typename Container, typename Graph, typename Label>
+    typename graph_traits<Graph>::vertex_descriptor
+    find_labeled_vertex(Container const& c, Graph const&, Label const& l,
+                        associative_container_tag)
+    {
+        typename Container::const_iterator i = c.find(l);
+        return i != c.end() ? i->second : graph_traits<Graph>::null_vertex();
+    }
+
+    // Dispatcher
+    template <typename Container, typename Graph, typename Label>
+    typename graph_traits<Graph>::vertex_descriptor
+    find_labeled_vertex(Container const& c, Graph const& g, Label const& l)
+    { return find_labeled_vertex(c, g, l, container_category(c)); }
+    //@}
+
+    /** @name Put Vertex Label */
+    //@{
+    // Tag dispatch on vectors.
+    template <typename Container, typename Label, typename Graph, typename Vertex>
+    bool put_vertex_label(Container& c, Graph const&, Label const& l, Vertex v,
+                          random_access_container_tag)
+    {
+        // If the element is already occupied, then we probably don't want to
+        // overwrite it.
+        if(c[l] == Graph::null_vertex()) return false;
+        c[l] = v;
+        return true;
+    }
+
+    // Attempt the insertion and return its result.
+    template <typename Container, typename Label, typename Graph, typename Vertex>
+    bool put_vertex_label(Container& c, Graph const&, Label const& l, Vertex v,
+                          unique_associative_container_tag)
+    { return c.insert(std::make_pair(l, v)).second; }
+
+    // Insert the pair and return true.
+    template <typename Container, typename Label, typename Graph, typename Vertex>
+    bool put_vertex_label(Container& c, Graph const&, Label const& l, Vertex v,
+                          multiple_associative_container_tag)
+    {
+        c.insert(std::make_pair(l, v));
+        return true;
+    }
+
+    // Dispatcher
+    template <typename Container, typename Label, typename Graph, typename Vertex>
+    bool put_vertex_label(Container& c, Graph const& g, Label const& l, Vertex v)
+    { return put_vertex_label(c, g, l, v, container_category(c)); }
+    //@}
+
+} // namespace detail
+
+struct labeled_graph_class_tag { };
+
+/** @internal
+ * This class is responsible for the deduction and declaration of type names
+ * for the labeled_graph class template.
+ */
+template <typename Graph, typename Label, typename Selector>
+struct labeled_graph_types {
+    typedef Graph graph_type;
+
+    // Label and maps
+    typedef Label label_type;
+    typedef typename graph_detail::choose_map<
+        Selector, Label, typename graph_traits<Graph>::vertex_descriptor
+    >::type map_type;
+};
+
+/**
+ * The labeled_graph class is a graph adaptor that maintains a mapping between
+ * vertex labels and vertex descriptors.
+ *
+ * @todo This class is somewhat redundant for adjacency_list<*, vecS>  if
+ * the intended label is an unsigned int (and perhpahs some other cases), but
+ * it does avoid some weird ambiguities (i.e. adding a vertex with a label that
+ * does not match its target index).
+ *
+ * @todo This needs to be reconciled with the named_graph, but since there is
+ * no documentation or examples, its not going to happen.
+ */
+template <typename Graph, typename Label, typename Selector = defaultS>
+class labeled_graph
+    : protected labeled_graph_types<Graph, Label, Selector>
+{
+    typedef labeled_graph_types<Graph, Label, Selector> Base;
+public:
+    typedef labeled_graph_class_tag graph_tag;
+
+    typedef typename Base::graph_type graph_type;
+    typedef typename graph_traits<graph_type>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<graph_type>::edge_descriptor edge_descriptor;
+    typedef typename graph_traits<graph_type>::directed_category directed_category;
+    typedef typename graph_traits<graph_type>::edge_parallel_category edge_parallel_category;
+    typedef typename graph_traits<graph_type>::traversal_category traversal_category;
+
+    typedef typename graph_traits<graph_type>::out_edge_iterator out_edge_iterator;
+    typedef typename graph_traits<graph_type>::in_edge_iterator in_edge_iterator;
+    typedef typename graph_traits<graph_type>::adjacency_iterator adjacency_iterator;
+    typedef typename graph_traits<graph_type>::degree_size_type degree_size_type;
+
+    typedef typename graph_traits<graph_type>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<graph_type>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<graph_type>::edge_iterator edge_iterator;
+    typedef typename graph_traits<graph_type>::edges_size_type edges_size_type;
+
+    typedef typename graph_type::vertex_property_type vertex_property_type;
+    typedef typename graph_type::edge_property_type edge_property_type;
+    typedef typename graph_type::graph_property_type graph_property_type;
+    typedef typename graph_type::vertex_bundled vertex_bundled;
+    typedef typename graph_type::edge_bundled edge_bundled;
+
+    typedef typename Base::label_type label_type;
+    typedef typename Base::map_type map_type;
+
+public:
+    labeled_graph(graph_property_type const& gp = graph_property_type())
+        : _graph(gp), _map()
+    { }
+
+    labeled_graph(labeled_graph const& x)
+        : _graph(x._graph), _map(x._map)
+    { }
+
+    // This constructor can only be used if map_type supports positional
+    // range insertion (i.e. its a vector). This is the only case where we can
+    // try to guess the intended labels for graph.
+    labeled_graph(vertices_size_type n,
+                  graph_property_type const& gp = graph_property_type())
+        : _graph(n, gp), _map()
+    {
+        std::pair<vertex_iterator, vertex_iterator> rng = vertices(_graph);
+        _map.insert(_map.end(), rng.first, rng.second);
+    }
+
+    // Construct a grpah over n vertices, each of which receives a label from
+    // the range [l, l + n). Note that the graph is not directly constructed
+    // over the n vertices, but added sequentially. This constructor is
+    // necessarily slower than the underlying counterpart.
+    template <typename LabelIter>
+    labeled_graph(vertices_size_type n, LabelIter l,
+                  graph_property_type const& gp = graph_property_type())
+        : _graph(gp)
+    { while(n-- >= 0) add_vertex(*l++); }
+
+    // Construct the graph over n vertices each of which has a label in the
+    // range [l, l + n) and a property in the range [p, p + n).
+    template <typename LabelIter, typename PropIter>
+    labeled_graph(vertices_size_type n, LabelIter l, PropIter p,
+                  graph_property_type const& gp = graph_property_type())
+    { while(n-- >= 0) add_vertex(*l++, *p++); }
+
+    labeled_graph& operator=(labeled_graph const& x) {
+        _graph = x._graph;
+        _map = x._map;
+        return *this;
+    }
+
+    /** @name Graph Accessors */
+    //@{
+    graph_type& graph() { return _graph; }
+    graph_type const& graph() const { return _graph; }
+    //@}
+
+    /**
+     * Create a new label for the given vertex, returning false, if the label
+     * cannot be created.
+     */
+    bool label_vertex(vertex_descriptor v, Label const& l)
+    { return graph_detail::put_vertex_label(_map, _graph, l, v); }
+
+    /** @name Add Vertex
+     * Add a vertex to the graph, returning the descriptor. If the vertices
+     * are uniquely labeled and the label already exists within the graph,
+     * then no vertex is added, and the returned descriptor refers to the
+     * existing vertex. A vertex property can be given as a parameter, if
+     * needed.
+     */
+    //@{
+    vertex_descriptor add_vertex(Label const& l) {
+        return graph_detail::insert_labeled_vertex(
+            _map, _graph, l, vertex_property_type()
+            ).first;
+    }
+
+    vertex_descriptor add_vertex(Label const& l, vertex_property_type const& p)
+    { return graph_detail::insert_labeled_vertex(_map, _graph, l, p).first; }
+    //@}
+
+    /** @name Insert Vertex
+     * Insert a vertex into the graph, returning a pair containing the
+     * descriptor of a vertex and a boolean value that describes whether or not
+     * a new vertex was inserted. If vertices are not uniquely labeled, then
+     * insertion will always succeed.
+     */
+    //@{
+    std::pair<vertex_descriptor, bool> insert_vertex(Label const& l) {
+        return graph_detail::insert_labeled_vertex(
+            _map, _graph, l, vertex_property_type()
+        );
+    }
+
+    std::pair<vertex_descriptor, bool>
+    insert_vertex(Label const& l, vertex_property_type const& p)
+    { return graph_detail::insert_labeled_vertex(_map, _graph, l, p); }
+    //@}
+
+    /** Remove the vertex with the given label. */
+    void remove_vertex(Label const& l)
+    { return boost::remove_vertex(vertex(l), _graph); }
+
+    /** Return a descriptor for the given label. */
+    vertex_descriptor vertex(Label const& l) const
+    { return graph_detail::find_labeled_vertex(_map, _graph, l); }
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+    /** @name Bundled Properties */
+    //@{
+    // Lookup the requested vertex and return the bundle.
+    vertex_bundled& operator[](Label const& l)
+    { return _graph[vertex(l)]; }
+
+    vertex_bundled const& operator[](Label const& l) const
+    { return _graph[vertex(l)]; }
+
+    // Delegate edge lookup to the underlying graph.
+    edge_bundled& operator[](edge_descriptor e)
+    { return _graph[e]; }
+
+    edge_bundled const& operator[](edge_descriptor e) const
+    { return _graph[e]; }
+    //@}
+#endif
+
+    /** Return a null descriptor */
+    static vertex_descriptor null_vertex()
+    { return graph_type::null_vertex(); }
+
+private:
+    graph_type _graph;
+    map_type _map;
+};
+
+/**
+ * The partial specialization over graph pointers allows the construction
+ * of temporary labeled graph objects. In this case, the labels are destructed
+ * when the wrapper goes out of scope.
+ */
+template <typename Graph, typename Label, typename Selector>
+class labeled_graph<Graph*, Label, Selector>
+    : protected labeled_graph_types<Graph, Label, Selector>
+{
+    typedef labeled_graph_types<Graph, Label, Selector> Base;
+public:
+    typedef labeled_graph_class_tag graph_tag;
+
+    typedef typename Base::graph_type graph_type;
+    typedef typename graph_traits<graph_type>::vertex_descriptor vertex_descriptor;
+    typedef typename graph_traits<graph_type>::edge_descriptor edge_descriptor;
+    typedef typename graph_traits<graph_type>::directed_category directed_category;
+    typedef typename graph_traits<graph_type>::edge_parallel_category edge_parallel_category;
+    typedef typename graph_traits<graph_type>::traversal_category traversal_category;
+
+    typedef typename graph_traits<graph_type>::out_edge_iterator out_edge_iterator;
+    typedef typename graph_traits<graph_type>::in_edge_iterator in_edge_iterator;
+    typedef typename graph_traits<graph_type>::adjacency_iterator adjacency_iterator;
+    typedef typename graph_traits<graph_type>::degree_size_type degree_size_type;
+
+    typedef typename graph_traits<graph_type>::vertex_iterator vertex_iterator;
+    typedef typename graph_traits<graph_type>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<graph_type>::edge_iterator edge_iterator;
+    typedef typename graph_traits<graph_type>::edges_size_type edges_size_type;
+
+    typedef typename graph_type::vertex_property_type vertex_property_type;
+    typedef typename graph_type::edge_property_type edge_property_type;
+    typedef typename graph_type::graph_property_type graph_property_type;
+    typedef typename graph_type::vertex_bundled vertex_bundled;
+    typedef typename graph_type::edge_bundled edge_bundled;
+
+    typedef typename Base::label_type label_type;
+    typedef typename Base::map_type map_type;
+
+    labeled_graph(graph_type* g)
+        : _graph(g)
+    { }
+
+    /** @name Graph Access */
+    //@{
+    graph_type& graph() { return *_graph; }
+    graph_type const& graph() const { return *_graph; }
+    //@}
+
+    /**
+     * Create a new label for the given vertex, returning false, if the label
+     * cannot be created.
+     */
+    bool label_vertex(vertex_descriptor v, Label const& l)
+    { return graph_detail::put_vertex_label(_map, *_graph, l, v); }
+
+    /** @name Add Vertex */
+    //@{
+    vertex_descriptor add_vertex(Label const& l) {
+        return graph_detail::insert_labeled_vertex(
+            _map, *_graph, l, vertex_property_type()
+            ).first;
+    }
+
+    vertex_descriptor add_vertex(Label const& l, vertex_property_type const& p)
+    { return graph_detail::insert_labeled_vertex(_map, *_graph, l, p).first; }
+
+    std::pair<vertex_descriptor, bool> insert_vertex(Label const& l) {
+        return graph_detail::insert_labeled_vertex(
+            _map, *_graph, l, vertex_property_type()
+        );
+    }
+    //@}
+
+    /** Try to insert a vertex with the given label. */
+    std::pair<vertex_descriptor, bool>
+    insert_vertex(Label const& l, vertex_property_type const& p)
+    { return graph_detail::insert_labeled_vertex(_map, *_graph, l, p); }
+
+    /** Remove the vertex with the given label. */
+    void remove_vertex(Label const& l)
+    { return boost::remove_vertex(vertex(l), *_graph); }
+
+    /** Return a descriptor for the given label. */
+    vertex_descriptor vertex(Label const& l) const
+    { return graph_detail::find_labeled_vertex(_map, *_graph, l); }
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+    /** @name Bundled Properties */
+    //@{
+    // Lookup the requested vertex and return the bundle.
+    vertex_bundled& operator[](Label const& l)
+    { return (*_graph)[vertex(l)]; }
+
+    vertex_bundled const& operator[](Label const& l) const
+    { return (*_graph)[vertex(l)]; }
+
+    // Delegate edge lookup to the underlying graph.
+    edge_bundled& operator[](edge_descriptor e)
+    { return (*_graph)[e]; }
+
+    edge_bundled const& operator[](edge_descriptor e) const
+    { return (*_graph)[e]; }
+    //@}
+#endif
+
+    static vertex_descriptor null_vertex()
+    { return graph_type::null_vertex(); }
+
+private:
+    graph_type* _graph;
+    map_type _map;
+};
+
+#define LABELED_GRAPH_PARAMS typename G, typename L, typename S
+#define LABELED_GRAPH labeled_graph<G,L,S>
+
+/** @name Labeled Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline bool label_vertex(typename LABELED_GRAPH::vertex_descriptor v,
+                         typename LABELED_GRAPH::label_type const l,
+                         LABELED_GRAPH& g)
+{ return g.label_vertex(v, l); }
+
+template <LABELED_GRAPH_PARAMS>
+inline bool vertex_by_label(typename LABELED_GRAPH::label_type const l,
+                            LABELED_GRAPH& g)
+{ return g.vertex(l); }
+//@}
+
+/** @name Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+edge(typename LABELED_GRAPH::vertex_descriptor const& u,
+     typename LABELED_GRAPH::vertex_descriptor const& v,
+     LABELED_GRAPH const& g)
+{ return edge(u, v, g.graph()); }
+
+// Labeled Extensions
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+edge_by_label(typename LABELED_GRAPH::label_type const& u,
+              typename LABELED_GRAPH::label_type const& v,
+              LABELED_GRAPH const& g)
+{ return edge(g.vertex(u), g.vertex(v), g); }
+//@}
+
+/** @name Incidence Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<
+    typename LABELED_GRAPH::out_edge_iterator,
+    typename LABELED_GRAPH::out_edge_iterator>
+out_edges(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return out_edges(v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::degree_size_type
+out_degree(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return out_degree(v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::vertex_descriptor
+source(typename LABELED_GRAPH::edge_descriptor e, LABELED_GRAPH const& g)
+{ return source(e, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::vertex_descriptor
+target(typename LABELED_GRAPH::edge_descriptor e, LABELED_GRAPH const& g)
+{ return target(e, g.graph()); }
+//@}
+
+/** @name Bidirectional Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<
+    typename LABELED_GRAPH::in_edge_iterator,
+    typename LABELED_GRAPH::in_edge_iterator>
+in_edges(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return in_edges(v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::degree_size_type
+in_degree(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return in_degree(v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::degree_size_type
+degree(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return degree(v, g.graph()); }
+//@}
+
+/** @name Adjacency Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<
+    typename LABELED_GRAPH::adjacency_iterator,
+    typename LABELED_GRAPH::adjacency_iterator>
+adjacenct_vertices(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH const& g)
+{ return adjacent_vertices(v, g.graph()); }
+//@}
+
+/** @name VertexListGraph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<
+    typename LABELED_GRAPH::vertex_iterator,
+    typename LABELED_GRAPH::vertex_iterator>
+vertices(LABELED_GRAPH const& g)
+{ return vertices(g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::vertices_size_type
+num_vertices(LABELED_GRAPH const& g)
+{ return num_vertices(g.graph()); }
+//@}
+
+/** @name EdgeListGraph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<
+    typename LABELED_GRAPH::edge_iterator,
+    typename LABELED_GRAPH::edge_iterator>
+edges(LABELED_GRAPH const& g)
+{ return edges(g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::edges_size_type
+num_edges(LABELED_GRAPH const& g)
+{ return num_edges(g.graph()); }
+//@}
+
+/** @internal @name Property Lookup */
+//@{
+namespace graph_detail {
+    struct labeled_graph_vertex_property_selector {
+        template <class LabeledGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename LabeledGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+
+    struct labeled_graph_edge_property_selector {
+        template <class LabeledGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename LabeledGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+}
+
+template <>
+struct vertex_property_selector<labeled_graph_class_tag> {
+    typedef graph_detail::labeled_graph_vertex_property_selector type;
+};
+
+template <>
+struct edge_property_selector<labeled_graph_class_tag> {
+    typedef graph_detail::labeled_graph_edge_property_selector type;
+};
+//@}
+
+/** @name Property Graph */
+//@{
+template <LABELED_GRAPH_PARAMS, typename Prop>
+inline typename property_map<LABELED_GRAPH, Prop>::type
+get(Prop p, LABELED_GRAPH& g)
+{ return get(p, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS, typename Prop>
+inline typename property_map<LABELED_GRAPH, Prop>::const_type
+get(Prop p, LABELED_GRAPH const& g)
+{ return get(p, g.impl()); }
+
+template <LABELED_GRAPH_PARAMS, typename Prop, typename Key>
+inline typename property_traits<
+    typename property_map<typename LABELED_GRAPH::graph_type, Prop>::const_type
+>::value_type
+get(Prop p, LABELED_GRAPH const& g, const Key& k)
+{ return get(p, g.impl(), k); }
+
+template <LABELED_GRAPH_PARAMS, typename Prop, typename Key, typename Value>
+inline void
+put(Prop p, LABELED_GRAPH& g, Key const& k, Value const& v)
+{ put(p, g.impl(), k, v); }
+//@}
+
+/** @name Mutable Graph */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+add_edge(typename LABELED_GRAPH::vertex_descriptor const& u,
+         typename LABELED_GRAPH::vertex_descriptor const& v,
+         LABELED_GRAPH& g)
+{ return add_edge(u, v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+add_edge(typename LABELED_GRAPH::vertex_descriptor const& u,
+         typename LABELED_GRAPH::vertex_descriptor const& v,
+         typename LABELED_GRAPH::edge_property_type const& p,
+         LABELED_GRAPH& g)
+{ return add_edge(u, v, p, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+clear_vertex(typename LABELED_GRAPH::vertex_descriptor v, LABELED_GRAPH& g)
+{ return clear_vertex(v, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+remove_edge(typename LABELED_GRAPH::edge_descriptor e, LABELED_GRAPH& g)
+{ return remove_edge(e, g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+remove_edge(typename LABELED_GRAPH::vertex_descriptor u,
+            typename LABELED_GRAPH::vertex_descriptor v,
+            LABELED_GRAPH& g)
+{ return remove_edge(u, v, g.graph()); }
+
+// Labeled extensions
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+add_edge_by_label(typename LABELED_GRAPH::label_type const& u,
+                  typename LABELED_GRAPH::label_type const& v,
+                  LABELED_GRAPH& g)
+{ return add_edge(g.vertex(u), g.vertex(v), g); }
+
+template <LABELED_GRAPH_PARAMS>
+inline std::pair<typename LABELED_GRAPH::edge_descriptor, bool>
+add_edge_by_label(typename LABELED_GRAPH::label_type const& u,
+                  typename LABELED_GRAPH::label_type const& v,
+                  typename LABELED_GRAPH::edge_property_type const& p,
+                  LABELED_GRAPH& g)
+{ return add_edge(g.vertex(u), g.vertex(v), p, g); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+clear_vertex_by_label(typename LABELED_GRAPH::label_type const& l, LABELED_GRAPH& g)
+{ clear_vertex(g.vertex(l), g.graph()); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+remove_edge_by_label(typename LABELED_GRAPH::label_type const& u,
+                     typename LABELED_GRAPH::label_type const& v,
+                     LABELED_GRAPH& g)
+{ remove_edge(g.vertex(u), g.vertex(v), g.graph()); }
+//@}
+
+/** @name Labeled Mutable Graph
+ * The labeled mutable graph hides the add_ and remove_ vertex functions from
+ * the mutable graph concept. Note that the remove_vertex is hidden because
+ * removing the vertex without its key could leave a dangling reference in
+ * the map.
+ */
+//@{
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::vertex_descriptor
+add_vertex(typename LABELED_GRAPH::label_type const& l,
+           LABELED_GRAPH& g)
+{ return g.add_vertex(l); }
+
+// MutableLabeledPropertyGraph::add_vertex(l, vp, g)
+template <LABELED_GRAPH_PARAMS>
+inline typename LABELED_GRAPH::vertex_descriptor
+add_vertex(typename LABELED_GRAPH::label_type const& l,
+           typename LABELED_GRAPH::vertex_property_type const& p,
+           LABELED_GRAPH& g)
+{ return g.add_vertex(l, p); }
+
+template <LABELED_GRAPH_PARAMS>
+inline void
+remove_vertex(typename LABELED_GRAPH::label_type const& l, LABELED_GRAPH& g)
+{ g.remove_vertex(l); }
+//@}
+
+#undef LABELED_GRAPH_PARAMS
+#undef LABELED_GRAPH
+
+} // namespace boost
+
+// Pull the labeled graph traits
+#include <boost/graph/detail/labeled_graph_traits.hpp>
+
+#endif // BOOST_GRAPH_LABELED_GRAPH_HPP
similarity index 97%
rename from deal.II/contrib/boost/include/boost/graph/make_biconnected_planar.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/make_biconnected_planar.hpp
index b7daef5a2060527484c42a34037191742b40f994..86a955a6e65a9ecb009722f0daed9d1162142938 100644 (file)
@@ -11,7 +11,7 @@
 #include <boost/config.hpp>
 #include <boost/tuple/tuple.hpp>   //for tie
 #include <boost/graph/biconnected_components.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <vector>
 #include <iterator>
 #include <algorithm>
@@ -44,7 +44,7 @@ namespace boost
     typedef iterator_property_map
       <std::vector<std::size_t>::iterator, EdgeIndexMap> component_map_t;
 
-       edge_size_t n_edges(num_edges(g));
+    edge_size_t n_edges(num_edges(g));
     std::vector<vertex_t> articulation_points;
     std::vector<edge_size_t> component_vector(n_edges);
     component_map_t component_map(component_vector.begin(), em);
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/make_connected.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/make_connected.hpp
index 94e572954c327032443c682ce87a0aae97b01a06..e5e2f52c1c5763a6ddd9d87d79f314ac489c8177 100644 (file)
@@ -12,7 +12,7 @@
 #include <boost/utility.hpp> //for next
 #include <boost/tuple/tuple.hpp>   //for tie
 #include <boost/graph/connected_components.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <vector>
 
 #include <boost/graph/planar_detail/add_edge_visitors.hpp>
@@ -62,7 +62,7 @@ namespace boost
     if (ci_prev == ci_end)
       return;
 
-    for(vec_of_vertices_itr_t ci = next(ci_prev); 
+    for(vec_of_vertices_itr_t ci = boost::next(ci_prev); 
         ci != ci_end;  ci_prev = ci, ++ci
         )
       {
similarity index 95%
rename from deal.II/contrib/boost/include/boost/graph/make_maximal_planar.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/make_maximal_planar.hpp
index 458de0a7a5710500d6bc6882e39966646923fe49..70a1e08abae78544f1974e003e9808bcc6b94449 100644 (file)
@@ -11,7 +11,7 @@
 #include <boost/config.hpp>
 #include <boost/tuple/tuple.hpp>   //for tie
 #include <boost/graph/biconnected_components.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <vector>
 #include <iterator>
 #include <algorithm>
@@ -130,7 +130,7 @@ namespace boost
       // The iterator manipulations on the next two lines are safe because 
       // vertices_on_face.size() > 3 (from the first test in this function)
       fi_end = prior(vertices_on_face.end());
-      for(face_iterator fi = next(next(vertices_on_face.begin())); 
+      for(face_iterator fi = boost::next(boost::next(vertices_on_face.begin())); 
           fi != fi_end; ++fi
           )
         {
@@ -145,7 +145,7 @@ namespace boost
         {
           add_edge_range(
                          vertices_on_face[0],
-                         next(next(vertices_on_face.begin())),
+                         boost::next(boost::next(vertices_on_face.begin())),
                          prior(vertices_on_face.end())
                          );
         }
@@ -153,13 +153,13 @@ namespace boost
         {
           add_edge_range(
                          vertices_on_face[1],
-                         next(marked_neighbor),
+                         boost::next(marked_neighbor),
                          vertices_on_face.end()
                          );
 
           add_edge_range(
-                         *next(marked_neighbor),
-                         next(next(vertices_on_face.begin())),
+                         *boost::next(marked_neighbor),
+                         boost::next(boost::next(vertices_on_face.begin())),
                          marked_neighbor
                          );
         }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/max_cardinality_matching.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/max_cardinality_matching.hpp
index 34edc763c79dc2cbd1b4d9852633fecfad29d731..ef9ed9e4f2a64c04ba22d1199feced89a3cead5a 100644 (file)
@@ -15,7 +15,7 @@
 #include <deque>
 #include <algorithm>                     // for std::sort and std::stable_sort
 #include <utility>                       // for std::pair
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/utility.hpp>             // for boost::tie
 #include <boost/graph/graph_traits.hpp>  
 #include <boost/graph/visitors.hpp>
@@ -266,7 +266,7 @@ namespace boost
           pred[w_prime] = v;
         }
         
-               //w_prime == v_prime can happen below if we get an edge that has been
+        //w_prime == v_prime can happen below if we get an edge that has been
         //shrunk into a blossom
         else if (vertex_state[w_prime] == graph::detail::V_EVEN && w_prime != v_prime) 
         {                                                             
@@ -682,7 +682,7 @@ namespace boost
       void discover_vertex(Vertex u, Graph&) 
       {
         m_parity = !m_parity;
-               m_parity ? ++m_count : --m_count;
+        m_parity ? ++m_count : --m_count;
       }
       
     protected:
@@ -736,12 +736,12 @@ namespace boost
       //excludes vertices labeled "graph::detail::V_ODD"
       non_odd_vertex() : vertex_state(0) { }
   
-         non_odd_vertex(VertexStateMap* arg_vertex_state) 
+      non_odd_vertex(VertexStateMap* arg_vertex_state) 
         : vertex_state(arg_vertex_state) { }
 
-         template <typename Vertex>
+      template <typename Vertex>
       bool operator()(const Vertex& v) const 
-         {
+      {
         BOOST_ASSERT(vertex_state);
         return get(*vertex_state, v) != graph::detail::V_ODD;
       }
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/mcgregor_common_subgraphs.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/mcgregor_common_subgraphs.hpp
new file mode 100644 (file)
index 0000000..25db09c
--- /dev/null
@@ -0,0 +1,1142 @@
+//=======================================================================
+// Copyright 2009 Trustees of Indiana University.
+// Authors: Michael Hansen, Andrew Lumsdaine
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_MCGREGOR_COMMON_SUBGRAPHS_HPP
+#define BOOST_GRAPH_MCGREGOR_COMMON_SUBGRAPHS_HPP
+
+#include <algorithm>
+#include <vector>
+#include <stack>
+
+#include <boost/make_shared.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/filtered_graph.hpp>
+#include <boost/graph/graph_utility.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/property_map/shared_array_property_map.hpp>
+
+namespace boost {
+
+  namespace detail {
+
+    // Traits associated with common subgraphs, used mainly to keep a
+    // consistent type for the correspondence maps.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond>
+    struct mcgregor_common_subgraph_traits {
+      typedef typename graph_traits<GraphFirst>::vertex_descriptor vertex_first_type;
+      typedef typename graph_traits<GraphSecond>::vertex_descriptor vertex_second_type;
+      
+      typedef shared_array_property_map<vertex_second_type, VertexIndexMapFirst>
+        correspondence_map_first_to_second_type;
+  
+      typedef shared_array_property_map<vertex_first_type, VertexIndexMapSecond>
+        correspondence_map_second_to_first_type;
+    };  
+
+  } // namespace detail
+
+  // ==========================================================================
+
+  // Binary function object that returns true if the values for item1
+  // in property_map1 and item2 in property_map2 are equivalent.
+  template <typename PropertyMapFirst,
+            typename PropertyMapSecond>
+  struct property_map_equivalent {
+  
+    property_map_equivalent(const PropertyMapFirst property_map1,
+                            const PropertyMapSecond property_map2) :
+      m_property_map1(property_map1),
+      m_property_map2(property_map2) { }
+
+    template <typename ItemFirst,
+              typename ItemSecond>
+    bool operator()(const ItemFirst item1, const ItemSecond item2) {
+      return (get(m_property_map1, item1) == get(m_property_map2, item2));
+    }
+  
+  private:
+    const PropertyMapFirst m_property_map1;
+    const PropertyMapSecond m_property_map2;
+  };
+
+  // Returns a property_map_equivalent object that compares the values
+  // of property_map1 and property_map2.
+  template <typename PropertyMapFirst,
+            typename PropertyMapSecond>
+  property_map_equivalent<PropertyMapFirst,
+                          PropertyMapSecond>
+  make_property_map_equivalent
+  (const PropertyMapFirst property_map1,
+   const PropertyMapSecond property_map2) {
+
+    return (property_map_equivalent<PropertyMapFirst, PropertyMapSecond>
+            (property_map1, property_map2));
+  }
+
+  // Binary function object that always returns true.  Used when
+  // vertices or edges are always equivalent (i.e. have no labels).
+  struct always_equivalent {
+  
+    template <typename ItemFirst,
+              typename ItemSecond>
+    bool operator()(const ItemFirst& item1, const ItemSecond& item2) {
+      return (true);
+    }
+  };
+
+  // ==========================================================================
+
+  namespace detail {
+
+    // Return true if new_vertex1 and new_vertex2 can extend the
+    // subgraph represented by correspondence_map_1_to_2 and
+    // correspondence_map_2_to_1.  The vertices_equivalent and
+    // edges_equivalent predicates are used to test vertex and edge
+    // equivalency between the two graphs.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename CorrespondenceMapFirstToSecond,
+              typename CorrespondenceMapSecondToFirst,
+              typename EdgeEquivalencePredicate,
+              typename VertexEquivalencePredicate>
+    bool can_extend_graph
+    (const GraphFirst& graph1,
+     const GraphSecond& graph2,
+     CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+     CorrespondenceMapSecondToFirst correspondence_map_2_to_1,
+     typename graph_traits<GraphFirst>::vertices_size_type subgraph_size,
+     typename graph_traits<GraphFirst>::vertex_descriptor new_vertex1,
+     typename graph_traits<GraphSecond>::vertex_descriptor new_vertex2,
+     EdgeEquivalencePredicate edges_equivalent,
+     VertexEquivalencePredicate vertices_equivalent,
+     bool only_connected_subgraphs)
+    {
+      typedef typename graph_traits<GraphFirst>::vertex_descriptor VertexFirst;
+      typedef typename graph_traits<GraphSecond>::vertex_descriptor VertexSecond;
+      
+      typedef typename graph_traits<GraphFirst>::edge_descriptor EdgeFirst;
+      typedef typename graph_traits<GraphSecond>::edge_descriptor EdgeSecond;
+
+      // Check vertex equality
+      if (!vertices_equivalent(new_vertex1, new_vertex2)) {
+        return (false);
+      }
+
+      // Vertices match and graph is empty, so we can extend the subgraph
+      if (subgraph_size == 0) {
+        return (true);
+      }
+
+      bool has_one_edge = false;
+
+      // Verify edges with existing sub-graph
+      BGL_FORALL_VERTICES_T(existing_vertex1, graph1, GraphFirst) {
+
+        VertexSecond existing_vertex2 = get(correspondence_map_1_to_2, existing_vertex1);
+
+        // Skip unassociated vertices
+        if (existing_vertex2 == graph_traits<GraphSecond>::null_vertex()) {
+          continue;
+        }
+
+        // NOTE: This will not work with parallel edges, since the
+        // first matching edge is always chosen.
+        EdgeFirst edge_to_new1, edge_from_new1;
+        bool edge_to_new_exists1 = false, edge_from_new_exists1 = false;
+        
+        EdgeSecond edge_to_new2, edge_from_new2;
+        bool edge_to_new_exists2 = false, edge_from_new_exists2 = false;
+
+        // Search for edge from existing to new vertex (graph1)
+        BGL_FORALL_OUTEDGES_T(existing_vertex1, edge1, graph1, GraphFirst) {
+          if (target(edge1, graph1) == new_vertex1) {
+            edge_to_new1 = edge1;
+            edge_to_new_exists1 = true;
+            break;
+          }
+        }
+
+        // Search for edge from existing to new vertex (graph2)
+        BGL_FORALL_OUTEDGES_T(existing_vertex2, edge2, graph2, GraphSecond) {
+          if (target(edge2,  graph2) == new_vertex2) {
+            edge_to_new2 = edge2;
+            edge_to_new_exists2 = true;
+            break;
+          }
+        }
+
+        // Make sure edges from existing to new vertices are equivalent
+        if ((edge_to_new_exists1 != edge_to_new_exists2) ||
+            ((edge_to_new_exists1 && edge_to_new_exists2) &&
+             !edges_equivalent(edge_to_new1, edge_to_new2))) {
+              
+          return (false);
+        }
+
+        bool is_undirected1 = is_undirected(graph1),
+          is_undirected2 = is_undirected(graph2);
+
+        if (is_undirected1 && is_undirected2) {
+
+          // Edge in both graphs exists and both graphs are undirected
+          if (edge_to_new_exists1 && edge_to_new_exists2) {
+            has_one_edge = true;
+          }
+
+          continue;
+        }
+        else {
+
+          if (!is_undirected1) {
+
+            // Search for edge from new to existing vertex (graph1)
+            BGL_FORALL_OUTEDGES_T(new_vertex1, edge1, graph1, GraphFirst) {
+              if (target(edge1, graph1) == existing_vertex1) {
+                edge_from_new1 = edge1;
+                edge_from_new_exists1 = true;
+                break;
+              }
+            }
+          }
+
+          if (!is_undirected2) {
+
+            // Search for edge from new to existing vertex (graph2)
+            BGL_FORALL_OUTEDGES_T(new_vertex2, edge2, graph2, GraphSecond) {
+              if (target(edge2, graph2) == existing_vertex2) {
+                edge_from_new2 = edge2;
+                edge_from_new_exists2 = true;
+                break;
+              }
+            }
+          }
+
+          // Make sure edges from new to existing vertices are equivalent
+          if ((edge_from_new_exists1 != edge_from_new_exists2) ||
+              ((edge_from_new_exists1 && edge_from_new_exists2) &&
+               !edges_equivalent(edge_from_new1, edge_from_new2))) {
+                
+            return (false);
+          }
+
+          if ((edge_from_new_exists1 && edge_from_new_exists2) ||
+              (edge_to_new_exists1 && edge_to_new_exists2)) {
+            has_one_edge = true;
+          }
+
+        } // else
+
+      } // BGL_FORALL_VERTICES_T
+
+      // Make sure new vertices are connected to the existing subgraph
+      if (only_connected_subgraphs && !has_one_edge) {
+        return (false);
+      }
+
+      return (true);
+    }    
+
+    // Recursive method that does a depth-first search in the space of
+    // potential subgraphs.  At each level, every new vertex pair from
+    // both graphs is tested to see if it can extend the current
+    // subgraph.  If so, the subgraph is output to subgraph_callback
+    // in the form of two correspondence maps (one for each graph).
+    // Returning false from subgraph_callback will terminate the
+    // search.  Function returns true if the entire search space was
+    // explored.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond,
+              typename CorrespondenceMapFirstToSecond,
+              typename CorrespondenceMapSecondToFirst,
+              typename VertexStackFirst,
+              typename EdgeEquivalencePredicate,
+              typename VertexEquivalencePredicate,
+              typename SubGraphInternalCallback>
+    bool mcgregor_common_subgraphs_internal
+    (const GraphFirst& graph1,
+     const GraphSecond& graph2,
+     const VertexIndexMapFirst& vindex_map1,
+     const VertexIndexMapSecond& vindex_map2,
+     CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+     CorrespondenceMapSecondToFirst correspondence_map_2_to_1,
+     VertexStackFirst& vertex_stack1,
+     EdgeEquivalencePredicate edges_equivalent,
+     VertexEquivalencePredicate vertices_equivalent,
+     bool only_connected_subgraphs,
+     SubGraphInternalCallback subgraph_callback)
+    {
+      typedef typename graph_traits<GraphFirst>::vertex_descriptor VertexFirst;
+      typedef typename graph_traits<GraphSecond>::vertex_descriptor VertexSecond;
+      typedef typename graph_traits<GraphFirst>::vertices_size_type VertexSizeFirst;
+
+      // Get iterators for vertices from both graphs
+      typename graph_traits<GraphFirst>::vertex_iterator
+        vertex1_iter, vertex1_end;
+  
+      typename graph_traits<GraphSecond>::vertex_iterator
+        vertex2_begin, vertex2_end, vertex2_iter;
+  
+      tie(vertex1_iter, vertex1_end) = vertices(graph1);
+      tie(vertex2_begin, vertex2_end) = vertices(graph2);
+      vertex2_iter = vertex2_begin;
+  
+      // Iterate until all vertices have been visited
+      BGL_FORALL_VERTICES_T(new_vertex1, graph1, GraphFirst) {
+
+        VertexSecond existing_vertex2 = get(correspondence_map_1_to_2, new_vertex1);
+
+        // Skip already matched vertices in first graph
+        if (existing_vertex2 != graph_traits<GraphSecond>::null_vertex()) {
+          continue;
+        }
+    
+        BGL_FORALL_VERTICES_T(new_vertex2, graph2, GraphSecond) {
+
+          VertexFirst existing_vertex1 = get(correspondence_map_2_to_1, new_vertex2);
+
+          // Skip already matched vertices in second graph
+          if (existing_vertex1 != graph_traits<GraphFirst>::null_vertex()) {
+            continue;
+          }
+
+          // Check if current sub-graph can be extended with the matched vertex pair
+          if (can_extend_graph(graph1, graph2,
+                               correspondence_map_1_to_2, correspondence_map_2_to_1,
+                               (VertexSizeFirst)vertex_stack1.size(),
+                               new_vertex1, new_vertex2,
+                               edges_equivalent, vertices_equivalent,
+                               only_connected_subgraphs)) {
+
+            // Keep track of old graph size for restoring later
+            VertexSizeFirst old_graph_size = (VertexSizeFirst)vertex_stack1.size(),
+              new_graph_size = old_graph_size + 1;
+
+            // Extend subgraph
+            put(correspondence_map_1_to_2, new_vertex1, new_vertex2);
+            put(correspondence_map_2_to_1, new_vertex2, new_vertex1);
+            vertex_stack1.push(new_vertex1);
+
+            // Only output sub-graphs larger than a single vertex
+            if (new_graph_size > 1) {
+            
+              // Returning false from the callback will cancel iteration
+              if (!subgraph_callback(correspondence_map_1_to_2,
+                                     correspondence_map_2_to_1,
+                                     new_graph_size)) {
+                return (false);
+              }
+            }
+      
+            // Depth-first search into the state space of possible sub-graphs
+            bool continue_iteration =
+              mcgregor_common_subgraphs_internal
+              (graph1, graph2,
+               vindex_map1, vindex_map2,
+               correspondence_map_1_to_2, correspondence_map_2_to_1,
+               vertex_stack1,
+               edges_equivalent, vertices_equivalent,
+               only_connected_subgraphs, subgraph_callback);
+
+            if (!continue_iteration) {
+              return (false);
+            }
+      
+            // Restore previous state
+            if (vertex_stack1.size() > old_graph_size) {
+              
+              VertexFirst stack_vertex1 = vertex_stack1.top();
+              VertexSecond stack_vertex2 = get(correspondence_map_1_to_2,
+                                               stack_vertex1);
+
+              // Contract subgraph
+              put(correspondence_map_1_to_2, stack_vertex1,
+                  graph_traits<GraphSecond>::null_vertex());
+            
+              put(correspondence_map_2_to_1, stack_vertex2,
+                  graph_traits<GraphFirst>::null_vertex());
+                  
+              vertex_stack1.pop();
+           }
+
+          } // if can_extend_graph
+
+        } // BGL_FORALL_VERTICES_T (graph2)
+
+      } // BGL_FORALL_VERTICES_T (graph1)
+
+      return (true);
+    }
+
+    // Internal method that initializes blank correspondence maps and
+    // a vertex stack for use in mcgregor_common_subgraphs_internal.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond,
+              typename EdgeEquivalencePredicate,
+              typename VertexEquivalencePredicate,
+              typename SubGraphInternalCallback>
+    inline void mcgregor_common_subgraphs_internal_init
+    (const GraphFirst& graph1,
+     const GraphSecond& graph2,
+     const VertexIndexMapFirst vindex_map1,
+     const VertexIndexMapSecond vindex_map2,
+     EdgeEquivalencePredicate edges_equivalent,
+     VertexEquivalencePredicate vertices_equivalent,
+     bool only_connected_subgraphs,
+     SubGraphInternalCallback subgraph_callback)
+    {
+      typedef mcgregor_common_subgraph_traits<GraphFirst,
+        GraphSecond, VertexIndexMapFirst,
+        VertexIndexMapSecond> SubGraphTraits;
+        
+      typename SubGraphTraits::correspondence_map_first_to_second_type
+        correspondence_map_1_to_2(num_vertices(graph1), vindex_map1);
+
+      BGL_FORALL_VERTICES_T(vertex1, graph1, GraphFirst) {
+        put(correspondence_map_1_to_2, vertex1,
+            graph_traits<GraphSecond>::null_vertex());
+      }
+                                                 
+      typename SubGraphTraits::correspondence_map_second_to_first_type
+        correspondence_map_2_to_1(num_vertices(graph2), vindex_map2);
+
+      BGL_FORALL_VERTICES_T(vertex2, graph2, GraphSecond) {
+        put(correspondence_map_2_to_1, vertex2,
+            graph_traits<GraphFirst>::null_vertex());
+      }
+
+      typedef typename graph_traits<GraphFirst>::vertex_descriptor
+        VertexFirst;
+        
+      std::stack<VertexFirst> vertex_stack1;
+
+      mcgregor_common_subgraphs_internal
+        (graph1, graph2,
+         vindex_map1, vindex_map2,
+         correspondence_map_1_to_2, correspondence_map_2_to_1,
+         vertex_stack1,
+         edges_equivalent, vertices_equivalent,
+         only_connected_subgraphs,
+         subgraph_callback);
+    }
+    
+  } // namespace detail
+
+  // ==========================================================================
+
+  // Enumerates all common subgraphs present in graph1 and graph2.
+  // Continues until the search space has been fully explored or false
+  // is returned from user_callback.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename VertexIndexMapFirst,
+            typename VertexIndexMapSecond,
+            typename EdgeEquivalencePredicate,
+            typename VertexEquivalencePredicate,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   const VertexIndexMapFirst vindex_map1,
+   const VertexIndexMapSecond vindex_map2,
+   EdgeEquivalencePredicate edges_equivalent,
+   VertexEquivalencePredicate vertices_equivalent,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       vindex_map1, vindex_map2,
+       edges_equivalent, vertices_equivalent,
+       only_connected_subgraphs,
+       user_callback);
+  }
+  
+  // Variant of mcgregor_common_subgraphs with all default parameters
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       get(vertex_index, graph1), get(vertex_index, graph2),
+       always_equivalent(), always_equivalent(),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // Named parameter variant of mcgregor_common_subgraphs
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback,
+            typename Param,
+            typename Tag,
+            typename Rest>
+  void mcgregor_common_subgraphs
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback,
+   const bgl_named_params<Param, Tag, Rest>& params)
+  {
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       choose_const_pmap(get_param(params, vertex_index1),
+                         graph1, vertex_index),
+       choose_const_pmap(get_param(params, vertex_index2),
+                         graph2, vertex_index),
+       choose_param(get_param(params, edges_equivalent_t()),
+                    always_equivalent()),
+       choose_param(get_param(params, vertices_equivalent_t()),
+                    always_equivalent()),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // ==========================================================================
+
+  namespace detail {
+
+    // Binary function object that intercepts subgraphs from
+    // mcgregor_common_subgraphs_internal and maintains a cache of
+    // unique subgraphs.  The user callback is invoked for each unique
+    // subgraph.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond,
+              typename SubGraphCallback>
+    struct unique_subgraph_interceptor {
+
+      typedef typename graph_traits<GraphFirst>::vertices_size_type
+        VertexSizeFirst;
+
+      typedef mcgregor_common_subgraph_traits<GraphFirst, GraphSecond,
+        VertexIndexMapFirst, VertexIndexMapSecond> SubGraphTraits;
+        
+      typedef typename SubGraphTraits::correspondence_map_first_to_second_type
+        CachedCorrespondenceMapFirstToSecond;
+
+      typedef typename SubGraphTraits::correspondence_map_second_to_first_type
+        CachedCorrespondenceMapSecondToFirst;
+
+      typedef std::pair<VertexSizeFirst,
+        std::pair<CachedCorrespondenceMapFirstToSecond,
+                  CachedCorrespondenceMapSecondToFirst> > SubGraph;
+                
+      typedef std::vector<SubGraph> SubGraphList;
+
+      unique_subgraph_interceptor(const GraphFirst& graph1,
+                                  const GraphSecond& graph2,
+                                  const VertexIndexMapFirst vindex_map1,
+                                  const VertexIndexMapSecond vindex_map2,
+                                  SubGraphCallback user_callback) :                                  
+        m_graph1(graph1), m_graph2(graph2),
+        m_vindex_map1(vindex_map1), m_vindex_map2(vindex_map2),
+        m_subgraphs(make_shared<SubGraphList>()),
+        m_user_callback(user_callback) { }
+      
+      template <typename CorrespondenceMapFirstToSecond,
+                typename CorrespondenceMapSecondToFirst>
+      bool operator()(CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+                      CorrespondenceMapSecondToFirst correspondence_map_2_to_1,
+                      VertexSizeFirst subgraph_size) {
+
+        for (typename SubGraphList::const_iterator
+               subgraph_iter = m_subgraphs->begin();
+             subgraph_iter != m_subgraphs->end();
+             ++subgraph_iter) {
+
+          SubGraph subgraph_cached = *subgraph_iter;
+
+          // Compare subgraph sizes
+          if (subgraph_size != subgraph_cached.first) {
+            continue;
+          }
+          
+          if (!are_property_maps_different(correspondence_map_1_to_2,
+                                           subgraph_cached.second.first,
+                                           m_graph1)) {
+                                    
+            // New subgraph is a duplicate
+            return (true);
+          }
+        }
+  
+        // Subgraph is unique, so make a cached copy
+        CachedCorrespondenceMapFirstToSecond
+          new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond
+          (num_vertices(m_graph1), m_vindex_map1);
+
+        CachedCorrespondenceMapSecondToFirst
+          new_subgraph_2_to_1 = CorrespondenceMapSecondToFirst
+          (num_vertices(m_graph2), m_vindex_map2);
+
+        BGL_FORALL_VERTICES_T(vertex1, m_graph1, GraphFirst) {
+          put(new_subgraph_1_to_2, vertex1, get(correspondence_map_1_to_2, vertex1));
+        }
+
+        BGL_FORALL_VERTICES_T(vertex2, m_graph2, GraphFirst) {
+          put(new_subgraph_2_to_1, vertex2, get(correspondence_map_2_to_1, vertex2));
+        }
+
+        m_subgraphs->push_back(std::make_pair(subgraph_size,
+          std::make_pair(new_subgraph_1_to_2,
+                         new_subgraph_2_to_1)));
+        
+        return (m_user_callback(correspondence_map_1_to_2,
+                                correspondence_map_2_to_1,
+                                subgraph_size));
+      }
+    
+    private:
+      const GraphFirst& m_graph1;
+      const GraphFirst& m_graph2;
+      const VertexIndexMapFirst m_vindex_map1;
+      const VertexIndexMapSecond m_vindex_map2;
+      shared_ptr<SubGraphList> m_subgraphs;
+      SubGraphCallback m_user_callback;
+    };
+    
+  } // namespace detail
+
+  // Enumerates all unique common subgraphs between graph1 and graph2.
+  // The user callback is invoked for each unique subgraph as they are
+  // discovered.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename VertexIndexMapFirst,
+            typename VertexIndexMapSecond,
+            typename EdgeEquivalencePredicate,
+            typename VertexEquivalencePredicate,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   const VertexIndexMapFirst vindex_map1,
+   const VertexIndexMapSecond vindex_map2,
+   EdgeEquivalencePredicate edges_equivalent,
+   VertexEquivalencePredicate vertices_equivalent,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+    detail::unique_subgraph_interceptor<GraphFirst, GraphSecond,
+      VertexIndexMapFirst, VertexIndexMapSecond,
+      SubGraphCallback> unique_callback
+      (graph1, graph2,
+       vindex_map1, vindex_map2,
+       user_callback);
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       vindex_map1, vindex_map2,
+       edges_equivalent, vertices_equivalent,
+       only_connected_subgraphs, unique_callback);
+  }
+
+  // Variant of mcgregor_common_subgraphs_unique with all default
+  // parameters.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+    mcgregor_common_subgraphs_unique
+      (graph1, graph2,
+       get(vertex_index, graph1), get(vertex_index, graph2),
+       always_equivalent(), always_equivalent(),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // Named parameter variant of mcgregor_common_subgraphs_unique
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback,
+            typename Param,
+            typename Tag,
+            typename Rest>
+  void mcgregor_common_subgraphs_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback,
+   const bgl_named_params<Param, Tag, Rest>& params)
+  {
+    mcgregor_common_subgraphs_unique
+      (graph1, graph2,
+       choose_const_pmap(get_param(params, vertex_index1),
+                         graph1, vertex_index),
+       choose_const_pmap(get_param(params, vertex_index2),
+                         graph2, vertex_index),
+       choose_param(get_param(params, edges_equivalent_t()),
+                    always_equivalent()),
+       choose_param(get_param(params, vertices_equivalent_t()),
+                    always_equivalent()),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // ==========================================================================
+
+  namespace detail {
+
+    // Binary function object that intercepts subgraphs from
+    // mcgregor_common_subgraphs_internal and maintains a cache of the
+    // largest subgraphs.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond,
+              typename SubGraphCallback>
+    struct maximum_subgraph_interceptor {
+
+      typedef typename graph_traits<GraphFirst>::vertices_size_type
+        VertexSizeFirst;
+
+      typedef mcgregor_common_subgraph_traits<GraphFirst, GraphSecond,
+        VertexIndexMapFirst, VertexIndexMapSecond> SubGraphTraits;
+        
+      typedef typename SubGraphTraits::correspondence_map_first_to_second_type
+        CachedCorrespondenceMapFirstToSecond;
+
+      typedef typename SubGraphTraits::correspondence_map_second_to_first_type
+        CachedCorrespondenceMapSecondToFirst;
+
+      typedef std::pair<VertexSizeFirst,
+        std::pair<CachedCorrespondenceMapFirstToSecond,
+                  CachedCorrespondenceMapSecondToFirst> > SubGraph;
+
+      typedef std::vector<SubGraph> SubGraphList;
+
+      maximum_subgraph_interceptor(const GraphFirst& graph1,
+                                   const GraphSecond& graph2,
+                                   const VertexIndexMapFirst vindex_map1,
+                                   const VertexIndexMapSecond vindex_map2,
+                                   SubGraphCallback user_callback) :
+        m_graph1(graph1), m_graph2(graph2),
+        m_vindex_map1(vindex_map1), m_vindex_map2(vindex_map2),
+        m_subgraphs(make_shared<SubGraphList>()),
+        m_largest_size_so_far(make_shared<VertexSizeFirst>(0)),
+        m_user_callback(user_callback) { }
+
+      template <typename CorrespondenceMapFirstToSecond,
+                typename CorrespondenceMapSecondToFirst>
+      bool operator()(CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+                      CorrespondenceMapSecondToFirst correspondence_map_2_to_1,
+                      VertexSizeFirst subgraph_size) {
+
+        if (subgraph_size > *m_largest_size_so_far) {
+          m_subgraphs->clear();
+          *m_largest_size_so_far = subgraph_size;
+        }
+
+        if (subgraph_size == *m_largest_size_so_far) {
+        
+          // Make a cached copy
+          CachedCorrespondenceMapFirstToSecond
+            new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond
+            (num_vertices(m_graph1), m_vindex_map1);
+
+          CachedCorrespondenceMapSecondToFirst
+            new_subgraph_2_to_1 = CachedCorrespondenceMapSecondToFirst
+            (num_vertices(m_graph2), m_vindex_map2);
+
+          BGL_FORALL_VERTICES_T(vertex1, m_graph1, GraphFirst) {
+            put(new_subgraph_1_to_2, vertex1, get(correspondence_map_1_to_2, vertex1));
+          }
+
+          BGL_FORALL_VERTICES_T(vertex2, m_graph2, GraphFirst) {
+            put(new_subgraph_2_to_1, vertex2, get(correspondence_map_2_to_1, vertex2));
+          }
+
+          m_subgraphs->push_back(std::make_pair(subgraph_size,
+            std::make_pair(new_subgraph_1_to_2,
+                           new_subgraph_2_to_1)));
+        }
+
+        return (true);
+      }
+
+      void output_subgraphs() {
+        for (typename SubGraphList::const_iterator
+               subgraph_iter = m_subgraphs->begin();
+             subgraph_iter != m_subgraphs->end();
+             ++subgraph_iter) {
+
+          SubGraph subgraph_cached = *subgraph_iter;
+          m_user_callback(subgraph_cached.second.first,
+                          subgraph_cached.second.second,
+                          subgraph_cached.first);
+        }
+      }
+
+    private:
+      const GraphFirst& m_graph1;
+      const GraphFirst& m_graph2;
+      const VertexIndexMapFirst m_vindex_map1;
+      const VertexIndexMapSecond m_vindex_map2;
+      shared_ptr<SubGraphList> m_subgraphs;
+      shared_ptr<VertexSizeFirst> m_largest_size_so_far;
+      SubGraphCallback m_user_callback;
+    };
+    
+  } // namespace detail
+
+  // Enumerates the largest common subgraphs found between graph1
+  // and graph2.  Note that the ENTIRE search space is explored before
+  // user_callback is actually invoked.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename VertexIndexMapFirst,
+            typename VertexIndexMapSecond,
+            typename EdgeEquivalencePredicate,
+            typename VertexEquivalencePredicate,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_maximum
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   const VertexIndexMapFirst vindex_map1,
+   const VertexIndexMapSecond vindex_map2,
+   EdgeEquivalencePredicate edges_equivalent,
+   VertexEquivalencePredicate vertices_equivalent,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+    detail::maximum_subgraph_interceptor<GraphFirst, GraphSecond,
+      VertexIndexMapFirst, VertexIndexMapSecond, SubGraphCallback>
+      max_interceptor
+      (graph1, graph2, vindex_map1, vindex_map2, user_callback);
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       vindex_map1, vindex_map2,
+       edges_equivalent, vertices_equivalent,
+       only_connected_subgraphs, max_interceptor);
+
+    // Only output the largest subgraphs
+    max_interceptor.output_subgraphs();
+  }
+
+  // Variant of mcgregor_common_subgraphs_maximum with all default
+  // parameters.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_maximum
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+    mcgregor_common_subgraphs_maximum
+      (graph1, graph2,
+       get(vertex_index, graph1), get(vertex_index, graph2),
+       always_equivalent(), always_equivalent(),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // Named parameter variant of mcgregor_common_subgraphs_maximum
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback,
+            typename Param,
+            typename Tag,
+            typename Rest>
+  void mcgregor_common_subgraphs_maximum
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback,
+   const bgl_named_params<Param, Tag, Rest>& params)
+  {
+    mcgregor_common_subgraphs_maximum
+      (graph1, graph2,
+       choose_const_pmap(get_param(params, vertex_index1),
+                         graph1, vertex_index),
+       choose_const_pmap(get_param(params, vertex_index2),
+                         graph2, vertex_index),
+       choose_param(get_param(params, edges_equivalent_t()),
+                    always_equivalent()),
+       choose_param(get_param(params, vertices_equivalent_t()),
+                    always_equivalent()),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // ==========================================================================
+
+  namespace detail {
+
+    // Binary function object that intercepts subgraphs from
+    // mcgregor_common_subgraphs_internal and maintains a cache of the
+    // largest, unique subgraphs.
+    template <typename GraphFirst,
+              typename GraphSecond,
+              typename VertexIndexMapFirst,
+              typename VertexIndexMapSecond,
+              typename SubGraphCallback>
+    struct unique_maximum_subgraph_interceptor {
+
+      typedef typename graph_traits<GraphFirst>::vertices_size_type
+        VertexSizeFirst;
+
+      typedef mcgregor_common_subgraph_traits<GraphFirst, GraphSecond,
+        VertexIndexMapFirst, VertexIndexMapSecond> SubGraphTraits;
+        
+      typedef typename SubGraphTraits::correspondence_map_first_to_second_type
+        CachedCorrespondenceMapFirstToSecond;
+
+      typedef typename SubGraphTraits::correspondence_map_second_to_first_type
+        CachedCorrespondenceMapSecondToFirst;
+
+      typedef std::pair<VertexSizeFirst,
+        std::pair<CachedCorrespondenceMapFirstToSecond,
+                  CachedCorrespondenceMapSecondToFirst> > SubGraph;
+
+      typedef std::vector<SubGraph> SubGraphList;
+
+      unique_maximum_subgraph_interceptor(const GraphFirst& graph1,
+                                          const GraphSecond& graph2,
+                                          const VertexIndexMapFirst vindex_map1,
+                                          const VertexIndexMapSecond vindex_map2,
+                                          SubGraphCallback user_callback) :                                  
+        m_graph1(graph1), m_graph2(graph2),
+        m_vindex_map1(vindex_map1), m_vindex_map2(vindex_map2),
+        m_subgraphs(make_shared<SubGraphList>()),
+        m_largest_size_so_far(make_shared<VertexSizeFirst>(0)),
+        m_user_callback(user_callback) { }        
+      
+      template <typename CorrespondenceMapFirstToSecond,
+                typename CorrespondenceMapSecondToFirst>
+      bool operator()(CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+                      CorrespondenceMapSecondToFirst correspondence_map_2_to_1,
+                      VertexSizeFirst subgraph_size) {
+
+        if (subgraph_size > *m_largest_size_so_far) {
+          m_subgraphs->clear();
+          *m_largest_size_so_far = subgraph_size;
+        }
+
+        if (subgraph_size == *m_largest_size_so_far) {
+
+          // Check if subgraph is unique
+          for (typename SubGraphList::const_iterator
+                 subgraph_iter = m_subgraphs->begin();
+               subgraph_iter != m_subgraphs->end();
+               ++subgraph_iter) {
+  
+            SubGraph subgraph_cached = *subgraph_iter;
+  
+            if (!are_property_maps_different(correspondence_map_1_to_2,
+                                             subgraph_cached.second.first,
+                                             m_graph1)) {
+                                      
+              // New subgraph is a duplicate
+              return (true);
+            }
+          }
+    
+          // Subgraph is unique, so make a cached copy
+          CachedCorrespondenceMapFirstToSecond
+            new_subgraph_1_to_2 = CachedCorrespondenceMapFirstToSecond
+            (num_vertices(m_graph1), m_vindex_map1);
+
+          CachedCorrespondenceMapSecondToFirst
+            new_subgraph_2_to_1 = CachedCorrespondenceMapSecondToFirst
+            (num_vertices(m_graph2), m_vindex_map2);
+
+          BGL_FORALL_VERTICES_T(vertex1, m_graph1, GraphFirst) {
+            put(new_subgraph_1_to_2, vertex1, get(correspondence_map_1_to_2, vertex1));
+          }
+
+          BGL_FORALL_VERTICES_T(vertex2, m_graph2, GraphFirst) {
+            put(new_subgraph_2_to_1, vertex2, get(correspondence_map_2_to_1, vertex2));
+          }
+
+          m_subgraphs->push_back(std::make_pair(subgraph_size,
+            std::make_pair(new_subgraph_1_to_2,
+                           new_subgraph_2_to_1)));
+        }
+    
+        return (true);
+      }
+
+      void output_subgraphs() {
+        for (typename SubGraphList::const_iterator
+               subgraph_iter = m_subgraphs->begin();
+             subgraph_iter != m_subgraphs->end();
+             ++subgraph_iter) {
+
+          SubGraph subgraph_cached = *subgraph_iter;
+          m_user_callback(subgraph_cached.second.first,
+                          subgraph_cached.second.second,
+                          subgraph_cached.first);
+        }
+      }
+    
+    private:
+      const GraphFirst& m_graph1;
+      const GraphFirst& m_graph2;
+      const VertexIndexMapFirst m_vindex_map1;
+      const VertexIndexMapSecond m_vindex_map2;
+      shared_ptr<SubGraphList> m_subgraphs;
+      shared_ptr<VertexSizeFirst> m_largest_size_so_far;
+      SubGraphCallback m_user_callback;
+    };
+    
+  } // namespace detail
+
+  // Enumerates the largest, unique common subgraphs found between
+  // graph1 and graph2.  Note that the ENTIRE search space is explored
+  // before user_callback is actually invoked.
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename VertexIndexMapFirst,
+            typename VertexIndexMapSecond,
+            typename EdgeEquivalencePredicate,
+            typename VertexEquivalencePredicate,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_maximum_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   const VertexIndexMapFirst vindex_map1,
+   const VertexIndexMapSecond vindex_map2,
+   EdgeEquivalencePredicate edges_equivalent,
+   VertexEquivalencePredicate vertices_equivalent,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+    detail::unique_maximum_subgraph_interceptor<GraphFirst, GraphSecond,
+      VertexIndexMapFirst, VertexIndexMapSecond, SubGraphCallback>
+      unique_max_interceptor
+      (graph1, graph2, vindex_map1, vindex_map2, user_callback);
+      
+    detail::mcgregor_common_subgraphs_internal_init
+      (graph1, graph2,
+       vindex_map1, vindex_map2,
+       edges_equivalent, vertices_equivalent,
+       only_connected_subgraphs, unique_max_interceptor);
+
+    // Only output the largest, unique subgraphs
+    unique_max_interceptor.output_subgraphs();
+  }
+
+  // Variant of mcgregor_common_subgraphs_maximum_unique with all default parameters
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback>
+  void mcgregor_common_subgraphs_maximum_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback)
+  {
+
+    mcgregor_common_subgraphs_maximum_unique
+      (graph1, graph2,
+       get(vertex_index, graph1), get(vertex_index, graph2),
+       always_equivalent(), always_equivalent(),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // Named parameter variant of
+  // mcgregor_common_subgraphs_maximum_unique
+  template <typename GraphFirst,
+            typename GraphSecond,
+            typename SubGraphCallback,
+            typename Param,
+            typename Tag,
+            typename Rest>
+  void mcgregor_common_subgraphs_maximum_unique
+  (const GraphFirst& graph1,
+   const GraphSecond& graph2,
+   bool only_connected_subgraphs,
+   SubGraphCallback user_callback,
+   const bgl_named_params<Param, Tag, Rest>& params)
+  {
+    mcgregor_common_subgraphs_maximum_unique
+      (graph1, graph2,
+       choose_const_pmap(get_param(params, vertex_index1),
+                         graph1, vertex_index),
+       choose_const_pmap(get_param(params, vertex_index2),
+                         graph2, vertex_index),
+       choose_param(get_param(params, edges_equivalent_t()),
+                    always_equivalent()),
+       choose_param(get_param(params, vertices_equivalent_t()),
+                    always_equivalent()),
+       only_connected_subgraphs, user_callback);
+  }
+
+  // ==========================================================================
+
+  // Fills a membership map (vertex -> bool) using the information
+  // present in correspondence_map_1_to_2. Every vertex in a
+  // membership map will have a true value only if it is not
+  // associated with a null vertex in the correspondence map.
+  template <typename GraphSecond,
+            typename GraphFirst,
+            typename CorrespondenceMapFirstToSecond,
+            typename MembershipMapFirst>
+  void fill_membership_map
+  (const GraphFirst& graph1,
+   const CorrespondenceMapFirstToSecond correspondence_map_1_to_2,
+   MembershipMapFirst membership_map1) {
+
+    BGL_FORALL_VERTICES_T(vertex1, graph1, GraphFirst) {
+      put(membership_map1, vertex1,
+          get(correspondence_map_1_to_2, vertex1) != graph_traits<GraphSecond>::null_vertex());
+    }
+
+  }
+
+  // Traits associated with a membership map filtered graph.  Provided
+  // for convenience to access graph and vertex filter types.
+  template <typename Graph,
+            typename MembershipMap>
+  struct membership_filtered_graph_traits {
+    typedef property_map_filter<MembershipMap> vertex_filter_type;
+    typedef filtered_graph<Graph, keep_all, vertex_filter_type> graph_type;
+  };
+
+  // Returns a filtered sub-graph of graph whose edge and vertex
+  // inclusion is dictated by membership_map.
+  template <typename Graph,
+            typename MembershipMap>            
+  typename membership_filtered_graph_traits<Graph, MembershipMap>::graph_type
+  make_membership_filtered_graph
+  (const Graph& graph,
+   MembershipMap& membership_map) {
+
+    typedef membership_filtered_graph_traits<Graph, MembershipMap> MFGTraits;
+    typedef typename MFGTraits::graph_type MembershipFilteredGraph;
+
+    typename MFGTraits::vertex_filter_type v_filter(membership_map);
+
+    return (MembershipFilteredGraph(graph, keep_all(), v_filter));
+    
+  }
+  
+} // namespace boost
+
+#endif // BOOST_GRAPH_MCGREGOR_COMMON_SUBGRAPHS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/mesh_graph_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/mesh_graph_generator.hpp
new file mode 100644 (file)
index 0000000..5bf1d47
--- /dev/null
@@ -0,0 +1,158 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_MESH_GENERATOR_HPP
+#define BOOST_GRAPH_MESH_GENERATOR_HPP
+
+#include <iterator>
+#include <utility>
+#include <cassert>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost {
+
+  template<typename Graph>
+  class mesh_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type 
+      vertices_size_type;
+
+    BOOST_STATIC_CONSTANT
+      (bool,
+       is_undirected = (is_base_and_derived<undirected_tag,
+                                            directed_category>::value
+                        || is_same<undirected_tag, directed_category>::value));
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    mesh_iterator()
+      : x(0), y(0), done(true) { }
+
+    // Vertices are numbered in row-major order
+    // Assumes directed
+    mesh_iterator(vertices_size_type x, vertices_size_type y, 
+                  bool toroidal = true)
+      : x(x), y(y), n(x*y), source(0), target(1), current(0,1), 
+        toroidal(toroidal), done(false)
+    { assert(x > 1 && y > 1); }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+    
+    mesh_iterator& operator++()
+    {
+      if (is_undirected) {
+        if (!toroidal) {
+          if (target == source + 1)
+            if (source < x * (y - 1))
+              target = source + x;
+            else {
+              source++;
+              target = (source % x) < x - 1 ? source + 1 : source + x;
+              if (target > n) 
+                done = true;
+            }
+          else if (target == source + x) {
+            source++;
+            target = (source % x) < x - 1 ? source + 1 : source + x;
+          }
+        } else {
+          if (target == source + 1 || target == source - (source % x))
+            target = (source + x) % n;
+          else if (target == (source + x) % n) {
+            if (source == n - 1)
+              done = true;
+            else {
+              source++;
+              target = (source % x) < (x - 1) ? source + 1 : source - (source % x);
+            }
+          }
+        }
+      } else { // Directed
+        if ( !toroidal ) {
+          if (target == source - x) 
+            target = source % x > 0 ? source - 1 : source + 1;
+          else if (target == source - 1)
+            if ((source % x) < (x - 1))
+              target = source + 1;
+            else if (source < x * (y - 1))
+              target = source + x;
+            else {
+              done = true;
+            }
+          else if (target == source + 1)
+            if (source < x * (y - 1))
+              target = source + x;
+            else {
+              source++;
+              target = source - x;
+            }
+          else if (target == source + x) {
+            source++;
+            target = (source >= x) ? source - x : source - 1;
+          }
+        } else {
+          if (source == n - 1 && target == (source + x) % n)
+            done = true;
+          else if (target == source - 1 || target == source + x - 1)
+            target = (source + x) % n;
+          else if (target == source + 1 || target == source - (source % x))
+            target = (source - x + n) % n;
+          else if (target == (source - x + n) % n)
+            target = (source % x > 0) ? source - 1 : source + x - 1;
+          else if (target == (source + x) % n) {
+            source++;
+            target = (source % x) < (x - 1) ? source + 1 : source - (source % x);
+          }
+        }
+      }
+
+      current.first = source;
+      current.second = target;
+
+      return *this;
+    }
+
+    mesh_iterator operator++(int)
+    {
+      mesh_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const mesh_iterator& other) const
+    {
+      return done == other.done;
+    }
+
+    bool operator!=(const mesh_iterator& other) const
+    { return !(*this == other); }
+
+  private: 
+
+    vertices_size_type x,y;
+    vertices_size_type n;
+    vertices_size_type source;
+    vertices_size_type target;
+    value_type current;
+    bool toroidal;
+    bool done;
+  };
+
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_MESH_GENERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/metis.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/metis.hpp
new file mode 100644 (file)
index 0000000..f16cac2
--- /dev/null
@@ -0,0 +1,339 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_METIS_HPP
+#define BOOST_GRAPH_METIS_HPP
+
+#ifdef BOOST_GRAPH_METIS_NO_INLINE
+#  define BOOST_GRAPH_METIS_INLINE_KEYWORD
+#else
+#  define BOOST_GRAPH_METIS_INLINE_KEYWORD inline
+#endif
+
+#include <string>
+#include <iostream>
+#include <iterator>
+#include <utility>
+#include <sstream>
+#include <exception>
+#include <vector>
+#include <algorithm>
+
+namespace boost { namespace graph {
+
+class metis_exception : public std::exception {};
+class metis_input_exception : public metis_exception {};
+
+class metis_reader
+{
+ public:
+  typedef std::size_t vertices_size_type;
+  typedef std::size_t edges_size_type;
+  typedef double vertex_weight_type;
+  typedef double edge_weight_type;
+
+  class edge_iterator
+  {
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef std::ptrdiff_t difference_type;
+
+  private:
+    class postincrement_proxy
+    {
+      postincrement_proxy(const value_type& value) : value(value) { }
+
+    public:
+      reference operator*() const { return value; }
+
+    private:
+      value_type value;
+      friend class edge_iterator;
+    };
+    
+  public:
+    edge_iterator& operator++();
+    postincrement_proxy operator++(int);
+
+    reference operator*() const { return self->edge; }
+    pointer operator->() const { return &self->edge; }
+
+    // Default copy constructor and assignment operator are okay
+
+  private:
+    edge_iterator(metis_reader* self);
+    void advance(bool skip_initial_read);
+    
+    metis_reader* self;
+
+    friend class metis_reader;
+    friend bool operator==(edge_iterator, edge_iterator);
+    friend bool operator!=(edge_iterator, edge_iterator);
+  };
+  friend class edge_iterator;
+
+  class edge_weight_iterator
+  {
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef edge_weight_type value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+
+    // Default copy constructor and assignment operator are okay
+
+    reference operator*() const { return self->edge_weight; }
+    pointer operator->() const { return &self->edge_weight; }
+
+    edge_weight_iterator& operator++() { return *this; }
+    edge_weight_iterator operator++(int) { return *this; }
+
+  private:
+    edge_weight_iterator(metis_reader* self) : self(self) { }
+
+    metis_reader* self;
+    
+    friend class metis_reader;
+  };
+  
+  metis_reader(std::istream& in) : in(in), edge_weight(1.0) { start(); }
+
+  edge_iterator begin();
+  edge_iterator end();
+  edge_weight_iterator weight_begin();
+
+  vertices_size_type num_vertices() const { return n_vertices; }
+  edges_size_type num_edges() const { return n_edges; }
+
+  std::size_t num_vertex_weights() const { return n_vertex_weights; }
+
+  vertex_weight_type vertex_weight(vertices_size_type v, std::size_t n)
+  { return vertex_weights[v*num_vertex_weights() + n]; }
+
+  bool has_edge_weights() const { return edge_weights; }
+
+ private:
+  void start();
+
+  // Configuration information
+  std::istream& in;
+
+  // Information about the current METIS file
+  vertices_size_type n_vertices;
+  edges_size_type n_edges;
+  std::size_t n_vertex_weights;
+  bool edge_weights;
+
+  // Information about the current edge/vertex
+  std::istringstream line_in;
+  std::pair<vertices_size_type, vertices_size_type> edge;
+  std::vector<vertex_weight_type> vertex_weights;
+  edge_weight_type edge_weight;    
+
+  friend bool operator==(edge_iterator, edge_iterator);
+  friend bool operator!=(edge_iterator, edge_iterator);
+};
+
+class metis_distribution
+{
+ public:  
+  typedef int process_id_type;
+  typedef std::size_t size_type;
+  typedef std::vector<process_id_type>::iterator iterator;
+
+  metis_distribution(std::istream& in, process_id_type my_id);
+  
+  size_type block_size(process_id_type id, size_type) const;
+  process_id_type operator()(size_type n) const { return vertices[n]; }
+  size_type local(size_type n) const;
+  size_type global(size_type n) const { return global(my_id, n); }
+  size_type global(process_id_type id, size_type n) const;
+
+  iterator begin() { return vertices.begin(); }
+  iterator end()   { return vertices.end(); }
+
+ private:
+  std::istream& in;
+  process_id_type my_id;
+  std::vector<process_id_type> vertices;
+};
+
+#if !defined(BOOST_GRAPH_METIS_NO_INLINE) || defined(BOOST_GRAPH_METIS_SOURCE)
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+bool operator==(metis_reader::edge_iterator x, metis_reader::edge_iterator y)
+{
+  return (x.self == y.self
+          || (x.self && x.self->edge.first == x.self->num_vertices())
+          || (y.self && y.self->edge.first == y.self->num_vertices()));
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+bool operator!=(metis_reader::edge_iterator x, metis_reader::edge_iterator y)
+{
+  return !(x == y);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_iterator::edge_iterator(metis_reader* self) 
+  : self(self) 
+{
+  if (self) advance(true);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_iterator& metis_reader::edge_iterator::operator++()
+{
+  advance(false);
+  return *this;
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+void metis_reader::edge_iterator::advance(bool skip_initial_read)
+{
+  do {
+
+    if (!skip_initial_read) {
+      // Try to read the next edge
+      if (self->line_in >> std::ws >> self->edge.second) {
+        --self->edge.second;
+        if (self->has_edge_weights()) {
+          if (!(self->line_in >> self->edge_weight))
+            boost::throw_exception(metis_input_exception());
+        }
+        return;
+      }
+
+      // Check if we're done
+      ++self->edge.first;
+      if (self->edge.first == self->num_vertices())
+        return;
+    }
+
+    // Find the next line
+    std::string line;
+    while (getline(self->in, line) && !line.empty() && line[0] == '%') {
+      /* Keep reading lines in the loop header... */
+    }
+    if (!self->in) boost::throw_exception(metis_input_exception());
+    self->line_in.str(line);
+    self->line_in.clear();
+
+    // Read the next line
+    std::size_t weights_left = self->n_vertex_weights;
+    vertex_weight_type weight;
+    while (weights_left > 0) {
+      if (self->line_in >> weight) self->vertex_weights.push_back(weight);
+      else boost::throw_exception(metis_input_exception());
+      --weights_left;
+    }
+
+    // Successive iterations will pick up edges for this vertex.
+    skip_initial_read = false;
+  } while (true);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_iterator::postincrement_proxy 
+metis_reader::edge_iterator::operator++(int)
+{
+  postincrement_proxy result(**this);
+  ++(*this);
+  return result;
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_iterator metis_reader::begin()
+{
+  if (edge.first != 0) start();
+  return edge_iterator(this);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_iterator metis_reader::end()
+{
+  return edge_iterator(0);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+metis_reader::edge_weight_iterator metis_reader::weight_begin()
+{
+  return edge_weight_iterator(this);
+}
+
+BOOST_GRAPH_METIS_INLINE_KEYWORD
+void metis_reader::start()
+{
+  in.seekg(0, std::ios::beg);
+  std::string line;
+  while (getline(in, line) && !line.empty() && line[0] == '%') {
+    /* Keep getting lines in loop header. */
+  }
+
+  if (!in || line.empty()) boost::throw_exception(metis_input_exception());
+
+  // Determine number of vertices and edges in the graph
+  line_in.str(line);
+  if (!(line_in >> n_vertices >> n_edges)) boost::throw_exception(metis_input_exception());
+
+  // Determine whether vertex or edge weights are included in the graph
+  int fmt = 0;
+  line_in >> fmt;
+  n_vertex_weights = fmt / 10;
+  edge_weights = (fmt % 10 == 1);
+  
+  // Determine how many (if any!) vertex weights are included
+  if (n_vertex_weights) line_in >> n_vertex_weights;
+
+  // Setup the iteration data structures
+  edge_weight = 1.0;
+  edge.first = 0;
+  edge.second = 0;
+  vertex_weights.reserve(n_vertex_weights * num_vertices());
+}
+
+metis_distribution::metis_distribution(std::istream& in, process_id_type my_id)
+  : in(in), my_id(my_id), 
+    vertices(std::istream_iterator<process_id_type>(in),
+             std::istream_iterator<process_id_type>())
+{
+}
+
+
+metis_distribution::size_type 
+metis_distribution::block_size(process_id_type id, size_type) const
+{
+  return std::count(vertices.begin(), vertices.end(), id);
+}
+
+metis_distribution::size_type metis_distribution::local(size_type n) const
+{
+  return std::count(vertices.begin(), vertices.begin() + n, vertices[n]);
+}
+
+metis_distribution::size_type 
+metis_distribution::global(process_id_type id, size_type n) const
+{
+  std::vector<process_id_type>::const_iterator i = vertices.begin();
+  while (*i != id) ++i;
+
+  while (n > 0) {
+    do { ++i; } while (*i != id); 
+    --n;
+  }
+
+  return i - vertices.begin();
+}
+
+#endif
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_METIS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/metric_tsp_approx.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/metric_tsp_approx.hpp
new file mode 100644 (file)
index 0000000..ff257ab
--- /dev/null
@@ -0,0 +1,313 @@
+
+//=======================================================================
+// Copyright 2008
+// Author: Matyas W Egyhazy
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_METRIC_TSP_APPROX_HPP
+#define BOOST_GRAPH_METRIC_TSP_APPROX_HPP
+
+// metric_tsp_approx
+// Generates an approximate tour solution for the traveling salesperson
+// problem in polynomial time. The current algorithm guarantees a tour with a
+// length at most as long as 2x optimal solution. The graph should have
+// 'natural' (metric) weights such that the triangle inequality is maintained.
+// Graphs must be fully interconnected.
+
+// TODO:
+// There are a couple of improvements that could be made.
+// 1) Change implementation to lower uppper bound Christofides heuristic
+// 2) Implement a less restrictive TSP heuristic (one that does not rely on
+//    triangle inequality).
+// 3) Determine if the algorithm can be implemented without creating a new
+//    graph.
+
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_as_tree.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/prim_minimum_spanning_tree.hpp>
+
+
+namespace boost
+{
+    // Define a concept for the concept-checking library.
+    template <typename Visitor, typename Graph>
+    struct TSPVertexVisitorConcept
+    {
+    private:
+        Visitor vis_;
+    public:
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+        BOOST_CONCEPT_USAGE(TSPVertexVisitorConcept)
+        {
+            Visitor vis(vis_);  // require copy construction
+            Graph g(1);
+            Vertex v(*vertices(g).first);
+            vis_.visit_vertex(v, g); // require visit_vertex
+        }
+    };
+
+    // Tree visitor that keeps track of a preorder traversal of a tree
+    // TODO: Consider migrating this to the graph_as_tree header.
+    // TODO: Parameterize the underlying stores o it doesn't have to be a vector.
+    template<typename Node, typename Tree> class PreorderTraverser
+    {
+    private:
+        std::vector<Node>& path_;
+    public:
+        typedef typename std::vector<Node>::const_iterator const_iterator;
+
+        PreorderTraverser(std::vector<Node>& p) : path_(p) {}
+
+        void preorder(Node n, const Tree& t)
+        { path_.push_back(n); }
+
+        void inorder(Node n, const Tree& t) const {}
+        void postorder(Node, const Tree& t) const {}
+
+        const_iterator begin() const { return path_.begin(); }
+        const_iterator end() const { return path_.end(); }
+    };
+
+    // Forward declarations
+    template <typename> class tsp_tour_visitor;
+    template <typename, typename, typename, typename> class tsp_tour_len_visitor;
+
+    template<typename VertexListGraph, typename OutputIterator>
+    void metric_tsp_approx_tour(VertexListGraph& g, OutputIterator o)
+    {
+        metric_tsp_approx_from_vertex(g, *vertices(g).first,
+            get(edge_weight, g), get(vertex_index, g),
+            tsp_tour_visitor<OutputIterator>(o));
+    }
+
+    template<typename VertexListGraph, typename WeightMap, typename OutputIterator>
+    void metric_tsp_approx_tour(VertexListGraph& g, WeightMap w, OutputIterator o)
+    {
+        metric_tsp_approx_from_vertex(g, *vertices(g).first,
+            w, tsp_tour_visitor<OutputIterator>(o));
+    }
+
+    template<typename VertexListGraph, typename OutputIterator>
+    void metric_tsp_approx_tour_from_vertex(VertexListGraph& g,
+        typename graph_traits<VertexListGraph>::vertex_descriptor start,
+        OutputIterator o)
+    {
+        metric_tsp_approx_from_vertex(g, start, get(edge_weight, g),
+            get(vertex_index, g), tsp_tour_visitor<OutputIterator>(o));
+    }
+
+    template<typename VertexListGraph, typename WeightMap,
+        typename OutputIterator>
+    void metric_tsp_approx_tour_from_vertex(VertexListGraph& g,
+    typename graph_traits<VertexListGraph>::vertex_descriptor start,
+        WeightMap w, OutputIterator o)
+    {
+        metric_tsp_approx_from_vertex(g, start, w, get(vertex_index, g),
+            tsp_tour_visitor<OutputIterator>(o));
+    }
+
+    template<typename VertexListGraph, typename TSPVertexVisitor>
+    void metric_tsp_approx(VertexListGraph& g, TSPVertexVisitor vis)
+    {
+        metric_tsp_approx_from_vertex(g, *vertices(g).first,
+            get(edge_weight, g), get(vertex_index, g), vis);
+    }
+
+    template<typename VertexListGraph, typename Weightmap,
+        typename VertexIndexMap, typename TSPVertexVisitor>
+    void metric_tsp_approx(VertexListGraph& g, Weightmap w,
+        TSPVertexVisitor vis)
+    {
+        metric_tsp_approx_from_vertex(g, *vertices(g).first, w,
+            get(vertex_index, g), vis);
+    }
+
+    template<typename VertexListGraph, typename WeightMap,
+        typename VertexIndexMap, typename TSPVertexVisitor>
+    void metric_tsp_approx(VertexListGraph& g, WeightMap w, VertexIndexMap id,
+        TSPVertexVisitor vis)
+    {
+        metric_tsp_approx_from_vertex(g, *vertices(g).first, w, id, vis);
+    }
+
+    template<typename VertexListGraph, typename WeightMap,
+        typename TSPVertexVisitor>
+    void metric_tsp_approx_from_vertex(VertexListGraph& g,
+    typename graph_traits<VertexListGraph>::vertex_descriptor start,
+        WeightMap w, TSPVertexVisitor vis)
+    {
+        metric_tsp_approx_from_vertex(g, start, w, get(vertex_index, g), vis);
+    }
+
+    template <
+        typename VertexListGraph,
+        typename WeightMap,
+        typename VertexIndexMap,
+        typename TSPVertexVisitor>
+    void metric_tsp_approx_from_vertex(const VertexListGraph& g,
+                                       typename graph_traits<VertexListGraph>::vertex_descriptor start,
+                                       WeightMap weightmap,
+                                       VertexIndexMap indexmap,
+                                       TSPVertexVisitor vis)
+    {
+        using namespace boost;
+        using namespace std;
+
+        BOOST_CONCEPT_ASSERT((VertexListGraphConcept<VertexListGraph>));
+        BOOST_CONCEPT_ASSERT((TSPVertexVisitorConcept<TSPVertexVisitor, VertexListGraph>));
+
+        // Types related to the input graph (GVertex is a template parameter).
+        typedef typename graph_traits<VertexListGraph>::vertex_descriptor GVertex;
+        typedef typename graph_traits<VertexListGraph>::vertex_iterator GVItr;
+
+        // We build a custom graph in this algorithm.
+        typedef adjacency_list <vecS, vecS, directedS, no_property, no_property > MSTImpl;
+        typedef graph_traits<MSTImpl>::edge_descriptor Edge;
+        typedef graph_traits<MSTImpl>::vertex_descriptor Vertex;
+        typedef graph_traits<MSTImpl>::vertex_iterator VItr;
+
+        // And then re-cast it as a tree.
+        typedef iterator_property_map<vector<Vertex>::iterator, property_map<MSTImpl, vertex_index_t>::type> ParentMap;
+        typedef graph_as_tree<MSTImpl, ParentMap> Tree;
+        typedef tree_traits<Tree>::node_descriptor Node;
+
+        // A predecessor map.
+        typedef vector<GVertex> PredMap;
+        typedef iterator_property_map<typename PredMap::iterator, VertexIndexMap> PredPMap;
+
+        PredMap preds(num_vertices(g));
+        PredPMap pred_pmap(preds.begin(), indexmap);
+
+        // Compute a spanning tree over the in put g.
+        prim_minimum_spanning_tree(g, pred_pmap,
+             root_vertex(start)
+            .vertex_index_map(indexmap)
+            .weight_map(weightmap));
+
+        // Build a MST using the predecessor map from prim mst
+        MSTImpl mst(num_vertices(g));
+        std::size_t cnt = 0;
+        pair<VItr, VItr> mst_verts(vertices(mst));
+        for(typename PredMap::iterator vi(preds.begin()); vi != preds.end(); ++vi, ++cnt)
+        {
+            if(indexmap[*vi] != cnt) {
+                add_edge(*next(mst_verts.first, indexmap[*vi]),
+                         *next(mst_verts.first, cnt), mst);
+            }
+        }
+
+        // Build a tree abstraction over the MST.
+        vector<Vertex> parent(num_vertices(mst));
+        Tree t(mst, *vertices(mst).first,
+            make_iterator_property_map(parent.begin(),
+            get(vertex_index, mst)));
+
+        // Create tour using a preorder traversal of the mst
+        vector<Node> tour;
+        PreorderTraverser<Node, Tree> tvis(tour);
+        traverse_tree(0, t, tvis);
+
+        pair<GVItr, GVItr> g_verts(vertices(g));
+        for(PreorderTraverser<Node, Tree>::const_iterator curr(tvis.begin());
+            curr != tvis.end(); ++curr)
+        {
+            // TODO: This is will be O(n^2) if vertex storage of g != vecS.
+            GVertex v = *next(g_verts.first, get(vertex_index, mst)[*curr]);
+            vis.visit_vertex(v, g);
+        }
+
+        // Connect back to the start of the tour
+        vis.visit_vertex(*g_verts.first, g);
+    }
+
+    // Default tsp tour visitor that puts the tour in an OutputIterator
+    template <typename OutItr>
+    class tsp_tour_visitor
+    {
+        OutItr itr_;
+    public:
+        tsp_tour_visitor(OutItr itr)
+            : itr_(itr)
+        { }
+
+        template <typename Vertex, typename Graph>
+        void visit_vertex(Vertex v, const Graph& g)
+        {
+            BOOST_CONCEPT_ASSERT((OutputIterator<OutItr, Vertex>));
+            *itr_++ = v;
+        }
+
+    };
+
+    // Tsp tour visitor that adds the total tour length.
+    template<typename Graph, typename WeightMap, typename OutIter, typename Length>
+    class tsp_tour_len_visitor
+    {
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        BOOST_CONCEPT_ASSERT((OutputIterator<OutIter, Vertex>));
+
+        OutIter iter_;
+        Length& tourlen_;
+        WeightMap& wmap_;
+        Vertex previous_;
+
+        // Helper function for getting the null vertex.
+        Vertex null()
+        { return graph_traits<Graph>::null_vertex(); }
+
+    public:
+        tsp_tour_len_visitor(Graph const&, OutIter iter, Length& l, WeightMap map)
+            : iter_(iter), tourlen_(l), wmap_(map), previous_(null())
+        { }
+
+        void visit_vertex(Vertex v, const Graph& g)
+        {
+            typedef typename graph_traits<Graph>::edge_descriptor Edge;
+
+            // If it is not the start, then there is a
+            // previous vertex
+            if(previous_ != null())
+            {
+                // NOTE: For non-adjacency matrix graphs g, this bit of code
+                // will be linear in the degree of previous_ or v. A better
+                // solution would be to visit edges of the graph, but that
+                // would require revisiting the core algorithm.
+                Edge e;
+                bool found;
+                tie(e, found) = edge(previous_, v, g);
+                if(!found) {
+                    throw not_complete();
+                }
+
+                tourlen_ += wmap_[e];
+            }
+
+            previous_ = v;
+            *iter_++ = v;
+        }
+    };
+
+    // Object generator(s)
+    template <typename OutIter>
+    inline tsp_tour_visitor<OutIter>
+    make_tsp_tour_visitor(OutIter iter)
+    { return tsp_tour_visitor<OutIter>(iter); }
+
+    template <typename Graph, typename WeightMap, typename OutIter, typename Length>
+    inline tsp_tour_len_visitor<Graph, WeightMap, OutIter, Length>
+    make_tsp_tour_len_visitor(Graph const& g, OutIter iter, Length& l, WeightMap map)
+    { return tsp_tour_len_visitor<Graph, WeightMap, OutIter, Length>(g, iter, l, map); }
+
+} //boost
+
+#endif // BOOST_GRAPH_METRIC_TSP_APPROX_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/minimum_degree_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/minimum_degree_ordering.hpp
index 6aa242dcc58f9f7a1604f1001604c77b2707f60b..39c3dcfb53c9c92d69976c4a67b58c72053d8bb8 100644 (file)
@@ -17,7 +17,7 @@
 #include <boost/pending/bucket_sorter.hpp>
 #include <boost/detail/numeric_traits.hpp> // for integer_traits
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost {
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/named_function_params.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/named_function_params.hpp
new file mode 100644 (file)
index 0000000..1e2647c
--- /dev/null
@@ -0,0 +1,506 @@
+//=======================================================================
+// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
+// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
+#define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
+
+#include <boost/graph/properties.hpp>
+#include <boost/ref.hpp>
+#include <boost/parameter/name.hpp>
+#include <boost/parameter/binding.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/graph/named_function_params.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/property_map/shared_array_property_map.hpp>
+
+namespace boost {
+
+  struct distance_compare_t { };
+  struct distance_combine_t { };
+  struct distance_inf_t { };
+  struct distance_zero_t { };
+  struct buffer_param_t { };
+  struct edge_copy_t { };
+  struct vertex_copy_t { };
+  struct vertex_isomorphism_t { };
+  struct vertex_invariant_t { };
+  struct vertex_invariant1_t { };
+  struct vertex_invariant2_t { };
+  struct edge_compare_t { };
+  struct vertex_max_invariant_t { };
+  struct orig_to_copy_t { };
+  struct root_vertex_t { };
+  struct polling_t { };
+  struct lookahead_t { };
+  struct in_parallel_t { };
+  struct attractive_force_t { };
+  struct repulsive_force_t { };
+  struct force_pairs_t { };
+  struct cooling_t { };
+  struct vertex_displacement_t { };
+  struct iterations_t { };
+  struct diameter_range_t { };
+  struct learning_constant_range_t { };
+  struct vertices_equivalent_t { };
+  struct edges_equivalent_t { };
+
+#define BOOST_BGL_DECLARE_NAMED_PARAMS \
+    BOOST_BGL_ONE_PARAM_CREF(weight_map, edge_weight) \
+    BOOST_BGL_ONE_PARAM_CREF(weight_map2, edge_weight2) \
+    BOOST_BGL_ONE_PARAM_CREF(distance_map, vertex_distance) \
+    BOOST_BGL_ONE_PARAM_CREF(predecessor_map, vertex_predecessor) \
+    BOOST_BGL_ONE_PARAM_CREF(rank_map, vertex_rank) \
+    BOOST_BGL_ONE_PARAM_CREF(root_map, vertex_root) \
+    BOOST_BGL_ONE_PARAM_CREF(root_vertex, root_vertex) \
+    BOOST_BGL_ONE_PARAM_CREF(edge_centrality_map, edge_centrality) \
+    BOOST_BGL_ONE_PARAM_CREF(centrality_map, vertex_centrality) \
+    BOOST_BGL_ONE_PARAM_CREF(color_map, vertex_color) \
+    BOOST_BGL_ONE_PARAM_CREF(edge_color_map, edge_color) \
+    BOOST_BGL_ONE_PARAM_CREF(capacity_map, edge_capacity) \
+    BOOST_BGL_ONE_PARAM_CREF(residual_capacity_map, edge_residual_capacity) \
+    BOOST_BGL_ONE_PARAM_CREF(reverse_edge_map, edge_reverse) \
+    BOOST_BGL_ONE_PARAM_CREF(discover_time_map, vertex_discover_time) \
+    BOOST_BGL_ONE_PARAM_CREF(lowpoint_map, vertex_lowpoint) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_index_map, vertex_index) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_index1_map, vertex_index1) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_index2_map, vertex_index2) \
+    BOOST_BGL_ONE_PARAM_CREF(visitor, graph_visitor) \
+    BOOST_BGL_ONE_PARAM_CREF(distance_compare, distance_compare) \
+    BOOST_BGL_ONE_PARAM_CREF(distance_combine, distance_combine) \
+    BOOST_BGL_ONE_PARAM_CREF(distance_inf, distance_inf) \
+    BOOST_BGL_ONE_PARAM_CREF(distance_zero, distance_zero) \
+    BOOST_BGL_ONE_PARAM_CREF(edge_copy, edge_copy) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_copy, vertex_copy) \
+    BOOST_BGL_ONE_PARAM_REF(buffer, buffer_param) \
+    BOOST_BGL_ONE_PARAM_CREF(orig_to_copy, orig_to_copy) \
+    BOOST_BGL_ONE_PARAM_CREF(isomorphism_map, vertex_isomorphism) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_invariant, vertex_invariant) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_invariant1, vertex_invariant1) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_invariant2, vertex_invariant2) \
+    BOOST_BGL_ONE_PARAM_CREF(vertex_max_invariant, vertex_max_invariant) \
+    BOOST_BGL_ONE_PARAM_CREF(polling, polling) \
+    BOOST_BGL_ONE_PARAM_CREF(lookahead, lookahead) \
+    BOOST_BGL_ONE_PARAM_CREF(in_parallel, in_parallel) \
+    BOOST_BGL_ONE_PARAM_CREF(displacement_map, vertex_displacement) \
+    BOOST_BGL_ONE_PARAM_CREF(attractive_force, attractive_force) \
+    BOOST_BGL_ONE_PARAM_CREF(repulsive_force, repulsive_force) \
+    BOOST_BGL_ONE_PARAM_CREF(force_pairs, force_pairs) \
+    BOOST_BGL_ONE_PARAM_CREF(cooling, cooling) \
+    BOOST_BGL_ONE_PARAM_CREF(iterations, iterations) \
+    BOOST_BGL_ONE_PARAM_CREF(diameter_range, diameter_range) \
+    BOOST_BGL_ONE_PARAM_CREF(learning_constant_range, learning_constant_range) \
+    BOOST_BGL_ONE_PARAM_CREF(vertices_equivalent, vertices_equivalent) \
+    BOOST_BGL_ONE_PARAM_CREF(edges_equivalent, edges_equivalent)
+
+  template <typename T, typename Tag, typename Base = no_property>
+  struct bgl_named_params : public Base
+  {
+    typedef bgl_named_params self;
+    typedef Base next_type;
+    typedef Tag tag_type;
+    typedef T value_type;
+    bgl_named_params(T v = T()) : m_value(v) { }
+    bgl_named_params(T v, const Base& b) : Base(b), m_value(v) { }
+    T m_value;
+
+#define BOOST_BGL_ONE_PARAM_REF(name, key) \
+    template <typename PType> \
+    bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t), self> \
+    name(PType& p) const { \
+      typedef bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t), self> Params; \
+      return Params(boost::ref(p), *this); \
+    } \
+
+#define BOOST_BGL_ONE_PARAM_CREF(name, key) \
+    template <typename PType> \
+    bgl_named_params<PType, BOOST_PP_CAT(key, _t), self> \
+    name(const PType& p) const { \
+      typedef bgl_named_params<PType, BOOST_PP_CAT(key, _t), self> Params; \
+      return Params(p, *this); \
+    } \
+
+BOOST_BGL_DECLARE_NAMED_PARAMS
+
+#undef BOOST_BGL_ONE_PARAM_REF
+#undef BOOST_BGL_ONE_PARAM_CREF
+
+    // Duplicate
+    template <typename PType>
+    bgl_named_params<PType, vertex_color_t, self>
+    vertex_color_map(const PType& p) const {return this->color_map(p);}
+  };
+
+#define BOOST_BGL_ONE_PARAM_REF(name, key) \
+    template <typename PType> \
+    bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t)> \
+    name(PType& p) { \
+      typedef bgl_named_params<boost::reference_wrapper<PType>, BOOST_PP_CAT(key, _t)> Params; \
+      return Params(boost::ref(p)); \
+    } \
+
+#define BOOST_BGL_ONE_PARAM_CREF(name, key) \
+    template <typename PType> \
+    bgl_named_params<PType, BOOST_PP_CAT(key, _t)> \
+    name(const PType& p) { \
+      typedef bgl_named_params<PType, BOOST_PP_CAT(key, _t)> Params; \
+      return Params(p); \
+    } \
+
+BOOST_BGL_DECLARE_NAMED_PARAMS
+
+#undef BOOST_BGL_ONE_PARAM_REF
+#undef BOOST_BGL_ONE_PARAM_CREF
+
+  // Duplicate
+  template <typename PType>
+  bgl_named_params<PType, vertex_color_t>
+  vertex_color_map(const PType& p) {return color_map(p);}
+
+  namespace detail {
+    struct unused_tag_type {};
+  }
+  typedef bgl_named_params<char, detail::unused_tag_type> no_named_parameters;
+
+  //===========================================================================
+  // Functions for extracting parameters from bgl_named_params
+
+  template <class Tag1, class Tag2, class T1, class Base>
+  inline
+  typename property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type
+  get_param(const bgl_named_params<T1,Tag1,Base>& p, Tag2 tag2)
+  {
+    enum { match = detail::same_property<Tag1,Tag2>::value };
+    typedef typename
+      property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type T2;
+    T2* t2 = 0;
+    typedef detail::property_value_dispatch<match> Dispatcher;
+    return Dispatcher::const_get_value(p, t2, tag2);
+  }
+
+
+  namespace detail {
+    // MSVC++ workaround
+    template <class Param>
+    struct choose_param_helper {
+      template <class Default> struct result { typedef Param type; };
+      template <typename Default>
+      static const Param& apply(const Param& p, const Default&) { return p; }
+    };
+    template <>
+    struct choose_param_helper<error_property_not_found> {
+      template <class Default> struct result { typedef Default type; };
+      template <typename Default>
+      static const Default& apply(const error_property_not_found&, const Default& d)
+        { return d; }
+    };
+  } // namespace detail
+
+  template <class P, class Default> 
+  const typename detail::choose_param_helper<P>::template result<Default>::type&
+  choose_param(const P& param, const Default& d) { 
+    return detail::choose_param_helper<P>::apply(param, d);
+  }
+
+  template <typename T>
+  inline bool is_default_param(const T&) { return false; }
+
+  inline bool is_default_param(const detail::error_property_not_found&)
+    { return true; }
+
+  namespace detail {
+
+    struct choose_parameter {
+      template <class P, class Graph, class Tag>
+      struct bind_ {
+        typedef const P& const_result_type;
+        typedef const P& result_type;
+        typedef P type;
+      };
+
+      template <class P, class Graph, class Tag>
+      static typename bind_<P, Graph, Tag>::const_result_type
+      const_apply(const P& p, const Graph&, Tag&) 
+      { return p; }
+
+      template <class P, class Graph, class Tag>
+      static typename bind_<P, Graph, Tag>::result_type
+      apply(const P& p, Graph&, Tag&) 
+      { return p; }
+    };
+
+    struct choose_default_param {
+      template <class P, class Graph, class Tag>
+      struct bind_ {
+        typedef typename property_map<Graph, Tag>::type 
+          result_type;
+        typedef typename property_map<Graph, Tag>::const_type 
+          const_result_type;
+        typedef typename property_map<Graph, Tag>::const_type 
+          type;
+      };
+
+      template <class P, class Graph, class Tag>
+      static typename bind_<P, Graph, Tag>::const_result_type
+      const_apply(const P&, const Graph& g, Tag tag) { 
+        return get(tag, g); 
+      }
+      template <class P, class Graph, class Tag>
+      static typename bind_<P, Graph, Tag>::result_type
+      apply(const P&, Graph& g, Tag tag) { 
+        return get(tag, g); 
+      }
+    };
+
+    template <class Param>
+    struct choose_property_map {
+      typedef choose_parameter type;
+    };
+    template <>
+    struct choose_property_map<detail::error_property_not_found> {
+      typedef choose_default_param type;
+    };
+
+    template <class Param, class Graph, class Tag>
+    struct choose_pmap_helper {
+      typedef typename choose_property_map<Param>::type Selector;
+      typedef typename Selector:: template bind_<Param, Graph, Tag> Bind;
+      typedef Bind type;
+      typedef typename Bind::result_type result_type;
+      typedef typename Bind::const_result_type const_result_type;
+      typedef typename Bind::type result;
+    };
+
+    // used in the max-flow algorithms
+    template <class Graph, class P, class T, class R>
+    struct edge_capacity_value
+    {
+      typedef bgl_named_params<P, T, R> Params;
+      typedef typename property_value< Params, edge_capacity_t>::type Param;
+      typedef typename detail::choose_pmap_helper<Param, Graph,
+        edge_capacity_t>::result CapacityEdgeMap;
+      typedef typename property_traits<CapacityEdgeMap>::value_type type;
+    };
+
+  } // namespace detail
+  
+
+  // Use this function instead of choose_param() when you want
+  // to avoid requiring get(tag, g) when it is not used. 
+  template <typename Param, typename Graph, typename PropertyTag>
+  typename
+    detail::choose_pmap_helper<Param,Graph,PropertyTag>::const_result_type
+  choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag)
+  { 
+    typedef typename 
+      detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
+    return Choice::const_apply(p, g, tag);
+  }
+
+  template <typename Param, typename Graph, typename PropertyTag>
+  typename detail::choose_pmap_helper<Param,Graph,PropertyTag>::result_type
+  choose_pmap(const Param& p, Graph& g, PropertyTag tag)
+  { 
+    typedef typename 
+      detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
+    return Choice::apply(p, g, tag);
+  }
+
+  // Declare all new tags
+  namespace graph {
+    namespace keywords {
+#define BOOST_BGL_ONE_PARAM_REF(name, key) BOOST_PARAMETER_NAME(name)
+#define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_PARAMETER_NAME(name)
+      BOOST_BGL_DECLARE_NAMED_PARAMS
+#undef BOOST_BGL_ONE_PARAM_REF
+#undef BOOST_BGL_ONE_PARAM_CREF
+    }
+  }
+
+  namespace detail {
+    template <typename Tag> struct convert_one_keyword {};
+#define BOOST_BGL_ONE_PARAM_REF(name, key) \
+    template <> \
+    struct convert_one_keyword<BOOST_PP_CAT(key, _t)> { \
+      typedef boost::graph::keywords::tag::name type; \
+    };
+#define BOOST_BGL_ONE_PARAM_CREF(name, key) BOOST_BGL_ONE_PARAM_REF(name, key)
+    BOOST_BGL_DECLARE_NAMED_PARAMS
+#undef BOOST_BGL_ONE_PARAM_REF
+#undef BOOST_BGL_ONE_PARAM_CREF
+
+    template <typename T>
+    struct convert_bgl_params_to_boost_parameter {
+      typedef typename convert_one_keyword<typename T::tag_type>::type new_kw;
+      typedef boost::parameter::aux::tagged_argument<new_kw, const typename T::value_type> tagged_arg_type;
+      typedef convert_bgl_params_to_boost_parameter<typename T::next_type> rest_conv;
+      typedef boost::parameter::aux::arg_list<tagged_arg_type, typename rest_conv::type> type;
+      static type conv(const T& x) {
+        return type(tagged_arg_type(x.m_value), rest_conv::conv(x));
+      }
+    };
+
+    template <typename P, typename R>
+    struct convert_bgl_params_to_boost_parameter<bgl_named_params<P, int, R> > {
+      typedef convert_bgl_params_to_boost_parameter<R> rest_conv;
+      typedef typename rest_conv::type type;
+      static type conv(const bgl_named_params<P, int, R>& x) {
+        return rest_conv::conv(x);
+      }
+    };
+
+    template <>
+    struct convert_bgl_params_to_boost_parameter<boost::no_property> {
+      typedef boost::parameter::aux::empty_arg_list type;
+      static type conv(const boost::no_property&) {return type();}
+    };
+
+    template <>
+    struct convert_bgl_params_to_boost_parameter<boost::no_named_parameters> {
+      typedef boost::parameter::aux::empty_arg_list type;
+      static type conv(const boost::no_property&) {return type();}
+    };
+
+    struct bgl_parameter_not_found_type {};
+
+    template <typename ArgPack, typename KeywordType>
+    struct parameter_exists : boost::mpl::not_<boost::is_same<typename boost::parameter::binding<ArgPack, KeywordType, bgl_parameter_not_found_type>::type, bgl_parameter_not_found_type> > {};
+  }
+
+#define BOOST_GRAPH_DECLARE_CONVERTED_PARAMETERS(old_type, old_var) \
+  typedef typename boost::detail::convert_bgl_params_to_boost_parameter<old_type>::type arg_pack_type; \
+  arg_pack_type arg_pack = boost::detail::convert_bgl_params_to_boost_parameter<old_type>::conv(old_var);
+
+  namespace detail {
+
+    template <typename ArgType, typename Prop, typename Graph, bool Exists>
+    struct override_const_property_t {
+      typedef ArgType result_type;
+      result_type operator()(const Graph& g, const typename boost::add_reference<ArgType>::type a) const {return a;}
+    };
+
+    template <typename ArgType, typename Prop, typename Graph>
+    struct override_const_property_t<ArgType, Prop, Graph, false> {
+      typedef typename boost::property_map<Graph, Prop>::const_type result_type;
+      result_type operator()(const Graph& g, const ArgType& a) const {return get(Prop(), g);}
+    };
+
+    template <typename ArgPack, typename Tag, typename Prop, typename Graph>
+    typename override_const_property_t<
+               typename boost::parameter::value_type<ArgPack, Tag, int>::type,
+               Prop,
+               Graph,
+               boost::detail::parameter_exists<ArgPack, Tag>::value
+             >::result_type
+    override_const_property(const ArgPack& ap, const boost::parameter::keyword<Tag>& t, const Graph& g, Prop prop) {
+    return override_const_property_t<
+             typename boost::parameter::value_type<ArgPack, Tag, int>::type,
+             Prop,
+             Graph,
+             boost::detail::parameter_exists<ArgPack, Tag>::value
+           >()(g, ap[t | 0]);
+    }
+
+    template <typename ArgType, typename Prop, typename Graph, bool Exists>
+    struct override_property_t {
+      typedef ArgType result_type;
+      result_type operator()(const Graph& g, const typename boost::add_reference<ArgType>::type a) const {return a;}
+    };
+
+    template <typename ArgType, typename Prop, typename Graph>
+    struct override_property_t<ArgType, Prop, Graph, false> {
+      typedef typename boost::property_map<Graph, Prop>::type result_type;
+      result_type operator()(const Graph& g, const ArgType& a) const {return get(Prop(), g);}
+    };
+
+    template <typename ArgPack, typename Tag, typename Prop, typename Graph>
+    typename override_property_t<
+               typename boost::parameter::value_type<ArgPack, Tag, int>::type,
+               Prop,
+               Graph,
+               boost::detail::parameter_exists<ArgPack, Tag>::value
+             >::result_type
+    override_property(const ArgPack& ap, const boost::parameter::keyword<Tag>& t, const Graph& g, Prop prop) {
+    return override_property_t<
+             typename boost::parameter::value_type<ArgPack, Tag, int>::type,
+             Prop,
+             Graph,
+             boost::detail::parameter_exists<ArgPack, Tag>::value
+           >()(g, ap[t | 0]);
+    }
+
+  }
+
+  namespace detail {
+
+    template <bool Exists, typename Graph, typename ArgPack, typename Value, typename PM>
+    struct color_map_maker_helper {
+      typedef PM map_type;
+      static PM make_map(const Graph&, Value, const PM& pm, const ArgPack&) {
+        return pm;
+      }
+    };
+
+    template <typename Graph, typename ArgPack, typename Value, typename PM>
+    struct color_map_maker_helper<false, Graph, ArgPack, Value, PM> {
+      typedef typename boost::remove_const<
+        typename override_const_property_t<
+          typename boost::parameter::value_type<
+            ArgPack, boost::graph::keywords::tag::vertex_index_map, int>::type,
+          boost::vertex_index_t,
+          Graph,
+          boost::detail::parameter_exists<
+            ArgPack, boost::graph::keywords::tag::vertex_index_map>::value
+        >::result_type>::type vi_map_type;
+      typedef
+        boost::shared_array_property_map<Value, vi_map_type>
+        map_type;
+      static map_type make_map(const Graph& g,
+                               Value v,
+                               const PM&,
+                               const ArgPack& ap) {
+        return make_shared_array_property_map(
+                 num_vertices(g), 
+                 v,
+                 override_const_property(
+                   ap,
+                   boost::graph::keywords::_vertex_index_map,
+                   g, vertex_index));
+      }
+    };
+
+    template <typename Graph, typename ArgPack>
+    struct color_map_maker {
+      BOOST_STATIC_CONSTANT(
+        bool,
+        has_color_map =
+          (parameter_exists<ArgPack, boost::graph::keywords::tag::color_map>
+           ::value));
+      typedef color_map_maker_helper<has_color_map, Graph, ArgPack, default_color_type,
+                                     typename boost::remove_const<
+                                       typename boost::parameter::value_type<
+                                                  ArgPack,
+                                                  boost::graph::keywords::tag::color_map,
+                                                  int
+                                                >::type
+                                              >::type> helper;
+      typedef typename helper::map_type map_type;
+      static map_type make_map(const Graph& g, const ArgPack& ap) {
+        return helper::make_map(g, white_color, ap[boost::graph::keywords::_color_map | 0], ap);
+      }
+    };
+
+  }
+
+} // namespace boost
+
+#undef BOOST_BGL_DECLARE_NAMED_PARAMS
+
+#endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/named_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/named_graph.hpp
new file mode 100644 (file)
index 0000000..dda608d
--- /dev/null
@@ -0,0 +1,537 @@
+// Copyright (C) 2007 Douglas Gregor
+
+// 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)
+
+// Provides support for named vertices in graphs, allowing one to more
+// easily associate unique external names (URLs, city names, employee
+// ID numbers, etc.) with the vertices of a graph.
+#ifndef BOOST_GRAPH_NAMED_GRAPH_HPP
+#define BOOST_GRAPH_NAMED_GRAPH_HPP
+
+#include <boost/config.hpp>
+#include <boost/type_traits/remove_cv.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#include <boost/multi_index/member.hpp>
+#include <boost/optional.hpp>
+#include <boost/throw_exception.hpp>
+#include <stdexcept> // for std::runtime_error
+
+namespace boost { namespace graph {
+
+/*******************************************************************
+ * User-customized traits                                          *
+ *******************************************************************/
+
+/**
+ * @brief Trait used to extract the internal vertex name from a vertex
+ * property.
+ *
+ * To enable the use of internal vertex names in a graph type,
+ * specialize the @c internal_vertex_name trait for your graph
+ * property (e.g., @c a City class, which stores information about the
+ * vertices in a road map).
+ */
+template<typename VertexProperty>
+struct internal_vertex_name
+{
+  /**
+   *  The @c type field provides a function object that extracts a key
+   *  from the @c VertexProperty. The function object type must have a
+   *  nested @c result_type that provides the type of the key. For
+   *  more information, see the @c KeyExtractor concept in the
+   *  Boost.MultiIndex documentation: @c type must either be @c void
+   *  (if @c VertexProperty does not have an internal vertex name) or
+   *  a model of @c KeyExtractor.
+   */
+  typedef void type;
+};
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+/**
+ * Extract the internal vertex name from a @c property structure by
+ * looking at its base.
+ */
+template<typename Tag, typename T, typename Base>
+struct internal_vertex_name<property<Tag, T, Base> >
+  : internal_vertex_name<Base> { };
+#endif
+
+/**
+ * Construct an instance of @c VertexProperty directly from its
+ * name. This function object should be used within the @c
+ * internal_vertex_constructor trait.
+ */
+template<typename VertexProperty>
+struct vertex_from_name
+{
+private:
+  typedef typename internal_vertex_name<VertexProperty>::type extract_name_type;
+
+  typedef typename remove_cv<
+            typename remove_reference<
+              typename extract_name_type::result_type>::type>::type
+    vertex_name_type;
+
+public:
+  typedef vertex_name_type argument_type;
+  typedef VertexProperty result_type;
+
+  VertexProperty operator()(const vertex_name_type& name)
+  {
+    return VertexProperty(name);
+  }
+};
+
+/**
+ * Throw an exception whenever one tries to construct a @c
+ * VertexProperty instance from its name.
+ */
+template<typename VertexProperty>
+struct cannot_add_vertex
+{
+private:
+  typedef typename internal_vertex_name<VertexProperty>::type extract_name_type;
+
+  typedef typename remove_cv<
+            typename remove_reference<
+              typename extract_name_type::result_type>::type>::type
+    vertex_name_type;
+
+public:
+  typedef vertex_name_type argument_type;
+  typedef VertexProperty result_type;
+
+  VertexProperty operator()(const vertex_name_type& name)
+  {
+      boost::throw_exception(std::runtime_error("add_vertex: "
+                                                "unable to create a vertex from its name"));
+  }
+};
+
+/**
+ * @brief Trait used to construct an instance of a @c VertexProperty,
+ * which is a class type that stores the properties associated with a
+ * vertex in a graph, from just the name of that vertex property. This
+ * operation is used when an operation is required to map from a
+ * vertex name to a vertex descriptor (e.g., to add an edge outgoing
+ * from that vertex), but no vertex by the name exists. The function
+ * object provided by this trait will be used to add new vertices
+ * based only on their names. Since this cannot be done for arbitrary
+ * types, the default behavior is to throw an exception when this
+ * routine is called, which requires that all named vertices be added
+ * before adding any edges by name.
+ */
+template<typename VertexProperty>
+struct internal_vertex_constructor
+{
+  /**
+   * The @c type field provides a function object that constructs a
+   * new instance of @c VertexProperty from the name of the vertex (as
+   * determined by @c internal_vertex_name). The function object shall
+   * accept a vertex name and return a @c VertexProperty. Predefined
+   * options include:
+   *
+   *   @c vertex_from_name<VertexProperty>: construct an instance of
+   *   @c VertexProperty directly from the name.
+   *
+   *   @c cannot_add_vertex<VertexProperty>: the default value, which
+   *   throws an @c std::runtime_error if one attempts to add a vertex
+   *   given just the name.
+   */
+  typedef cannot_add_vertex<VertexProperty> type;
+};
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+/**
+ * Extract the internal vertex constructor from a @c property structure by
+ * looking at its base.
+ */
+template<typename Tag, typename T, typename Base>
+struct internal_vertex_constructor<property<Tag, T, Base> >
+  : internal_vertex_constructor<Base> { };
+#endif
+
+/*******************************************************************
+ * Named graph-specific metafunctions                              *
+ *******************************************************************/
+namespace detail {
+  /** @internal
+   * Extracts the type of a bundled vertex property from a vertex
+   * property. The primary template matches when we have hit the end
+   * of the @c property<> list.
+   */
+  template<typename VertexProperty>
+  struct extract_bundled_vertex
+  {
+    typedef VertexProperty type;
+  };
+
+  /** @internal
+   * Recursively extract the bundled vertex property from a vertex
+   * property.
+   */
+  template<typename Tag, typename T, typename Base>
+  struct extract_bundled_vertex<property<Tag, T, Base> >
+    : extract_bundled_vertex<Base>
+  { };
+
+  /**
+   * We have found the bundled vertex property type, marked with
+   * vertex_bundle_t.
+   */
+  template<typename T, typename Base>
+  struct extract_bundled_vertex<property<vertex_bundle_t, T, Base> >
+  {
+    typedef T type;
+  };
+
+  /**
+   * Translate @c no_property into @c error_property_not_found when we
+   * have failed to extract a bundled vertex property type.
+   */
+  template<>
+  struct extract_bundled_vertex<no_property>
+  {
+    typedef boost::detail::error_property_not_found type;
+  };
+}
+
+/*******************************************************************
+ * Named graph mixin                                               *
+ *******************************************************************/
+
+/**
+ * named_graph is a mixin that provides names for the vertices of a
+ * graph, including a mapping from names to vertices. Graph types that
+ * may or may not be have vertex names (depending on the properties
+ * supplied by the user) should use maybe_named_graph.
+ *
+ * Template parameters:
+ *
+ *   Graph: the graph type that derives from named_graph
+ *
+ *   Vertex: the type of a vertex descriptor in Graph. Note: we cannot
+ *   use graph_traits here, because the Graph is not yet defined.
+ *
+ *   VertexProperty: the type stored with each vertex in the Graph.
+ */
+template<typename Graph, typename Vertex, typename VertexProperty>
+class named_graph
+{
+public:
+  /// The type of the function object that extracts names from vertex
+  /// properties.
+  typedef typename internal_vertex_name<VertexProperty>::type extract_name_type;
+  /// The type of the "bundled" property, from which the name can be
+  /// extracted.
+  typedef typename detail::extract_bundled_vertex<VertexProperty>::type
+    bundled_vertex_property_type;
+
+  /// The type of the function object that generates vertex properties
+  /// from names, for the implicit addition of vertices.
+  typedef typename internal_vertex_constructor<VertexProperty>::type
+    vertex_constructor_type;
+
+  /// The type used to name vertices in the graph
+  typedef typename remove_cv<
+            typename remove_reference<
+              typename extract_name_type::result_type>::type>::type
+    vertex_name_type;
+
+  /// The type of vertex descriptors in the graph
+  typedef Vertex vertex_descriptor;
+
+private:
+  /// Key extractor for use with the multi_index_container
+  struct extract_name_from_vertex
+  {
+    typedef vertex_name_type result_type;
+
+    extract_name_from_vertex(Graph& graph, const extract_name_type& extract)
+      : graph(graph), extract(extract) { }
+
+    const result_type& operator()(Vertex vertex) const
+    {
+      return extract(graph[vertex]);
+    }
+
+    Graph& graph;
+    extract_name_type extract;
+  };
+
+public:
+  /// The type that maps names to vertices
+  typedef multi_index::multi_index_container<
+            Vertex,
+            multi_index::indexed_by<
+              multi_index::hashed_unique<multi_index::tag<vertex_name_t>,
+                                         extract_name_from_vertex> >
+          > named_vertices_type;
+
+  /// The set of vertices, indexed by name
+  typedef typename named_vertices_type::template index<vertex_name_t>::type
+    vertices_by_name_type;
+
+  /// Construct an instance of the named graph mixin, using the given
+  /// function object to extract a name from the bundled property
+  /// associated with a vertex.
+  named_graph(const extract_name_type& extract = extract_name_type(),
+              const vertex_constructor_type& vertex_constructor
+                = vertex_constructor_type());
+
+  /// Notify the named_graph that we have added the given vertex. The
+  /// name of the vertex will be added to the mapping.
+  void added_vertex(Vertex vertex);
+
+  /// Notify the named_graph that we are removing the given
+  /// vertex. The name of the vertex will be removed from the mapping.
+  void removing_vertex(Vertex vertex);
+
+  /// Notify the named_graph that we are clearing the graph.
+  /// This will clear out all of the name->vertex mappings
+  void clearing_graph();
+
+  /// Retrieve the derived instance
+  Graph&       derived()       { return static_cast<Graph&>(*this); }
+  const Graph& derived() const { return static_cast<const Graph&>(*this); }
+
+  /// Extract the name from a vertex property instance
+  typename extract_name_type::result_type
+  extract_name(const bundled_vertex_property_type& property);
+
+  /// Search for a vertex that has the given property (based on its
+  /// name)
+  optional<vertex_descriptor>
+  vertex_by_property(const bundled_vertex_property_type& property);
+
+  /// Mapping from names to vertices
+  named_vertices_type named_vertices;
+
+  /// Constructs a vertex from the name of that vertex
+  vertex_constructor_type vertex_constructor;
+};
+
+/// Helper macro containing the template parameters of named_graph
+#define BGL_NAMED_GRAPH_PARAMS \
+  typename Graph, typename Vertex, typename VertexProperty
+/// Helper macro containing the named_graph<...> instantiation
+#define BGL_NAMED_GRAPH \
+  named_graph<Graph, Vertex, VertexProperty>
+
+template<BGL_NAMED_GRAPH_PARAMS>
+BGL_NAMED_GRAPH::named_graph(const extract_name_type& extract,
+                             const vertex_constructor_type& vertex_constructor)
+  : named_vertices(
+      typename named_vertices_type::ctor_args_list(
+        boost::make_tuple(
+          boost::make_tuple(
+            0, // initial number of buckets
+            extract_name_from_vertex(derived(), extract),
+            boost::hash<vertex_name_type>(),
+            std::equal_to<vertex_name_type>())))),
+    vertex_constructor(vertex_constructor)
+{
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+inline void BGL_NAMED_GRAPH::added_vertex(Vertex vertex)
+{
+  named_vertices.insert(vertex);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+inline void BGL_NAMED_GRAPH::removing_vertex(Vertex vertex)
+{
+  named_vertices.erase(vertex);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+inline void BGL_NAMED_GRAPH::clearing_graph()
+{
+  named_vertices.clear();
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+typename BGL_NAMED_GRAPH::extract_name_type::result_type
+BGL_NAMED_GRAPH::extract_name(const bundled_vertex_property_type& property)
+{
+  return named_vertices.key_extractor().extract(property);
+}
+
+template<BGL_NAMED_GRAPH_PARAMS>
+optional<typename BGL_NAMED_GRAPH::vertex_descriptor>
+BGL_NAMED_GRAPH::
+vertex_by_property(const bundled_vertex_property_type& property)
+{
+  return find_vertex(extract_name(property), *this);
+}
+
+/// Retrieve the vertex associated with the given name
+template<BGL_NAMED_GRAPH_PARAMS>
+optional<Vertex>
+find_vertex(typename BGL_NAMED_GRAPH::vertex_name_type const& name,
+            const BGL_NAMED_GRAPH& g)
+{
+  typedef typename BGL_NAMED_GRAPH::vertices_by_name_type
+    vertices_by_name_type;
+
+  // Retrieve the set of vertices indexed by name
+  vertices_by_name_type const& vertices_by_name
+    = g.named_vertices.template get<vertex_name_t>();
+
+  /// Look for a vertex with the given name
+  typename vertices_by_name_type::const_iterator iter
+    = vertices_by_name.find(name);
+
+  if (iter == vertices_by_name.end())
+    return optional<Vertex>(); // vertex not found
+  else
+    return *iter;
+}
+
+/// Retrieve the vertex associated with the given name, or add a new
+/// vertex with that name if no such vertex is available.
+template<BGL_NAMED_GRAPH_PARAMS>
+Vertex
+add_vertex(typename BGL_NAMED_GRAPH::vertex_name_type const& name,
+           BGL_NAMED_GRAPH& g)
+{
+  if (optional<Vertex> vertex = find_vertex(name, g))
+    /// We found the vertex, so return it
+    return *vertex;
+  else
+    /// There is no vertex with the given name, so create one
+    return add_vertex(g.vertex_constructor(name), g.derived());
+}
+
+/// Add an edge using vertex names to refer to the vertices
+template<BGL_NAMED_GRAPH_PARAMS>
+std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         BGL_NAMED_GRAPH& g)
+{
+  return add_edge(add_vertex(u_name, g.derived()),
+                  add_vertex(v_name, g.derived()),
+                  g.derived());
+}
+
+/// Add an edge using vertex descriptors or names to refer to the vertices
+template<BGL_NAMED_GRAPH_PARAMS>
+std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
+add_edge(typename BGL_NAMED_GRAPH::vertex_descriptor const& u,
+         typename BGL_NAMED_GRAPH::vertex_name_type const& v_name,
+         BGL_NAMED_GRAPH& g)
+{
+  return add_edge(u,
+                  add_vertex(v_name, g.derived()),
+                  g.derived());
+}
+
+/// Add an edge using vertex descriptors or names to refer to the vertices
+template<BGL_NAMED_GRAPH_PARAMS>
+std::pair<typename graph_traits<Graph>::edge_descriptor, bool>
+add_edge(typename BGL_NAMED_GRAPH::vertex_name_type const& u_name,
+         typename BGL_NAMED_GRAPH::vertex_descriptor const& v,
+         BGL_NAMED_GRAPH& g)
+{
+  return add_edge(add_vertex(u_name, g.derived()),
+                  v,
+                  g.derived());
+}
+
+#undef BGL_NAMED_GRAPH
+#undef BGL_NAMED_GRAPH_PARAMS
+
+/*******************************************************************
+ * Maybe named graph mixin                                         *
+ *******************************************************************/
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+/**
+ * A graph mixin that can provide a mapping from names to vertices,
+ * and use that mapping to simplify creation and manipulation of
+ * graphs.
+ */
+template<typename Graph, typename Vertex, typename VertexProperty,
+         typename ExtractName
+           = typename internal_vertex_name<VertexProperty>::type>
+struct maybe_named_graph : public named_graph<Graph, Vertex, VertexProperty>
+{
+};
+
+/**
+ * A graph mixin that can provide a mapping from names to vertices,
+ * and use that mapping to simplify creation and manipulation of
+ * graphs. This partial specialization turns off this functionality
+ * when the @c VertexProperty does not have an internal vertex name.
+ */
+template<typename Graph, typename Vertex, typename VertexProperty>
+struct maybe_named_graph<Graph, Vertex, VertexProperty, void>
+{
+  /// The type of the "bundled" property, from which the name can be
+  /// extracted.
+  typedef typename detail::extract_bundled_vertex<VertexProperty>::type
+    bundled_vertex_property_type;
+
+  /// Notify the named_graph that we have added the given vertex. This
+  /// is a no-op.
+  void added_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are removing the given
+  /// vertex. This is a no-op.
+  void removing_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are clearing the graph. This is a
+  /// no-op.
+  void clearing_graph() { }
+
+  /// Search for a vertex that has the given property (based on its
+  /// name). This always returns an empty optional<>
+  optional<Vertex>
+  vertex_by_property(const bundled_vertex_property_type&)
+  {
+    return optional<Vertex>();
+  }
+};
+#else
+template<typename Graph, typename Vertex, typename VertexProperty,
+         typename ExtractName
+           = typename internal_vertex_name<VertexProperty>::type>
+struct maybe_named_graph
+{
+  /// The type of the "bundled" property, from which the name can be
+  /// extracted.
+  typedef typename detail::extract_bundled_vertex<VertexProperty>::type
+    bundled_vertex_property_type;
+
+  /// Notify the named_graph that we have added the given vertex. This
+  /// is a no-op.
+  void added_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are removing the given
+  /// vertex. This is a no-op.
+  void removing_vertex(Vertex) { }
+
+  /// Notify the named_graph that we are clearing the graph. This is a
+  /// no-op.
+  void clearing_graph() { }
+
+  /// Search for a vertex that has the given property (based on its
+  /// name). This always returns an empty optional<>
+  template<typename Property>
+  optional<Vertex>
+  vertex_by_property(const bundled_vertex_property_type&)
+  {
+    return optional<Vertex>();
+  }
+};
+#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_NAMED_GRAPH_HPP
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/neighbor_bfs.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/neighbor_bfs.hpp
index 1c7b9782ac56ff816fef992a281f97f92110fc0e..01cfe49b7c8db318292373046e7f1e8d843f6207 100644 (file)
@@ -17,6 +17,7 @@
   (for directed graphs only. use normal BFS for undirected graphs)
 */
 #include <boost/config.hpp>
+#include <boost/ref.hpp>
 #include <vector>
 #include <boost/pending/queue.hpp>
 #include <boost/graph/graph_traits.hpp>
@@ -211,7 +212,6 @@ namespace boost {
       typedef typename Traits::vertex_descriptor Vertex;
       typedef boost::queue<Vertex> queue_t;
       queue_t Q;
-      detail::wrap_ref<queue_t> Qref(Q);
       // Initialization
       typedef typename property_traits<ColorMap>::value_type ColorValue;
       typedef color_traits<ColorValue> Color;
@@ -222,7 +222,7 @@ namespace boost {
       }
       neighbor_bfs_impl
         (g, s, 
-         choose_param(get_param(params, buffer_param_t()), Qref).ref,
+         choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
          vis, color);
     }
 
@@ -306,11 +306,10 @@ namespace boost {
     // Buffer default
     typedef boost::queue<typename Traits::vertex_descriptor> queue_t;
     queue_t Q;
-    detail::wrap_ref<queue_t> Qref(Q);
 
     detail::neighbor_bfs_impl
       (g, s,
-       choose_param(get_param(params, buffer_param_t()), Qref).ref,
+       choose_param(get_param(params, buffer_param_t()), boost::ref(Q)).get(),
        choose_param(get_param(params, graph_visitor),
                     make_neighbor_bfs_visitor(null_visitor())),
        choose_pmap(get_param(params, vertex_color), g, vertex_color)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/numeric_values.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/numeric_values.hpp
new file mode 100644 (file)
index 0000000..ad01837
--- /dev/null
@@ -0,0 +1,52 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_NUMERIC_VALUES_HPP
+#define BOOST_GRAPH_NUMERIC_VALUES_HPP
+
+#include <limits>
+
+namespace boost
+{
+
+#define BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(type) \
+    template <> struct numeric_values<type> { \
+        typedef type value_type; \
+        static type zero() { return 0.0; } \
+        static type infinity() { return std::numeric_limits<type>::infinity(); } \
+    };
+
+    /**
+     * This generic type reports various numeric values for some type. In the
+     * general case, numeric values simply treat their maximum value as infinity
+     * and the default-constructed value as 0.
+     *
+     * Specializations of this template can redefine the notions of zero and
+     * infinity for various types. For example, the class is specialized for
+     * floating point types to use the built in notion of infinity.
+     */
+    template <typename T>
+    struct numeric_values
+    {
+        typedef T value_type;
+
+        static T zero()
+        { return T(); }
+
+        static T infinity()
+        { return (std::numeric_limits<T>::max)(); }
+    };
+
+    // Specializations for floating point types refer to 0.0 and their infinity
+    // value defined by numeric_limits.
+    BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(float)
+    BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(double)
+    BOOST_GRAPH_SPECIALIZE_NUMERIC_FLOAT(long double)
+
+#undef BOOST_GRAPH_SPECIALIZE_NUMERIC_VALUE
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/overloading.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/overloading.hpp
new file mode 100644 (file)
index 0000000..a952e22
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+//
+// This file contains helps that enable concept-based overloading
+// within the Boost Graph Library.
+//
+#ifndef BOOST_GRAPH_OVERLOADING_HPP
+#define BOOST_GRAPH_OVERLOADING_HPP
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/utility/enable_if.hpp>
+
+namespace boost {  namespace graph { namespace detail {
+
+struct no_parameter {};
+
+} } } // end namespace boost::graph::detail
+
+#ifndef BOOST_NO_SFINAE
+
+#define BOOST_GRAPH_ENABLE_IF_MODELS(Graph, Tag, Type)               \
+  typename enable_if_c<(is_base_and_derived<                         \
+                          Tag,                                       \
+                          typename graph_traits<Graph>::traversal_category>::value), \
+                       Type>::type
+
+#define BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, Tag)                   \
+  , BOOST_GRAPH_ENABLE_IF_MODELS(Graph, Tag,                            \
+                                 ::boost::graph::detail::no_parameter)  \
+    = ::boost::graph::detail::no_parameter()
+
+#else
+
+#define BOOST_GRAPH_ENABLE_IF_MODELS(Graph, Tag, Type) Type
+#define BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, Tag)
+
+#endif // no SFINAE support
+
+#endif // BOOST_GRAPH_OVERLOADING_HPP
similarity index 91%
rename from deal.II/contrib/boost/include/boost/graph/page_rank.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/page_rank.hpp
index 8a4e14143b07ae0b953e485706ab545e51a66823..9532260f0b828eea7b2a710749610aad6915abc3 100644 (file)
 #ifndef BOOST_GRAPH_PAGE_RANK_HPP
 #define BOOST_GRAPH_PAGE_RANK_HPP
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/graph/iteration_macros.hpp>
+#include <boost/graph/overloading.hpp>
 #include <vector>
 
 namespace boost { namespace graph {
@@ -72,7 +73,8 @@ void
 page_rank(const Graph& g, RankMap rank_map, Done done, 
           typename property_traits<RankMap>::value_type damping,
           typename graph_traits<Graph>::vertices_size_type n,
-          RankMap2 rank_map2)
+          RankMap2 rank_map2
+          BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, vertex_list_graph_tag))
 {
   typedef typename property_traits<RankMap>::value_type rank_type;
 
@@ -131,7 +133,9 @@ page_rank(const Graph& g, RankMap rank_map)
 // applies when we have a bidirectional graph.
 template<typename MutableGraph>
 void
-remove_dangling_links(MutableGraph& g)
+remove_dangling_links(MutableGraph& g
+                      BOOST_GRAPH_ENABLE_IF_MODELS_PARM(MutableGraph, 
+                                                        vertex_list_graph_tag))
 {
   typename graph_traits<MutableGraph>::vertices_size_type old_n;
   do {
@@ -150,4 +154,8 @@ remove_dangling_links(MutableGraph& g)
 
 } } // end namespace boost::graph
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/page_rank.hpp>
+#endif
+
 #endif // BOOST_GRAPH_PAGE_RANK_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/algorithm.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/algorithm.hpp
new file mode 100644 (file)
index 0000000..eed9bf8
--- /dev/null
@@ -0,0 +1,84 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_PARALLEL_ALGORITHM_HPP
+#define BOOST_PARALLEL_ALGORITHM_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/optional.hpp>
+#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT
+#include <vector>
+#include <functional>
+
+namespace boost { namespace parallel {
+  template<typename BinaryOp>
+  struct is_commutative
+  {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+  };
+
+  template<typename T>
+  struct minimum : std::binary_function<T, T, T>
+  {
+    const T& operator()(const T& x, const T& y) const { return x < y? x : y; }
+  };
+
+  template<typename T>
+  struct maximum : std::binary_function<T, T, T>
+  {
+    const T& operator()(const T& x, const T& y) const { return x < y? y : x; }
+  };
+
+  template<typename T>
+  struct sum : std::binary_function<T, T, T>
+  {
+    const T operator()(const T& x, const T& y) const { return x + y; }
+  };
+
+  template<typename ProcessGroup, typename InputIterator,
+           typename OutputIterator, typename BinaryOperation>
+  OutputIterator
+  reduce(ProcessGroup pg, typename ProcessGroup::process_id_type root,
+         InputIterator first, InputIterator last, OutputIterator out,
+         BinaryOperation bin_op);
+
+  template<typename ProcessGroup, typename T, typename BinaryOperation>
+  inline T
+  all_reduce(ProcessGroup pg, const T& value, BinaryOperation bin_op)
+  {
+    T result;
+    all_reduce(pg,
+               const_cast<T*>(&value), const_cast<T*>(&value+1),
+               &result, bin_op);
+    return result;
+  }
+
+  template<typename ProcessGroup, typename T, typename BinaryOperation>
+  inline T
+  scan(ProcessGroup pg, const T& value, BinaryOperation bin_op)
+  {
+    T result;
+    scan(pg,
+         const_cast<T*>(&value), const_cast<T*>(&value+1),
+         &result, bin_op);
+    return result;
+  }
+
+
+  template<typename ProcessGroup, typename InputIterator, typename T>
+  void
+  all_gather(ProcessGroup pg, InputIterator first, InputIterator last,
+             std::vector<T>& out);
+} } // end namespace boost::parallel
+
+#include <boost/graph/parallel/detail/inplace_all_to_all.hpp>
+
+#endif // BOOST_PARALLEL_ALGORITHM_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/basic_reduce.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/basic_reduce.hpp
new file mode 100644 (file)
index 0000000..ee23b3a
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_PARALLEL_BASIC_REDUCE_HPP
+#define BOOST_PARALLEL_BASIC_REDUCE_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { namespace parallel {
+
+/** Reduction operation used to reconcile differences between local
+ * and remote values for a particular key in a property map.  The
+ * type @c T is typically the @c value_type of the property
+ * map. This basic reduction returns a default-constructed @c T as
+ * the default value and always resolves to the remote value.
+ */
+template<typename T>
+struct basic_reduce
+{
+  BOOST_STATIC_CONSTANT(bool, non_default_resolver = false);
+
+  /// Returns a default-constructed T object
+  template<typename Key>
+  T operator()(const Key&) const { return T(); }
+  
+  /// Returns the remote value
+  template<typename Key>
+  const T& operator()(const Key&, const T&, const T& remote) const 
+  { return remote; }
+};
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_PARALLEL_BASIC_REDUCE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/container_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/container_traits.hpp
new file mode 100644 (file)
index 0000000..f4dd0e9
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+//
+// This file contains traits that describe 
+//
+#ifndef BOOST_GRAPH_PARALLEL_CONTAINER_TRAITS_HPP
+#define BOOST_GRAPH_PARALLEL_CONTAINER_TRAITS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { namespace graph { namespace parallel {
+
+template<typename T>
+struct process_group_type
+{
+  typedef typename T::process_group_type type;
+};
+
+template<typename T>
+inline typename process_group_type<T>::type
+process_group(const T& x)
+{ return x.process_group(); }
+
+// Helper function that algorithms should use to get the process group
+// out of a container.
+template<typename Container>
+inline typename process_group_type<Container>::type
+process_group_adl(const Container& container)
+{
+  return process_group(container);
+}
+
+
+} } } // end namespace boost::graph::parallel 
+
+#endif // BOOST_GRAPH_PARALLEL_CONTAINER_TRAITS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/inplace_all_to_all.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/inplace_all_to_all.hpp
new file mode 100644 (file)
index 0000000..a403ad7
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_PARALLEL_INPLACE_ALL_TO_ALL_HPP
+#define BOOST_GRAPH_PARALLEL_INPLACE_ALL_TO_ALL_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+//
+// Implements the inplace all-to-all communication algorithm.
+//
+#include <vector>
+#include <iterator>
+
+namespace boost { namespace parallel { 
+
+template<typename ProcessGroup, typename T>
+// where {LinearProcessGroup<ProcessGroup>, MessagingProcessGroup<ProcessGroup>}
+void 
+inplace_all_to_all(ProcessGroup pg, 
+                   const std::vector<std::vector<T> >& outgoing,
+                   std::vector<std::vector<T> >& incoming)
+{
+  typedef typename std::vector<T>::size_type size_type;
+
+  typedef typename ProcessGroup::process_size_type process_size_type;
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+  process_size_type p = num_processes(pg);
+
+  // Make sure there are no straggling messages
+  synchronize(pg);
+
+  // Send along the count (always) and the data (if count > 0)
+  for (process_id_type dest = 0; dest < p; ++dest) {
+    if (dest != process_id(pg)) {
+      send(pg, dest, 0, outgoing[dest].size());
+      if (!outgoing[dest].empty())
+        send(pg, dest, 1, &outgoing[dest].front(), outgoing[dest].size());
+    }
+  }
+
+  // Make sure all of the data gets transferred
+  synchronize(pg);
+
+  // Receive the sizes and data
+  for (process_id_type source = 0; source < p; ++source) {
+    if (source != process_id(pg)) {
+      size_type size;
+      receive(pg, source, 0, size);
+      incoming[source].resize(size);
+      if (size > 0)
+        receive(pg, source, 1, &incoming[source].front(), size);
+    } else if (&incoming != &outgoing) {
+      incoming[source] = outgoing[source];
+    }
+  }
+}
+
+template<typename ProcessGroup, typename T>
+// where {LinearProcessGroup<ProcessGroup>, MessagingProcessGroup<ProcessGroup>}
+void 
+inplace_all_to_all(ProcessGroup pg, std::vector<std::vector<T> >& data)
+{
+  inplace_all_to_all(pg, data, data);
+}
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_GRAPH_PARALLEL_INPLACE_ALL_TO_ALL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/property_holders.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/property_holders.hpp
new file mode 100644 (file)
index 0000000..bbdbeba
--- /dev/null
@@ -0,0 +1,152 @@
+// Copyright (C) 2007 Douglas Gregor and Matthias Troyer
+//
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//
+// This file contains helper data structures for use in transmitting
+// properties. The basic idea is to optimize away any storage for the
+// properties when no properties are specified.
+#ifndef BOOST_PARALLEL_DETAIL_PROPERTY_HOLDERS_HPP
+#define BOOST_PARALLEL_DETAIL_PROPERTY_HOLDERS_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/mpi/datatype.hpp>
+#include <boost/property_map/property_map.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+
+namespace boost { namespace detail { namespace parallel {
+
+/**
+ * This structure contains an instance of @c Property, unless @c
+ * Property is a placeholder for "no property". Always access the
+ * property through @c get_property. Typically used as a base class.
+ */
+template<typename Property>
+struct maybe_store_property
+{
+  maybe_store_property() {}
+  maybe_store_property(const Property& p) : p(p) {}
+
+  Property&       get_property()       { return p; }
+  const Property& get_property() const { return p; }
+
+private:
+  Property p;
+
+  friend class boost::serialization::access;
+
+  template<typename Archiver>
+  void serialize(Archiver& ar, const unsigned int /*version*/)
+  {
+    ar & p;
+  }
+};
+
+template<>
+struct maybe_store_property<no_property>
+{
+  maybe_store_property() {}
+  maybe_store_property(no_property) {}
+
+  no_property get_property() const { return no_property(); }
+
+private:
+  friend class boost::serialization::access;
+
+  template<typename Archiver>
+  void serialize(Archiver&, const unsigned int /*version*/) { }
+};
+
+/**
+ * This structure is a simple pair that also contains a property.
+ */
+template<typename T, typename U, typename Property>
+class pair_with_property
+  : public boost::parallel::detail::untracked_pair<T, U>
+  , public maybe_store_property<Property>
+{
+public:
+  typedef boost::parallel::detail::untracked_pair<T, U>           pair_base;
+  typedef maybe_store_property<Property> property_base;
+
+  pair_with_property() { }
+
+  pair_with_property(const T& t, const U& u, const Property& property)
+    : pair_base(t, u), property_base(property) { }
+
+private:
+  friend class boost::serialization::access;
+
+  template<typename Archiver>
+  void serialize(Archiver& ar, const unsigned int /*version*/) 
+  { 
+    ar & boost::serialization::base_object<pair_base>(*this)
+       & boost::serialization::base_object<property_base>(*this);
+  }
+};
+
+template<typename T, typename U, typename Property>
+inline pair_with_property<T, U, Property>
+make_pair_with_property(const T& t, const U& u, const Property& property)
+{
+  return pair_with_property<T, U, Property>(t, u, property);
+}
+
+} } } // end namespace boost::parallel::detail
+
+namespace boost { namespace mpi {
+
+template<> 
+struct is_mpi_datatype<boost::detail::parallel::maybe_store_property<no_property> > : mpl::true_ { };
+
+template<typename Property>
+struct is_mpi_datatype<boost::detail::parallel::maybe_store_property<Property> >
+  : is_mpi_datatype<Property> { };
+
+template<typename T, typename U, typename Property>
+struct is_mpi_datatype<boost::detail::parallel::pair_with_property<T, U, Property> >
+  : boost::mpl::and_<is_mpi_datatype<boost::parallel::detail::untracked_pair<T, U> >,
+                     is_mpi_datatype<Property> > { };
+
+} } // end namespace boost::mpi
+
+BOOST_IS_BITWISE_SERIALIZABLE(boost::detail::parallel::maybe_store_property<no_property>)
+
+namespace boost { namespace serialization {
+
+template<typename Property>
+struct is_bitwise_serializable<boost::detail::parallel::maybe_store_property<Property> >
+  : is_bitwise_serializable<Property> { };
+
+template<typename Property>
+struct implementation_level<boost::detail::parallel::maybe_store_property<Property> >
+ : mpl::int_<object_serializable> {} ;
+
+template<typename Property>
+struct tracking_level<boost::detail::parallel::maybe_store_property<Property> >
+ : mpl::int_<track_never> {} ;
+
+template<typename T, typename U, typename Property>
+struct is_bitwise_serializable<
+        boost::detail::parallel::pair_with_property<T, U, Property> >
+  : boost::mpl::and_<is_bitwise_serializable<boost::parallel::detail::untracked_pair<T, U> >,
+                     is_bitwise_serializable<Property> > { };
+
+template<typename T, typename U, typename Property>
+struct implementation_level<
+        boost::detail::parallel::pair_with_property<T, U, Property> >
+ : mpl::int_<object_serializable> {} ;
+
+template<typename T, typename U, typename Property>
+struct tracking_level<
+        boost::detail::parallel::pair_with_property<T, U, Property> >
+ : mpl::int_<track_never> {} ;
+
+} } // end namespace boost::serialization
+
+#endif // BOOST_PARALLEL_DETAIL_PROPERTY_HOLDERS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/untracked_pair.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/detail/untracked_pair.hpp
new file mode 100644 (file)
index 0000000..3554910
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright (C) 2007 Matthias Troyer
+//
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//
+// This file contains helper data structures for use in transmitting
+// properties. The basic idea is to optimize away any storage for the
+// properties when no properties are specified.
+#ifndef BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
+#define BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/mpi/datatype.hpp>
+#include <utility> // for std::pair
+#include <boost/serialization/utility.hpp>
+
+namespace boost { namespace parallel { namespace detail {
+
+/**
+ * This structure is like std::pair, with the only difference
+ * that tracking in the serialization library is turned off.
+ */
+template<typename T, typename U>
+struct untracked_pair : public std::pair<T,U>
+{
+  untracked_pair() {}
+
+  untracked_pair(const T& t, const U& u)
+  : std::pair<T,U>(t,u) {}
+
+  template<class T1, class U1>
+  untracked_pair(std::pair<T1,U1> const& p)
+  : std::pair<T,U>(p) {}  
+};
+
+template<typename T, typename U>
+inline untracked_pair<T, U>
+make_untracked_pair(const T& t, const U& u)
+{
+  return untracked_pair<T,U>(t,u);
+}
+
+} } } // end namespace boost::parallel::detail
+
+namespace boost { namespace mpi {
+
+template<typename T, typename U>
+struct is_mpi_datatype<boost::parallel::detail::untracked_pair<T, U> >
+  : is_mpi_datatype<std::pair<T,U> > {};
+
+} } // end namespace boost::mpi
+
+namespace boost { namespace serialization {
+
+// pair
+template<class Archive, class F, class S>
+inline void serialize(
+    Archive & ar,
+    boost::parallel::detail::untracked_pair<F, S> & p,
+    const unsigned int /* file_version */
+){
+    ar & boost::serialization::make_nvp("first", p.first);
+    ar & boost::serialization::make_nvp("second", p.second);
+}
+
+template<typename T, typename U>
+struct is_bitwise_serializable<
+        boost::parallel::detail::untracked_pair<T, U> >
+  : is_bitwise_serializable<std::pair<T, U> > {};
+
+template<typename T, typename U>
+struct implementation_level<boost::parallel::detail::untracked_pair<T, U> >
+ : mpl::int_<object_serializable> {} ;
+
+template<typename T, typename U>
+struct tracking_level<boost::parallel::detail::untracked_pair<T, U> >
+ : mpl::int_<track_never> {} ;
+
+} } // end namespace boost::serialization
+
+#endif // BOOST_PARALLEL_DETAIL_UNTRACKED_PAIR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/distribution.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/distribution.hpp
new file mode 100644 (file)
index 0000000..d717a1f
--- /dev/null
@@ -0,0 +1,614 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Peter Gottschling
+//           Andrew Lumsdaine
+#ifndef BOOST_PARALLEL_DISTRIBUTION_HPP
+#define BOOST_PARALLEL_DISTRIBUTION_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <cstddef>
+#include <vector>
+#include <algorithm>
+#include <numeric>
+#include <boost/iterator/counting_iterator.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/shared_ptr.hpp>
+#include <typeinfo>
+
+namespace boost { namespace parallel {
+
+template<typename ProcessGroup, typename SizeType = std::size_t>
+class variant_distribution
+{
+public:
+  typedef typename ProcessGroup::process_id_type process_id_type;
+  typedef typename ProcessGroup::process_size_type process_size_type;
+  typedef SizeType size_type;
+
+private:
+  struct basic_distribution
+  {
+    virtual ~basic_distribution() {}
+    virtual size_type block_size(process_id_type, size_type) const = 0;
+    virtual process_id_type in_process(size_type) const = 0;
+    virtual size_type local(size_type) const = 0;
+    virtual size_type global(size_type) const = 0;
+    virtual size_type global(process_id_type, size_type) const = 0;
+    virtual void* address() = 0;
+    virtual const void* address() const = 0;
+    virtual const std::type_info& type() const = 0;
+  };
+
+  template<typename Distribution>
+  struct poly_distribution : public basic_distribution
+  {
+    explicit poly_distribution(const Distribution& distribution)
+      : distribution_(distribution) { }
+
+    virtual size_type block_size(process_id_type id, size_type n) const
+    { return distribution_.block_size(id, n); }
+
+    virtual process_id_type in_process(size_type i) const
+    { return distribution_(i); }
+
+    virtual size_type local(size_type i) const
+    { return distribution_.local(i); }
+
+    virtual size_type global(size_type n) const
+    { return distribution_.global(n); }
+
+    virtual size_type global(process_id_type id, size_type n) const
+    { return distribution_.global(id, n); }
+
+    virtual void* address() { return &distribution_; }
+    virtual const void* address() const { return &distribution_; }
+    virtual const std::type_info& type() const { return typeid(Distribution); }
+
+  private:
+    Distribution distribution_;
+  };
+
+public:
+  variant_distribution() { }
+
+  template<typename Distribution>
+  variant_distribution(const Distribution& distribution)
+    : distribution_(new poly_distribution<Distribution>(distribution)) { }
+
+  size_type block_size(process_id_type id, size_type n) const
+  { return distribution_->block_size(id, n); }
+  
+  process_id_type operator()(size_type i) const
+  { return distribution_->in_process(i); }
+  
+  size_type local(size_type i) const
+  { return distribution_->local(i); }
+  
+  size_type global(size_type n) const
+  { return distribution_->global(n); }
+
+  size_type global(process_id_type id, size_type n) const
+  { return distribution_->global(id, n); }
+
+  operator bool() const { return distribution_; }
+
+  void clear() { distribution_.reset(); }
+
+  template<typename T>
+  T* as()
+  {
+    if (distribution_->type() == typeid(T))
+      return static_cast<T*>(distribution_->address());
+    else
+      return 0;
+  }
+
+  template<typename T>
+  const T* as() const
+  {
+    if (distribution_->type() == typeid(T))
+      return static_cast<T*>(distribution_->address());
+    else
+      return 0;
+  }
+
+private:
+  shared_ptr<basic_distribution> distribution_;
+};
+
+struct block
+{
+  template<typename LinearProcessGroup>
+  explicit block(const LinearProcessGroup& pg, std::size_t n) 
+    : id(process_id(pg)), p(num_processes(pg)), n(n) { }
+
+  // If there are n elements in the distributed data structure, returns the number of elements stored locally.
+  template<typename SizeType>
+  SizeType block_size(SizeType n) const
+  { return (n / p) + ((std::size_t)(n % p) > id? 1 : 0); }
+
+  // If there are n elements in the distributed data structure, returns the number of elements stored on processor ID
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType n) const
+  { return (n / p) + ((ProcessID)(n % p) > id? 1 : 0); }
+
+  // Returns the processor on which element with global index i is stored
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  { 
+    SizeType cutoff_processor = n % p;
+    SizeType cutoff = cutoff_processor * (n / p + 1);
+
+    if (i < cutoff) return i / (n / p + 1);
+    else return cutoff_processor + (i - cutoff) / (n / p);
+  }
+
+  // Find the starting index for processor with the given id
+  template<typename ID>
+  std::size_t start(ID id) const
+  {
+    std::size_t estimate = id * (n / p + 1);
+    ID cutoff_processor = n % p;
+    if (id < cutoff_processor) return estimate;
+    else return estimate - (id - cutoff_processor);
+  }
+
+  // Find the local index for the ith global element
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    SizeType owner = (*this)(i);
+    return i - start(owner);
+  }
+
+  // Returns the global index of local element i
+  template<typename SizeType>
+  SizeType global(SizeType i) const
+  { return global(id, i); }
+
+  // Returns the global index of the ith local element on processor id
+  template<typename ProcessID, typename SizeType>
+  SizeType global(ProcessID id, SizeType i) const
+  { return i + start(id); }
+
+ private:
+  std::size_t id; //< The ID number of this processor
+  std::size_t p;  //< The number of processors
+  std::size_t n;  //< The size of the problem space
+};
+
+// Block distribution with arbitrary block sizes
+struct uneven_block
+{
+  typedef std::vector<std::size_t>    size_vector;
+
+  template<typename LinearProcessGroup>
+  explicit uneven_block(const LinearProcessGroup& pg, const std::vector<std::size_t>& local_sizes) 
+    : id(process_id(pg)), p(num_processes(pg)), local_sizes(local_sizes)
+  { 
+    assert(local_sizes.size() == p);
+    local_starts.resize(p + 1);
+    local_starts[0] = 0;
+    std::partial_sum(local_sizes.begin(), local_sizes.end(), &local_starts[1]);
+    n = local_starts[p];
+  }
+
+  // To do maybe: enter local size in each process and gather in constructor (much handier)
+  // template<typename LinearProcessGroup>
+  // explicit uneven_block(const LinearProcessGroup& pg, std::size_t my_local_size) 
+
+  // If there are n elements in the distributed data structure, returns the number of elements stored locally.
+  template<typename SizeType>
+  SizeType block_size(SizeType) const
+  { return local_sizes[id]; }
+
+  // If there are n elements in the distributed data structure, returns the number of elements stored on processor ID
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType) const
+  { return local_sizes[id]; }
+
+  // Returns the processor on which element with global index i is stored
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  {
+    assert (i >= (SizeType) 0 && i < (SizeType) n); // check for valid range
+    size_vector::const_iterator lb = std::lower_bound(local_starts.begin(), local_starts.end(), (std::size_t) i);
+    return ((SizeType)(*lb) == i ? lb : --lb) - local_starts.begin();
+  }
+
+  // Find the starting index for processor with the given id
+  template<typename ID>
+  std::size_t start(ID id) const 
+  {
+    return local_starts[id];
+  }
+
+  // Find the local index for the ith global element
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    SizeType owner = (*this)(i);
+    return i - start(owner);
+  }
+
+  // Returns the global index of local element i
+  template<typename SizeType>
+  SizeType global(SizeType i) const
+  { return global(id, i); }
+
+  // Returns the global index of the ith local element on processor id
+  template<typename ProcessID, typename SizeType>
+  SizeType global(ProcessID id, SizeType i) const
+  { return i + start(id); }
+
+ private:
+  std::size_t              id;           //< The ID number of this processor
+  std::size_t              p;            //< The number of processors
+  std::size_t              n;            //< The size of the problem space
+  std::vector<std::size_t> local_sizes;  //< The sizes of all blocks
+  std::vector<std::size_t> local_starts; //< Lowest global index of each block
+};
+
+
+struct oned_block_cyclic
+{
+  template<typename LinearProcessGroup>
+  explicit oned_block_cyclic(const LinearProcessGroup& pg, std::size_t size)
+    : id(process_id(pg)), p(num_processes(pg)), size(size) { }
+      
+  template<typename SizeType>
+  SizeType block_size(SizeType n) const
+  { 
+    return block_size(id, n);
+  }
+
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType n) const
+  {
+    SizeType all_blocks = n / size;
+    SizeType extra_elements = n % size;
+    SizeType everyone_gets = all_blocks / p;
+    SizeType extra_blocks = all_blocks % p;
+    SizeType my_blocks = everyone_gets + (p < extra_blocks? 1 : 0);
+    SizeType my_elements = my_blocks * size 
+                         + (p == extra_blocks? extra_elements : 0);
+    return my_elements;
+  }
+
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  { 
+    return (i / size) % p;
+  }
+
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    return ((i / size) / p) * size + i % size;
+  }
+
+  template<typename SizeType>
+  SizeType global(SizeType i) const
+  { return global(id, i); }
+
+  template<typename ProcessID, typename SizeType>
+  SizeType global(ProcessID id, SizeType i) const
+  { 
+    return ((i / size) * p + id) * size + i % size;
+  }
+
+ private:
+  std::size_t id;                   //< The ID number of this processor
+  std::size_t p;                    //< The number of processors
+  std::size_t size;                 //< Block size
+};
+
+struct twod_block_cyclic
+{
+  template<typename LinearProcessGroup>
+  explicit twod_block_cyclic(const LinearProcessGroup& pg,
+                             std::size_t block_rows, std::size_t block_columns,
+                             std::size_t data_columns_per_row)
+    : id(process_id(pg)), p(num_processes(pg)), 
+      block_rows(block_rows), block_columns(block_columns), 
+      data_columns_per_row(data_columns_per_row)
+  { }
+      
+  template<typename SizeType>
+  SizeType block_size(SizeType n) const
+  { 
+    return block_size(id, n);
+  }
+
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType n) const
+  {
+    // TBD: This is really lame :)
+    int result = -1;
+    while (n > 0) {
+      --n;
+      if ((*this)(n) == id && (int)local(n) > result) result = local(n);
+    }
+    ++result;
+
+    //    std::cerr << "Block size of id " << id << " is " << result << std::endl;
+    return result;
+  }
+
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  { 
+    SizeType result = get_block_num(i) % p;
+    //    std::cerr << "Item " << i << " goes on processor " << result << std::endl;
+    return result;
+  }
+
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    // Compute the start of the block
+    std::size_t block_num = get_block_num(i);
+    //    std::cerr << "Item " << i << " is in block #" << block_num << std::endl;
+
+    std::size_t local_block_num = block_num / p;
+    std::size_t block_start = local_block_num * block_rows * block_columns;
+
+    // Compute the offset into the block 
+    std::size_t data_row = i / data_columns_per_row;
+    std::size_t data_col = i % data_columns_per_row;
+    std::size_t block_offset = (data_row % block_rows) * block_columns 
+                             + (data_col % block_columns);    
+
+    //    std::cerr << "Item " << i << " maps to local index " << block_start+block_offset << std::endl;
+    return block_start + block_offset;
+  }
+
+  template<typename SizeType>
+  SizeType global(SizeType i) const
+  { 
+    // Compute the (global) block in which this element resides
+    SizeType local_block_num = i / (block_rows * block_columns);
+    SizeType block_offset = i % (block_rows * block_columns);
+    SizeType block_num = local_block_num * p + id;
+
+    // Compute the position of the start of the block (globally)
+    SizeType block_start = block_num * block_rows * block_columns;
+
+    std::cerr << "Block " << block_num << " starts at index " << block_start
+              << std::endl;
+
+    // Compute the row and column of this block
+    SizeType block_row = block_num / (data_columns_per_row / block_columns);
+    SizeType block_col = block_num % (data_columns_per_row / block_columns);
+
+    SizeType row_in_block = block_offset / block_columns;
+    SizeType col_in_block = block_offset % block_columns;
+
+    std::cerr << "Local index " << i << " is in block at row " << block_row
+              << ", column " << block_col << ", in-block row " << row_in_block
+              << ", in-block col " << col_in_block << std::endl;
+
+    SizeType result = block_row * block_rows + block_col * block_columns
+                    + row_in_block * block_rows + col_in_block;
+
+
+    std::cerr << "global(" << i << "@" << id << ") = " << result 
+              << " =? " << local(result) << std::endl;
+    assert(i == local(result));
+    return result;
+  }
+
+ private:
+  template<typename SizeType>
+  std::size_t get_block_num(SizeType i) const
+  {
+    std::size_t data_row = i / data_columns_per_row;
+    std::size_t data_col = i % data_columns_per_row;
+    std::size_t block_row = data_row / block_rows;
+    std::size_t block_col = data_col / block_columns;
+    std::size_t blocks_in_row = data_columns_per_row / block_columns;
+    std::size_t block_num = block_col * blocks_in_row + block_row;
+    return block_num;
+  }
+
+  std::size_t id;                   //< The ID number of this processor
+  std::size_t p;                    //< The number of processors
+  std::size_t block_rows;           //< The # of rows in each block
+  std::size_t block_columns;        //< The # of columns in each block
+  std::size_t data_columns_per_row; //< The # of columns per row of data
+};
+
+class twod_random
+{
+  template<typename RandomNumberGen>
+  struct random_int
+  {
+    explicit random_int(RandomNumberGen& gen) : gen(gen) { }
+
+    template<typename T>
+    T operator()(T n) const
+    {
+      uniform_int<T> distrib(0, n-1);
+      return distrib(gen);
+    }
+
+  private:
+    RandomNumberGen& gen;
+  };
+  
+ public:
+  template<typename LinearProcessGroup, typename RandomNumberGen>
+  explicit twod_random(const LinearProcessGroup& pg,
+                       std::size_t block_rows, std::size_t block_columns,
+                       std::size_t data_columns_per_row,
+                       std::size_t n,
+                       RandomNumberGen& gen)
+    : id(process_id(pg)), p(num_processes(pg)), 
+      block_rows(block_rows), block_columns(block_columns), 
+      data_columns_per_row(data_columns_per_row),
+      global_to_local(n / (block_rows * block_columns))
+  { 
+    std::copy(make_counting_iterator(std::size_t(0)),
+              make_counting_iterator(global_to_local.size()),
+              global_to_local.begin());
+
+    random_int<RandomNumberGen> rand(gen);
+    std::random_shuffle(global_to_local.begin(), global_to_local.end(), rand);
+  }
+      
+  template<typename SizeType>
+  SizeType block_size(SizeType n) const
+  { 
+    return block_size(id, n);
+  }
+
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType n) const
+  {
+    // TBD: This is really lame :)
+    int result = -1;
+    while (n > 0) {
+      --n;
+      if ((*this)(n) == id && (int)local(n) > result) result = local(n);
+    }
+    ++result;
+
+    //    std::cerr << "Block size of id " << id << " is " << result << std::endl;
+    return result;
+  }
+
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  { 
+    SizeType result = get_block_num(i) % p;
+    //    std::cerr << "Item " << i << " goes on processor " << result << std::endl;
+    return result;
+  }
+
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    // Compute the start of the block
+    std::size_t block_num = get_block_num(i);
+    //    std::cerr << "Item " << i << " is in block #" << block_num << std::endl;
+
+    std::size_t local_block_num = block_num / p;
+    std::size_t block_start = local_block_num * block_rows * block_columns;
+
+    // Compute the offset into the block 
+    std::size_t data_row = i / data_columns_per_row;
+    std::size_t data_col = i % data_columns_per_row;
+    std::size_t block_offset = (data_row % block_rows) * block_columns 
+                             + (data_col % block_columns);    
+
+    //    std::cerr << "Item " << i << " maps to local index " << block_start+block_offset << std::endl;
+    return block_start + block_offset;
+  }
+
+ private:
+  template<typename SizeType>
+  std::size_t get_block_num(SizeType i) const
+  {
+    std::size_t data_row = i / data_columns_per_row;
+    std::size_t data_col = i % data_columns_per_row;
+    std::size_t block_row = data_row / block_rows;
+    std::size_t block_col = data_col / block_columns;
+    std::size_t blocks_in_row = data_columns_per_row / block_columns;
+    std::size_t block_num = block_col * blocks_in_row + block_row;
+    return global_to_local[block_num];
+  }
+
+  std::size_t id;                   //< The ID number of this processor
+  std::size_t p;                    //< The number of processors
+  std::size_t block_rows;           //< The # of rows in each block
+  std::size_t block_columns;        //< The # of columns in each block
+  std::size_t data_columns_per_row; //< The # of columns per row of data
+  std::vector<std::size_t> global_to_local;
+};
+
+class random_distribution
+{
+  template<typename RandomNumberGen>
+  struct random_int
+  {
+    explicit random_int(RandomNumberGen& gen) : gen(gen) { }
+
+    template<typename T>
+    T operator()(T n) const
+    {
+      uniform_int<T> distrib(0, n-1);
+      return distrib(gen);
+    }
+
+  private:
+    RandomNumberGen& gen;
+  };
+  
+ public:
+  template<typename LinearProcessGroup, typename RandomNumberGen>
+  random_distribution(const LinearProcessGroup& pg, RandomNumberGen& gen,
+                      std::size_t n)
+    : base(pg, n), local_to_global(n), global_to_local(n)
+  {
+    std::copy(make_counting_iterator(std::size_t(0)),
+              make_counting_iterator(n),
+              local_to_global.begin());
+
+    random_int<RandomNumberGen> rand(gen);
+    std::random_shuffle(local_to_global.begin(), local_to_global.end(), rand);
+                        
+
+    for (std::vector<std::size_t>::size_type i = 0; i < n; ++i)
+      global_to_local[local_to_global[i]] = i;
+  }
+
+  template<typename SizeType>
+  SizeType block_size(SizeType n) const
+  { return base.block_size(n); }
+
+  template<typename SizeType, typename ProcessID>
+  SizeType block_size(ProcessID id, SizeType n) const
+  { return base.block_size(id, n); }
+
+  template<typename SizeType>
+  SizeType operator()(SizeType i) const
+  {
+    return base(global_to_local[i]);
+  }
+
+  template<typename SizeType>
+  SizeType local(SizeType i) const
+  { 
+    return base.local(global_to_local[i]);
+  }
+
+  template<typename ProcessID, typename SizeType>
+  SizeType global(ProcessID p, SizeType i) const
+  { 
+    return local_to_global[base.global(p, i)];
+  }
+
+  template<typename SizeType>
+  SizeType global(SizeType i) const
+  { 
+    return local_to_global[base.global(i)];
+  }
+
+ private:
+  block base;
+  std::vector<std::size_t> local_to_global;
+  std::vector<std::size_t> global_to_local;
+};
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_PARALLEL_DISTRIBUTION_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/process_group.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/process_group.hpp
new file mode 100644 (file)
index 0000000..280ee4d
--- /dev/null
@@ -0,0 +1,101 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP
+#define BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <cstdlib>
+#include <utility>
+
+namespace boost { namespace graph { namespace parallel {
+
+/**
+ * A special type used as a flag to a process group constructor that
+ * indicates that the copy of a process group will represent a new
+ * distributed data structure.
+ */
+struct attach_distributed_object { };
+
+/**
+ * Describes the context in which a trigger is being invoked to
+ * receive a message.
+ */
+enum trigger_receive_context {
+  /// No trigger is active at this time.
+  trc_none,
+  /// The trigger is being invoked during synchronization, at the end
+  /// of a superstep.
+  trc_in_synchronization,
+  /// The trigger is being invoked as an "early" receive of a message
+  /// that was sent through the normal "send" operations to be
+  /// received by the end of the superstep, but the process group sent
+  /// the message earlier to clear its buffers.
+  trc_early_receive,
+  /// The trigger is being invoked for an out-of-band message, which
+  /// must be handled immediately.
+  trc_out_of_band,
+  /// The trigger is being invoked for an out-of-band message, which
+  /// must be handled immediately and has alredy been received by 
+  /// an MPI_IRecv call.
+  trc_irecv_out_of_band  
+};
+
+// Process group tags
+struct process_group_tag {};
+struct linear_process_group_tag : virtual process_group_tag {};
+struct messaging_process_group_tag : virtual process_group_tag {};
+struct immediate_process_group_tag : virtual messaging_process_group_tag {};
+struct bsp_process_group_tag : virtual messaging_process_group_tag {};
+struct batch_process_group_tag : virtual messaging_process_group_tag {};
+struct locking_process_group_tag : virtual process_group_tag {};
+struct spawning_process_group_tag : virtual process_group_tag {};
+
+struct process_group_archetype
+{
+  typedef int process_id_type;
+};
+
+void wait(process_group_archetype&);
+void synchronize(process_group_archetype&);
+int process_id(const process_group_archetype&);
+int num_processes(const process_group_archetype&);
+
+template<typename T> void send(process_group_archetype&, int, int, const T&);
+
+template<typename T>
+process_group_archetype::process_id_type
+receive(const process_group_archetype& pg,
+        process_group_archetype::process_id_type source, int tag, T& value);
+
+template<typename T>
+std::pair<process_group_archetype::process_id_type, std::size_t>
+receive(const process_group_archetype& pg, int tag, T values[], std::size_t n);
+
+template<typename T>
+std::pair<process_group_archetype::process_id_type, std::size_t>
+receive(const process_group_archetype& pg,
+        process_group_archetype::process_id_type source, int tag, T values[],
+        std::size_t n);
+
+} } } // end namespace boost::graph::parallel
+
+namespace boost { namespace graph { namespace distributed {
+  using parallel::trigger_receive_context;
+  using parallel::trc_early_receive;
+  using parallel::trc_out_of_band;
+  using parallel::trc_irecv_out_of_band;
+  using parallel::trc_in_synchronization;
+  using parallel::trc_none;
+  using parallel::attach_distributed_object;
+} } } // end namespace boost::graph::distributed
+
+#endif // BOOST_GRAPH_PARALLEL_PROCESS_GROUP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/properties.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/properties.hpp
new file mode 100644 (file)
index 0000000..c6bb0bb
--- /dev/null
@@ -0,0 +1,111 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_PARALLEL_PROPERTIES_HPP
+#define BOOST_GRAPH_PARALLEL_PROPERTIES_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/properties.hpp>
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+
+namespace boost {
+  /***************************************************************************
+   * Property map reduction operations
+   ***************************************************************************/
+  /**
+   * Metafunction that produces a reduction operation for the given
+   * property. The default behavior merely forwards to @ref
+   * basic_reduce, but it is expected that this class template will be
+   * specified for important properties.
+   */
+  template<typename Property>
+  struct property_reduce
+  {
+    template<typename Value>
+    class apply : public parallel::basic_reduce<Value> {};
+  };
+
+  /**
+   * Reduction of vertex colors can only darken, not lighten, the
+   * color. Black cannot turn black, grey can only turn black, and
+   * white can be changed to either color. The default color is white.
+   */ 
+  template<> 
+  struct property_reduce<vertex_color_t>
+  {
+    template<typename Color>
+    class apply
+    {
+      typedef color_traits<Color> traits;
+      
+    public:
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+      template<typename Key>
+      Color operator()(const Key&) const { return traits::white(); }
+      
+      template<typename Key>
+      Color operator()(const Key&, Color local, Color remote) const {
+        if (local == traits::white()) return remote;
+        else if (remote == traits::black()) return remote;
+        else return local;
+      }
+    };
+  };
+
+  /**
+   * Reduction of a distance always takes the shorter distance. The
+   * default distance value is the maximum value for the data type.
+   */
+  template<> 
+  struct property_reduce<vertex_distance_t>
+  {
+    template<typename T>
+    class apply
+    {
+    public:
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+      template<typename Key>
+      T operator()(const Key&) const { return (std::numeric_limits<T>::max)(); }
+
+      template<typename Key>
+      T operator()(const Key&, T x, T y) const { return x < y? x : y; }
+    };
+  };
+
+  template<> 
+  struct property_reduce<vertex_predecessor_t>
+  {
+    template<typename T>
+    class apply
+    {
+    public:
+      BOOST_STATIC_CONSTANT(bool, non_default_resolver = true);
+
+      T operator()(T key) const { return key; }
+      T operator()(T key, T, T y) const { return y; }
+    };
+  };
+
+  template<typename Property, typename PropertyMap>
+  inline void set_property_map_role(Property p, PropertyMap pm)
+  {
+    typedef typename property_traits<PropertyMap>::value_type value_type;
+    typedef property_reduce<Property> property_red;
+    typedef typename property_red::template apply<value_type> reduce;
+
+    pm.set_reduce(reduce());
+  }
+
+} // end namespace boost
+#endif // BOOST_GRAPH_PARALLEL_PROPERTIES_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/simple_trigger.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/parallel/simple_trigger.hpp
new file mode 100644 (file)
index 0000000..b1639bf
--- /dev/null
@@ -0,0 +1,108 @@
+// Copyright (C) 2007 Douglas Gregor 
+
+// 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)
+
+// This file contains a simplification of the "trigger" method for
+// process groups. The simple trigger handles the common case where
+// the handler associated with a trigger is a member function bound to
+// a particular pointer.
+
+#ifndef BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_HPP
+#define BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/graph/parallel/process_group.hpp>
+
+namespace boost { namespace graph { namespace parallel {
+
+namespace detail {
+
+/**
+ * INTERNAL ONLY
+ *
+ * The actual function object that bridges from the normal trigger
+ * interface to the simplified interface. This is the equivalent of
+ * bind(pmf, self, _1, _2, _3, _4), but without the compile-time
+ * overhead of bind.
+ */
+template<typename Class, typename T, typename Result>
+class simple_trigger_t 
+{
+public:
+  simple_trigger_t(Class* self, 
+                   Result (Class::*pmf)(int, int, const T&, 
+                                        trigger_receive_context))
+    : self(self), pmf(pmf) { }
+
+  Result 
+  operator()(int source, int tag, const T& data, 
+             trigger_receive_context context) const
+  {
+    return (self->*pmf)(source, tag, data, context);
+  }
+
+private:
+  Class* self;
+  Result (Class::*pmf)(int, int, const T&, trigger_receive_context);
+};
+
+} // end namespace detail
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger to a handler that is
+ * just a bound member function.
+ *
+ * INTERNAL ONLY
+ */
+template<typename ProcessGroup, typename Class, typename T>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               void (Class::*pmf)(int source, int tag, const T& data, 
+                                  trigger_receive_context context), int)
+{
+  pg.template trigger<T>(tag, 
+                         detail::simple_trigger_t<Class, T, void>(self, pmf));
+}
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger with a reply to a
+ * handler that is just a bound member function.
+ *
+ * INTERNAL ONLY
+ */
+template<typename ProcessGroup, typename Class, typename T, typename Result>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               Result (Class::*pmf)(int source, int tag, const T& data, 
+                                    trigger_receive_context context), long)
+{
+  pg.template trigger_with_reply<T>
+    (tag, detail::simple_trigger_t<Class, T, Result>(self, pmf));
+}
+
+/**
+ * Simplified trigger interface that reduces the amount of code
+ * required to connect a process group trigger to a handler that is
+ * just a bound member function.
+ */
+template<typename ProcessGroup, typename Class, typename T, typename Result>
+inline void 
+simple_trigger(ProcessGroup& pg, int tag, Class* self, 
+               Result (Class::*pmf)(int source, int tag, const T& data, 
+                                    trigger_receive_context context))
+{
+        // We pass 0 (an int) to help VC++ disambiguate calls to simple_trigger 
+        // with Result=void.
+        simple_trigger(pg, tag, self, pmf, 0); 
+}
+
+} } } // end namespace boost::graph::parallel
+
+#endif // BOOST_GRAPH_PARALLEL_SIMPLE_TRIGGER_HPP
similarity index 82%
rename from deal.II/contrib/boost/include/boost/graph/planar_canonical_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_canonical_ordering.hpp
index 6f8e2579d8878f1ef8bbd99bb2d86a8ff7c06357..d43ea4785ec058bb5e92b0e766a9edd69bdcf859 100644 (file)
 #include <boost/config.hpp>
 #include <boost/utility.hpp>  //for next and prior
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 
 namespace boost
 {
 
 
+  namespace detail {
+    enum planar_canonical_ordering_state
+         {PCO_PROCESSED, 
+          PCO_UNPROCESSED, 
+          PCO_ONE_NEIGHBOR_PROCESSED, 
+          PCO_READY_TO_BE_PROCESSED};
+  }
+    
   template<typename Graph, 
            typename PlanarEmbedding, 
            typename OutputIterator, 
@@ -47,16 +55,11 @@ namespace boost
       <typename std::vector<std::size_t>::iterator, VertexIndexMap> 
       vertex_to_size_t_map_t;
     
-    enum {PROCESSED, 
-          UNPROCESSED, 
-          ONE_NEIGHBOR_PROCESSED, 
-          READY_TO_BE_PROCESSED};
-    
     std::vector<vertex_t> processed_neighbor_vector(num_vertices(g));
     vertex_to_vertex_map_t processed_neighbor
       (processed_neighbor_vector.begin(), vm);
 
-    std::vector<std::size_t> status_vector(num_vertices(g), UNPROCESSED);
+    std::vector<std::size_t> status_vector(num_vertices(g), detail::PCO_UNPROCESSED);
     vertex_to_size_t_map_t status(status_vector.begin(), vm);
 
     std::list<vertex_t> ready_to_be_processed;
@@ -73,16 +76,16 @@ namespace boost
       }
 
     ready_to_be_processed.push_back(first_vertex);
-    status[first_vertex] = READY_TO_BE_PROCESSED;
+    status[first_vertex] = detail::PCO_READY_TO_BE_PROCESSED;
     ready_to_be_processed.push_back(second_vertex);
-    status[second_vertex] = READY_TO_BE_PROCESSED;
+    status[second_vertex] = detail::PCO_READY_TO_BE_PROCESSED;
 
     while(!ready_to_be_processed.empty())
       {
         vertex_t u = ready_to_be_processed.front();
         ready_to_be_processed.pop_front();
 
-        if (status[u] != READY_TO_BE_PROCESSED && u != second_vertex)
+        if (status[u] != detail::PCO_READY_TO_BE_PROCESSED && u != second_vertex)
           continue;
 
         embedding_iterator_t ei, ei_start, ei_end;
@@ -98,7 +101,7 @@ namespace boost
           {
             
             edge_t e(*ei); // e = (u,v)
-            next_edge_itr = next(ei) == ei_end ? ei_start : next(ei);
+            next_edge_itr = boost::next(ei) == ei_end ? ei_start : boost::next(ei);
             vertex_t v = source(e,g) == u ? target(e,g) : source(e,g);
 
             vertex_t prior_vertex = source(*prior_edge_itr, g) == u ? 
@@ -124,19 +127,19 @@ namespace boost
             // past any loops or parallel edges
             while (next_vertex == v || next_vertex == u)
               {
-                next_edge_itr = next(next_edge_itr) == ei_end ?
-                  ei_start : next(next_edge_itr);
+                next_edge_itr = boost::next(next_edge_itr) == ei_end ?
+                  ei_start : boost::next(next_edge_itr);
                 next_vertex = source(*next_edge_itr, g) == u ? 
                   target(*next_edge_itr, g) : source(*next_edge_itr, g);
               }
 
 
-            if (status[v] == UNPROCESSED)
+            if (status[v] == detail::PCO_UNPROCESSED)
               {
-                status[v] = ONE_NEIGHBOR_PROCESSED;
+                status[v] = detail::PCO_ONE_NEIGHBOR_PROCESSED;
                 processed_neighbor[v] = u;
               }
-            else if (status[v] == ONE_NEIGHBOR_PROCESSED)
+            else if (status[v] == detail::PCO_ONE_NEIGHBOR_PROCESSED)
               {
                 vertex_t x = processed_neighbor[v];
                 //are edges (v,u) and (v,x) adjacent in the planar
@@ -152,24 +155,24 @@ namespace boost
                      )
                     )
                   {
-                    status[v] = READY_TO_BE_PROCESSED;
+                    status[v] = detail::PCO_READY_TO_BE_PROCESSED;
                   }
                 else
                   {
-                    status[v] = READY_TO_BE_PROCESSED + 1;
+                    status[v] = detail::PCO_READY_TO_BE_PROCESSED + 1;
                   }                                                        
               }
-            else if (status[v] > ONE_NEIGHBOR_PROCESSED)
+            else if (status[v] > detail::PCO_ONE_NEIGHBOR_PROCESSED)
               {
                 //check the two edges before and after (v,u) in the planar
                 //embedding, and update status[v] accordingly
 
                 bool processed_before = false;
-                if (status[prior_vertex] == PROCESSED)
+                if (status[prior_vertex] == detail::PCO_PROCESSED)
                   processed_before = true;
 
                 bool processed_after = false;
-                if (status[next_vertex] == PROCESSED)
+                if (status[next_vertex] == detail::PCO_PROCESSED)
                   processed_after = true;
 
                 if (!processed_before && !processed_after)
@@ -180,14 +183,14 @@ namespace boost
 
               }
 
-            if (status[v] == READY_TO_BE_PROCESSED)
+            if (status[v] == detail::PCO_READY_TO_BE_PROCESSED)
               ready_to_be_processed.push_back(v);
 
             prior_edge_itr = ei;
 
           }
 
-        status[u] = PROCESSED;
+        status[u] = detail::PCO_PROCESSED;
         *ordering = u;
         ++ordering;
         
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/planar_detail/add_edge_visitors.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/add_edge_visitors.hpp
index 3ad65b822851ad92a94b17dddeb86ea32f800204..9635376990e9ec52aec349fee048bbbe9abc306b 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef __ADD_EDGE_VISITORS_HPP__
 #define __ADD_EDGE_VISITORS_HPP__
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost
 {
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/planar_detail/boyer_myrvold_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/boyer_myrvold_impl.hpp
index d09552217afc0c6cb8b6cc4507ff7c866f58a2f6..041a55003c45c03278e1c3623d2d37667bd22edb 100644 (file)
@@ -14,7 +14,7 @@
 #include <boost/config.hpp>    //for std::min macros
 #include <boost/shared_ptr.hpp>
 #include <boost/tuple/tuple.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/depth_first_search.hpp>
 #include <boost/graph/planar_detail/face_handles.hpp>
@@ -25,6 +25,9 @@
 
 namespace boost
 {
+  namespace detail {
+    enum bm_case_t{BM_NO_CASE_CHOSEN, BM_CASE_A, BM_CASE_B, BM_CASE_C, BM_CASE_D, BM_CASE_E};
+  }
 
   template<typename LowPointMap, typename DFSParentMap,
            typename DFSNumberMap, typename LeastAncestorMap,
@@ -1022,7 +1025,7 @@ namespace boost
       garbage.splice(garbage.end(), 
                      *separated_dfs_child_list[dfs_parent[v]], 
                      to_delete, 
-                     next(to_delete)
+                     boost::next(to_delete)
                      );
     }
 
@@ -1240,8 +1243,7 @@ namespace boost
       vertex_t second_x_y_path_endpoint = graph_traits<Graph>::null_vertex();
       vertex_t w_ancestor = v;
 
-      enum case_t{NO_CASE_CHOSEN, CASE_A, CASE_B, CASE_C, CASE_D, CASE_E};
-      case_t chosen_case = NO_CASE_CHOSEN;
+      detail::bm_case_t chosen_case = detail::BM_NO_CASE_CHOSEN;
 
       std::vector<edge_t> x_external_path;
       std::vector<edge_t> y_external_path;
@@ -1403,7 +1405,7 @@ namespace boost
       //If v isn't on the same bicomp as x and y, it's a case A
       if (bicomp_root != v)
         {
-          chosen_case = CASE_A;
+          chosen_case = detail::BM_CASE_A;
 
           for(tie(vi,vi_end) = vertices(g); vi != vi_end; ++vi)
             if (lower_face_vertex[*vi])
@@ -1420,7 +1422,7 @@ namespace boost
         }
       else if (w != graph_traits<Graph>::null_vertex())
         {
-          chosen_case = CASE_B;
+          chosen_case = detail::BM_CASE_B;
 
           for(tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
             {
@@ -1512,7 +1514,7 @@ namespace boost
           //We need to find a valid z, since the x-y path re-defines the lower
           //face, and the z we found earlier may now be on the upper face.
 
-          chosen_case = CASE_E;
+          chosen_case = detail::BM_CASE_E;
 
 
           // The z we've used so far is just an externally active vertex on the
@@ -1587,7 +1589,7 @@ namespace boost
                   if (w == graph_traits<Graph>::null_vertex() && 
                       externally_active(current_vertex,v) &&
                       outer_face_edge[e] &&
-                      outer_face_edge[*next(old_face_itr)] &&
+                      outer_face_edge[*boost::next(old_face_itr)] &&
                       !seen_x_or_y
                       )
                     {
@@ -1631,7 +1633,7 @@ namespace boost
                     }
                   else if (previous_vertex == x || previous_vertex == y)
                     {
-                      chosen_case = CASE_C;
+                      chosen_case = detail::BM_CASE_C;
                     }
               
                 }
@@ -1688,7 +1690,7 @@ namespace boost
 
               if (x_y_path_vertex[current_vertex])
                 {
-                  chosen_case = CASE_D;
+                  chosen_case = detail::BM_CASE_D;
                   break;
                 }
               else
@@ -1704,7 +1706,7 @@ namespace boost
 
 
 
-      if (chosen_case != CASE_B && chosen_case != CASE_A)
+      if (chosen_case != detail::BM_CASE_B && chosen_case != detail::BM_CASE_A)
         {
 
           //Finding z and w.
@@ -1724,7 +1726,7 @@ namespace boost
                             z_v_path
                             );
               
-          if (chosen_case == CASE_E)
+          if (chosen_case == detail::BM_CASE_E)
             {
 
               for(tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
@@ -1810,11 +1812,11 @@ namespace boost
       // a deterministic process, and we can simplify the function 
       // is_kuratowski_subgraph by cleaning up some edges here.
 
-      if (chosen_case == CASE_B)
+      if (chosen_case == detail::BM_CASE_B)
         {
           is_in_subgraph[dfs_parent_edge[v]] = false;
         }
-      else if (chosen_case == CASE_C)
+      else if (chosen_case == detail::BM_CASE_C)
         {
           // In a case C subgraph, at least one of the x-y path endpoints
           // (call it alpha) is above either x or y on the outer face. The
@@ -1857,7 +1859,7 @@ namespace boost
             }
           
         }
-      else if (chosen_case == CASE_D)
+      else if (chosen_case == detail::BM_CASE_D)
         {
           // Need to remove both of the edges adjacent to v on the outer face.
           // remove the connecting edges from v to bicomp, then
@@ -1868,7 +1870,7 @@ namespace boost
           is_in_subgraph[v_dfchild_handle.second_edge()] = false;
 
         }
-      else if (chosen_case == CASE_E)
+      else if (chosen_case == detail::BM_CASE_E)
         {
           // Similarly to case C, if the endpoints of the x-y path are both 
           // below x and y, we should remove an edge to allow the subgraph to 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/planar_detail/bucket_sort.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/bucket_sort.hpp
index f07262859dc613e5dc9d9a1cc2ea6eda6dae8d6e..4ec95d8e2887b78b4d42c15d9a226582523e1e48 100644 (file)
@@ -10,7 +10,7 @@
 
 #include <vector>
 #include <algorithm>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/planar_detail/face_iterators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_detail/face_iterators.hpp
index 2cd1df5ec3ea61802d9ad9a6a902eacbfb2c60e9..b5e7ab95b20e4331476bb3a7b234fa90b66eba2f 100644 (file)
@@ -270,7 +270,7 @@ namespace boost
 
     vertex_t m_lead;
     vertex_t m_follow;
-       edge_storage<Graph, boost::is_same<ValueType, edge_t>::value > m_edge;
+    edge_storage<Graph, boost::is_same<ValueType, edge_t>::value > m_edge;
     FaceHandlesMap m_face_handles;
   };
   
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/planar_face_traversal.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/planar_face_traversal.hpp
index 95e8401fa833bfed19fdc7b8169a12cd614ef886..6f392c49a3d5d4098c6240b4fead411cc7fd768d 100644 (file)
@@ -107,7 +107,7 @@ namespace boost
           {
             edge_t e(*pi);
             std::map<vertex_t, edge_t> m = get(next_edge, e);
-            m[v] = next(pi) == pi_end ? *pi_begin : *next(pi);
+            m[v] = boost::next(pi) == pi_end ? *pi_begin : *boost::next(pi);
             put(next_edge, e, m);
           } 
       }
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/plod_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/plod_generator.hpp
new file mode 100644 (file)
index 0000000..4e557cf
--- /dev/null
@@ -0,0 +1,253 @@
+// Copyright 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_PLOD_GENERATOR_HPP
+#define BOOST_GRAPH_PLOD_GENERATOR_HPP
+
+#include <iterator>
+#include <utility>
+#include <boost/random/uniform_int.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <vector>
+#include <map>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/mpl/if.hpp>
+
+namespace boost {
+  template<typename RandomGenerator>
+  class out_directed_plod_iterator 
+  {
+  public:
+    typedef std::forward_iterator_tag            iterator_category;
+    typedef std::pair<std::size_t, std::size_t>  value_type;
+    typedef const value_type&                    reference;
+    typedef const value_type*                    pointer;
+    typedef std::ptrdiff_t                       difference_type;
+
+    out_directed_plod_iterator() : gen(0), at_end(true) { }
+
+    out_directed_plod_iterator(RandomGenerator& gen, std::size_t n,  
+                               double alpha, double beta, 
+                               bool allow_self_loops)
+      : gen(&gen), n(n), alpha(alpha), beta(beta), 
+        allow_self_loops(allow_self_loops), at_end(false), degree(0),
+        current(0, 0)
+    {
+      using std::pow;
+
+      uniform_int<std::size_t> x(0, n-1);
+      std::size_t xv = x(gen);
+      degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha)));
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    out_directed_plod_iterator& operator++()
+    { 
+      using std::pow;
+
+      uniform_int<std::size_t> x(0, n-1);
+
+      // Continue stepping through source nodes until the
+      // (out)degree is > 0
+      while (degree == 0) {
+        // Step to the next source node. If we've gone past the
+        // number of nodes we're responsible for, we're done.
+        if (++current.first >= n) {
+          at_end = true;
+          return *this;
+        }
+
+        std::size_t xv = x(*gen);
+        degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha)));      
+      }
+
+      do {
+        current.second = x(*gen);
+      } while (current.first == current.second && !allow_self_loops);
+      --degree;
+
+      return *this;
+    }
+
+    out_directed_plod_iterator operator++(int)
+    {
+      out_directed_plod_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const out_directed_plod_iterator& other) const
+    { 
+      return at_end == other.at_end; 
+    }
+
+    bool operator!=(const out_directed_plod_iterator& other) const
+    { 
+      return !(*this == other); 
+    }
+
+  private:    
+    RandomGenerator* gen;
+    std::size_t n;
+    double alpha;
+    double beta;
+    bool allow_self_loops;
+    bool at_end;
+    std::size_t degree;
+    value_type current;
+  };
+
+  template<typename RandomGenerator>
+  class undirected_plod_iterator 
+  {
+    typedef std::vector<std::pair<std::size_t, std::size_t> > out_degrees_t;
+
+  public:
+    typedef std::input_iterator_tag              iterator_category;
+    typedef std::pair<std::size_t, std::size_t>  value_type;
+    typedef const value_type&                    reference;
+    typedef const value_type*                    pointer;
+    typedef std::ptrdiff_t                       difference_type;
+
+    undirected_plod_iterator() 
+      : gen(0), out_degrees(), degrees_left(0), allow_self_loops(false) { }
+
+    undirected_plod_iterator(RandomGenerator& gen, std::size_t n,  
+                             double alpha, double beta, 
+                             bool allow_self_loops = false)
+      : gen(&gen), n(n), out_degrees(new out_degrees_t),
+        degrees_left(0), allow_self_loops(allow_self_loops)
+    {
+      using std::pow;
+
+      uniform_int<std::size_t> x(0, n-1);
+      for (std::size_t i = 0; i != n; ++i) {
+        std::size_t xv = x(gen);
+        std::size_t degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha)));
+        if (degree == 0) degree = 1;
+        else if (degree >= n) degree = n-1;
+        out_degrees->push_back(std::make_pair(i, degree));
+        degrees_left += degree;
+      }
+
+      next();
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    undirected_plod_iterator& operator++()
+    { 
+      next();
+      return *this;
+    }
+
+    undirected_plod_iterator operator++(int)
+    {
+      undirected_plod_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const undirected_plod_iterator& other) const
+    { 
+      return degrees_left == other.degrees_left; 
+    }
+
+    bool operator!=(const undirected_plod_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+    void next()
+    {
+      std::size_t source, target;
+      while (true) {
+        /* We may get to the point where we can't actually find any
+           new edges, so we just add some random edge and set the
+           degrees left = 0 to signal termination. */
+        if (out_degrees->size() < 2) {
+          uniform_int<std::size_t> x(0, n-1);
+          current.first  = x(*gen);
+          do {
+            current.second = x(*gen);
+          } while (current.first == current.second && !allow_self_loops);
+          degrees_left = 0;
+          out_degrees->clear();
+          return;
+        }
+
+        uniform_int<std::size_t> x(0, out_degrees->size()-1);
+
+        // Select source vertex
+        source = x(*gen);
+        if ((*out_degrees)[source].second == 0) {
+          (*out_degrees)[source] = out_degrees->back();
+          out_degrees->pop_back();
+          continue;
+        } 
+
+        // Select target vertex
+        target = x(*gen);
+        if ((*out_degrees)[target].second == 0) {
+          (*out_degrees)[target] = out_degrees->back();
+          out_degrees->pop_back();
+          continue;
+        } else if (source != target 
+                   || (allow_self_loops && (*out_degrees)[source].second > 2)) {
+          break;
+        }
+      }
+
+      // Update degree counts
+      --(*out_degrees)[source].second;
+      --degrees_left;
+      --(*out_degrees)[target].second;
+      --degrees_left;
+      current.first  = (*out_degrees)[source].first;
+      current.second = (*out_degrees)[target].first;
+    }
+
+    RandomGenerator* gen;
+    std::size_t n;
+    shared_ptr<out_degrees_t> out_degrees;
+    std::size_t degrees_left;
+    bool allow_self_loops;
+    value_type current;
+  };
+
+
+  template<typename RandomGenerator, typename Graph>
+  class plod_iterator
+    : public mpl::if_<is_convertible<
+                        typename graph_traits<Graph>::directed_category,
+                        directed_tag>,
+                      out_directed_plod_iterator<RandomGenerator>,
+                      undirected_plod_iterator<RandomGenerator> >::type
+  {
+    typedef typename mpl::if_<
+                       is_convertible<
+                         typename graph_traits<Graph>::directed_category,
+                         directed_tag>,
+                        out_directed_plod_iterator<RandomGenerator>,
+                        undirected_plod_iterator<RandomGenerator> >::type
+      inherited;
+
+  public:
+    plod_iterator() : inherited() { }
+
+    plod_iterator(RandomGenerator& gen, std::size_t n,  
+                  double alpha, double beta, bool allow_self_loops = false)
+      : inherited(gen, n, alpha, beta, allow_self_loops) { }
+  };
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_PLOD_GENERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/point_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/point_traits.hpp
new file mode 100644 (file)
index 0000000..89da939
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_POINT_TRAITS_HPP
+#define BOOST_GRAPH_POINT_TRAITS_HPP
+
+namespace boost { namespace graph {
+
+template<typename Point>
+struct point_traits
+{
+  // The type of each component of the point
+  typedef typename Point::component_type component_type;
+
+  // The number of dimensions in the point
+  static std::size_t dimensions(const Point& point);
+};
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_POINT_TRAITS_HPP
similarity index 79%
rename from deal.II/contrib/boost/include/boost/graph/properties.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/properties.hpp
index e3816e36e8b3cb5821affc4fba36aa01f61914a3..3a313b17ba6ab472a5ffa9f9c062adeac89e0b7a 100644 (file)
@@ -6,16 +6,26 @@
 // accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
 //=======================================================================
+
 #ifndef BOOST_GRAPH_PROPERTIES_HPP
 #define BOOST_GRAPH_PROPERTIES_HPP
 
 #include <boost/config.hpp>
 #include <cassert>
 #include <boost/pending/property.hpp>
-#include <boost/property_map.hpp>
+#include <boost/detail/workaround.hpp>
+
+// Include the property map library and extensions in the BGL.
+#include <boost/property_map/property_map.hpp>
+#include <boost/graph/property_maps/constant_property_map.hpp>
+#include <boost/graph/property_maps/null_property_map.hpp>
+
 #include <boost/graph/graph_traits.hpp>
 #include <boost/type_traits/is_convertible.hpp>
-
+#include <boost/limits.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/if.hpp>
 
 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
 // Stay out of the way of the concept checking class
@@ -35,12 +45,12 @@ namespace boost {
     static default_color_type red() { return red_color; }
     static default_color_type black() { return black_color; }
   };
-  
+
   // These functions are now obsolete, replaced by color_traits.
   inline default_color_type white(default_color_type) { return white_color; }
   inline default_color_type gray(default_color_type) { return gray_color; }
   inline default_color_type green(default_color_type) { return green_color; }
-  inline default_color_type red(default_color_type) { return red_color; } 
+  inline default_color_type red(default_color_type) { return red_color; }
   inline default_color_type black(default_color_type) { return black_color; }
 
 #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
@@ -90,28 +100,46 @@ namespace boost {
   BOOST_DEF_PROPERTY(vertex, name);
   BOOST_DEF_PROPERTY(graph, name);
   BOOST_DEF_PROPERTY(vertex, distance);
+  BOOST_DEF_PROPERTY(vertex, distance2);
   BOOST_DEF_PROPERTY(vertex, color);
   BOOST_DEF_PROPERTY(vertex, degree);
   BOOST_DEF_PROPERTY(vertex, in_degree);
   BOOST_DEF_PROPERTY(vertex, out_degree);
   BOOST_DEF_PROPERTY(vertex, current_degree);
-  BOOST_DEF_PROPERTY(vertex, priority); 
+  BOOST_DEF_PROPERTY(vertex, priority);
   BOOST_DEF_PROPERTY(vertex, discover_time);
   BOOST_DEF_PROPERTY(vertex, finish_time);
   BOOST_DEF_PROPERTY(vertex, predecessor);
   BOOST_DEF_PROPERTY(vertex, rank);
   BOOST_DEF_PROPERTY(vertex, centrality);
   BOOST_DEF_PROPERTY(vertex, lowpoint);
+  BOOST_DEF_PROPERTY(vertex, potential);
+  BOOST_DEF_PROPERTY(vertex, update);
   BOOST_DEF_PROPERTY(edge, reverse);
   BOOST_DEF_PROPERTY(edge, capacity);
+  BOOST_DEF_PROPERTY(edge, flow);
   BOOST_DEF_PROPERTY(edge, residual_capacity);
   BOOST_DEF_PROPERTY(edge, centrality);
+  BOOST_DEF_PROPERTY(edge, discover_time);
+  BOOST_DEF_PROPERTY(edge, update);
+  BOOST_DEF_PROPERTY(edge, finished);
   BOOST_DEF_PROPERTY(graph, visitor);
 
   // These tags are used for property bundles
   BOOST_DEF_PROPERTY(vertex, bundle);
   BOOST_DEF_PROPERTY(edge, bundle);
 
+  // These tags are used to denote the owners and local descriptors
+  // for the vertices and edges of a distributed graph.
+  BOOST_DEF_PROPERTY(vertex, global);
+  BOOST_DEF_PROPERTY(vertex, owner);
+  BOOST_DEF_PROPERTY(vertex, local);
+  BOOST_DEF_PROPERTY(edge, global);
+  BOOST_DEF_PROPERTY(edge, owner);
+  BOOST_DEF_PROPERTY(edge, local);
+  BOOST_DEF_PROPERTY(vertex, local_index);
+  BOOST_DEF_PROPERTY(edge, local_index);
+
 #undef BOOST_DEF_PROPERTY
 
   namespace detail {
@@ -223,7 +251,7 @@ namespace boost {
   template <class Graph, class Property>
   class graph_property {
   public:
-    typedef typename property_value<typename Graph::graph_property_type, 
+    typedef typename property_value<typename Graph::graph_property_type,
       Property>::type type;
   };
 
@@ -239,9 +267,9 @@ namespace boost {
   };
 
   template <typename Graph>
-  class degree_property_map 
+  class degree_property_map
     : public put_get_helper<typename graph_traits<Graph>::degree_size_type,
-                            degree_property_map<Graph> >                  
+                            degree_property_map<Graph> >
   {
   public:
     typedef typename graph_traits<Graph>::vertex_descriptor key_type;
@@ -262,9 +290,9 @@ namespace boost {
   }
 
   //========================================================================
-  // Iterator Property Map Generating Functions contributed by 
+  // Iterator Property Map Generating Functions contributed by
   // Kevin Vanhorn. (see also the property map generating functions
-  // in boost/property_map.hpp)
+  // in boost/property_map/property_map.hpp)
 
 #if !defined(BOOST_NO_STD_ITERATOR_TRAITS)
   // A helper function for creating a vertex property map out of a
@@ -281,8 +309,8 @@ namespace boost {
   make_iterator_vertex_map(RandomAccessIterator iter, const PropertyGraph& g)
   {
     return make_iterator_property_map(iter, get(vertex_index, g));
-  }  
-  
+  }
+
   // Use this next function when vertex_descriptor is known to be an
   // integer type, with values ranging from 0 to num_vertices(g).
   //
@@ -297,7 +325,7 @@ namespace boost {
   make_iterator_vertex_map(RandomAccessIterator iter)
   {
     return make_iterator_property_map(iter, identity_property_map());
-  }      
+  }
 #endif
 
   template <class PropertyGraph, class RandomAccessContainer>
@@ -312,7 +340,7 @@ namespace boost {
   {
     assert(c.size() >= num_vertices(g));
     return make_iterator_vertex_map(c.begin(), g);
-  }   
+  }
 
   template <class RandomAccessContainer> inline
   iterator_property_map<
@@ -329,17 +357,24 @@ namespace boost {
 #if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
 #  define BOOST_GRAPH_NO_BUNDLED_PROPERTIES
 #endif
+
+#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) && !defined (BOOST_GRAPH_NO_BUNDLED_PROPERTIES)
+// This compiler cannot define a partial specialization based on a
+// pointer-to-member type, as seen in boost/graph/subgraph.hpp line 985 (as of
+// trunk r53912)
+#  define BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+#endif
+
 #ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
   template<typename Graph, typename Descriptor, typename Bundle, typename T>
   struct bundle_property_map
     : put_get_helper<T&, bundle_property_map<Graph, Descriptor, Bundle, T> >
   {
     typedef Descriptor key_type;
-    typedef T value_type;
+    typedef typename remove_const<T>::type value_type;
     typedef T& reference;
     typedef lvalue_property_map_tag category;
+
     bundle_property_map() { }
     bundle_property_map(Graph* g_, T Bundle::* pm_) : g(g_), pm(pm_) {}
 
@@ -351,11 +386,16 @@ namespace boost {
 
   namespace detail {
     template<typename VertexBundle, typename EdgeBundle, typename Bundle>
-      struct is_vertex_bundle : is_convertible<VertexBundle*, Bundle*> {};
+      struct is_vertex_bundle
+      : mpl::and_<is_convertible<VertexBundle*, Bundle*>,
+                  mpl::and_<mpl::not_<is_void<VertexBundle> >,
+                            mpl::not_<is_same<VertexBundle, no_property> > > >
+      { };
   }
-  
+
+  // Specialize the property map template to generate bundled property maps.
   template <typename Graph, typename T, typename Bundle>
-  struct property_map<Graph, T Bundle::*>  
+  struct property_map<Graph, T Bundle::*>
   {
   private:
     typedef graph_traits<Graph> traits;
@@ -369,7 +409,7 @@ namespace boost {
                        vertex_bundled,
                        edge_bundled>::type
       actual_bundle;
-    
+
   public:
     typedef bundle_property_map<Graph, descriptor, actual_bundle, T> type;
     typedef bundle_property_map<const Graph, descriptor, actual_bundle, const T>
@@ -377,6 +417,47 @@ namespace boost {
   };
 #endif
 
+// These metafunctions help implement the process of determining the vertex
+// and edge properties of a graph.
+namespace graph_detail {
+    template <typename Retag>
+    struct retagged_property {
+        typedef typename Retag::type type;
+    };
+
+    template <typename Retag, typename With, typename Without>
+    struct retagged_bundle {
+        typedef typename mpl::if_<
+            is_same<typename Retag::retagged, no_property>,
+            Without,
+            With
+        >::type type;
+    };
+
+    template <typename Prop>
+    struct vertex_prop {
+    private:
+        typedef detail::retag_property_list<vertex_bundle_t, Prop> Retag;
+    public:
+        typedef typename retagged_property<Retag>::type type;
+        typedef typename retagged_bundle<
+            Retag, Prop, no_vertex_bundle
+        >::type bundle;
+    };
+
+    template <typename Prop>
+    struct edge_prop {
+//     private:
+        typedef detail::retag_property_list<edge_bundle_t, Prop> Retag;
+    public:
+        typedef typename Retag::retagged retagged;
+        typedef typename retagged_property<Retag>::type type;
+        typedef typename retagged_bundle<
+            Retag, Prop, no_edge_bundle
+        >::type bundle;
+    };
+} // namespace graph_detail
+
 } // namespace boost
 
 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
@@ -385,5 +466,4 @@ namespace boost {
 # undef RandomAccessIterator
 #endif
 
-
 #endif /* BOOST_GRAPH_PROPERTIES_HPPA */
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/property_iter_range.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/property_iter_range.hpp
index 69ff7f007604313cdd058008efc2f2bf1325d6f0..8485fed33963e1f6f92ef3f0d437aec2e3109199 100644 (file)
@@ -1,5 +1,5 @@
 
-// (C) Copyright François Faure, iMAGIS-GRAVIR / UJF, 2001.
+// (C) Copyright Francois Faure, iMAGIS-GRAVIR / UJF, 2001.
 //
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
 //      differentiate between const/mutable graphs and
 //      added a workaround to avoid partial specialization.
 
-// 02 May 2001   François Faure
+// 02 May 2001   Francois Faure
 //     Initial version.
 
 #ifndef BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP
 #define BOOST_GRAPH_PROPERTY_ITER_RANGE_HPP
 
-#include <boost/property_map_iterator.hpp>
+#include <boost/property_map/property_map_iterator.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/type_traits/same_traits.hpp>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/constant_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/constant_property_map.hpp
new file mode 100644 (file)
index 0000000..9f7f039
--- /dev/null
@@ -0,0 +1,59 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CONSTANT_PROPERTY_HPP
+#define BOOST_GRAPH_CONSTANT_PROPERTY_HPP
+
+#include <boost/property_map/property_map.hpp>
+
+
+// TODO: This should really be part of the property maps library rather than
+// the Boost.Graph library.
+
+namespace boost {
+
+/**
+ * A constant property is one, that regardless of the edge or vertex given,
+ * will always return a constant value.
+ */
+template <typename Key, typename Value>
+struct constant_property_map
+    : public boost::put_get_helper<
+            const Value&,
+            constant_property_map<Key, Value>
+    >
+{
+    typedef Key key_type;
+    typedef Value value_type;
+    typedef const Value& reference;
+    typedef boost::readable_property_map_tag category;
+
+    constant_property_map()
+        : m_value()
+    { }
+
+    constant_property_map(const value_type &value)
+        : m_value(value)
+    { }
+
+    constant_property_map(const constant_property_map& copy)
+        : m_value(copy.m_value)
+    { }
+
+    inline reference operator [](const key_type& v) const
+    { return m_value; }
+
+    value_type m_value;
+};
+
+template <typename Key, typename Value>
+inline constant_property_map<Key, Value>
+make_constant_property(const Value& value)
+{ return constant_property_map<Key, Value>(value); }
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/container_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/container_property_map.hpp
new file mode 100644 (file)
index 0000000..e07cd33
--- /dev/null
@@ -0,0 +1,75 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CONTAINER_PROPERTY_MAP_HPP
+#define BOOST_GRAPH_CONTAINER_PROPERTY_MAP_HPP
+
+#include <boost/graph/detail/index.hpp>
+#include <boost/property_map/property_map.hpp>
+
+namespace boost
+{
+    // This is an adapter built over the iterator property map with
+    // more useful uniform construction semantics. Specifically, this
+    // requires the container rather than the iterator and the graph
+    // rather than the optional index map.
+    template <typename Graph, typename Key, typename Container>
+    struct container_property_map
+        : public boost::put_get_helper<
+                typename iterator_property_map<
+                        typename Container::iterator,
+                        typename property_map<
+                                Graph,
+                                typename detail::choose_indexer<Graph, Key>::index_type
+                            >::type
+                    >::reference,
+                    container_property_map<Graph, Key, Container>
+            >
+    {
+        typedef typename detail::choose_indexer<Graph, Key>::indexer_type indexer_type;
+        typedef typename indexer_type::index_type index_type;
+        typedef iterator_property_map<
+                typename Container::iterator,
+                typename property_map<Graph, index_type>::type
+            > map_type;
+        typedef typename map_type::key_type key_type;
+        typedef typename map_type::value_type value_type;
+        typedef typename map_type::reference reference;
+        typedef typename map_type::category category;
+
+        // The default constructor will *probably* crash if its actually
+        // used for referencing vertices since the underlying iterator
+        // map points past the end of an unknown container.
+        inline container_property_map()
+            : m_map()
+        { }
+
+        // This is the preferred constructor. It is invoked over the container
+        // and the graph explicitly. This requires that the underlying iterator
+        // map use the indices of the vertices in g rather than the default
+        // identity map.
+        //
+        // Note the const-cast this ensures the reference type of the
+        // vertex index map is non-const, which happens to be an
+        // artifact of passing const graph references.
+        inline container_property_map(Container& c, const Graph& g)
+            : m_map(c.begin(), indexer_type::index_map(const_cast<Graph&>(g)))
+        { }
+
+        // Typical copy constructor.
+        inline container_property_map(const container_property_map& x)
+            : m_map(x.m_map)
+        { }
+
+        // The [] operator delegates to the underlying map/
+        inline reference operator [](const key_type& k) const
+        { return m_map[k];  }
+
+        map_type m_map;
+    };
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/matrix_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/matrix_property_map.hpp
new file mode 100644 (file)
index 0000000..bf4f2c9
--- /dev/null
@@ -0,0 +1,67 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_MATRIX_PROPERTY_MAP_HPP
+#define BOOST_GRAPH_MATRIX_PROPERTY_MAP_HPP
+
+#include <boost/graph/property_maps/container_property_map.hpp>
+
+namespace boost
+{
+    // This property map is built specifically for property maps over
+    // matrices. Like the basic property map over a container, this builds
+    // the property abstraction over a matrix (usually a vector of vectors)
+    // and returns property maps over the nested containers.
+    template <typename Graph, typename Key, typename Matrix>
+    struct matrix_property_map
+        : boost::put_get_helper<
+                container_property_map<Graph, Key, typename Matrix::value_type>,
+                matrix_property_map<Graph, Key, Matrix> >
+    {
+        // abstract the indexing keys
+        typedef typename detail::choose_indexer<Graph, Key>::indexer_type indexer_type;
+
+        // aliases for the nested container and its corresponding map
+        typedef typename Matrix::value_type container_type;
+        typedef container_property_map<Graph, Key, container_type> map_type;
+
+        typedef Key key_type;
+
+        // This property map doesn't really provide access to nested containers,
+        // but returns property maps over them. Since property maps are all
+        // copy-constructible (or should be anyways), we never return references.
+        // As such, this property is only readable, but not writable. Curiously,
+        // the inner property map is actually an lvalue pmap.
+        typedef map_type value_type;
+        typedef map_type reference;
+        typedef readable_property_map_tag category;
+
+        matrix_property_map()
+            : m_matrix(0), m_graph(0)
+        { }
+
+        matrix_property_map(Matrix& m, const Graph& g)
+            : m_matrix(&m), m_graph(const_cast<Graph*>(&g))
+        { }
+
+        matrix_property_map(const matrix_property_map& x)
+            : m_matrix(x.m_matrix), m_graph(x.m_graph)
+        { }
+
+        inline reference operator [](key_type k) const
+        {
+            typedef typename indexer_type::value_type Index;
+            Index x = indexer_type::index(k, *m_graph);
+            return map_type((*m_matrix)[x], *m_graph);
+        }
+
+    private:
+        mutable Matrix* m_matrix;
+        mutable Graph* m_graph;
+    };
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/null_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/property_maps/null_property_map.hpp
new file mode 100644 (file)
index 0000000..f627348
--- /dev/null
@@ -0,0 +1,41 @@
+// (C) Copyright Andrew Sutton 2007
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_NULL_PROPERTY_HPP
+#define BOOST_GRAPH_NULL_PROPERTY_HPP
+
+#include <boost/property_map/property_map.hpp>
+
+// TODO: This should really be part of the property maps library rather than
+// the Boost.Graph library.
+
+namespace boost
+{
+    // A null property is somewhat like the inverse of the constant
+    // property map except that instead of returning a single value,
+    // this eats any writes and cannot be read from.
+
+    template <typename Key, typename Value>
+    struct null_property_map
+    {
+        typedef Key key_type;
+        typedef Value value_type;
+        typedef void reference;
+        typedef boost::writable_property_map_tag category;
+    };
+
+    // The null_property_map<K,V> only has a put() function.
+    template <typename K, typename V>
+    void put(null_property_map<K,V>& pm, const K& key, const V& value)
+    { }
+
+    // A helper function for intantiating null property maps.
+    template <typename Key, typename Value>
+    inline null_property_map<Key, Value> make_null_property()
+    { return null_property_map<Key, Value>(); }
+}
+
+#endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/graph/push_relabel_max_flow.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/push_relabel_max_flow.hpp
index 987b8cfe4c6b96786d78c5bf380767a6c9ba5702..2b65470979d3fa0a8ba4e6752f415bc8df260604 100644 (file)
@@ -121,7 +121,7 @@ namespace boost {
         : g(g_), n(num_vertices(g_)), capacity(cap), src(src_), sink(sink_), 
           index(idx),
           excess_flow(num_vertices(g_)),
-          current(num_vertices(g_), out_edges(*vertices(g_).first, g_).second),
+          current(num_vertices(g_), out_edges(*vertices(g_).first, g_)),
           distance(num_vertices(g_)),
           color(num_vertices(g_)),
           reverse_edge(rev),
@@ -149,7 +149,7 @@ namespace boost {
         for (tie(u_iter, u_end) = vertices(g); u_iter != u_end; ++u_iter) {
           vertex_descriptor u = *u_iter;
           excess_flow[u] = 0;
-          current[u] = out_edges(u, g).first;
+          current[u] = out_edges(u, g);
         }
 
         bool overflow_detected = false;
@@ -240,7 +240,7 @@ namespace boost {
                 && is_residual_edge(reverse_edge[a])) {
               distance[v] = d_v;
               color[v] = ColorTraits::gray();
-              current[v] = out_edges(v, g).first;
+              current[v] = out_edges(v, g);
               max_distance = max BOOST_PREVENT_MACRO_SUBSTITUTION(d_v, max_distance);
 
               if (excess_flow[v] > 0)
@@ -262,8 +262,7 @@ namespace boost {
         assert(excess_flow[u] > 0);
         while (1) {
           out_edge_iterator ai, ai_end;
-          for (ai = current[u], ai_end = out_edges(u, g).second;
-               ai != ai_end; ++ai) {
+          for (tie(ai, ai_end) = current[u]; ai != ai_end; ++ai) {
             edge_descriptor a = *ai;
             if (is_residual_edge(a)) {
               vertex_descriptor v = target(a, g);
@@ -291,7 +290,7 @@ namespace boost {
             if (distance[u] == n)
               break;
           } else {              // i is no longer active
-            current[u] = ai;
+            current[u].first = ai;
             add_to_inactive_list(u, layer);
             break;
           }
@@ -350,7 +349,7 @@ namespace boost {
         ++min_distance;
         if (min_distance < n) {
           distance[u] = min_distance;     // this is the main action
-          current[u] = min_edge_iter;
+          current[u].first = min_edge_iter;
           max_distance = max BOOST_PREVENT_MACRO_SUBSTITUTION(min_distance, max_distance);
         }
         return min_distance;
@@ -444,7 +443,7 @@ namespace boost {
           u = *u_iter;
           color[u] = ColorTraits::white();
           parent[u] = u;
-          current[u] = out_edges(u, g).first;
+          current[u] = out_edges(u, g);
         }
         // eliminate flow cycles and topologically order the vertices
         for (tie(u_iter, u_end) = vertices(g); u_iter != u_end; ++u_iter) {
@@ -455,8 +454,8 @@ namespace boost {
             r = u;
             color[r] = ColorTraits::gray();
             while (1) {
-              for (; current[u] != out_edges(u, g).second; ++current[u]) {
-                edge_descriptor a = *current[u];
+              for (; current[u].first != current[u].second; ++current[u].first) {
+                edge_descriptor a = *current[u].first;
                 if (capacity[a] == 0 && is_residual_edge(a)) {
                   vertex_descriptor v = target(a, g);
                   if (color[v] == ColorTraits::white()) {
@@ -469,16 +468,16 @@ namespace boost {
                     FlowValue delta = residual_capacity[a];
                     while (1) {
                       BOOST_USING_STD_MIN();
-                      delta = min BOOST_PREVENT_MACRO_SUBSTITUTION(delta, residual_capacity[*current[v]]);
+                      delta = min BOOST_PREVENT_MACRO_SUBSTITUTION(delta, residual_capacity[*current[v].first]);
                       if (v == u)
                         break;
                       else
-                        v = target(*current[v], g);
+                        v = target(*current[v].first, g);
                     }
                     // remove delta flow units
                     v = u;
                     while (1) {
-                      a = *current[v];
+                      a = *current[v].first;
                       residual_capacity[a] -= delta;
                       residual_capacity[reverse_edge[a]] += delta;
                       v = target(a, g);
@@ -488,25 +487,25 @@ namespace boost {
 
                     // back-out of DFS to the first saturated edge
                     restart = u;
-                    for (v = target(*current[u], g); v != u; v = target(a, g)){
-                      a = *current[v];
+                    for (v = target(*current[u].first, g); v != u; v = target(a, g)){
+                      a = *current[v].first;
                       if (color[v] == ColorTraits::white() 
                           || is_saturated(a)) {
-                        color[target(*current[v], g)] = ColorTraits::white();
+                        color[target(*current[v].first, g)] = ColorTraits::white();
                         if (color[v] != ColorTraits::white())
                           restart = v;
                       }
                     }
                     if (restart != u) {
                       u = restart;
-                      ++current[u];
+                      ++current[u].first;
                       break;
                     }
                   } // else if (color[v] == ColorTraits::gray())
                 } // if (capacity[a] == 0 ...
               } // for out_edges(u, g)  (though "u" changes during loop)
               
-              if (current[u] == out_edges(u, g).second) {
+              if ( current[u].first == current[u].second ) {
                 // scan of i is complete
                 color[u] = ColorTraits::black();
                 if (u != src) {
@@ -521,7 +520,7 @@ namespace boost {
                 }
                 if (u != r) {
                   u = parent[u];
-                  ++current[u];
+                  ++current[u].first;
                 } else
                   break;
               }
@@ -533,8 +532,8 @@ namespace boost {
         // note that the sink is not on the stack
         if (! bos_null) {
           for (u = tos; u != bos; u = topo_next[u]) {
-            ai = out_edges(u, g).first;
-            while (excess_flow[u] > 0 && ai != out_edges(u, g).second) {
+            tie(ai, a_end) = out_edges(u, g);
+            while (excess_flow[u] > 0 && ai != a_end) {
               if (capacity[*ai] == 0 && is_residual_edge(*ai))
                 push_flow(*ai);
               ++ai;
@@ -632,7 +631,7 @@ namespace boost {
 
       // will need to use random_access_property_map with these
       std::vector< FlowValue > excess_flow;
-      std::vector< out_edge_iterator > current;
+      std::vector< std::pair<out_edge_iterator, out_edge_iterator> > current;
       std::vector< distance_size_type > distance;
       std::vector< default_color_type > color;
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/r_c_shortest_paths.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/r_c_shortest_paths.hpp
new file mode 100644 (file)
index 0000000..22cdad8
--- /dev/null
@@ -0,0 +1,729 @@
+// r_c_shortest_paths.hpp header file
+
+// Copyright Michael Drexl 2005, 2006.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_R_C_SHORTEST_PATHS_HPP
+#define BOOST_GRAPH_R_C_SHORTEST_PATHS_HPP
+
+#include <map>
+#include <queue>
+#include <vector>
+
+#include <boost/graph/graph_traits.hpp>
+
+namespace boost {
+
+// r_c_shortest_paths_label struct
+template<class Graph, class Resource_Container>
+struct r_c_shortest_paths_label
+{
+  r_c_shortest_paths_label
+  ( const unsigned long n, 
+    const Resource_Container& rc = Resource_Container(), 
+    const r_c_shortest_paths_label* const pl = 0, 
+    const typename graph_traits<Graph>::edge_descriptor& ed = 
+      graph_traits<Graph>::edge_descriptor(), 
+    const typename graph_traits<Graph>::vertex_descriptor& vd = 
+      graph_traits<Graph>::vertex_descriptor() )
+  : num( n ), 
+    cumulated_resource_consumption( rc ), 
+    p_pred_label( pl ), 
+    pred_edge( ed ), 
+    resident_vertex( vd ), 
+    b_is_dominated( false ), 
+    b_is_processed( false )
+  {}
+  r_c_shortest_paths_label& operator=( const r_c_shortest_paths_label& other )
+  {
+    if( this == &other )
+      return *this;
+    this->~r_c_shortest_paths_label();
+    new( this ) r_c_shortest_paths_label( other );
+    return *this;
+  }
+  const unsigned long num;
+  Resource_Container cumulated_resource_consumption;
+  const r_c_shortest_paths_label* const p_pred_label;
+  const typename graph_traits<Graph>::edge_descriptor pred_edge;
+  const typename graph_traits<Graph>::vertex_descriptor resident_vertex;
+  bool b_is_dominated;
+  bool b_is_processed;
+}; // r_c_shortest_paths_label
+
+template<class Graph, class Resource_Container>
+inline bool operator==
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return 
+    l1.cumulated_resource_consumption == l2.cumulated_resource_consumption;
+}
+
+template<class Graph, class Resource_Container>
+inline bool operator!=
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return 
+    !( l1 == l2 );
+}
+
+template<class Graph, class Resource_Container>
+inline bool operator<
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return 
+    l1.cumulated_resource_consumption < l2.cumulated_resource_consumption;
+}
+
+template<class Graph, class Resource_Container>
+inline bool operator>
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return 
+    l2.cumulated_resource_consumption < l1.cumulated_resource_consumption;
+}
+
+template<class Graph, class Resource_Container>
+inline bool operator<=
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return 
+    l1 < l2 || l1 == l2;
+}
+
+template<class Graph, class Resource_Container>
+inline bool operator>=
+( const r_c_shortest_paths_label<Graph, Resource_Container>& l1, 
+  const r_c_shortest_paths_label<Graph, Resource_Container>& l2 )
+{
+  return l2 < l1 || l1 == l2;
+}
+
+namespace detail {
+
+// ks_smart_pointer class
+// from:
+// Kuhlins, S.; Schader, M. (1999):
+// Die C++-Standardbibliothek
+// Springer, Berlin
+// p. 333 f.
+template<class T>
+class ks_smart_pointer
+{
+public:
+  ks_smart_pointer( T* ptt = 0 ) : pt( ptt ) {}
+  ks_smart_pointer( const ks_smart_pointer& other ) : pt( other.pt ) {}
+  ks_smart_pointer& operator=( const ks_smart_pointer& other )
+    { pt = other.pt; return *this; }
+  ~ks_smart_pointer() {}
+  T& operator*() const { return *pt; }
+  T* operator->() const { return pt; }
+  T* get() const { return pt; }
+  operator T*() const { return pt; }
+  friend bool operator==( const ks_smart_pointer& t, 
+                          const ks_smart_pointer& u )
+    { return *t.pt == *u.pt; }
+  friend bool operator!=( const ks_smart_pointer& t, 
+                          const ks_smart_pointer& u )
+    { return *t.pt != *u.pt; }
+  friend bool operator<( const ks_smart_pointer& t, 
+                         const ks_smart_pointer& u )
+    { return *t.pt < *u.pt; }
+  friend bool operator>( const ks_smart_pointer& t, 
+                         const ks_smart_pointer& u )
+    { return *t.pt > *u.pt; }
+  friend bool operator<=( const ks_smart_pointer& t, 
+                          const ks_smart_pointer& u )
+    { return *t.pt <= *u.pt; }
+  friend bool operator>=( const ks_smart_pointer& t, 
+                          const ks_smart_pointer& u )
+    { return *t.pt >= *u.pt; }
+private:
+  T* pt;
+}; // ks_smart_pointer
+
+
+// r_c_shortest_paths_dispatch function (body/implementation)
+template<class Graph, 
+         class VertexIndexMap, 
+         class EdgeIndexMap, 
+         class Resource_Container, 
+         class Resource_Extension_Function, 
+         class Dominance_Function, 
+         class Label_Allocator, 
+         class Visitor>
+void r_c_shortest_paths_dispatch
+( const Graph& g, 
+  const VertexIndexMap& vertex_index_map, 
+  const EdgeIndexMap& edge_index_map, 
+  typename graph_traits<Graph>::vertex_descriptor s, 
+  typename graph_traits<Graph>::vertex_descriptor t, 
+  // each inner vector corresponds to a pareto-optimal path
+  std::vector
+    <std::vector
+      <typename graph_traits
+        <Graph>::edge_descriptor> >& pareto_optimal_solutions, 
+  std::vector
+    <Resource_Container>& pareto_optimal_resource_containers, 
+  bool b_all_pareto_optimal_solutions, 
+  // to initialize the first label/resource container 
+  // and to carry the type information
+  const Resource_Container& rc, 
+  Resource_Extension_Function& ref, 
+  Dominance_Function& dominance, 
+  // to specify the memory management strategy for the labels
+  Label_Allocator la, 
+  Visitor vis )
+{
+  pareto_optimal_resource_containers.clear();
+  pareto_optimal_solutions.clear();
+
+  unsigned long i_label_num = 0;
+  typedef 
+    typename 
+      Label_Allocator::template rebind
+        <r_c_shortest_paths_label
+          <Graph, Resource_Container> >::other LAlloc;
+  LAlloc l_alloc;
+  typedef 
+    ks_smart_pointer
+      <r_c_shortest_paths_label<Graph, Resource_Container> > Splabel;
+  std::priority_queue<Splabel, std::vector<Splabel>, std::greater<Splabel> > 
+    unprocessed_labels;
+
+  bool b_feasible = true;
+  r_c_shortest_paths_label<Graph, Resource_Container>* first_label = 
+    l_alloc.allocate( 1 );
+  l_alloc.construct
+    ( first_label, 
+      r_c_shortest_paths_label
+        <Graph, Resource_Container>( i_label_num++, 
+                                     rc, 
+                                     0, 
+                                     typename graph_traits<Graph>::
+                                       edge_descriptor(), 
+                                     s ) );
+
+  Splabel splabel_first_label = Splabel( first_label );
+  unprocessed_labels.push( splabel_first_label );
+  std::vector<std::list<Splabel> > vec_vertex_labels( num_vertices( g ) );
+  vec_vertex_labels[vertex_index_map[s]].push_back( splabel_first_label );
+  std::vector<typename std::list<Splabel>::iterator> 
+    vec_last_valid_positions_for_dominance( num_vertices( g ) );
+  for( int i = 0; i < static_cast<int>( num_vertices( g ) ); ++i )
+    vec_last_valid_positions_for_dominance[i] = vec_vertex_labels[i].begin();
+  std::vector<int> vec_last_valid_index_for_dominance( num_vertices( g ), 0 );
+  std::vector<bool> 
+    b_vec_vertex_already_checked_for_dominance( num_vertices( g ), false );
+  while( unprocessed_labels.size() )
+  {
+    Splabel cur_label = unprocessed_labels.top();
+    unprocessed_labels.pop();
+    vis.on_label_popped( *cur_label, g );
+    // an Splabel object in unprocessed_labels and the respective Splabel 
+    // object in the respective list<Splabel> of vec_vertex_labels share their 
+    // embedded r_c_shortest_paths_label object
+    // to avoid memory leaks, dominated 
+    // r_c_shortest_paths_label objects are marked and deleted when popped 
+    // from unprocessed_labels, as they can no longer be deleted at the end of 
+    // the function; only the Splabel object in unprocessed_labels still 
+    // references the r_c_shortest_paths_label object
+    // this is also for efficiency, because the else branch is executed only 
+    // if there is a chance that extending the 
+    // label leads to new undominated labels, which in turn is possible only 
+    // if the label to be extended is undominated
+    if( !cur_label->b_is_dominated )
+    {
+      int i_cur_resident_vertex_num = cur_label->resident_vertex;
+      std::list<Splabel>& list_labels_cur_vertex = 
+        vec_vertex_labels[i_cur_resident_vertex_num];
+      if( static_cast<int>( list_labels_cur_vertex.size() ) >= 2 
+          && vec_last_valid_index_for_dominance[i_cur_resident_vertex_num] 
+               < static_cast<int>( list_labels_cur_vertex.size() ) )
+      {
+        typename std::list<Splabel>::iterator outer_iter = 
+          list_labels_cur_vertex.begin();
+        bool b_outer_iter_at_or_beyond_last_valid_pos_for_dominance = false;
+        while( outer_iter != list_labels_cur_vertex.end() )
+        {
+          Splabel cur_outer_splabel = *outer_iter;
+          typename std::list<Splabel>::iterator inner_iter = outer_iter;
+          if( !b_outer_iter_at_or_beyond_last_valid_pos_for_dominance 
+              && outer_iter == 
+                   vec_last_valid_positions_for_dominance
+                     [i_cur_resident_vertex_num] )
+            b_outer_iter_at_or_beyond_last_valid_pos_for_dominance = true;
+          if( !b_vec_vertex_already_checked_for_dominance
+                [i_cur_resident_vertex_num] 
+              || b_outer_iter_at_or_beyond_last_valid_pos_for_dominance )
+          {
+            ++inner_iter;
+          }
+          else
+          {
+            inner_iter = 
+              vec_last_valid_positions_for_dominance
+                [i_cur_resident_vertex_num];
+            ++inner_iter;
+          }
+          bool b_outer_iter_erased = false;
+          while( inner_iter != list_labels_cur_vertex.end() )
+          {
+            Splabel cur_inner_splabel = *inner_iter;
+            if( dominance( cur_outer_splabel->
+                             cumulated_resource_consumption, 
+                           cur_inner_splabel->
+                             cumulated_resource_consumption ) )
+            {
+              typename std::list<Splabel>::iterator buf = inner_iter;
+              ++inner_iter;
+              list_labels_cur_vertex.erase( buf );
+              if( cur_inner_splabel->b_is_processed )
+              {
+                l_alloc.destroy( cur_inner_splabel.get() );
+                l_alloc.deallocate( cur_inner_splabel.get(), 1 );
+              }
+              else
+                cur_inner_splabel->b_is_dominated = true;
+              continue;
+            }
+            else
+              ++inner_iter;
+            if( dominance( cur_inner_splabel->
+                             cumulated_resource_consumption, 
+                           cur_outer_splabel->
+                             cumulated_resource_consumption ) )
+            {
+              typename std::list<Splabel>::iterator buf = outer_iter;
+              ++outer_iter;
+              list_labels_cur_vertex.erase( buf );
+              b_outer_iter_erased = true;
+              if( cur_outer_splabel->b_is_processed )
+              {
+                l_alloc.destroy( cur_outer_splabel.get() );
+                l_alloc.deallocate( cur_outer_splabel.get(), 1 );
+              }
+              else
+                cur_outer_splabel->b_is_dominated = true;
+              break;
+            }
+          }
+          if( !b_outer_iter_erased )
+            ++outer_iter;
+        }
+        if( static_cast<int>( list_labels_cur_vertex.size() ) > 1 )
+          vec_last_valid_positions_for_dominance[i_cur_resident_vertex_num] = 
+            (--(list_labels_cur_vertex.end()));
+        else
+          vec_last_valid_positions_for_dominance[i_cur_resident_vertex_num] = 
+            list_labels_cur_vertex.begin();
+        b_vec_vertex_already_checked_for_dominance
+          [i_cur_resident_vertex_num] = true;
+        vec_last_valid_index_for_dominance[i_cur_resident_vertex_num] = 
+          static_cast<int>( list_labels_cur_vertex.size() ) - 1;
+      }
+    }
+    if( !b_all_pareto_optimal_solutions && cur_label->resident_vertex == t )
+    {
+      // the devil don't sleep
+      if( cur_label->b_is_dominated )
+      {
+        l_alloc.destroy( cur_label.get() );
+        l_alloc.deallocate( cur_label.get(), 1 );
+      }
+      while( unprocessed_labels.size() )
+      {
+        Splabel l = unprocessed_labels.top();
+        unprocessed_labels.pop();
+        // delete only dominated labels, because nondominated labels are 
+        // deleted at the end of the function
+        if( l->b_is_dominated )
+        {
+          l_alloc.destroy( l.get() );
+          l_alloc.deallocate( l.get(), 1 );
+        }
+      }
+      break;
+    }
+    if( !cur_label->b_is_dominated )
+    {
+      cur_label->b_is_processed = true;
+      vis.on_label_not_dominated( *cur_label, g );
+      typename graph_traits<Graph>::vertex_descriptor cur_vertex = 
+        cur_label->resident_vertex;
+      typename graph_traits<Graph>::out_edge_iterator oei, oei_end;
+      for( tie( oei, oei_end ) = out_edges( cur_vertex, g ); 
+           oei != oei_end; 
+           ++oei )
+      {
+        b_feasible = true;
+        r_c_shortest_paths_label<Graph, Resource_Container>* new_label = 
+          l_alloc.allocate( 1 );
+        l_alloc.construct( new_label, 
+                           r_c_shortest_paths_label
+                             <Graph, Resource_Container>
+                               ( i_label_num++, 
+                                 cur_label->cumulated_resource_consumption, 
+                                 cur_label.get(), 
+                                 *oei, 
+                                 target( *oei, g ) ) );
+        b_feasible = 
+          ref( g, 
+               new_label->cumulated_resource_consumption, 
+               new_label->p_pred_label->cumulated_resource_consumption, 
+               new_label->pred_edge );
+
+        if( !b_feasible )
+        {
+          vis.on_label_not_feasible( *new_label, g );
+          l_alloc.destroy( new_label );
+          l_alloc.deallocate( new_label, 1 );
+        }
+        else
+        {
+          const r_c_shortest_paths_label<Graph, Resource_Container>& 
+            ref_new_label = *new_label;
+          vis.on_label_feasible( ref_new_label, g );
+          Splabel new_sp_label( new_label );
+          vec_vertex_labels[vertex_index_map[new_sp_label->resident_vertex]].
+            push_back( new_sp_label );
+          unprocessed_labels.push( new_sp_label );
+        }
+      }
+    }
+    else
+    {
+      vis.on_label_dominated( *cur_label, g );
+      l_alloc.destroy( cur_label.get() );
+      l_alloc.deallocate( cur_label.get(), 1 );
+    }
+  }
+  std::list<Splabel> dsplabels = vec_vertex_labels[vertex_index_map[t]];
+  typename std::list<Splabel>::const_iterator csi = dsplabels.begin();
+  typename std::list<Splabel>::const_iterator csi_end = dsplabels.end();
+  // if d could be reached from o
+  if( dsplabels.size() )
+  {
+    for( ; csi != csi_end; ++csi )
+    {
+      std::vector<typename graph_traits<Graph>::edge_descriptor> 
+        cur_pareto_optimal_path;
+      const r_c_shortest_paths_label<Graph, Resource_Container>* p_cur_label = 
+        (*csi).get();
+      pareto_optimal_resource_containers.
+        push_back( p_cur_label->cumulated_resource_consumption );
+      while( p_cur_label->num != 0 )
+      {
+        cur_pareto_optimal_path.push_back( p_cur_label->pred_edge );
+        p_cur_label = p_cur_label->p_pred_label;
+      }
+      pareto_optimal_solutions.push_back( cur_pareto_optimal_path );
+      if( !b_all_pareto_optimal_solutions )
+        break;
+    }
+  }
+
+  int i_size = static_cast<int>( vec_vertex_labels.size() );
+  for( int i = 0; i < i_size; ++i )
+  {
+    const std::list<Splabel>& list_labels_cur_vertex = vec_vertex_labels[i];
+    csi_end = list_labels_cur_vertex.end();
+    for( csi = list_labels_cur_vertex.begin(); csi != csi_end; ++csi )
+    {
+      l_alloc.destroy( (*csi).get() );
+      l_alloc.deallocate( (*csi).get(), 1 );
+    }
+  }
+} // r_c_shortest_paths_dispatch
+
+} // detail
+
+// default_r_c_shortest_paths_visitor struct
+struct default_r_c_shortest_paths_visitor
+{
+  template<class Label, class Graph>
+  void on_label_popped( const Label& l, const Graph& g ) {}
+  template<class Label, class Graph>
+  void on_label_feasible( const Label& l, const Graph& g ) {}
+  template<class Label, class Graph>
+  void on_label_not_feasible( const Label& l, const Graph& g ) {}
+  template<class Label, class Graph>
+  void on_label_dominated( const Label& l, const Graph& g ) {}
+  template<class Label, class Graph>
+  void on_label_not_dominated( const Label& l, const Graph& g ) {}
+}; // default_r_c_shortest_paths_visitor
+
+
+// default_r_c_shortest_paths_allocator
+typedef 
+  std::allocator<int> default_r_c_shortest_paths_allocator;
+// default_r_c_shortest_paths_allocator
+
+
+// r_c_shortest_paths functions (handle/interface)
+// first overload:
+// - return all pareto-optimal solutions
+// - specify Label_Allocator and Visitor arguments
+template<class Graph, 
+         class VertexIndexMap, 
+         class EdgeIndexMap, 
+         class Resource_Container, 
+         class Resource_Extension_Function, 
+         class Dominance_Function, 
+         class Label_Allocator, 
+         class Visitor>
+void r_c_shortest_paths
+( const Graph& g, 
+  const VertexIndexMap& vertex_index_map, 
+  const EdgeIndexMap& edge_index_map, 
+  typename graph_traits<Graph>::vertex_descriptor s, 
+  typename graph_traits<Graph>::vertex_descriptor t, 
+  // each inner vector corresponds to a pareto-optimal path
+  std::vector<std::vector<typename graph_traits<Graph>::edge_descriptor> >& 
+    pareto_optimal_solutions, 
+  std::vector<Resource_Container>& pareto_optimal_resource_containers, 
+  // to initialize the first label/resource container 
+  // and to carry the type information
+  const Resource_Container& rc, 
+  const Resource_Extension_Function& ref, 
+  const Dominance_Function& dominance, 
+  // to specify the memory management strategy for the labels
+  Label_Allocator la, 
+  Visitor vis )
+{
+  r_c_shortest_paths_dispatch( g, 
+                               vertex_index_map, 
+                               edge_index_map, 
+                               s, 
+                               t, 
+                               pareto_optimal_solutions, 
+                               pareto_optimal_resource_containers, 
+                               true, 
+                               rc, 
+                               ref, 
+                               dominance, 
+                               la, 
+                               vis );
+}
+
+// second overload:
+// - return only one pareto-optimal solution
+// - specify Label_Allocator and Visitor arguments
+template<class Graph, 
+         class VertexIndexMap, 
+         class EdgeIndexMap, 
+         class Resource_Container, 
+         class Resource_Extension_Function, 
+         class Dominance_Function, 
+         class Label_Allocator, 
+         class Visitor>
+void r_c_shortest_paths
+( const Graph& g, 
+  const VertexIndexMap& vertex_index_map, 
+  const EdgeIndexMap& edge_index_map, 
+  typename graph_traits<Graph>::vertex_descriptor s, 
+  typename graph_traits<Graph>::vertex_descriptor t, 
+  std::vector<typename graph_traits<Graph>::edge_descriptor>& 
+    pareto_optimal_solution, 
+  Resource_Container& pareto_optimal_resource_container, 
+  // to initialize the first label/resource container 
+  // and to carry the type information
+  const Resource_Container& rc, 
+  const Resource_Extension_Function& ref, 
+  const Dominance_Function& dominance, 
+  // to specify the memory management strategy for the labels
+  Label_Allocator la, 
+  Visitor vis )
+{
+  // each inner vector corresponds to a pareto-optimal path
+  std::vector<std::vector<typename graph_traits<Graph>::edge_descriptor> > 
+    pareto_optimal_solutions;
+  std::vector<Resource_Container> pareto_optimal_resource_containers;
+  r_c_shortest_paths_dispatch( g, 
+                               vertex_index_map, 
+                               edge_index_map, 
+                               s, 
+                               t, 
+                               pareto_optimal_solutions, 
+                               pareto_optimal_resource_containers, 
+                               false, 
+                               rc, 
+                               ref, 
+                               dominance, 
+                               la, 
+                               vis );
+  pareto_optimal_solution = pareto_optimal_solutions[0];
+  pareto_optimal_resource_container = pareto_optimal_resource_containers[0];
+}
+
+// third overload:
+// - return all pareto-optimal solutions
+// - use default Label_Allocator and Visitor
+template<class Graph, 
+         class VertexIndexMap, 
+         class EdgeIndexMap, 
+         class Resource_Container, 
+         class Resource_Extension_Function, 
+         class Dominance_Function>
+void r_c_shortest_paths
+( const Graph& g, 
+  const VertexIndexMap& vertex_index_map, 
+  const EdgeIndexMap& edge_index_map, 
+  typename graph_traits<Graph>::vertex_descriptor s, 
+  typename graph_traits<Graph>::vertex_descriptor t, 
+  // each inner vector corresponds to a pareto-optimal path
+  std::vector<std::vector<typename graph_traits<Graph>::edge_descriptor> >& 
+    pareto_optimal_solutions, 
+  std::vector<Resource_Container>& pareto_optimal_resource_containers, 
+  // to initialize the first label/resource container 
+  // and to carry the type information
+  const Resource_Container& rc, 
+  const Resource_Extension_Function& ref, 
+  const Dominance_Function& dominance )
+{
+  r_c_shortest_paths_dispatch( g, 
+                               vertex_index_map, 
+                               edge_index_map, 
+                               s, 
+                               t, 
+                               pareto_optimal_solutions, 
+                               pareto_optimal_resource_containers, 
+                               true, 
+                               rc, 
+                               ref, 
+                               dominance, 
+                               default_r_c_shortest_paths_allocator(), 
+                               default_r_c_shortest_paths_visitor() );
+}
+
+// fourth overload:
+// - return only one pareto-optimal solution
+// - use default Label_Allocator and Visitor
+template<class Graph, 
+         class VertexIndexMap, 
+         class EdgeIndexMap, 
+         class Resource_Container, 
+         class Resource_Extension_Function, 
+         class Dominance_Function>
+void r_c_shortest_paths
+( const Graph& g, 
+  const VertexIndexMap& vertex_index_map, 
+  const EdgeIndexMap& edge_index_map, 
+  typename graph_traits<Graph>::vertex_descriptor s, 
+  typename graph_traits<Graph>::vertex_descriptor t, 
+  std::vector<typename graph_traits<Graph>::edge_descriptor>& 
+    pareto_optimal_solution, 
+  Resource_Container& pareto_optimal_resource_container, 
+  // to initialize the first label/resource container 
+  // and to carry the type information
+  const Resource_Container& rc, 
+  const Resource_Extension_Function& ref, 
+  const Dominance_Function& dominance )
+{
+  // each inner vector corresponds to a pareto-optimal path
+  std::vector<std::vector<typename graph_traits<Graph>::edge_descriptor> > 
+    pareto_optimal_solutions;
+  std::vector<Resource_Container> pareto_optimal_resource_containers;
+  r_c_shortest_paths_dispatch( g, 
+                               vertex_index_map, 
+                               edge_index_map, 
+                               s, 
+                               t, 
+                               pareto_optimal_solutions, 
+                               pareto_optimal_resource_containers, 
+                               false, 
+                               rc, 
+                               ref, 
+                               dominance, 
+                               default_r_c_shortest_paths_allocator(), 
+                               default_r_c_shortest_paths_visitor() );
+  pareto_optimal_solution = pareto_optimal_solutions[0];
+  pareto_optimal_resource_container = pareto_optimal_resource_containers[0];
+}
+// r_c_shortest_paths
+
+
+// check_r_c_path function
+template<class Graph, 
+         class Resource_Container, 
+         class Resource_Extension_Function>
+void check_r_c_path( const Graph& g, 
+                     const std::vector
+                       <typename graph_traits
+                         <Graph>::edge_descriptor>& ed_vec_path, 
+                     const Resource_Container& initial_resource_levels, 
+                     // if true, computed accumulated final resource levels must 
+                     // be equal to desired_final_resource_levels
+                     // if false, computed accumulated final resource levels must 
+                     // be less than or equal to desired_final_resource_levels
+                     bool b_result_must_be_equal_to_desired_final_resource_levels, 
+                     const Resource_Container& desired_final_resource_levels, 
+                     Resource_Container& actual_final_resource_levels, 
+                     const Resource_Extension_Function& ref, 
+                     bool& b_is_a_path_at_all, 
+                     bool& b_feasible, 
+                     bool& b_correctly_extended, 
+                     typename graph_traits<Graph>::edge_descriptor& 
+                       ed_last_extended_arc )
+{
+  int i_size_ed_vec_path = static_cast<int>( ed_vec_path.size() );
+  std::vector<typename graph_traits<Graph>::edge_descriptor> buf_path;
+  if( i_size_ed_vec_path == 0 )
+    b_feasible = true;
+  else
+  {
+    if( i_size_ed_vec_path == 1 
+        || target( ed_vec_path[0], g ) == source( ed_vec_path[1], g ) )
+      buf_path = ed_vec_path;
+    else
+      for( int i = i_size_ed_vec_path - 1; i >= 0; --i )
+        buf_path.push_back( ed_vec_path[i] );
+    for( int i = 0; i < i_size_ed_vec_path - 1; ++i )
+    {
+      if( target( buf_path[i], g ) != source( buf_path[i + 1], g ) )
+      {
+        b_is_a_path_at_all = false;
+        b_feasible = false;
+        b_correctly_extended = false;
+        return;
+      }
+    }
+  }
+  b_is_a_path_at_all = true;
+  b_feasible = true;
+  b_correctly_extended = false;
+  Resource_Container current_resource_levels = initial_resource_levels;
+  actual_final_resource_levels = current_resource_levels;
+  for( int i = 0; i < i_size_ed_vec_path; ++i )
+  {
+    ed_last_extended_arc = buf_path[i];
+    b_feasible = ref( g, 
+                      actual_final_resource_levels, 
+                      current_resource_levels, 
+                      buf_path[i] );
+    current_resource_levels = actual_final_resource_levels;
+    if( !b_feasible )
+      return;
+  }
+  if( b_result_must_be_equal_to_desired_final_resource_levels )
+    b_correctly_extended = 
+     actual_final_resource_levels == desired_final_resource_levels ? 
+       true : false;
+  else
+  {
+    if( actual_final_resource_levels < desired_final_resource_levels 
+        || actual_final_resource_levels == desired_final_resource_levels )
+      b_correctly_extended = true;
+  }
+} // check_path
+
+} // namespace
+
+#endif // BOOST_GRAPH_R_C_SHORTEST_PATHS_HPP
similarity index 97%
rename from deal.II/contrib/boost/include/boost/graph/random.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/random.hpp
index 4159a0245525e50280204b43dda3f2e897aa9aad..bc53b8f3aa077dac0bd49c851cb45d09ac8f0b45 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <boost/pending/property.hpp>
 #include <boost/graph/properties.hpp>
+#include <boost/next_prior.hpp>
 
 #include <boost/graph/adjacency_list.hpp>
 #include <boost/graph/copy.hpp>
@@ -41,8 +42,7 @@ namespace boost {
     #endif
       typename graph_traits<Graph>::vertex_iterator
         i = vertices(g).first;
-      while (n-- > 0) ++i; // std::advance not VC++ portable
-      return *i;
+      return *(boost::next(i, n));
     } else
       return *vertices(g).first;
   }
@@ -62,8 +62,7 @@ namespace boost {
     #endif
       typename graph_traits<Graph>::edge_iterator
         i = edges(g).first;
-      while (n-- > 0) ++i; // std::advance not VC++ portable
-      return *i;
+      return *(boost::next(i, n));
     } else
       return *edges(g).first;
   }
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/random_layout.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/random_layout.hpp
new file mode 100644 (file)
index 0000000..4cd16f2
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_RANDOM_LAYOUT_HPP
+#define BOOST_GRAPH_RANDOM_LAYOUT_HPP
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/random/uniform_01.hpp>
+#include <boost/random/uniform_real.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/graph/iteration_macros.hpp>
+
+namespace boost {
+
+template<typename Topology,
+         typename Graph, typename PositionMap>
+void
+random_graph_layout
+ (const Graph& g, PositionMap position_map,
+  const Topology& topology)
+{
+  BGL_FORALL_VERTICES_T(v, g, Graph) {
+    put(position_map, v, topology.random_point());
+  }
+}
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_RANDOM_LAYOUT_HPP
similarity index 84%
rename from deal.II/contrib/boost/include/boost/graph/read_dimacs.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/read_dimacs.hpp
index 4d4d16010724eb25e0a4670bad58f433e994304b..f31482a41bd5be4b56c0699fb9a59cb9255a5f18 100644 (file)
@@ -9,24 +9,29 @@
 
 /*
   Reads maximal flow problem in extended DIMACS format.
-  This works, but could use some polishing. 
+  This works, but could use some polishing.
 */
 
 /* ----------------------------------------------------------------- */
 
 #include <vector>
-#include <istream>
-#include <stdio.h>
+#include <iostream>
+#include <string>
+#include <cstdio>
+#include <cstring>
+#include <cstdlib>
+
+#include <boost/graph/graph_traits.hpp>
 
 namespace boost {
 
 template <class Graph, class CapacityMap, class ReverseEdgeMap>
 int read_dimacs_max_flow(Graph& g,
-                         CapacityMap capacity, 
+                         CapacityMap capacity,
                          ReverseEdgeMap reverse_edge,
                          typename graph_traits<Graph>::vertex_descriptor& src,
                          typename graph_traits<Graph>::vertex_descriptor& sink,
-                         std::istream& in=std::cin)
+                         std::istream& in = std::cin)
 {
   //  const int MAXLINE = 100;      /* max line length in the input file */
   const int ARC_FIELDS = 3;     /* no of fields in arc line  */
@@ -37,7 +42,7 @@ int read_dimacs_max_flow(Graph& g,
   typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
   typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
   typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
-  
+
   std::vector<vertex_descriptor> verts;
 
   long m, n,                    /*  number of edges and nodes */
@@ -48,11 +53,11 @@ int read_dimacs_max_flow(Graph& g,
     no_nslines=0,               /* no of node-source-lines */
     no_nklines=0,               /* no of node-source-lines */
     no_alines=0;                /* no of arc-lines */
-  
+
   std::string in_line;          /* for reading input line */
-  char pr_type[3];              /* for reading type of the problem */
+  char pr_type[4];              /* for reading type of the problem */
   char nd;                      /* source (s) or sink (t) */
-  
+
   int k,                        /* temporary */
     err_no;                     /* no of detected error */
 
@@ -78,9 +83,9 @@ int read_dimacs_max_flow(Graph& g,
   const int EN19 = 18;
   const int EN20 = 19;
   const int EN22 = 20;
-  
-  static char *err_message[] = 
-  { 
+
+  static char *err_message[] =
+  {
     /* 0*/    "more than one problem line.",
     /* 1*/    "wrong number of parameters in the problem line.",
     /* 2*/    "it is not a Max Flow problem line.",
@@ -121,26 +126,26 @@ int read_dimacs_max_flow(Graph& g,
     case '\n':                 /* skip empty lines   */
     case '\0':                 /* skip empty lines at the end of file */
       break;
-      
+
     case 'p':                  /* problem description      */
       if ( no_plines > 0 )
         /* more than one problem line */
         { err_no = EN1 ; goto error; }
-      
+
       no_plines = 1;
-      
+
       if (
           /* reading problem line: type of problem, no of nodes, no of arcs */
-          sscanf ( in_line.c_str(), "%*c %3s %ld %ld", pr_type, &n, &m )
+          std::sscanf ( in_line.c_str(), "%*c %3s %ld %ld", pr_type, &n, &m )
           != P_FIELDS
           )
         /*wrong number of parameters in the problem line*/
         { err_no = EN2; goto error; }
-      
-      if ( strcmp ( pr_type, PROBLEM_TYPE ) )
+
+      if ( std::strcmp ( pr_type, PROBLEM_TYPE ) )
         /*wrong problem type*/
         { err_no = EN3; goto error; }
-      
+
       if ( n <= 0  || m <= 0 )
         /*wrong value of no of arcs or nodes*/
         { err_no = EN4; goto error; }
@@ -150,83 +155,83 @@ int read_dimacs_max_flow(Graph& g,
           verts.push_back(add_vertex(g));
       }
       break;
-      
+
     case 'n':                    /* source(s) description */
       if ( no_plines == 0 )
         /* there was not problem line above */
         { err_no = EN8; goto error; }
-      
+
       /* reading source  or sink */
-      k = sscanf ( in_line.c_str(),"%*c %ld %c", &i, &nd );
+      k = std::sscanf ( in_line.c_str(),"%*c %ld %c", &i, &nd );
       --i; // index from 0
       if ( k < NODE_FIELDS )
         /* node line is incorrect */
         { err_no = EN11; goto error; }
-      
+
       if ( i < 0 || i > n )
         /* wrong value of node */
         { err_no = EN12; goto error; }
-      
+
       switch (nd) {
       case 's':  /* source line */
-        
+
         if ( no_nslines != 0)
-          /* more than one source line */ 
+          /* more than one source line */
           { err_no = EN9; goto error; }
-        
+
         no_nslines = 1;
         src = verts[i];
         break;
-        
+
       case 't':  /* sink line */
-        
+
         if ( no_nklines != 0)
           /* more than one sink line */
           { err_no = EN9; goto error; }
-        
+
         no_nklines = 1;
         sink = verts[i];
         break;
-        
+
       default:
         /* wrong type of node-line */
-        err_no = EN12; goto error; 
+        err_no = EN12; goto error;
       }
       break;
-      
+
     case 'a':                    /* arc description */
-      if ( no_nslines == 0 || no_nklines == 0 ) 
+      if ( no_nslines == 0 || no_nklines == 0 )
         /* there was not source and sink description above */
         { err_no = EN14; goto error; }
-      
+
       if ( no_alines >= m )
         /*too many arcs on input*/
         { err_no = EN16; goto error; }
-      
+
       if (
           /* reading an arc description */
-          sscanf ( in_line.c_str(),"%*c %ld %ld %ld",
-                   &tail, &head, &cap )
+          std::sscanf ( in_line.c_str(),"%*c %ld %ld %ld",
+                        &tail, &head, &cap )
           != ARC_FIELDS
-          ) 
+          )
         /* arc description is not correct */
         { err_no = EN15; goto error; }
 
       --tail; // index from 0, not 1
       --head;
       if ( tail < 0  ||  tail > n  ||
-           head < 0  ||  head > n  
+           head < 0  ||  head > n
            )
         /* wrong value of nodes */
         { err_no = EN17; goto error; }
 
-      {      
-        edge_descriptor e1, e2; 
+      {
+        edge_descriptor e1, e2;
         bool in1, in2;
         tie(e1, in1) = add_edge(verts[tail], verts[head], g);
         tie(e2, in2) = add_edge(verts[head], verts[tail], g);
         if (!in1 || !in2) {
-          std::cerr << "unable to add edge (" << head << "," << tail << ")" 
+          std::cerr << "unable to add edge (" << head << "," << tail << ")"
                     << std::endl;
           return -1;
         }
@@ -237,39 +242,39 @@ int read_dimacs_max_flow(Graph& g,
       }
       ++no_alines;
       break;
-      
+
     default:
       /* unknown type of line */
       err_no = EN18; goto error;
-      
+
     } /* end of switch */
   }     /* end of input loop */
-  
-  /* ----- all is red  or  error while reading ----- */ 
-  
-  if ( feof (stdin) == 0 ) /* reading error */
-    { err_no=EN21; goto error; } 
-  
+
+  /* ----- all is red  or  error while reading ----- */
+
+  if ( in.eof() == 0 ) /* reading error */
+    { err_no=EN21; goto error; }
+
   if ( no_lines == 0 ) /* empty input */
-    { err_no = EN22; goto error; } 
-  
+    { err_no = EN22; goto error; }
+
   if ( no_alines < m ) /* not enough arcs */
-    { err_no = EN19; goto error; } 
-  
-  if ( out_degree(src, g) == 0 || out_degree(sink, g) == 0  ) 
+    { err_no = EN19; goto error; }
+
+  if ( out_degree(src, g) == 0 || out_degree(sink, g) == 0  )
     /* no arc goes out of the source */
     { err_no = EN20; goto error; }
-  
+
   /* Thanks God! all is done */
   return (0);
-  
+
   /* ---------------------------------- */
  error:  /* error found reading input */
-  
-  printf ( "\nline %ld of input - %s\n", 
-           no_lines, err_message[err_no] );
-  
-  exit (1);
+
+  std::printf ( "\nline %ld of input - %s\n",
+                no_lines, err_message[err_no] );
+
+  std::exit (1);
   return (0); /* to avoid warning */
 }
 /* --------------------   end of parser  -------------------*/
similarity index 83%
rename from deal.II/contrib/boost/include/boost/graph/relax.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/relax.hpp
index 29205d19405f124fb3e07b333a865d902a4bd059..1d2250a80da87bfce87e6fa0f397fe2c2d27789b 100644 (file)
@@ -12,7 +12,7 @@
 #include <functional>
 #include <boost/limits.hpp> // for numeric limits
 #include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost {
 
@@ -24,11 +24,10 @@ namespace boost {
     {
       T operator()(const T& a, const T& b) const {
         using namespace std;
-       T zero(0);
-       T result = a + b;
-       if (result < zero && a >= zero && b >= zero)
-         return (numeric_limits<T>::max)();
-       return result;
+       const T inf = (std::numeric_limits<T>::max)();
+       if (a == inf) return inf;
+       if (b == inf) return inf;
+       return a + b;
       }
     };
     
@@ -49,14 +48,17 @@ namespace boost {
       D d_u = get(d, u), d_v = get(d, v);
       W w_e = get(w, e);
       
+      // The redundant gets in the return statements are to ensure that extra
+      // floating-point precision in x87 registers does not lead to relax()
+      // returning true when the distance did not actually change.
       if ( compare(combine(d_u, w_e), d_v) ) {
         put(d, v, combine(d_u, w_e));
         put(p, v, u);
-        return true;
+        return compare(get(d, v), d_v);
       } else if (is_undirected && compare(combine(d_v, w_e), d_u)) {
         put(d, u, combine(d_v, w_e));
         put(p, u, v);
-        return true;
+        return compare(get(d, u), d_u);
       } else
         return false;
     }
similarity index 86%
rename from deal.II/contrib/boost/include/boost/graph/reverse_graph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/reverse_graph.hpp
index 314584fabf317f5e6d75f2f36d9e7f218e0740e7..8fbd6364b811b90ac41507246cf3bf23d20508f8 100644 (file)
@@ -76,9 +76,9 @@ class reverse_graph {
     typedef typename Traits::edges_size_type edges_size_type;
 
     // More typedefs used by detail::edge_property_map, vertex_property_map
-    typedef typename BidirectionalGraph::edge_property_type
+    typedef typename boost::edge_property_type<BidirectionalGraph>::type
       edge_property_type;
-    typedef typename BidirectionalGraph::vertex_property_type
+    typedef typename boost::vertex_property_type<BidirectionalGraph>::type
       vertex_property_type;
     typedef reverse_graph_tag graph_tag;
 
@@ -146,16 +146,16 @@ edges(const reverse_graph<BidirectionalGraph,GRef>& g)
 }
 
 template <class BidirectionalGraph, class GRef>
-inline std::pair<typename BidirectionalGraph::in_edge_iterator,
-                 typename BidirectionalGraph::in_edge_iterator>
-out_edges(const typename BidirectionalGraph::vertex_descriptor u,
+inline std::pair<typename graph_traits<BidirectionalGraph>::in_edge_iterator,
+                 typename graph_traits<BidirectionalGraph>::in_edge_iterator>
+out_edges(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
           const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return in_edges(u, g.m_g);
 }
 
 template <class BidirectionalGraph, class GRef>
-inline typename BidirectionalGraph::vertices_size_type
+inline typename graph_traits<BidirectionalGraph>::vertices_size_type
 num_vertices(const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return num_vertices(g.m_g);
@@ -169,26 +169,27 @@ num_edges(const reverse_graph<BidirectionalGraph,GRef>& g)
 }
 
 template <class BidirectionalGraph, class GRef>
-inline typename BidirectionalGraph::degree_size_type
-out_degree(const typename BidirectionalGraph::vertex_descriptor u,
+inline typename graph_traits<BidirectionalGraph>::degree_size_type
+out_degree(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
            const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return in_degree(u, g.m_g);
 }
 
 template <class BidirectionalGraph, class GRef>
-inline std::pair<typename BidirectionalGraph::edge_descriptor, bool>
-edge(const typename BidirectionalGraph::vertex_descriptor u,
-     const typename BidirectionalGraph::vertex_descriptor v,
+inline std::pair<typename graph_traits<BidirectionalGraph>::edge_descriptor, 
+                 bool>
+edge(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
+     const typename graph_traits<BidirectionalGraph>::vertex_descriptor v,
      const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return edge(v, u, g.m_g);
 }
 
 template <class BidirectionalGraph, class GRef>
-inline std::pair<typename BidirectionalGraph::out_edge_iterator,
-    typename BidirectionalGraph::out_edge_iterator>
-in_edges(const typename BidirectionalGraph::vertex_descriptor u,
+inline std::pair<typename graph_traits<BidirectionalGraph>::out_edge_iterator,
+                 typename graph_traits<BidirectionalGraph>::out_edge_iterator>
+in_edges(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
          const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return out_edges(u, g.m_g);
@@ -197,20 +198,20 @@ in_edges(const typename BidirectionalGraph::vertex_descriptor u,
 template <class BidirectionalGraph, class GRef>
 inline std::pair<typename reverse_graph<BidirectionalGraph,GRef>::adjacency_iterator,
     typename reverse_graph<BidirectionalGraph,GRef>::adjacency_iterator>
-adjacent_vertices(const typename BidirectionalGraph::vertex_descriptor u,
+adjacent_vertices(typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
                   const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     typedef reverse_graph<BidirectionalGraph,GRef> Graph;
-    typename Graph::out_edge_iterator first, last;
+    typename graph_traits<Graph>::out_edge_iterator first, last;
     tie(first, last) = out_edges(u, g);
-    typedef typename Graph::adjacency_iterator adjacency_iterator;
+    typedef typename graph_traits<Graph>::adjacency_iterator adjacency_iterator;
     return std::make_pair(adjacency_iterator(first, const_cast<Graph*>(&g)),
                           adjacency_iterator(last, const_cast<Graph*>(&g)));
 }
 
 template <class BidirectionalGraph, class GRef>
-inline typename BidirectionalGraph::degree_size_type
-in_degree(const typename BidirectionalGraph::vertex_descriptor u,
+inline typename graph_traits<BidirectionalGraph>::degree_size_type
+in_degree(const typename graph_traits<BidirectionalGraph>::vertex_descriptor u,
           const reverse_graph<BidirectionalGraph,GRef>& g)
 {
     return out_degree(u, g.m_g);
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/rmat_graph_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/rmat_graph_generator.hpp
new file mode 100644 (file)
index 0000000..8761b0c
--- /dev/null
@@ -0,0 +1,594 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_RMAT_GENERATOR_HPP
+#define BOOST_GRAPH_RMAT_GENERATOR_HPP
+
+#include <math.h>
+#include <iterator>
+#include <utility>
+#include <vector>
+#include <queue>
+#include <map>
+#include <boost/shared_ptr.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/random/uniform_01.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/test/floating_point_comparison.hpp>
+
+using boost::shared_ptr;
+using boost::uniform_01;
+
+// Returns floor(log_2(n)), and -1 when n is 0
+template <typename IntegerType>
+inline int int_log2(IntegerType n) {
+  int l = 0;
+  while (n > 0) {++l; n >>= 1;}
+  return l - 1;
+}
+
+struct keep_all_edges {
+  template <typename T>
+  bool operator()(const T&, const T&) { return true; }
+};
+
+template <typename Distribution, typename ProcessId>
+struct keep_local_edges {
+
+  keep_local_edges(const Distribution& distrib, const ProcessId& id)
+    : distrib(distrib), id(id)
+  { }
+
+  template <typename T>
+  bool operator()(const T& x, const T& y)
+  { return distrib(x) == id || distrib(y) == id; }
+
+private:
+  const Distribution& distrib;
+  const ProcessId&    id;
+};
+
+template <typename RandomGenerator, typename T>
+void
+generate_permutation_vector(RandomGenerator& gen, std::vector<T>& vertexPermutation, T n)
+{
+  using boost::uniform_int;
+
+  vertexPermutation.resize(n);
+
+  // Generate permutation map of vertex numbers
+  uniform_int<T> rand_vertex(0, n-1);
+  for (T i = 0; i < n; ++i)
+    vertexPermutation[i] = i;
+
+  // Can't use std::random_shuffle unless we create another (synchronized) PRNG
+  for (T i = 0; i < n; ++i)
+    std::swap(vertexPermutation[i], vertexPermutation[rand_vertex(gen)]);
+}
+
+template <typename RandomGenerator, typename T>
+std::pair<T,T>
+generate_edge(shared_ptr<uniform_01<RandomGenerator> > prob, T n,
+              unsigned int SCALE, double a, double b, double c, double d)
+{
+  T u = 0, v = 0;
+  T step = n/2;
+  for (unsigned int j = 0; j < SCALE; ++j) {
+    double p = (*prob)();
+
+    if (p < a)
+      ;
+    else if (p >= a && p < a + b)
+      v += step;
+    else if (p >= a + b && p < a + b + c)
+      u += step;
+    else { // p > a + b + c && p < a + b + c + d
+      u += step;
+      v += step;
+    }
+
+    step /= 2;
+
+    // 0.2 and 0.9 are hardcoded in the reference SSCA implementation.
+    // The maximum change in any given value should be less than 10%
+    a *= 0.9 + 0.2 * (*prob)();
+    b *= 0.9 + 0.2 * (*prob)();
+    c *= 0.9 + 0.2 * (*prob)();
+    d *= 0.9 + 0.2 * (*prob)();
+
+    double S = a + b + c + d;
+
+    a /= S; b /= S; c /= S;
+    // d /= S;
+    // Ensure all values add up to 1, regardless of floating point errors
+    d = 1. - a - b - c;
+  }
+
+  return std::make_pair(u, v);
+}
+
+namespace boost {
+
+  /*
+    Chakrabarti's R-MAT scale free generator.
+
+    For all flavors of the R-MAT iterator a+b+c+d must equal 1 and for the
+    unique_rmat_iterator 'm' << 'n^2'.  If 'm' is too close to 'n^2' the
+    generator may be unable to generate sufficient unique edges
+
+    To get a true scale free distribution {a, b, c, d : a > b, a > c, a > d}
+  */
+
+  template<typename RandomGenerator, typename Graph>
+  class rmat_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    // No argument constructor, set to terminating condition
+    rmat_iterator()
+      : gen(), edge(0) { }
+
+    // Initialize for edge generation
+    rmat_iterator(RandomGenerator& gen, vertices_size_type n,
+                  edges_size_type m, double a, double b, double c,
+                  double d, bool permute_vertices = true)
+      : gen(), n(n), a(a), b(b), c(c), d(d), edge(m),
+        permute_vertices(permute_vertices),
+        SCALE(int_log2(n))
+
+    {
+      this->gen.reset(new uniform_01<RandomGenerator>(gen));
+
+      assert(boost::test_tools::check_is_close(a + b + c + d, 1., boost::test_tools::fraction_tolerance(1.e-5)));
+
+      if (permute_vertices)
+        generate_permutation_vector(gen, vertexPermutation, n);
+
+      // TODO: Generate the entire adjacency matrix then "Clip and flip" if undirected graph
+
+      // Generate the first edge
+      vertices_size_type u, v;
+      tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+      if (permute_vertices)
+        current = std::make_pair(vertexPermutation[u],
+                                 vertexPermutation[v]);
+      else
+        current = std::make_pair(u, v);
+
+      --edge;
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    rmat_iterator& operator++()
+    {
+      vertices_size_type u, v;
+      tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+      if (permute_vertices)
+        current = std::make_pair(vertexPermutation[u],
+                                 vertexPermutation[v]);
+      else
+        current = std::make_pair(u, v);
+
+      --edge;
+
+      return *this;
+    }
+
+    rmat_iterator operator++(int)
+    {
+      rmat_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const rmat_iterator& other) const
+    {
+      return edge == other.edge;
+    }
+
+    bool operator!=(const rmat_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+
+    // Parameters
+    shared_ptr<uniform_01<RandomGenerator> > gen;
+    vertices_size_type n;
+    double a, b, c, d;
+    int edge;
+    bool permute_vertices;
+    int SCALE;
+
+    // Internal data structures
+    std::vector<vertices_size_type> vertexPermutation;
+    value_type current;
+  };
+
+  // Sorted version for CSR
+  template <typename T>
+  struct sort_pair {
+    bool operator() (const std::pair<T,T>& x, const std::pair<T,T>& y)
+    {
+      if (x.first == y.first)
+        return x.second > y.second;
+      else
+        return x.first > y.first;
+    }
+  };
+
+  template<typename RandomGenerator, typename Graph,
+           typename EdgePredicate = keep_all_edges>
+  class sorted_rmat_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    // No argument constructor, set to terminating condition
+    sorted_rmat_iterator()
+      : gen(), values(sort_pair<vertices_size_type>()), done(true)
+    { }
+
+    // Initialize for edge generation
+    sorted_rmat_iterator(RandomGenerator& gen, vertices_size_type n,
+                         edges_size_type m, double a, double b, double c,
+                         double d, bool permute_vertices = true,
+                         EdgePredicate ep = keep_all_edges())
+      : gen(), permute_vertices(permute_vertices),
+        values(sort_pair<vertices_size_type>()), done(false)
+
+    {
+      assert(boost::test_tools::check_is_close(a + b + c + d, 1., boost::test_tools::fraction_tolerance(1.e-5)));
+
+      this->gen.reset(new uniform_01<RandomGenerator>(gen));
+
+      std::vector<vertices_size_type> vertexPermutation;
+      if (permute_vertices)
+        generate_permutation_vector(gen, vertexPermutation, n);
+
+      // TODO: "Clip and flip" if undirected graph
+      int SCALE = int_log2(n);
+
+      for (edges_size_type i = 0; i < m; ++i) {
+
+        vertices_size_type u, v;
+        tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+        if (permute_vertices) {
+          if (ep(vertexPermutation[u], vertexPermutation[v]))
+            values.push(std::make_pair(vertexPermutation[u], vertexPermutation[v]));
+        } else {
+          if (ep(u, v))
+            values.push(std::make_pair(u, v));
+        }
+
+      }
+
+      current = values.top();
+      values.pop();
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    sorted_rmat_iterator& operator++()
+    {
+      if (!values.empty()) {
+        current = values.top();
+        values.pop();
+      } else
+        done = true;
+
+      return *this;
+    }
+
+    sorted_rmat_iterator operator++(int)
+    {
+      sorted_rmat_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const sorted_rmat_iterator& other) const
+    {
+      return values.empty() && other.values.empty() && done && other.done;
+    }
+
+    bool operator!=(const sorted_rmat_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+
+    // Parameters
+    shared_ptr<uniform_01<RandomGenerator> > gen;
+    bool permute_vertices;
+
+    // Internal data structures
+    std::priority_queue<value_type, std::vector<value_type>, sort_pair<vertices_size_type> > values;
+    value_type current;
+    bool       done;
+  };
+
+
+  // This version is slow but guarantees unique edges
+  template<typename RandomGenerator, typename Graph,
+           typename EdgePredicate = keep_all_edges>
+  class unique_rmat_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    // No argument constructor, set to terminating condition
+    unique_rmat_iterator()
+        : gen(), done(true)
+    { }
+
+    // Initialize for edge generation
+    unique_rmat_iterator(RandomGenerator& gen, vertices_size_type n,
+                         edges_size_type m, double a, double b, double c,
+                         double d, bool permute_vertices = true,
+                         EdgePredicate ep = keep_all_edges())
+      : gen(), done(false)
+
+    {
+      assert(boost::test_tools::check_is_close(a + b + c + d, 1., boost::test_tools::fraction_tolerance(1.e-5)));
+
+      this->gen.reset(new uniform_01<RandomGenerator>(gen));
+
+      std::vector<vertices_size_type> vertexPermutation;
+      if (permute_vertices)
+        generate_permutation_vector(gen, vertexPermutation, n);
+
+      int SCALE = int_log2(n);
+
+      std::map<value_type, bool> edge_map;
+
+      edges_size_type edges = 0;
+      do {
+        vertices_size_type u, v;
+        tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+        // Lowest vertex number always comes first
+        // (this means we don't have to worry about i->j and j->i being in the edge list)
+        if (u > v && is_same<directed_category, undirected_tag>::value)
+          std::swap(u, v);
+
+        if (edge_map.find(std::make_pair(u, v)) == edge_map.end()) {
+          edge_map[std::make_pair(u, v)] = true;
+
+          if (permute_vertices) {
+            if (ep(vertexPermutation[u], vertexPermutation[v]))
+              values.push_back(std::make_pair(vertexPermutation[u], vertexPermutation[v]));
+          } else {
+            if (ep(u, v))
+              values.push_back(std::make_pair(u, v));
+          }
+
+          edges++;
+        }
+      } while (edges < m);
+      // NGE - Asking for more than n^2 edges will result in an infinite loop here
+      //       Asking for a value too close to n^2 edges may as well
+
+      current = values.back();
+      values.pop_back();
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    unique_rmat_iterator& operator++()
+    {
+      if (!values.empty()) {
+        current = values.back();
+        values.pop_back();
+      } else
+        done = true;
+
+      return *this;
+    }
+
+    unique_rmat_iterator operator++(int)
+    {
+      unique_rmat_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const unique_rmat_iterator& other) const
+    {
+      return values.empty() && other.values.empty() && done && other.done;
+    }
+
+    bool operator!=(const unique_rmat_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+
+    // Parameters
+    shared_ptr<uniform_01<RandomGenerator> > gen;
+
+    // Internal data structures
+    std::vector<value_type> values;
+    value_type              current;
+    bool                    done;
+  };
+
+  // This version is slow but guarantees unique edges
+  template<typename RandomGenerator, typename Graph,
+           typename EdgePredicate = keep_all_edges>
+  class sorted_unique_rmat_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
+    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    // No argument constructor, set to terminating condition
+    sorted_unique_rmat_iterator()
+      : gen(), values(sort_pair<vertices_size_type>()), done(true) { }
+
+    // Initialize for edge generation
+    sorted_unique_rmat_iterator(RandomGenerator& gen, vertices_size_type n,
+                                edges_size_type m, double a, double b, double c,
+                                double d, bool bidirectional = false,
+                                bool permute_vertices = true,
+                                EdgePredicate ep = keep_all_edges())
+      : gen(), bidirectional(bidirectional),
+        values(sort_pair<vertices_size_type>()), done(false)
+
+    {
+      assert(boost::test_tools::check_is_close(a + b + c + d, 1., boost::test_tools::fraction_tolerance(1.e-5)));
+
+      this->gen.reset(new uniform_01<RandomGenerator>(gen));
+
+      std::vector<vertices_size_type> vertexPermutation;
+      if (permute_vertices)
+        generate_permutation_vector(gen, vertexPermutation, n);
+
+      int SCALE = int_log2(n);
+
+      std::map<value_type, bool> edge_map;
+
+      edges_size_type edges = 0;
+      do {
+
+        vertices_size_type u, v;
+        tie(u, v) = generate_edge(this->gen, n, SCALE, a, b, c, d);
+
+        if (bidirectional) {
+          if (edge_map.find(std::make_pair(u, v)) == edge_map.end()) {
+            edge_map[std::make_pair(u, v)] = true;
+            edge_map[std::make_pair(v, u)] = true;
+
+            if (ep(u, v)) {
+              if (permute_vertices) {
+                values.push(std::make_pair(vertexPermutation[u], vertexPermutation[v]));
+                values.push(std::make_pair(vertexPermutation[v], vertexPermutation[u]));
+              } else {
+                values.push(std::make_pair(u, v));
+                values.push(std::make_pair(v, u));
+              }
+           }
+
+            ++edges;
+          }
+        } else {
+          // Lowest vertex number always comes first
+          // (this means we don't have to worry about i->j and j->i being in the edge list)
+          if (u > v && is_same<directed_category, undirected_tag>::value)
+            std::swap(u, v);
+
+          if (edge_map.find(std::make_pair(u, v)) == edge_map.end()) {
+            edge_map[std::make_pair(u, v)] = true;
+
+            if (permute_vertices) {
+              if (ep(vertexPermutation[u], vertexPermutation[v]))
+                values.push(std::make_pair(vertexPermutation[u], vertexPermutation[v]));
+            } else {
+              if (ep(u, v))
+                values.push(std::make_pair(u, v));
+            }
+
+            ++edges;
+          }
+        }
+
+      } while (edges < m);
+      // NGE - Asking for more than n^2 edges will result in an infinite loop here
+      //       Asking for a value too close to n^2 edges may as well
+
+      current = values.top();
+      values.pop();
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+
+    sorted_unique_rmat_iterator& operator++()
+    {
+      if (!values.empty()) {
+        current = values.top();
+        values.pop();
+      } else
+        done = true;
+
+      return *this;
+    }
+
+    sorted_unique_rmat_iterator operator++(int)
+    {
+      sorted_unique_rmat_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const sorted_unique_rmat_iterator& other) const
+    {
+      return values.empty() && other.values.empty() && done && other.done;
+    }
+
+    bool operator!=(const sorted_unique_rmat_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+
+    // Parameters
+    shared_ptr<uniform_01<RandomGenerator> > gen;
+    bool             bidirectional;
+
+    // Internal data structures
+    std::priority_queue<value_type, std::vector<value_type>,
+                        sort_pair<vertices_size_type> > values;
+    value_type current;
+    bool       done;
+  };
+
+} // end namespace boost
+
+#ifdef BOOST_GRAPH_USE_MPI
+#include <boost/graph/distributed/rmat_graph_generator.hpp>
+#endif // BOOST_GRAPH_USE_MPI
+
+#endif // BOOST_GRAPH_RMAT_GENERATOR_HPP
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/sequential_vertex_coloring.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/sequential_vertex_coloring.hpp
index 606f2e52d257ef6dcf4759d0eecc520b6bc6e515..f5362b3c4135f39ba1029c03f382df2f36c36b9c 100644 (file)
@@ -13,7 +13,7 @@
 #include <vector>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/tuple/tuple.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/limits.hpp>
 
 #ifdef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
similarity index 98%
rename from deal.II/contrib/boost/include/boost/graph/sloan_ordering.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/sloan_ordering.hpp
index b0855e5a1f0d03ae031b786f2e02c4a1bb90e273..ff5748dd7f3c6da050d36d57086f94585eb0a3ac 100644 (file)
 
 #define WEIGHT1 1               //default weight for the distance in the Sloan algorithm
 #define WEIGHT2 2               //default weight for the degree in the Sloan algorithm
-#define MAXINT 2147483647       //Maximum value for a 32bit integer
 
 #include <boost/config.hpp>
 #include <vector>
 #include <queue>
+#include <algorithm>
+#include <limits>
 #include <boost/pending/queue.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/breadth_first_search.hpp>
 #include <boost/graph/properties.hpp>
 #include <boost/pending/indirect_cmp.hpp>
-#include <boost/property_map.hpp>
-#include <algorithm>
-#include <utility>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/visitors.hpp>
 #include <boost/graph/adjacency_list.hpp>
 #include <boost/graph/cuthill_mckee_ordering.hpp>
@@ -195,9 +194,9 @@ namespace boost {
       //end 3 & 4
 
       
-      //step 5
-      //Initializing w
-      w_e = MAXINT;
+      // step 5
+      // Initializing w
+      w_e = (std::numeric_limits<unsigned>::max)();
       //end 5
       
       
similarity index 88%
rename from deal.II/contrib/boost/include/boost/graph/small_world_generator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/small_world_generator.hpp
index ae2663371933965840dc4cbd7d8e6cf66bea6323..4822e26ce7ad451be9daa6921185f5c564e21406 100644 (file)
@@ -20,7 +20,7 @@ namespace boost {
   template<typename RandomGenerator, typename Graph>
   class small_world_iterator
   {
-    typedef typename graph_traits<Graph>::vertices_size_type 
+    typedef typename graph_traits<Graph>::vertices_size_type
       vertices_size_type;
 
   public:
@@ -31,20 +31,20 @@ namespace boost {
     typedef void difference_type;
 
     small_world_iterator() : gen(0) {}
-    small_world_iterator(RandomGenerator& gen, vertices_size_type n, 
-                         vertices_size_type k, double prob = 0.0, 
-                         bool allow_self_loops = false) 
-      : gen(&gen), n(n), k(k), prob(prob), source(0), 
-        target(allow_self_loops? 0 : 1), 
-        allow_self_loops(allow_self_loops), 
+    small_world_iterator(RandomGenerator& gen, vertices_size_type n,
+                         vertices_size_type k, double prob = 0.0,
+                         bool allow_self_loops = false)
+      : gen(&gen), n(n), k(k), prob(prob), source(0),
+        target(allow_self_loops? 0 : 1),
+        allow_self_loops(allow_self_loops),
         current(0, allow_self_loops? 0 : 1)
     { }
 
     reference operator*() const { return current; }
     pointer operator->() const { return &current; }
-    
+
     small_world_iterator& operator++()
-    { 
+    {
       target = (target + 1) % n;
       if (target == (source + k/2 + 1) % n) {
         ++source;
@@ -62,8 +62,8 @@ namespace boost {
         vertices_size_type upper = (source + k/2) % n;
         do {
           current.second = rand_vertex_gen(*gen);
-        } while (current.second >= lower && current.second <= upper
-                 || (upper < lower 
+        } while ((current.second >= lower && current.second <= upper)
+                 || (upper < lower
                      && (current.second >= lower || current.second <= upper)));
       } else {
         current.second = target;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/ssca_graph_generator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/ssca_graph_generator.hpp
new file mode 100644 (file)
index 0000000..18d4a23
--- /dev/null
@@ -0,0 +1,169 @@
+// Copyright 2004, 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_SSCA_GENERATOR_HPP
+#define BOOST_GRAPH_SSCA_GENERATOR_HPP
+
+#include <iterator>
+#include <utility>
+#include <vector>
+#include <queue>
+#include <boost/config.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+enum Direction {FORWARD = 1, BACKWARD = 2, BOTH = FORWARD | BACKWARD};
+
+namespace boost {
+
+  // This generator generates graphs according to the method specified
+  // in SSCA 1.1.  Current versions of SSCA use R-MAT graphs
+
+  template<typename RandomGenerator, typename Graph>
+  class ssca_iterator
+  {
+    typedef typename graph_traits<Graph>::directed_category directed_category;
+    typedef typename graph_traits<Graph>::vertices_size_type 
+      vertices_size_type;
+
+  public:
+    typedef std::input_iterator_tag iterator_category;
+    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
+    typedef const value_type& reference;
+    typedef const value_type* pointer;
+    typedef void difference_type;
+
+    // No argument constructor, set to terminating condition
+    ssca_iterator()
+      : gen(), verticesRemaining(0) { }
+
+    // Initialize for edge generation
+    ssca_iterator(RandomGenerator& gen, vertices_size_type totVertices, 
+                  vertices_size_type maxCliqueSize, double probUnidirectional, 
+                  int maxParallelEdges, double probIntercliqueEdges) 
+      : gen(&gen), totVertices(totVertices), maxCliqueSize(maxCliqueSize), 
+        probUnidirectional(probUnidirectional), maxParallelEdges(maxParallelEdges),
+        probIntercliqueEdges(probIntercliqueEdges), currentClique(0), 
+        verticesRemaining(totVertices)
+    { 
+      cliqueNum = std::vector<int>(totVertices, -1);
+      current = std::make_pair(0,0);
+    }
+
+    reference operator*() const { return current; }
+    pointer operator->() const { return &current; }
+    
+    ssca_iterator& operator++()
+    {
+      BOOST_USING_STD_MIN();
+      while (values.empty() && verticesRemaining > 0) { // If there are no values left, generate a new clique
+        uniform_int<vertices_size_type> clique_size(1, maxCliqueSize);
+        uniform_int<vertices_size_type> rand_vertex(0, totVertices-1);
+        uniform_int<int> num_parallel_edges(1, maxParallelEdges);
+        uniform_int<short> direction(0,1);
+        uniform_01<RandomGenerator> prob(*gen);
+        std::vector<vertices_size_type> cliqueVertices;
+
+        cliqueVertices.clear();
+        vertices_size_type size = min BOOST_PREVENT_MACRO_SUBSTITUTION (clique_size(*gen), verticesRemaining);
+        while (cliqueVertices.size() < size) {
+          vertices_size_type v = rand_vertex(*gen);
+          if (cliqueNum[v] == -1) {
+            cliqueNum[v] = currentClique;
+            cliqueVertices.push_back(v);
+            verticesRemaining--;
+          }
+        }  // Nick: This is inefficient when only a few vertices remain...
+           //       I should probably just select the remaining vertices 
+           //       in order when only a certain fraction remain.
+
+        typename std::vector<vertices_size_type>::iterator first, second;
+        for (first = cliqueVertices.begin(); first != cliqueVertices.end(); ++first)
+          for (second = first+1; second != cliqueVertices.end(); ++second) {
+            Direction d;
+            int edges;
+
+            d = prob() < probUnidirectional ? (direction(*gen) == 0 ? FORWARD : BACKWARD) : BOTH;
+
+            if (d & FORWARD) {
+              edges = num_parallel_edges(*gen);
+              for (int i = 0; i < edges; ++i)
+                values.push(std::make_pair(*first, *second));
+            }
+              
+            if (d & BACKWARD) {
+              edges = num_parallel_edges(*gen);
+              for (int i = 0; i < edges; ++i)
+                values.push(std::make_pair(*second, *first));
+            }
+          }
+
+        if (verticesRemaining == 0) {
+          // Generate interclique edges
+          for (vertices_size_type i = 0; i < totVertices; ++i) {
+            double p = probIntercliqueEdges;
+            for (vertices_size_type d = 2; d < totVertices/2; d *= 2, p/= 2) {
+              vertices_size_type j = (i+d) % totVertices;
+              if (cliqueNum[j] != cliqueNum[i] && prob() < p) {
+                int edges = num_parallel_edges(*gen);
+                for (int i = 0; i < edges; ++i)
+                  values.push(std::make_pair(i, j));
+              }
+            }
+          }
+        }
+
+        currentClique++;
+      } 
+
+      if (!values.empty()) { // If we're not done return a value
+        current = values.front();
+        values.pop();
+      }
+
+      return *this;
+    }
+
+    ssca_iterator operator++(int)
+    {
+      ssca_iterator temp(*this);
+      ++(*this);
+      return temp;
+    }
+
+    bool operator==(const ssca_iterator& other) const
+    {
+      return verticesRemaining == other.verticesRemaining && values.empty() && other.values.empty();
+    }
+
+    bool operator!=(const ssca_iterator& other) const
+    { return !(*this == other); }
+
+  private:
+
+    // Parameters
+    RandomGenerator* gen;
+    vertices_size_type totVertices;
+    vertices_size_type maxCliqueSize;
+    double probUnidirectional;
+    int maxParallelEdges;
+    double probIntercliqueEdges;
+
+    // Internal data structures
+    std::vector<int> cliqueNum;
+    std::queue<value_type> values;
+    int currentClique;
+    vertices_size_type verticesRemaining;
+    value_type current;
+  };
+
+} // end namespace boost
+
+#endif // BOOST_GRAPH_SSCA_GENERATOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/st_connected.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/st_connected.hpp
new file mode 100644 (file)
index 0000000..9801a27
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) 2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
+#define BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/two_bit_color_map.hpp>
+#include <boost/graph/iteration_macros.hpp>
+#include <boost/pending/queue.hpp>
+
+namespace boost { namespace graph {
+
+template<typename Graph, typename ColorMap>
+bool 
+st_connected(const Graph& g, 
+             typename graph_traits<Graph>::vertex_descriptor s,
+             typename graph_traits<Graph>::vertex_descriptor t,
+             ColorMap color)
+{
+  typedef typename property_traits<ColorMap>::value_type Color;
+  typedef color_traits<Color> ColorTraits;
+  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+  // Set all vertices to white (unvisited)
+  BGL_FORALL_VERTICES_T(v, g, Graph)
+    put(color, v, ColorTraits::white());
+
+  // Vertices found from the source are grey
+  put(color, s, ColorTraits::gray());
+
+  // Vertices found from the target are greeen
+  put(color, t, ColorTraits::green());
+  queue<Vertex> Q;
+  Q.push(s);
+  Q.push(t);
+
+  while (!Q.empty()) {
+    Vertex u = Q.top(); Q.pop();
+    Color u_color = get(color, u);
+
+    BGL_FORALL_OUTEDGES_T(u, e, g, Graph) {
+      Vertex v = target(e, g);
+      Color v_color = get(color, v);
+      if (v_color == ColorTraits::white()) {
+        // We have not seen "v" before; mark it with the same color as u
+        Color u_color = get(color, u);
+        put(color, v, u_color);
+        
+        // Push it on the queue
+        Q.push(v);
+      } else if (v_color != ColorTraits::black() && u_color != v_color) {
+        // Colors have collided. We're done!
+        return true;
+      }
+    }
+    // u is done, so mark it black
+    put(color, u, ColorTraits::black());
+  }
+
+  return false;
+}
+
+template<typename Graph>
+inline bool 
+st_connected(const Graph& g, 
+             typename graph_traits<Graph>::vertex_descriptor s,
+             typename graph_traits<Graph>::vertex_descriptor t)
+{
+  return st_connected(g, s, t, 
+                      make_two_bit_color_map(num_vertices(g),
+                                             get(vertex_index, g)));
+}
+
+} } // end namespace boost::graph
+
+#endif // BOOST_GRAPH_DISTRIBUTED_ST_CONNECTED_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/stanford_graph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/stanford_graph.hpp
index c98bba1167c2f8a26693dd4e854fb69cc89ff405..0bb798c0f3ce63483ed46cea8de9f2e26aa2f047 100644 (file)
@@ -12,7 +12,7 @@
 #include <boost/config.hpp>
 #include <boost/iterator.hpp>
 #include <boost/operators.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/graph/strong_components.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/strong_components.hpp
index 0ed0b4a19b1b632d60b30980b6b0b59cf792c8f8..9469010a846cbf409cdf02ee2e4a72318292298d 100644 (file)
@@ -17,6 +17,7 @@
 #include <boost/graph/depth_first_search.hpp>
 #include <boost/type_traits/conversion_traits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/graph/overloading.hpp>
 
 namespace boost {
 
@@ -219,7 +220,8 @@ namespace boost {
             class P, class T, class R>
   inline typename property_traits<ComponentMap>::value_type
   strong_components(const Graph& g, ComponentMap comp,
-                    const bgl_named_params<P, T, R>& params)
+                    const bgl_named_params<P, T, R>& params
+                    BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, vertex_list_graph_tag))
   {
     typedef typename graph_traits<Graph>::directed_category DirCat;
     BOOST_STATIC_ASSERT((is_convertible<DirCat*, directed_tag*>::value == true));
@@ -229,7 +231,8 @@ namespace boost {
 
   template <class Graph, class ComponentMap>
   inline typename property_traits<ComponentMap>::value_type
-  strong_components(const Graph& g, ComponentMap comp)
+  strong_components(const Graph& g, ComponentMap comp
+                    BOOST_GRAPH_ENABLE_IF_MODELS_PARM(Graph, vertex_list_graph_tag))
   {
     typedef typename graph_traits<Graph>::directed_category DirCat;
     BOOST_STATIC_ASSERT((is_convertible<DirCat*, directed_tag*>::value == true));
@@ -331,4 +334,8 @@ namespace boost {
 
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/strong_components.hpp>
+#endif
+
 #endif // BOOST_GRAPH_STRONG_COMPONENTS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/subgraph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/subgraph.hpp
new file mode 100644 (file)
index 0000000..ba2405f
--- /dev/null
@@ -0,0 +1,1221 @@
+//=======================================================================
+// Copyright 2001 University of Notre Dame.
+// Authors: Jeremy G. Siek and Lie-Quan Lee
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//=======================================================================
+
+#ifndef BOOST_SUBGRAPH_HPP
+#define BOOST_SUBGRAPH_HPP
+
+// UNDER CONSTRUCTION
+
+#include <boost/config.hpp>
+#include <list>
+#include <vector>
+#include <map>
+#include <cassert>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/graph_mutability_traits.hpp>
+#include <boost/graph/properties.hpp>
+#include <boost/iterator/indirect_iterator.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost {
+
+struct subgraph_tag { };
+
+/** @name Property Lookup
+ * The local_property and global_property functions are used to create
+ * structures that determine the lookup strategy for properties in subgraphs.
+ * Note that the nested kind member is used to help interoperate with actual
+ * Property types.
+ */
+//@{
+template <typename T>
+struct local_property
+{
+    typedef T kind;
+    local_property(T x) : value(x) { }
+    T value;
+};
+
+template <typename T>
+inline local_property<T> local(T x)
+{ return local_property<T>(x); }
+
+template <typename T>
+struct global_property
+{
+    typedef T kind;
+    global_property(T x) : value(x) { }
+    T value;
+};
+
+template <typename T>
+inline global_property<T> global(T x)
+{ return global_property<T>(x); }
+//@}
+
+// Invariants of an induced subgraph:
+//   - If vertex u is in subgraph g, then u must be in g.parent().
+//   - If edge e is in subgraph g, then e must be in g.parent().
+//   - If edge e=(u,v) is in the root graph, then edge e
+//     is also in any subgraph that contains both vertex u and v.
+
+// The Graph template parameter must have a vertex_index and edge_index
+// internal property. It is assumed that the vertex indices are assigned
+// automatically by the graph during a call to add_vertex(). It is not
+// assumed that the edge vertices are assigned automatically, they are
+// explicitly assigned here.
+
+template <typename Graph>
+class subgraph {
+    typedef graph_traits<Graph> Traits;
+    typedef std::list<subgraph<Graph>*> ChildrenList;
+public:
+// Graph requirements
+typedef typename Traits::vertex_descriptor         vertex_descriptor;
+typedef typename Traits::edge_descriptor           edge_descriptor;
+typedef typename Traits::directed_category         directed_category;
+typedef typename Traits::edge_parallel_category    edge_parallel_category;
+typedef typename Traits::traversal_category        traversal_category;
+
+    // IncidenceGraph requirements
+    typedef typename Traits::out_edge_iterator         out_edge_iterator;
+    typedef typename Traits::degree_size_type          degree_size_type;
+
+    // AdjacencyGraph requirements
+    typedef typename Traits::adjacency_iterator        adjacency_iterator;
+
+    // VertexListGraph requirements
+    typedef typename Traits::vertex_iterator           vertex_iterator;
+    typedef typename Traits::vertices_size_type        vertices_size_type;
+
+    // EdgeListGraph requirements
+    typedef typename Traits::edge_iterator             edge_iterator;
+    typedef typename Traits::edges_size_type           edges_size_type;
+
+    typedef typename Traits::in_edge_iterator          in_edge_iterator;
+
+    typedef typename Graph::edge_property_type         edge_property_type;
+    typedef typename Graph::vertex_property_type       vertex_property_type;
+    typedef typename Graph::vertex_bundled             vertex_bundled;
+    typedef typename Graph::edge_bundled               edge_bundled;
+    typedef subgraph_tag                               graph_tag;
+    typedef Graph                                      graph_type;
+    typedef typename Graph::graph_property_type        graph_property_type;
+
+    // Create the main graph, the root of the subgraph tree
+    subgraph()
+        : m_parent(0), m_edge_counter(0)
+    { }
+
+    subgraph(const graph_property_type& p)
+        : m_graph(p), m_parent(0), m_edge_counter(0)
+    { }
+
+    subgraph(vertices_size_type n, const graph_property_type& p = graph_property_type())
+        : m_graph(n, p), m_parent(0), m_edge_counter(0), m_global_vertex(n)
+    {
+        typename Graph::vertex_iterator v, v_end;
+        vertices_size_type i = 0;
+        for(tie(v, v_end) = vertices(m_graph); v != v_end; ++v)
+            m_global_vertex[i++] = *v;
+    }
+
+    // copy constructor
+    subgraph(const subgraph& x)
+        : m_graph(x.m_graph), m_parent(x.m_parent), m_edge_counter(x.m_edge_counter)
+        , m_global_vertex(x.m_global_vertex), m_global_edge(x.m_global_edge)
+    {
+        // Do a deep copy (recursive).
+        for(typename ChildrenList::const_iterator i = x.m_children.begin();
+            i != x.m_children.end(); ++i)
+        {
+            m_children.push_back(new subgraph<Graph>( **i ));
+        }
+    }
+
+
+    ~subgraph() {
+      for(typename ChildrenList::iterator i = m_children.begin();
+          i != m_children.end(); ++i)
+        {
+            delete *i;
+        }
+    }
+
+    // Return a null vertex descriptor for the graph.
+    static vertex_descriptor null_vertex()
+    { return Traits::null_vertex(); }
+
+
+    // Create a subgraph
+    subgraph<Graph>& create_subgraph() {
+        m_children.push_back(new subgraph<Graph>());
+        m_children.back()->m_parent = this;
+        return *m_children.back();
+    }
+
+    // Create a subgraph with the specified vertex set.
+    template <typename VertexIterator>
+    subgraph<Graph>& create_subgraph(VertexIterator first, VertexIterator last) {
+        m_children.push_back(new subgraph<Graph>());
+        m_children.back()->m_parent = this;
+        for(; first != last; ++first) {
+            add_vertex(*first, *m_children.back());
+        }
+        return *m_children.back();
+    }
+
+    // local <-> global descriptor conversion functions
+    vertex_descriptor local_to_global(vertex_descriptor u_local) const
+    { return m_global_vertex[u_local]; }
+
+    vertex_descriptor global_to_local(vertex_descriptor u_global) const {
+        vertex_descriptor u_local; bool in_subgraph;
+        tie(u_local, in_subgraph) = this->find_vertex(u_global);
+        assert(in_subgraph == true);
+        return u_local;
+    }
+
+    edge_descriptor local_to_global(edge_descriptor e_local) const
+    { return m_global_edge[get(get(edge_index, m_graph), e_local)]; }
+
+    edge_descriptor global_to_local(edge_descriptor e_global) const
+    { return (*m_local_edge.find(get(get(edge_index, root().m_graph), e_global))).second; }
+
+    // Is vertex u (of the root graph) contained in this subgraph?
+    // If so, return the matching local vertex.
+    std::pair<vertex_descriptor, bool>
+    find_vertex(vertex_descriptor u_global) const {
+        typename std::map<vertex_descriptor, vertex_descriptor>::const_iterator
+            i = m_local_vertex.find(u_global);
+        bool valid = i != m_local_vertex.end();
+        return std::make_pair((valid ? (*i).second : null_vertex()), valid);
+    }
+
+    // Return the parent graph.
+    subgraph& parent() { return *m_parent; }
+    const subgraph& parent() const { return *m_parent; }
+
+    // Return true if this is the root subgraph
+    bool is_root() const { return m_parent == 0; }
+
+    // Return the root graph of the subgraph tree.
+    subgraph& root()
+    { return is_root() ? *this : m_parent->root(); }
+
+    const subgraph& root() const
+    { return is_root() ? *this : m_parent->root(); }
+
+    // Return the children subgraphs of this graph/subgraph.
+    // Use a list of pointers because the VC++ std::list doesn't like
+    // storing incomplete type.
+    typedef indirect_iterator<
+        typename ChildrenList::const_iterator
+      , subgraph<Graph>
+      , std::bidirectional_iterator_tag
+    >
+    children_iterator;
+
+    typedef indirect_iterator<
+        typename ChildrenList::const_iterator
+      , subgraph<Graph> const
+      , std::bidirectional_iterator_tag
+    >
+    const_children_iterator;
+
+    std::pair<const_children_iterator, const_children_iterator> children() const {
+      return std::make_pair(const_children_iterator(m_children.begin()),
+                            const_children_iterator(m_children.end()));
+    }
+
+    std::pair<children_iterator, children_iterator> children() {
+      return std::make_pair(children_iterator(m_children.begin()),
+                            children_iterator(m_children.end()));
+    }
+
+    std::size_t num_children() const { return m_children.size(); }
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+    // Defualt property access delegates the lookup to global properties.
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type&
+    operator[](Descriptor x)
+    { return is_root() ? m_graph[x] : root().m_graph[local_to_global(x)]; }
+
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type const&
+    operator[](Descriptor x) const
+    { return is_root() ? m_graph[x] : root().m_graph[local_to_global(x)]; }
+
+    // Local property access returns the local property of the given descripor.
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type&
+    operator[](local_property<Descriptor> x)
+    { return m_graph[x.value]; }
+
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type const&
+    operator[](local_property<Descriptor> x) const
+    { return m_graph[x.value]; }
+
+    // Global property access returns the global property associated with the
+    // given descriptor. This is an alias for the default bundled property
+    // access operations.
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type&
+    operator[](global_property<Descriptor> x)
+    { return (*this)[x.value]; }
+
+    template <typename Descriptor>
+    typename graph::detail::bundled_result<Graph, Descriptor>::type const&
+    operator[](global_property<Descriptor> x) const
+    { return (*this)[x.value]; }
+
+#endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+
+    //  private:
+    typedef typename property_map<Graph, edge_index_t>::type EdgeIndexMap;
+    typedef typename property_traits<EdgeIndexMap>::value_type edge_index_type;
+    BOOST_STATIC_ASSERT((!is_same<edge_index_type,
+                        boost::detail::error_property_not_found>::value));
+
+private:
+    typedef std::vector<vertex_descriptor> GlobalVertexList;
+    typedef std::vector<edge_descriptor> GlobalEdgeList;
+    typedef std::map<vertex_descriptor, vertex_descriptor> LocalVertexMap;
+    typedef std::map<edge_index_type, edge_descriptor> LocalEdgeMap;
+    // TODO: Should the LocalVertexMap be: map<index_type, descriptor>?
+    // TODO: Can we relax the indexing requirement if both descriptors are
+    // LessThanComparable?
+    // TODO: Should we really be using unorderd_map for improved lookup times?
+
+public: // Probably shouldn't be public....
+    Graph m_graph;
+    subgraph<Graph>* m_parent;
+    edge_index_type m_edge_counter; // for generating unique edge indices
+    ChildrenList m_children;
+    GlobalVertexList m_global_vertex; // local -> global
+    LocalVertexMap m_local_vertex;  // global -> local
+    GlobalEdgeList m_global_edge;              // local -> global
+    LocalEdgeMap m_local_edge; // global -> local
+
+    edge_descriptor local_add_edge(vertex_descriptor u_local,
+                                   vertex_descriptor v_local,
+                                   edge_descriptor e_global)
+    {
+        edge_descriptor e_local;
+        bool inserted;
+        tie(e_local, inserted) = add_edge(u_local, v_local, m_graph);
+        put(edge_index, m_graph, e_local, m_edge_counter++);
+        m_global_edge.push_back(e_global);
+        m_local_edge[get(get(edge_index, this->root()), e_global)] = e_local;
+        return e_local;
+    }
+};
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+// TODO: I don't think these are required since the default metafunction
+// returns Graph::vertex_bundled.
+template <typename Graph>
+struct vertex_bundle_type<subgraph<Graph> >
+    : vertex_bundle_type<Graph>
+{ };
+
+template<typename Graph>
+struct edge_bundle_type<subgraph<Graph> >
+    : edge_bundle_type<Graph>
+{ };
+#endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+
+//===========================================================================
+// Functions special to the Subgraph Class
+
+template <typename G>
+typename subgraph<G>::vertex_descriptor
+add_vertex(typename subgraph<G>::vertex_descriptor u_global,
+           subgraph<G>& g)
+{
+    assert(!g.is_root());
+    typename subgraph<G>::vertex_descriptor u_local, v_global, uu_global;
+    typename subgraph<G>::edge_descriptor e_global;
+
+    u_local = add_vertex(g.m_graph);
+    g.m_global_vertex.push_back(u_global);
+    g.m_local_vertex[u_global] = u_local;
+
+    subgraph<G>& r = g.root();
+
+    // remember edge global and local maps
+    {
+        typename subgraph<G>::out_edge_iterator ei, ei_end;
+        for (tie(ei, ei_end) = out_edges(u_global, r);
+            ei != ei_end; ++ei) {
+            e_global = *ei;
+            v_global = target(e_global, r);
+            if (g.find_vertex(v_global).second == true)
+            g.local_add_edge(u_local, g.global_to_local(v_global), e_global);
+        }
+    }
+    if (is_directed(g)) { // not necessary for undirected graph
+        typename subgraph<G>::vertex_iterator vi, vi_end;
+        typename subgraph<G>::out_edge_iterator ei, ei_end;
+        for(tie(vi, vi_end) = vertices(r); vi != vi_end; ++vi) {
+            v_global = *vi;
+            if(g.find_vertex(v_global).second)
+            for(tie(ei, ei_end) = out_edges(*vi, r); ei != ei_end; ++ei) {
+                e_global = *ei;
+                uu_global = target(e_global, r);
+                if(uu_global == u_global && g.find_vertex(v_global).second) {
+                    g.local_add_edge(g.global_to_local(v_global), u_local, e_global);
+                }
+            }
+        }
+    }
+
+    return u_local;
+}
+
+// NOTE: Descriptors are local unless otherwise noted.
+
+//===========================================================================
+// Functions required by the IncidenceGraph concept
+
+template <typename G>
+std::pair<typename graph_traits<G>::out_edge_iterator,
+          typename graph_traits<G>::out_edge_iterator>
+out_edges(typename graph_traits<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return out_edges(v, g.m_graph); }
+
+template <typename G>
+typename graph_traits<G>::degree_size_type
+out_degree(typename graph_traits<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return out_degree(v, g.m_graph); }
+
+template <typename G>
+typename graph_traits<G>::vertex_descriptor
+source(typename graph_traits<G>::edge_descriptor e, const subgraph<G>& g)
+{ return source(e, g.m_graph); }
+
+template <typename G>
+typename graph_traits<G>::vertex_descriptor
+target(typename graph_traits<G>::edge_descriptor e, const subgraph<G>& g)
+{ return target(e, g.m_graph); }
+
+//===========================================================================
+// Functions required by the BidirectionalGraph concept
+
+template <typename G>
+std::pair<typename graph_traits<G>::in_edge_iterator,
+          typename graph_traits<G>::in_edge_iterator>
+in_edges(typename graph_traits<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return in_edges(v, g.m_graph); }
+
+template <typename G>
+typename graph_traits<G>::degree_size_type
+in_degree(typename graph_traits<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return in_degree(v, g.m_graph); }
+
+template <typename G>
+typename graph_traits<G>::degree_size_type
+degree(typename graph_traits<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return degree(v, g.m_graph); }
+
+//===========================================================================
+// Functions required by the AdjacencyGraph concept
+
+template <typename G>
+std::pair<typename subgraph<G>::adjacency_iterator,
+          typename subgraph<G>::adjacency_iterator>
+adjacent_vertices(typename subgraph<G>::vertex_descriptor v, const subgraph<G>& g)
+{ return adjacent_vertices(v, g.m_graph); }
+
+//===========================================================================
+// Functions required by the VertexListGraph concept
+
+template <typename G>
+std::pair<typename subgraph<G>::vertex_iterator,
+          typename subgraph<G>::vertex_iterator>
+vertices(const subgraph<G>& g)
+{ return vertices(g.m_graph); }
+
+template <typename G>
+typename subgraph<G>::vertices_size_type
+num_vertices(const subgraph<G>& g)
+{ return num_vertices(g.m_graph); }
+
+//===========================================================================
+// Functions required by the EdgeListGraph concept
+
+template <typename G>
+std::pair<typename subgraph<G>::edge_iterator,
+          typename subgraph<G>::edge_iterator>
+edges(const subgraph<G>& g)
+{ return edges(g.m_graph); }
+
+template <typename G>
+typename subgraph<G>::edges_size_type
+num_edges(const subgraph<G>& g)
+{ return num_edges(g.m_graph); }
+
+//===========================================================================
+// Functions required by the AdjacencyMatrix concept
+
+template <typename G>
+std::pair<typename subgraph<G>::edge_descriptor, bool>
+edge(typename subgraph<G>::vertex_descriptor u,
+     typename subgraph<G>::vertex_descriptor v,
+     const subgraph<G>& g)
+{ return edge(u, v, g.m_graph); }
+
+//===========================================================================
+// Functions required by the MutableGraph concept
+
+namespace detail {
+
+    template <typename Vertex, typename Edge, typename Graph>
+    void add_edge_recur_down(Vertex u_global, Vertex v_global, Edge e_global,
+                             subgraph<Graph>& g);
+
+    template <typename Vertex, typename Edge, typename Children, typename G>
+    void children_add_edge(Vertex u_global, Vertex v_global, Edge e_global,
+                           Children& c, subgraph<G>* orig)
+    {
+        for(typename Children::iterator i = c.begin(); i != c.end(); ++i) {
+            if ((*i)->find_vertex(u_global).second &&
+                (*i)->find_vertex(v_global).second)
+            {
+                add_edge_recur_down(u_global, v_global, e_global, **i, orig);
+            }
+        }
+    }
+
+    template <typename Vertex, typename Edge, typename Graph>
+    void add_edge_recur_down(Vertex u_global, Vertex v_global, Edge e_global,
+                             subgraph<Graph>& g, subgraph<Graph>* orig)
+    {
+        if(&g != orig ) {
+            // add local edge only if u_global and v_global are in subgraph g
+            Vertex u_local, v_local;
+            bool u_in_subgraph, v_in_subgraph;
+            tie(u_local, u_in_subgraph) = g.find_vertex(u_global);
+            tie(v_local, v_in_subgraph) = g.find_vertex(v_global);
+            if(u_in_subgraph && v_in_subgraph) {
+                g.local_add_edge(u_local, v_local, e_global);
+            }
+        }
+        children_add_edge(u_global, v_global, e_global, g.m_children, orig);
+    }
+
+    template <typename Vertex, typename Graph>
+    std::pair<typename subgraph<Graph>::edge_descriptor, bool>
+    add_edge_recur_up(Vertex u_global, Vertex v_global,
+                      const typename Graph::edge_property_type& ep,
+                      subgraph<Graph>& g, subgraph<Graph>* orig)
+    {
+        if(g.is_root()) {
+            typename subgraph<Graph>::edge_descriptor e_global;
+            bool inserted;
+            tie(e_global, inserted) = add_edge(u_global, v_global, ep, g.m_graph);
+            put(edge_index, g.m_graph, e_global, g.m_edge_counter++);
+            g.m_global_edge.push_back(e_global);
+            children_add_edge(u_global, v_global, e_global, g.m_children, orig);
+            return std::make_pair(e_global, inserted);
+        } else {
+            return add_edge_recur_up(u_global, v_global, ep, *g.m_parent, orig);
+        }
+    }
+
+} // namespace detail
+
+// Add an edge to the subgraph g, specified by the local vertex descriptors u
+// and v. In addition, the edge will be added to any (all) other subgraphs that
+// contain vertex descriptors u and v.
+
+template <typename G>
+std::pair<typename subgraph<G>::edge_descriptor, bool>
+add_edge(typename subgraph<G>::vertex_descriptor u,
+         typename subgraph<G>::vertex_descriptor v,
+         const typename G::edge_property_type& ep,
+         subgraph<G>& g)
+{
+    if (g.is_root()) {
+        // u and v are really global
+        return detail::add_edge_recur_up(u, v, ep, g, &g);
+    } else {
+        typename subgraph<G>::edge_descriptor e_local, e_global;
+        bool inserted;
+        tie(e_global, inserted) =
+            detail::add_edge_recur_up(g.local_to_global(u),
+                                      g.local_to_global(v),
+                                      ep, g, &g);
+        e_local = g.local_add_edge(u, v, e_global);
+        return std::make_pair(e_local, inserted);
+    }
+}
+
+template <typename G>
+std::pair<typename subgraph<G>::edge_descriptor, bool>
+add_edge(typename subgraph<G>::vertex_descriptor u,
+         typename subgraph<G>::vertex_descriptor v,
+         subgraph<G>& g)
+{ return add_edge(u, v, typename G::edge_property_type(), g); }
+
+namespace detail {
+    //-------------------------------------------------------------------------
+    // implementation of remove_edge(u,v,g)
+    template <typename Vertex, typename Graph>
+    void remove_edge_recur_down(Vertex u_global, Vertex v_global,
+                                subgraph<Graph>& g);
+
+    template <typename Vertex, typename Children>
+    void children_remove_edge(Vertex u_global, Vertex v_global,
+                              Children& c)
+    {
+        for(typename Children::iterator i = c.begin(); i != c.end(); ++i) {
+            if((*i)->find_vertex(u_global).second &&
+               (*i)->find_vertex(v_global).second)
+            {
+                remove_edge_recur_down(u_global, v_global, **i);
+            }
+        }
+    }
+
+    template <typename Vertex, typename Graph>
+    void remove_edge_recur_down(Vertex u_global, Vertex v_global,
+                                subgraph<Graph>& g)
+    {
+        Vertex u_local, v_local;
+        u_local = g.m_local_vertex[u_global];
+        v_local = g.m_local_vertex[v_global];
+        remove_edge(u_local, v_local, g.m_graph);
+        children_remove_edge(u_global, v_global, g.m_children);
+    }
+
+    template <typename Vertex, typename Graph>
+    void remove_edge_recur_up(Vertex u_global, Vertex v_global,
+                              subgraph<Graph>& g)
+    {
+        if(g.is_root()) {
+            remove_edge(u_global, v_global, g.m_graph);
+            children_remove_edge(u_global, v_global, g.m_children);
+        } else {
+            remove_edge_recur_up(u_global, v_global, *g.m_parent);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+    // implementation of remove_edge(e,g)
+    template <typename Edge, typename Graph>
+    void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g);
+
+    template <typename Edge, typename Children>
+    void children_remove_edge(Edge e_global, Children& c)
+    {
+        for(typename Children::iterator i = c.begin(); i != c.end(); ++i) {
+            if((*i)->find_vertex(source(e_global, **i)).second &&
+               (*i)->find_vertex(target(e_global, **i)).second)
+            {
+                remove_edge_recur_down(source(e_global, **i),
+                                       target(e_global, **i),
+                                       **i);
+            }
+        }
+    }
+
+    template <typename Edge, typename Graph>
+    void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g)
+    {
+        remove_edge(g.global_to_local(e_global), g.m_graph);
+        children_remove_edge(e_global, g.m_children);
+    }
+
+    template <typename Edge, typename Graph>
+    void remove_edge_recur_up(Edge e_global, subgraph<Graph>& g)
+    {
+        if (g.is_root()) {
+            remove_edge(e_global, g.m_graph);
+            children_remove_edge(e_global, g.m_children);
+        } else {
+            remove_edge_recur_up(e_global, *g.m_parent);
+        }
+    }
+
+} // namespace detail
+
+template <typename G>
+void
+remove_edge(typename subgraph<G>::vertex_descriptor u,
+            typename subgraph<G>::vertex_descriptor v,
+            subgraph<G>& g)
+{
+    if(g.is_root()) {
+        detail::remove_edge_recur_up(u, v, g);
+    } else {
+        detail::remove_edge_recur_up(g.local_to_global(u),
+                                     g.local_to_global(v), g);
+    }
+}
+
+template <typename G>
+void
+remove_edge(typename subgraph<G>::edge_descriptor e, subgraph<G>& g)
+{
+    if(g.is_root()) {
+        detail::remove_edge_recur_up(e, g);
+    } else {
+        detail::remove_edge_recur_up(g.local_to_global(e), g);
+    }
+}
+
+// TODO: This is wrong...
+template <typename Predicate, typename G>
+void
+remove_edge_if(Predicate p, subgraph<G>& g)
+{ remove_edge_if(p, g.m_graph); }
+
+// TODO: Ths is wrong
+template <typename G>
+void
+clear_vertex(typename subgraph<G>::vertex_descriptor v, subgraph<G>& g)
+{ clear_vertex(v, g.m_graph); }
+
+namespace detail {
+    template <typename G>
+    typename subgraph<G>::vertex_descriptor
+    add_vertex_recur_up(subgraph<G>& g)
+    {
+        typename subgraph<G>::vertex_descriptor u_local, u_global;
+        if (g.is_root()) {
+            u_global = add_vertex(g.m_graph);
+            g.m_global_vertex.push_back(u_global);
+        } else {
+            u_global = add_vertex_recur_up(*g.m_parent);
+            u_local = add_vertex(g.m_graph);
+            g.m_global_vertex.push_back(u_global);
+            g.m_local_vertex[u_global] = u_local;
+        }
+        return u_global;
+    }
+} // namespace detail
+
+template <typename G>
+typename subgraph<G>::vertex_descriptor
+add_vertex(subgraph<G>& g)
+{
+    typename subgraph<G>::vertex_descriptor  u_local, u_global;
+    if(g.is_root()) {
+        u_global = add_vertex(g.m_graph);
+        g.m_global_vertex.push_back(u_global);
+        u_local = u_global;
+    } else {
+        u_global = detail::add_vertex_recur_up(g.parent());
+        u_local = add_vertex(g.m_graph);
+        g.m_global_vertex.push_back(u_global);
+        g.m_local_vertex[u_global] = u_local;
+    }
+    return u_local;
+}
+
+
+// TODO: Under Construction
+template <typename G>
+void remove_vertex(typename subgraph<G>::vertex_descriptor u, subgraph<G>& g)
+{ assert(false); }
+
+//===========================================================================
+// Functions required by the PropertyGraph concept
+
+/**
+ * The global property map returns the global properties associated with local
+ * descriptors.
+ */
+template <typename GraphPtr, typename PropertyMap, typename Tag>
+class subgraph_global_property_map
+    : public put_get_helper<
+        typename property_traits<PropertyMap>::reference,
+        subgraph_global_property_map<GraphPtr, PropertyMap, Tag>
+    >
+{
+    typedef property_traits<PropertyMap> Traits;
+public:
+    typedef typename Traits::category category;
+    typedef typename Traits::value_type value_type;
+    typedef typename Traits::key_type key_type;
+    typedef typename Traits::reference reference;
+
+    subgraph_global_property_map()
+    { }
+
+    subgraph_global_property_map(GraphPtr g)
+        : m_g(g)
+    { }
+
+    reference operator[](key_type e) const {
+        PropertyMap pmap = get(Tag(), m_g->root().m_graph);
+        return m_g->is_root()
+            ? pmap[e]
+            : pmap[m_g->local_to_global(e)];
+    }
+
+    GraphPtr m_g;
+};
+
+/**
+ * The local property map returns the local property associated with the local
+ * descriptors.
+ */
+template <typename GraphPtr, typename PropertyMap, typename Tag>
+class subgraph_local_property_map
+    : public put_get_helper<
+        typename property_traits<PropertyMap>::reference,
+        subgraph_local_property_map<GraphPtr, PropertyMap, Tag>
+    >
+{
+    typedef property_traits<PropertyMap> Traits;
+public:
+    typedef typename Traits::category category;
+    typedef typename Traits::value_type value_type;
+    typedef typename Traits::key_type key_type;
+    typedef typename Traits::reference reference;
+
+    typedef Tag tag;
+    typedef PropertyMap pmap;
+
+    subgraph_local_property_map()
+    { }
+
+    subgraph_local_property_map(GraphPtr g)
+        : m_g(g)
+    { }
+
+    reference operator[](key_type e) const {
+        // Get property map on the underlying graph.
+        PropertyMap pmap = get(Tag(), m_g->m_graph);
+        return pmap[e];
+    }
+
+    GraphPtr m_g;
+};
+
+namespace detail {
+    // Extract the actual tags from local or global property maps so we don't
+    // try to find non-properties.
+    template <typename P> struct extract_lg_tag { typedef P type; };
+    template <typename P> struct extract_lg_tag< local_property<P> > {
+        typedef P type;
+    };
+    template <typename P> struct extract_lg_tag< global_property<P> > {
+        typedef P type;
+    };
+
+    // NOTE: Mysterious Property template parameter unused in both metafunction
+    // classes.
+    struct subgraph_global_pmap {
+        template <class Tag, class SubGraph, class Property>
+        struct bind_ {
+            typedef typename SubGraph::graph_type Graph;
+            typedef SubGraph* SubGraphPtr;
+            typedef const SubGraph* const_SubGraphPtr;
+            typedef typename extract_lg_tag<Tag>::type TagType;
+            typedef typename property_map<Graph, TagType>::type PMap;
+            typedef typename property_map<Graph, TagType>::const_type const_PMap;
+        public:
+            typedef subgraph_global_property_map<SubGraphPtr, PMap, TagType> type;
+            typedef subgraph_global_property_map<const_SubGraphPtr, const_PMap, TagType>
+            const_type;
+        };
+    };
+
+    struct subgraph_local_pmap {
+        template <class Tag, class SubGraph, class Property>
+        struct bind_ {
+            typedef typename SubGraph::graph_type Graph;
+            typedef SubGraph* SubGraphPtr;
+            typedef const SubGraph* const_SubGraphPtr;
+            typedef typename extract_lg_tag<Tag>::type TagType;
+            typedef typename property_map<Graph, TagType>::type PMap;
+            typedef typename property_map<Graph, TagType>::const_type const_PMap;
+        public:
+            typedef subgraph_local_property_map<SubGraphPtr, PMap, TagType> type;
+            typedef subgraph_local_property_map<const_SubGraphPtr, const_PMap, TagType>
+            const_type;
+        };
+    };
+
+    // These metafunctions select the corresponding metafunctions above, and
+    // are used by the choose_pmap metafunction below to specialize the choice
+    // of local/global property map. By default, we defer to the global
+    // property.
+    template <class Tag>
+    struct subgraph_choose_pmap_helper {
+        typedef subgraph_global_pmap type;
+    };
+    template <class Tag>
+    struct subgraph_choose_pmap_helper< local_property<Tag> > {
+        typedef subgraph_local_pmap type;
+    };
+    template <class Tag>
+    struct subgraph_choose_pmap_helper< global_property<Tag> > {
+        typedef subgraph_global_pmap type;
+    };
+
+    // As above, unless we're requesting vertex_index_t. Then it's always a
+    // local property map. This enables the correct translation of descriptors
+    // between local and global layers.
+    template <>
+    struct subgraph_choose_pmap_helper<vertex_index_t> {
+        typedef subgraph_local_pmap type;
+    };
+    template <>
+    struct subgraph_choose_pmap_helper< local_property<vertex_index_t> > {
+        typedef subgraph_local_pmap type;
+    };
+    template <>
+    struct subgraph_choose_pmap_helper< global_property<vertex_index_t> > {
+        typedef subgraph_local_pmap type;
+    };
+
+    // Determine the kind of property. If SameType<Tag, vertex_index_t>, then
+    // the property lookup is always local. Otherwise, the lookup is global.
+    // NOTE: Property parameter is basically unused.
+    template <class Tag, class Graph, class Property>
+    struct subgraph_choose_pmap {
+        typedef typename subgraph_choose_pmap_helper<Tag>::type Helper;
+        typedef typename Helper::template bind_<Tag, Graph, Property> Bind;
+        typedef typename Bind::type type;
+        typedef typename Bind::const_type const_type;
+    };
+
+    // Used by the vertex/edge property selectors to determine the kind(s) of
+    // property maps used by the property_map type generator.
+    struct subgraph_property_generator {
+        template <class SubGraph, class Property, class Tag>
+        struct bind_ {
+            typedef subgraph_choose_pmap<Tag, SubGraph, Property> Choice;
+            typedef typename Choice::type type;
+            typedef typename Choice::const_type const_type;
+        };
+    };
+
+  } // namespace detail
+
+template <>
+struct vertex_property_selector<subgraph_tag> {
+    typedef detail::subgraph_property_generator type;
+};
+
+template <>
+struct edge_property_selector<subgraph_tag> {
+    typedef detail::subgraph_property_generator type;
+};
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+/** @internal
+ * This property map implements local or global bundled property access on
+ * an underlying graph. The LocalGlobal template template parameter must be
+ * one of the local_property or global_property templates.
+ */
+template <
+    typename Graph, typename Descriptor, typename Bundle, typename T,
+    template <typename> class LocalGlobal>
+struct subgraph_lg_bundle_property_map
+    : put_get_helper<
+        T&,
+        subgraph_lg_bundle_property_map<Graph, Descriptor, Bundle, T, LocalGlobal>
+    >
+{
+private:
+    typedef LocalGlobal<Descriptor> Wrap;
+public:
+    typedef Descriptor key_type;
+    typedef typename remove_const<T>::type value_type;
+    typedef T& reference;
+    typedef lvalue_property_map_tag category;
+
+    subgraph_lg_bundle_property_map()
+    { }
+
+    subgraph_lg_bundle_property_map(Graph* g, T Bundle::* p)
+        : m_g(g), m_prop(p)
+    { }
+
+    reference operator[](key_type k) const
+    { return (*m_g)[Wrap(k)].*m_prop; }
+
+private:
+    Graph* m_g;
+    T Bundle::* m_prop;
+};
+
+// Specialize the property map template to generate bundled property maps.
+// NOTE: I'm cheating (actually double-dipping) with the local/global subgraph
+// property templates. I'm not using them store descriptors, just specialize
+// the property map template for specific lookups.
+namespace graph_detail {
+    // Help decoding some of the types required for property map definitions.
+    template <typename Graph, typename T, typename Bundle>
+    struct bundled_subgraph_pmap_helper {
+        typedef subgraph<Graph> Subgraph;
+        typedef graph_traits<Subgraph> Traits;
+        typedef typename Subgraph::vertex_bundled VertBundled;
+        typedef typename Subgraph::edge_bundled EdgeBundled;
+
+        // Deduce the descriptor from the template params
+        typedef typename mpl::if_<
+            detail::is_vertex_bundle<VertBundled, EdgeBundled, Bundle>,
+            typename Traits::vertex_descriptor, typename Traits::edge_descriptor
+        >::type Desc;
+
+        // Deduce the bundled property type
+        typedef typename mpl::if_<
+            detail::is_vertex_bundle<VertBundled, EdgeBundled, Bundle>,
+            VertBundled, EdgeBundled
+        >::type Prop;
+    };
+} // namespace graph_detail
+
+template <typename Graph, typename T, typename Bundle>
+struct property_map<subgraph<Graph>, local_property<T Bundle::*> >
+    : graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle>
+{
+private:
+    typedef graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle> Base;
+    typedef typename Base::Subgraph Subgraph;
+    typedef typename Base::Desc Desc;
+    typedef typename Base::Prop Prop;
+public:
+    typedef subgraph_lg_bundle_property_map<
+        Subgraph, Desc, Prop, T, local_property
+    > type;
+    typedef subgraph_lg_bundle_property_map<
+        Subgraph const, Desc, Prop, T const, local_property
+    > const_type;
+};
+
+template <typename Graph, typename T, typename Bundle>
+struct property_map<subgraph<Graph>, global_property<T Bundle::*> >
+    : graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle>
+{
+private:
+    typedef graph_detail::bundled_subgraph_pmap_helper<Graph, T, Bundle> Base;
+    typedef typename Base::Subgraph Subgraph;
+    typedef typename Base::Desc Desc;
+    typedef typename Base::Prop Prop;
+public:
+    typedef subgraph_lg_bundle_property_map<
+        Subgraph, Desc, Prop, T, global_property
+    > type;
+    typedef subgraph_lg_bundle_property_map<
+        Subgraph const, Desc, Prop, T const, global_property
+    > const_type;
+};
+#endif
+
+// ==================================================
+// get(p, g), get(p, g, k), and put(p, g, k, v)
+// ==================================================
+template <typename G, typename Property>
+typename property_map<subgraph<G>, Property>::type
+get(Property, subgraph<G>& g) {
+    typedef typename property_map< subgraph<G>, Property>::type PMap;
+    return PMap(&g);
+}
+
+template <typename G, typename Property>
+typename property_map<subgraph<G>, Property>::const_type
+get(Property, const subgraph<G>& g) {
+    typedef typename property_map< subgraph<G>, Property>::const_type PMap;
+    return PMap(&g);
+}
+
+template <typename G, typename Property, typename Key>
+typename property_traits<
+    typename property_map<subgraph<G>, Property>::const_type
+>::value_type
+get(Property, const subgraph<G>& g, const Key& k) {
+    typedef typename property_map< subgraph<G>, Property>::const_type PMap;
+    PMap pmap(&g);
+    return pmap[k];
+}
+
+template <typename G, typename Property, typename Key, typename Value>
+void put(Property, subgraph<G>& g, const Key& k, const Value& val) {
+    typedef typename property_map< subgraph<G>, Property>::type PMap;
+    PMap pmap(&g);
+    pmap[k] = val;
+}
+
+// ==================================================
+// get(global(p), g)
+// NOTE: get(global(p), g, k) and put(global(p), g, k, v) not supported
+// ==================================================
+template <typename G, typename Property>
+typename property_map<subgraph<G>, global_property<Property> >::type
+get(global_property<Property>, subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, global_property<Property>
+    >::type Map;
+    return Map(&g);
+}
+
+template <typename G, typename Property>
+typename property_map<subgraph<G>, global_property<Property> >::const_type
+get(global_property<Property>, const subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, global_property<Property>
+    >::const_type Map;
+    return Map(&g);
+}
+
+// ==================================================
+// get(local(p), g)
+// NOTE: get(local(p), g, k) and put(local(p), g, k, v) not supported
+// ==================================================
+template <typename G, typename Property>
+typename property_map<subgraph<G>, local_property<Property> >::type
+get(local_property<Property>, subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, local_property<Property>
+    >::type Map;
+    return Map(&g);
+}
+
+template <typename G, typename Property>
+typename property_map<subgraph<G>, local_property<Property> >::const_type
+get(local_property<Property>, const subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, local_property<Property>
+    >::const_type Map;
+    return Map(&g);
+}
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+// ==================================================
+// get(bundle(p), g)
+// ==================================================
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<subgraph<G>, T Bundle::*>::type
+get(T Bundle::* p, subgraph<G>& g) {
+    typedef typename property_map<subgraph<G>, T Bundle::*>::type Map;
+    return Map(&g, p);
+}
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<subgraph<G>, T Bundle::*>::const_type
+get(T Bundle::* p, subgraph<G> const& g) {
+    typedef typename property_map<subgraph<G>, T Bundle::*>::const_type Map;
+    return Map(&g, p);
+}
+
+template <typename Graph, typename Type, typename Bundle, typename Key>
+inline Type get(Type Bundle::* p, subgraph<Graph> const& g, Key const& k)
+{ return get(get(p, g), k); }
+
+template <typename Graph, typename Type, typename Bundle, typename Key,
+          typename Value>
+inline void put(Type Bundle::* p, Graph& g, Key const& k, Value const& v)
+{ put(get(p, g), k, v); }
+
+// =========================================================
+// Local bundled, get
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<
+    subgraph<G>, local_property<T Bundle::*>
+>::type
+get(local_property<T Bundle::*> p, subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, local_property<T Bundle::*>
+    >::type Map;
+    return Map(&g, p.value);
+}
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<
+    subgraph<G>, local_property<T Bundle::*>
+>::const_type
+get(local_property<T Bundle::*> p, subgraph<G> const& g) {
+    typedef typename property_map<
+        subgraph<G>, local_property<T Bundle::*>
+    >::const_type Map;
+    return Map(&g, p.value);
+}
+
+template <typename Graph, typename Type, typename Bundle, typename Key>
+inline Type get(local_property<Type Bundle::*> p, subgraph<Graph> const& g,
+                Key const& k)
+{ return get(get(p, g), k); }
+
+// =========================================================
+// Global bundled, get
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<
+    subgraph<G>, global_property<T Bundle::*>
+>::type
+get(global_property<T Bundle::*> p, subgraph<G>& g) {
+    typedef typename property_map<
+        subgraph<G>, global_property<T Bundle::*>
+    >::type Map;
+    return Map(&g, p.value);
+}
+
+template<typename G, typename T, typename Bundle>
+inline typename property_map<
+    subgraph<G>, global_property<T Bundle::*>
+>::const_type
+get(global_property<T Bundle::*> p, subgraph<G> const& g) {
+    typedef typename property_map<
+        subgraph<G>, global_property<T Bundle::*>
+    >::const_type Map;
+    return Map(&g, p.value);
+}
+
+template <typename Graph, typename Type, typename Bundle, typename Key>
+inline Type get(global_property<Type Bundle::*> p, subgraph<Graph> const& g,
+                Key const& k)
+{ return get(get(p, g), k); }
+
+#endif
+
+template <typename G, typename Tag>
+inline typename graph_property<G, Tag>::type&
+get_property(subgraph<G>& g, Tag tag) {
+    return get_property(g.m_graph, tag);
+}
+
+template <typename G, typename Tag>
+inline const typename graph_property<G, Tag>::type&
+get_property(const subgraph<G>& g, Tag tag) {
+    return get_property(g.m_graph, tag);
+}
+
+//===========================================================================
+// Miscellaneous Functions
+
+template <typename G>
+typename subgraph<G>::vertex_descriptor
+vertex(typename subgraph<G>::vertices_size_type n, const subgraph<G>& g)
+{ return vertex(n, g.m_graph); }
+
+//===========================================================================
+// Mutability Traits
+// Just pull the mutability traits form the underlying graph. Note that this
+// will probably fail (badly) for labeled graphs.
+template <typename G>
+struct graph_mutability_traits< subgraph<G> > {
+    typedef typename graph_mutability_traits<G>::category category;
+};
+
+} // namespace boost
+
+#endif // BOOST_SUBGRAPH_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/tiernan_all_cycles.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/tiernan_all_cycles.hpp
new file mode 100644 (file)
index 0000000..f750eb1
--- /dev/null
@@ -0,0 +1,376 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_CYCLE_HPP
+#define BOOST_GRAPH_CYCLE_HPP
+
+#include <vector>
+
+#include <boost/config.hpp>
+#include <boost/graph/graph_concepts.hpp>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/properties.hpp>
+
+#include <boost/concept/detail/concept_def.hpp>
+namespace boost {
+    namespace concepts {
+        BOOST_concept(CycleVisitor,(Visitor)(Path)(Graph))
+        {
+            BOOST_CONCEPT_USAGE(CycleVisitor)
+            {
+                vis.cycle(p, g);
+            }
+        private:
+            Visitor vis;
+            Graph g;
+            Path p;
+        };
+    } /* namespace concepts */
+using concepts::CycleVisitorConcept;
+} /* namespace boost */
+#include <boost/concept/detail/concept_undef.hpp>
+
+
+namespace boost
+{
+
+// The implementation of this algorithm is a reproduction of the Teirnan
+// approach for directed graphs: bibtex follows
+//
+//     @article{362819,
+//         author = {James C. Tiernan},
+//         title = {An efficient search algorithm to find the elementary circuits of a graph},
+//         journal = {Commun. ACM},
+//         volume = {13},
+//         number = {12},
+//         year = {1970},
+//         issn = {0001-0782},
+//         pages = {722--726},
+//         doi = {http://doi.acm.org/10.1145/362814.362819},
+//             publisher = {ACM Press},
+//             address = {New York, NY, USA},
+//         }
+//
+// It should be pointed out that the author does not provide a complete analysis for
+// either time or space. This is in part, due to the fact that it's a fairly input
+// sensitive problem related to the density and construction of the graph, not just
+// its size.
+//
+// I've also taken some liberties with the interpretation of the algorithm - I've
+// basically modernized it to use real data structures (no more arrays and matrices).
+// Oh... and there's explicit control structures - not just gotos.
+//
+// The problem is definitely NP-complete, an an unbounded implementation of this
+// will probably run for quite a while on a large graph. The conclusions
+// of this paper also reference a Paton algorithm for undirected graphs as being
+// much more efficient (apparently based on spanning trees). Although not implemented,
+// it can be found here:
+//
+//     @article{363232,
+//         author = {Keith Paton},
+//         title = {An algorithm for finding a fundamental set of cycles of a graph},
+//         journal = {Commun. ACM},
+//         volume = {12},
+//         number = {9},
+//         year = {1969},
+//         issn = {0001-0782},
+//         pages = {514--518},
+//         doi = {http://doi.acm.org/10.1145/363219.363232},
+//             publisher = {ACM Press},
+//             address = {New York, NY, USA},
+//         }
+
+/**
+ * The default cycle visitor providse an empty visit function for cycle
+ * visitors.
+ */
+struct cycle_visitor
+{
+    template <typename Path, typename Graph>
+    inline void cycle(const Path& p, const Graph& g)
+    { }
+};
+
+/**
+ * The min_max_cycle_visitor simultaneously records the minimum and maximum
+ * cycles in a graph.
+ */
+struct min_max_cycle_visitor
+{
+    min_max_cycle_visitor(std::size_t& min_, std::size_t& max_)
+        : minimum(min_), maximum(max_)
+    { }
+
+    template <typename Path, typename Graph>
+    inline void cycle(const Path& p, const Graph& g)
+    {
+        BOOST_USING_STD_MIN();
+        BOOST_USING_STD_MAX();
+        std::size_t len = p.size();
+        minimum = min BOOST_PREVENT_MACRO_SUBSTITUTION (minimum, len);
+        maximum = max BOOST_PREVENT_MACRO_SUBSTITUTION (maximum, len);
+    }
+    std::size_t& minimum;
+    std::size_t& maximum;
+};
+
+inline min_max_cycle_visitor
+find_min_max_cycle(std::size_t& min_, std::size_t& max_)
+{ return min_max_cycle_visitor(min_, max_); }
+
+namespace detail
+{
+    template <typename Graph, typename Path>
+    inline bool
+    is_vertex_in_path(const Graph&,
+                        typename graph_traits<Graph>::vertex_descriptor v,
+                        const Path& p)
+    {
+        return (std::find(p.begin(), p.end(), v) != p.end());
+    }
+
+    template <typename Graph, typename ClosedMatrix>
+    inline bool
+    is_path_closed(const Graph& g,
+                    typename graph_traits<Graph>::vertex_descriptor u,
+                    typename graph_traits<Graph>::vertex_descriptor v,
+                    const ClosedMatrix& closed)
+    {
+        // the path from u to v is closed if v can be found in the list
+        // of closed vertices associated with u.
+        typedef typename ClosedMatrix::const_reference Row;
+        Row r = closed[get(vertex_index, g, u)];
+        if(find(r.begin(), r.end(), v) != r.end()) {
+            return true;
+        }
+        return false;
+    }
+
+    template <typename Graph, typename Path, typename ClosedMatrix>
+    inline bool
+    can_extend_path(const Graph& g,
+                    typename graph_traits<Graph>::edge_descriptor e,
+                    const Path& p,
+                    const ClosedMatrix& m)
+    {
+        function_requires< IncidenceGraphConcept<Graph> >();
+        function_requires< VertexIndexGraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+        // get the vertices in question
+        Vertex
+            u = source(e, g),
+            v = target(e, g);
+
+        // conditions for allowing a traversal along this edge are:
+        // 1. the index of v must be greater than that at which the
+        //    the path is rooted (p.front()).
+        // 2. the vertex v cannot already be in the path
+        // 3. the vertex v cannot be closed to the vertex u
+
+        bool indices = get(vertex_index, g, p.front()) < get(vertex_index, g, v);
+        bool path = !is_vertex_in_path(g, v, p);
+        bool closed = !is_path_closed(g, u, v, m);
+        return indices && path && closed;
+    }
+
+    template <typename Graph, typename Path>
+    inline bool
+    can_wrap_path(const Graph& g, const Path& p)
+    {
+        function_requires< IncidenceGraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        typedef typename graph_traits<Graph>::out_edge_iterator OutIterator;
+
+        // iterate over the out-edges of the back, looking for the
+        // front of the path. also, we can't travel along the same
+        // edge that we did on the way here, but we don't quite have the
+        // stringent requirements that we do in can_extend_path().
+        Vertex
+            u = p.back(),
+            v = p.front();
+        OutIterator i, end;
+        for(tie(i, end) = out_edges(u, g); i != end; ++i) {
+            if((target(*i, g) == v)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    template <typename Graph,
+        typename Path,
+        typename ClosedMatrix>
+    inline typename graph_traits<Graph>::vertex_descriptor
+    extend_path(const Graph& g,
+                Path& p,
+                ClosedMatrix& closed)
+    {
+        function_requires< IncidenceGraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        typedef typename graph_traits<Graph>::edge_descriptor Edge;
+        typedef typename graph_traits<Graph>::out_edge_iterator OutIterator;
+
+        // get the current vertex
+        Vertex u = p.back();
+        Vertex ret = graph_traits<Graph>::null_vertex();
+
+        // AdjacencyIterator i, end;
+        OutIterator i, end;
+        for(tie(i, end) = out_edges(u, g); i != end; ++i) {
+            Vertex v = target(*i, g);
+
+            // if we can actually extend along this edge,
+            // then that's what we want to do
+            if(can_extend_path(g, *i, p, closed)) {
+                p.push_back(v);         // add the vertex to the path
+                ret = v;
+                break;
+            }
+        }
+        return ret;
+    }
+
+    template <typename Graph, typename Path, typename ClosedMatrix>
+    inline bool
+    exhaust_paths(const Graph& g, Path& p, ClosedMatrix& closed)
+    {
+        function_requires< GraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+
+        // if there's more than one vertex in the path, this closes
+        // of some possible routes and returns true. otherwise, if there's
+        // only one vertex left, the vertex has been used up
+        if(p.size() > 1) {
+            // get the last and second to last vertices, popping the last
+            // vertex off the path
+            Vertex last, prev;
+            last = p.back();
+            p.pop_back();
+            prev = p.back();
+
+            // reset the closure for the last vertex of the path and
+            // indicate that the last vertex in p is now closed to
+            // the next-to-last vertex in p
+            closed[get(vertex_index, g, last)].clear();
+            closed[get(vertex_index, g, prev)].push_back(last);
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
+    template <typename Graph, typename Visitor>
+    inline void
+    all_cycles_from_vertex(const Graph& g,
+                            typename graph_traits<Graph>::vertex_descriptor v,
+                            Visitor vis,
+                            std::size_t minlen,
+                            std::size_t maxlen)
+    {
+        function_requires< VertexListGraphConcept<Graph> >();
+        typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+        typedef std::vector<Vertex> Path;
+        function_requires< CycleVisitorConcept<Visitor,Path,Graph> >();
+        typedef std::vector<Vertex> VertexList;
+        typedef std::vector<VertexList> ClosedMatrix;
+
+        Path p;
+        ClosedMatrix closed(num_vertices(g), VertexList());
+        Vertex null = graph_traits<Graph>::null_vertex();
+
+        // each path investigation starts at the ith vertex
+        p.push_back(v);
+
+        while(1) {
+            // extend the path until we've reached the end or the
+            // maxlen-sized cycle
+            Vertex j = null;
+            while(((j = detail::extend_path(g, p, closed)) != null)
+                    && (p.size() < maxlen))
+                ; // empty loop
+
+            // if we're done extending the path and there's an edge
+            // connecting the back to the front, then we should have
+            // a cycle.
+            if(detail::can_wrap_path(g, p) && p.size() >= minlen) {
+                vis.cycle(p, g);
+            }
+
+            if(!detail::exhaust_paths(g, p, closed)) {
+                break;
+            }
+        }
+    }
+
+    // Select the minimum allowable length of a cycle based on the directedness
+    // of the graph - 2 for directed, 3 for undirected.
+    template <typename D> struct min_cycles { enum { value = 2 }; };
+    template <> struct min_cycles<undirected_tag> { enum { value = 3 }; };
+} /* namespace detail */
+
+template <typename Graph, typename Visitor>
+inline void
+tiernan_all_cycles(const Graph& g,
+                    Visitor vis,
+                    std::size_t minlen,
+                    std::size_t maxlen)
+{
+    function_requires< VertexListGraphConcept<Graph> >();
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+
+    VertexIterator i, end;
+    for(tie(i, end) = vertices(g); i != end; ++i) {
+        detail::all_cycles_from_vertex(g, *i, vis, minlen, maxlen);
+    }
+}
+
+template <typename Graph, typename Visitor>
+inline void
+tiernan_all_cycles(const Graph& g, Visitor vis, std::size_t maxlen)
+{
+    typedef typename graph_traits<Graph>::directed_category Dir;
+    tiernan_all_cycles(g, vis, detail::min_cycles<Dir>::value, maxlen);
+}
+
+template <typename Graph, typename Visitor>
+inline void
+tiernan_all_cycles(const Graph& g, Visitor vis)
+{
+    typedef typename graph_traits<Graph>::directed_category Dir;
+    tiernan_all_cycles(g, vis, detail::min_cycles<Dir>::value,
+                       (std::numeric_limits<std::size_t>::max)());
+}
+
+template <typename Graph>
+inline std::pair<std::size_t, std::size_t>
+tiernan_girth_and_circumference(const Graph& g)
+{
+    std::size_t
+        min_ = (std::numeric_limits<std::size_t>::max)(),
+        max_ = 0;
+    tiernan_all_cycles(g, find_min_max_cycle(min_, max_));
+
+    // if this is the case, the graph is acyclic...
+    if(max_ == 0) max_ = min_;
+
+    return std::make_pair(min_, max_);
+}
+
+template <typename Graph>
+inline std::size_t
+tiernan_girth(const Graph& g)
+{ return tiernan_girth_and_circumference(g).first; }
+
+template <typename Graph>
+inline std::size_t
+tiernan_circumference(const Graph& g)
+{ return tiernan_girth_and_circumference(g).second; }
+
+} /* namespace boost */
+
+#endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/graph/topological_sort.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/topological_sort.hpp
index 2ed7e18e92afac2cea06300781b70ec316a1b088..9a7f6eb889be492f5dc354f3f11f89f91e8c0bd3 100644 (file)
@@ -12,7 +12,7 @@
 #define BOOST_GRAPH_TOPOLOGICAL_SORT_HPP
 
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/depth_first_search.hpp>
 #include <boost/graph/visitors.hpp>
 #include <boost/graph/exception.hpp>
@@ -37,7 +37,7 @@ namespace boost {
       : m_iter(_iter) { }
     
     template <typename Edge, typename Graph>
-    void back_edge(const Edge& u, Graph&) { throw not_a_dag(); }
+    void back_edge(const Edge&, Graph&) { throw not_a_dag(); }
     
     template <typename Vertex, typename Graph> 
     void finish_vertex(const Vertex& u, Graph&) { *m_iter++ = u; }
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/topology.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/topology.hpp
new file mode 100644 (file)
index 0000000..ada36d1
--- /dev/null
@@ -0,0 +1,598 @@
+// Copyright 2009 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Jeremiah Willcock
+//           Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_GRAPH_TOPOLOGY_HPP
+#define BOOST_GRAPH_TOPOLOGY_HPP
+
+#include <boost/config/no_tr1/cmath.hpp>
+#include <cmath>
+#include <boost/random/uniform_01.hpp>
+#include <boost/random/linear_congruential.hpp>
+#include <boost/math/constants/constants.hpp> // For root_two
+#include <boost/algorithm/minmax.hpp>
+#include <boost/config.hpp> // For BOOST_STATIC_CONSTANT
+#include <boost/math/special_functions/hypot.hpp>
+
+// Classes and concepts to represent points in a space, with distance and move
+// operations (used for Gurson-Atun layout), plus other things like bounding
+// boxes used for other layout algorithms.
+
+namespace boost {
+
+/***********************************************************
+ * Topologies                                              *
+ ***********************************************************/
+template<std::size_t Dims>
+class convex_topology 
+{
+  public: // For VisualAge C++
+  struct point 
+  {
+    BOOST_STATIC_CONSTANT(std::size_t, dimensions = Dims);
+    point() { }
+    double& operator[](std::size_t i) {return values[i];}
+    const double& operator[](std::size_t i) const {return values[i];}
+
+  private:
+    double values[Dims];
+  };
+
+  public: // For VisualAge C++
+  struct point_difference
+  {
+    BOOST_STATIC_CONSTANT(std::size_t, dimensions = Dims);
+    point_difference() {
+      for (std::size_t i = 0; i < Dims; ++i) values[i] = 0.;
+    }
+    double& operator[](std::size_t i) {return values[i];}
+    const double& operator[](std::size_t i) const {return values[i];}
+
+    friend point_difference operator+(const point_difference& a, const point_difference& b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = a[i] + b[i];
+      return result;
+    }
+
+    friend point_difference& operator+=(point_difference& a, const point_difference& b) {
+      for (std::size_t i = 0; i < Dims; ++i)
+        a[i] += b[i];
+      return a;
+    }
+
+    friend point_difference operator-(const point_difference& a) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = -a[i];
+      return result;
+    }
+
+    friend point_difference operator-(const point_difference& a, const point_difference& b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = a[i] - b[i];
+      return result;
+    }
+
+    friend point_difference& operator-=(point_difference& a, const point_difference& b) {
+      for (std::size_t i = 0; i < Dims; ++i)
+        a[i] -= b[i];
+      return a;
+    }
+
+    friend point_difference operator*(const point_difference& a, const point_difference& b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = a[i] * b[i];
+      return result;
+    }
+
+    friend point_difference operator*(const point_difference& a, double b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = a[i] * b;
+      return result;
+    }
+
+    friend point_difference operator*(double a, const point_difference& b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = a * b[i];
+      return result;
+    }
+
+    friend point_difference operator/(const point_difference& a, const point_difference& b) {
+      point_difference result;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result[i] = (b[i] == 0.) ? 0. : a[i] / b[i];
+      return result;
+    }
+
+    friend double dot(const point_difference& a, const point_difference& b) {
+      double result = 0;
+      for (std::size_t i = 0; i < Dims; ++i)
+        result += a[i] * b[i];
+      return result;
+    }
+
+  private:
+    double values[Dims];
+  };
+
+ public:
+  typedef point point_type;
+  typedef point_difference point_difference_type;
+
+  double distance(point a, point b) const 
+  {
+    double dist = 0.;
+    for (std::size_t i = 0; i < Dims; ++i) {
+      double diff = b[i] - a[i];
+      dist = boost::math::hypot(dist, diff);
+    }
+    // Exact properties of the distance are not important, as long as
+    // < on what this returns matches real distances; l_2 is used because
+    // Fruchterman-Reingold also uses this code and it relies on l_2.
+    return dist;
+  }
+
+  point move_position_toward(point a, double fraction, point b) const 
+  {
+    point result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = a[i] + (b[i] - a[i]) * fraction;
+    return result;
+  }
+
+  point_difference difference(point a, point b) const {
+    point_difference result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = a[i] - b[i];
+    return result;
+  }
+
+  point adjust(point a, point_difference delta) const {
+    point result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = a[i] + delta[i];
+    return result;
+  }
+
+  point pointwise_min(point a, point b) const {
+    BOOST_USING_STD_MIN();
+    point result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = min BOOST_PREVENT_MACRO_SUBSTITUTION (a[i], b[i]);
+    return result;
+  }
+
+  point pointwise_max(point a, point b) const {
+    BOOST_USING_STD_MAX();
+    point result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = max BOOST_PREVENT_MACRO_SUBSTITUTION (a[i], b[i]);
+    return result;
+  }
+
+  double norm(point_difference delta) const {
+    double n = 0.;
+    for (std::size_t i = 0; i < Dims; ++i)
+      n = boost::math::hypot(n, delta[i]);
+    return n;
+  }
+
+  double volume(point_difference delta) const {
+    double n = 1.;
+    for (std::size_t i = 0; i < Dims; ++i)
+      n *= delta[i];
+    return n;
+  }
+
+};
+
+template<std::size_t Dims,
+         typename RandomNumberGenerator = minstd_rand>
+class hypercube_topology : public convex_topology<Dims>
+{
+  typedef uniform_01<RandomNumberGenerator, double> rand_t;
+
+ public:
+  typedef typename convex_topology<Dims>::point_type point_type;
+  typedef typename convex_topology<Dims>::point_difference_type point_difference_type;
+
+  explicit hypercube_topology(double scaling = 1.0) 
+    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), 
+      scaling(scaling) 
+  { }
+
+  hypercube_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
+    : gen_ptr(), rand(new rand_t(gen)), scaling(scaling) { }
+                     
+  point_type random_point() const 
+  {
+    point_type p;
+    for (std::size_t i = 0; i < Dims; ++i)
+      p[i] = (*rand)() * scaling;
+    return p;
+  }
+
+  point_type bound(point_type a) const
+  {
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+    point_type p;
+    for (std::size_t i = 0; i < Dims; ++i)
+      p[i] = min BOOST_PREVENT_MACRO_SUBSTITUTION (scaling, max BOOST_PREVENT_MACRO_SUBSTITUTION (-scaling, a[i]));
+    return p;
+  }
+
+  double distance_from_boundary(point_type a) const
+  {
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+#ifndef BOOST_NO_STDC_NAMESPACE
+    using std::abs;
+#endif
+    BOOST_STATIC_ASSERT (Dims >= 1);
+    double dist = abs(scaling - a[0]);
+    for (std::size_t i = 1; i < Dims; ++i)
+      dist = min BOOST_PREVENT_MACRO_SUBSTITUTION (dist, abs(scaling - a[i]));
+    return dist;
+  }
+
+  point_type center() const {
+    point_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = scaling * .5;
+    return result;
+  }
+
+  point_type origin() const {
+    point_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = 0;
+    return result;
+  }
+
+  point_difference_type extent() const {
+    point_difference_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = scaling;
+    return result;
+  }
+
+ private:
+  shared_ptr<RandomNumberGenerator> gen_ptr;
+  shared_ptr<rand_t> rand;
+  double scaling;
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class square_topology : public hypercube_topology<2, RandomNumberGenerator>
+{
+  typedef hypercube_topology<2, RandomNumberGenerator> inherited;
+
+ public:
+  explicit square_topology(double scaling = 1.0) : inherited(scaling) { }
+  
+  square_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
+    : inherited(gen, scaling) { }
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class rectangle_topology : public convex_topology<2>
+{
+  typedef uniform_01<RandomNumberGenerator, double> rand_t;
+
+  public:
+  rectangle_topology(double left, double top, double right, double bottom)
+    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)),
+      left(std::min BOOST_PREVENT_MACRO_SUBSTITUTION (left, right)),
+      top(std::min BOOST_PREVENT_MACRO_SUBSTITUTION (top, bottom)),
+      right(std::max BOOST_PREVENT_MACRO_SUBSTITUTION (left, right)),
+      bottom(std::max BOOST_PREVENT_MACRO_SUBSTITUTION (top, bottom)) { }
+
+  rectangle_topology(RandomNumberGenerator& gen, double left, double top, double right, double bottom)
+    : gen_ptr(), rand(new rand_t(gen)),
+      left(std::min BOOST_PREVENT_MACRO_SUBSTITUTION (left, right)),
+      top(std::min BOOST_PREVENT_MACRO_SUBSTITUTION (top, bottom)),
+      right(std::max BOOST_PREVENT_MACRO_SUBSTITUTION (left, right)),
+      bottom(std::max BOOST_PREVENT_MACRO_SUBSTITUTION (top, bottom)) { }
+
+  typedef typename convex_topology<2>::point_type point_type;
+  typedef typename convex_topology<2>::point_difference_type point_difference_type;
+
+  point_type random_point() const 
+  {
+    point_type p;
+    p[0] = (*rand)() * (right - left) + left;
+    p[1] = (*rand)() * (bottom - top) + top;
+    return p;
+  }
+
+  point_type bound(point_type a) const
+  {
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+    point_type p;
+    p[0] = min BOOST_PREVENT_MACRO_SUBSTITUTION (right, max BOOST_PREVENT_MACRO_SUBSTITUTION (left, a[0]));
+    p[1] = min BOOST_PREVENT_MACRO_SUBSTITUTION (bottom, max BOOST_PREVENT_MACRO_SUBSTITUTION (top, a[1]));
+    return p;
+  }
+
+  double distance_from_boundary(point_type a) const
+  {
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+#ifndef BOOST_NO_STDC_NAMESPACE
+    using std::abs;
+#endif
+    double dist = abs(left - a[0]);
+    dist = min BOOST_PREVENT_MACRO_SUBSTITUTION (dist, abs(right - a[0]));
+    dist = min BOOST_PREVENT_MACRO_SUBSTITUTION (dist, abs(top - a[1]));
+    dist = min BOOST_PREVENT_MACRO_SUBSTITUTION (dist, abs(bottom - a[1]));
+    return dist;
+  }
+
+  point_type center() const {
+    point_type result;
+    result[0] = (left + right) / 2.;
+    result[1] = (top + bottom) / 2.;
+    return result;
+  }
+
+  point_type origin() const {
+    point_type result;
+    result[0] = left;
+    result[1] = top;
+    return result;
+  }
+
+  point_difference_type extent() const {
+    point_difference_type result;
+    result[0] = right - left;
+    result[1] = bottom - top;
+    return result;
+  }
+
+ private:
+  shared_ptr<RandomNumberGenerator> gen_ptr;
+  shared_ptr<rand_t> rand;
+  double left, top, right, bottom;
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class cube_topology : public hypercube_topology<3, RandomNumberGenerator>
+{
+  typedef hypercube_topology<3, RandomNumberGenerator> inherited;
+
+ public:
+  explicit cube_topology(double scaling = 1.0) : inherited(scaling) { }
+  
+  cube_topology(RandomNumberGenerator& gen, double scaling = 1.0) 
+    : inherited(gen, scaling) { }
+};
+
+template<std::size_t Dims,
+         typename RandomNumberGenerator = minstd_rand>
+class ball_topology : public convex_topology<Dims>
+{
+  typedef uniform_01<RandomNumberGenerator, double> rand_t;
+
+ public:
+  typedef typename convex_topology<Dims>::point_type point_type;
+  typedef typename convex_topology<Dims>::point_difference_type point_difference_type;
+
+  explicit ball_topology(double radius = 1.0) 
+    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)), 
+      radius(radius) 
+  { }
+
+  ball_topology(RandomNumberGenerator& gen, double radius = 1.0) 
+    : gen_ptr(), rand(new rand_t(gen)), radius(radius) { }
+                     
+  point_type random_point() const 
+  {
+    point_type p;
+    double dist_sum;
+    do {
+      dist_sum = 0.0;
+      for (std::size_t i = 0; i < Dims; ++i) {
+        double x = (*rand)() * 2*radius - radius;
+        p[i] = x;
+        dist_sum += x * x;
+      }
+    } while (dist_sum > radius*radius);
+    return p;
+  }
+
+  point_type bound(point_type a) const
+  {
+    BOOST_USING_STD_MIN();
+    BOOST_USING_STD_MAX();
+    double r = 0.;
+    for (std::size_t i = 0; i < Dims; ++i)
+      r = boost::math::hypot(r, a[i]);
+    if (r <= radius) return a;
+    double scaling_factor = radius / r;
+    point_type p;
+    for (std::size_t i = 0; i < Dims; ++i)
+      p[i] = a[i] * scaling_factor;
+    return p;
+  }
+
+  double distance_from_boundary(point_type a) const
+  {
+    double r = 0.;
+    for (std::size_t i = 0; i < Dims; ++i)
+      r = boost::math::hypot(r, a[i]);
+    return radius - r;
+  }
+
+  point_type center() const {
+    point_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = 0;
+    return result;
+  }
+
+  point_type origin() const {
+    point_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = -radius;
+    return result;
+  }
+
+  point_difference_type extent() const {
+    point_difference_type result;
+    for (std::size_t i = 0; i < Dims; ++i)
+      result[i] = 2. * radius;
+    return result;
+  }
+
+ private:
+  shared_ptr<RandomNumberGenerator> gen_ptr;
+  shared_ptr<rand_t> rand;
+  double radius;
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class circle_topology : public ball_topology<2, RandomNumberGenerator>
+{
+  typedef ball_topology<2, RandomNumberGenerator> inherited;
+
+ public:
+  explicit circle_topology(double radius = 1.0) : inherited(radius) { }
+  
+  circle_topology(RandomNumberGenerator& gen, double radius = 1.0) 
+    : inherited(gen, radius) { }
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class sphere_topology : public ball_topology<3, RandomNumberGenerator>
+{
+  typedef ball_topology<3, RandomNumberGenerator> inherited;
+
+ public:
+  explicit sphere_topology(double radius = 1.0) : inherited(radius) { }
+  
+  sphere_topology(RandomNumberGenerator& gen, double radius = 1.0) 
+    : inherited(gen, radius) { }
+};
+
+template<typename RandomNumberGenerator = minstd_rand>
+class heart_topology 
+{
+  // Heart is defined as the union of three shapes:
+  // Square w/ corners (+-1000, -1000), (0, 0), (0, -2000)
+  // Circle centered at (-500, -500) radius 500*sqrt(2)
+  // Circle centered at (500, -500) radius 500*sqrt(2)
+  // Bounding box (-1000, -2000) - (1000, 500*(sqrt(2) - 1))
+
+  struct point 
+  {
+    point() { values[0] = 0.0; values[1] = 0.0; }
+    point(double x, double y) { values[0] = x; values[1] = y; }
+
+    double& operator[](std::size_t i)       { return values[i]; }
+    double  operator[](std::size_t i) const { return values[i]; }
+
+  private:
+    double values[2];
+  };
+
+  bool in_heart(point p) const 
+  {
+#ifndef BOOST_NO_STDC_NAMESPACE
+    using std::abs;
+#endif
+
+    if (p[1] < abs(p[0]) - 2000) return false; // Bottom
+    if (p[1] <= -1000) return true; // Diagonal of square
+    if (boost::math::hypot(p[0] - -500, p[1] - -500) <= 500. * boost::math::constants::root_two<double>())
+      return true; // Left circle
+    if (boost::math::hypot(p[0] - 500, p[1] - -500) <= 500. * boost::math::constants::root_two<double>())
+      return true; // Right circle
+    return false;
+  }
+
+  bool segment_within_heart(point p1, point p2) const 
+  {
+    // Assumes that p1 and p2 are within the heart
+    if ((p1[0] < 0) == (p2[0] < 0)) return true; // Same side of symmetry line
+    if (p1[0] == p2[0]) return true; // Vertical
+    double slope = (p2[1] - p1[1]) / (p2[0] - p1[0]);
+    double intercept = p1[1] - p1[0] * slope;
+    if (intercept > 0) return false; // Crosses between circles
+    return true;
+  }
+
+  typedef uniform_01<RandomNumberGenerator, double> rand_t;
+
+ public:
+  typedef point point_type;
+
+  heart_topology() 
+    : gen_ptr(new RandomNumberGenerator), rand(new rand_t(*gen_ptr)) { }
+
+  heart_topology(RandomNumberGenerator& gen) 
+    : gen_ptr(), rand(new rand_t(gen)) { }
+
+  point random_point() const 
+  {
+    point result;
+    do {
+      result[0] = (*rand)() * (1000 + 1000 * boost::math::constants::root_two<double>()) - (500 + 500 * boost::math::constants::root_two<double>());
+      result[1] = (*rand)() * (2000 + 500 * (boost::math::constants::root_two<double>() - 1)) - 2000;
+    } while (!in_heart(result));
+    return result;
+  }
+
+  // Not going to provide clipping to bounding region or distance from boundary
+
+  double distance(point a, point b) const 
+  {
+    if (segment_within_heart(a, b)) {
+      // Straight line
+      return boost::math::hypot(b[0] - a[0], b[1] - a[1]);
+    } else {
+      // Straight line bending around (0, 0)
+      return boost::math::hypot(a[0], a[1]) + boost::math::hypot(b[0], b[1]);
+    }
+  }
+
+  point move_position_toward(point a, double fraction, point b) const 
+  {
+    if (segment_within_heart(a, b)) {
+      // Straight line
+      return point(a[0] + (b[0] - a[0]) * fraction,
+                   a[1] + (b[1] - a[1]) * fraction);
+    } else {
+      double distance_to_point_a = boost::math::hypot(a[0], a[1]);
+      double distance_to_point_b = boost::math::hypot(b[0], b[1]);
+      double location_of_point = distance_to_point_a / 
+                                   (distance_to_point_a + distance_to_point_b);
+      if (fraction < location_of_point)
+        return point(a[0] * (1 - fraction / location_of_point), 
+                     a[1] * (1 - fraction / location_of_point));
+      else
+        return point(
+          b[0] * ((fraction - location_of_point) / (1 - location_of_point)),
+          b[1] * ((fraction - location_of_point) / (1 - location_of_point)));
+    }
+  }
+
+ private:
+  shared_ptr<RandomNumberGenerator> gen_ptr;
+  shared_ptr<rand_t> rand;
+};
+
+} // namespace boost
+
+#endif // BOOST_GRAPH_TOPOLOGY_HPP
similarity index 97%
rename from deal.II/contrib/boost/include/boost/graph/transitive_closure.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/transitive_closure.hpp
index a4742ab155e1d8f803c3bb6e89eb650d4bd83011..378dacf54f51732bb35c93f4219505fb5025fa4e 100644 (file)
@@ -38,13 +38,13 @@ namespace boost
 
   namespace detail
   {
-    template < typename Container, typename ST = std::size_t,
-      typename VT = typename Container::value_type >
+    template < typename TheContainer, typename ST = std::size_t,
+      typename VT = typename TheContainer::value_type >
       struct subscript_t:public std::unary_function < ST, VT >
     {
       typedef VT& result_type;
 
-      subscript_t(Container & c):container(&c)
+      subscript_t(TheContainer & c):container(&c)
       {
       }
       VT & operator() (const ST & i) const
@@ -52,11 +52,11 @@ namespace boost
         return (*container)[i];
       }
     protected:
-        Container * container;
+        TheContainer * container;
     };
-    template < typename Container >
-      subscript_t < Container > subscript(Container & c) {
-      return subscript_t < Container > (c);
+    template < typename TheContainer >
+      subscript_t < TheContainer > subscript(TheContainer & c) {
+      return subscript_t < TheContainer > (c);
     }
   }                             // namespace detail
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/transitive_reduction.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/transitive_reduction.hpp
new file mode 100644 (file)
index 0000000..5cfa962
--- /dev/null
@@ -0,0 +1,130 @@
+// (C) Copyright 2009 Eric Bose-Wolf
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_TRANSITIVE_REDUCTION_HPP
+#define BOOST_GRAPH_TRANSITIVE_REDUCTION_HPP
+
+#include <vector>
+#include <algorithm> //std::find
+#include <boost/concept/requires.hpp>
+#include <boost/concept_check.hpp>
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/topological_sort.hpp>
+
+// also I didn't got all of the concepts thin. Am I suppose to check
+// for all concepts, which are needed for functions I call? (As if I
+// wouldn't do that, the users would see the functions called by
+// complaining about missings concepts, which would be clearly an error
+// message revealing internal implementation and should therefore be avoided?)
+
+// the pseudocode which I followed implementing this algorithmn was taken
+// from the german book Algorithmische Graphentheorie by Volker Turau
+// it is proposed to be of O(n + nm_red ) where n is the number
+// of vertices and m_red is the number of edges in the transitive
+// reduction, but I think my implementation spoiled this up at some point
+// indicated below.
+
+namespace boost {
+
+template <
+    typename Graph, typename GraphTR, typename G_to_TR_VertexMap,
+    typename VertexIndexMap
+>
+BOOST_CONCEPT_REQUIRES(
+                      ((VertexListGraphConcept< Graph >))
+                      ((IncidenceGraphConcept< Graph >))
+                      ((MutableGraphConcept< GraphTR >))
+                      ((ReadablePropertyMapConcept< VertexIndexMap,
+                          typename graph_traits<Graph>::vertex_descriptor >))
+                      ((Integer< typename
+                          property_traits< VertexIndexMap >::value_type >))
+                      ((LvaluePropertyMapConcept< G_to_TR_VertexMap,
+                          typename graph_traits<Graph>::vertex_descriptor >)),
+                       (void))
+transitive_reduction(const Graph& g, GraphTR& tr,
+                     G_to_TR_VertexMap g_to_tr_map,
+                     VertexIndexMap g_index_map )
+{
+    typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+    typedef typename graph_traits<Graph>::vertex_iterator VertexIterator;
+    typedef typename std::vector<Vertex>::size_type size_type;
+
+    std::vector<Vertex> topo_order;
+    topological_sort(g, std::back_inserter(topo_order));
+
+    std::vector<size_type> topo_number_storage(num_vertices(g));
+
+    iterator_property_map<size_type*, VertexIndexMap,
+    size_type, size_type&> topo_number( &topo_number_storage[0], g_index_map );
+
+    {
+        typename std::vector<Vertex>::reverse_iterator it = topo_order.rbegin();
+        size_type n = 0;
+        for(; it != topo_order.rend(); ++it,++n ) {
+            topo_number[ *it ] = n;
+        }
+    }
+
+    std::vector< std::vector< bool > > edge_in_closure(num_vertices(g),
+                                            std::vector<bool>( num_vertices(g), false));
+    {
+        typename std::vector<Vertex>::reverse_iterator it = topo_order.rbegin();
+            for( ; it != topo_order.rend(); ++it ) {
+            g_to_tr_map[*it] = add_vertex(tr);
+        }
+    }
+
+    typename std::vector<Vertex>::iterator
+        it = topo_order.begin(),
+        end = topo_order.end();
+    for( ; it != end; ++it ) {
+        size_type i = topo_number[ *it ];
+        edge_in_closure[i][i] = true;
+        std::vector<Vertex> neighbors;
+
+        //I have to collect the successors of *it and traverse them in
+        //ascending topological order. I didn't know a better way, how to
+        //do that. So what I'm doint is, collection the successors of *it here
+        {
+            typename Graph::out_edge_iterator oi,oi_end;
+            for( tie(oi, oi_end) = out_edges( *it, g ); oi != oi_end; ++oi ) {
+                neighbors.push_back( target( *oi, g ) );
+            }
+        }
+
+        {
+            //and run through all vertices in topological order
+            typename std::vector<Vertex>::reverse_iterator
+                rit = topo_order.rbegin();
+                rend = topo_order.rend();
+            for(; rit != rend; ++rit ) {
+                //looking if they are successors of *it
+                if( std::find( neighbors.begin(), neighbors.end(), *rit) != neighbors.end() ) {
+                    size_type j = topo_number[ *rit ];
+                    if( not edge_in_closure[i][j] ) {
+                    for(size_type k = j; k < num_vertices(g); ++k) {
+                        if( not edge_in_closure[i][k] ) {
+                        //here we need edge_in_closure to be in topological order,
+                        edge_in_closure[i][k] = edge_in_closure[j][k];
+                        }
+                    }
+                    //therefore we only access edge_in_closure only through
+                    //topo_number property_map
+                    add_edge(g_to_tr_map[*it], g_to_tr_map[*rit], tr);
+                    } //if ( not edge_in_
+                } //if (find (
+            } //for( typename vector<Vertex>::reverse_iterator
+        } // {
+
+    } //for( typename vector<Vertex>::iterator
+
+} //void transitive_reduction
+
+} // namespace boost
+
+#endif
+
similarity index 88%
rename from deal.II/contrib/boost/include/boost/graph/two_bit_color_map.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/two_bit_color_map.hpp
index 3a6d6913211434edd562eaba372c424a344fdd8b..3dbcdcef9c00bca03656b44e69c816985223eda2 100644 (file)
@@ -13,8 +13,9 @@
 #ifndef BOOST_TWO_BIT_COLOR_MAP_HPP
 #define BOOST_TWO_BIT_COLOR_MAP_HPP
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/shared_array.hpp>
+#include <algorithm>
 
 namespace boost {
 
@@ -50,6 +51,8 @@ struct two_bit_color_map
   explicit two_bit_color_map(std::size_t n, const IndexMap& index = IndexMap())
     : n(n), index(index), data(new unsigned char[(n + 3) / 4])
   {
+    // Fill to white
+    std::fill(data.get(), data.get() + (n + 3) / 4, 0);
   }
 };
 
@@ -59,7 +62,7 @@ get(const two_bit_color_map<IndexMap>& pm,
     typename two_bit_color_map<IndexMap>::key_type key) 
 {
   typename property_traits<IndexMap>::value_type i = get(pm.index, key);
-  assert (i < pm.n);
+  assert ((std::size_t)i < pm.n);
   return two_bit_color_type((pm.data.get()[i / 4] >> ((i % 4) * 2)) & 3);
 }
 
@@ -70,7 +73,7 @@ put(const two_bit_color_map<IndexMap>& pm,
     two_bit_color_type value)
 {
   typename property_traits<IndexMap>::value_type i = get(pm.index, key);
-  assert (i < pm.n);
+  assert ((std::size_t)i < pm.n);
   assert (value >= 0 && value < 4);
   std::size_t byte_num = i / 4;
   std::size_t bit_position = ((i % 4) * 2);
@@ -88,3 +91,7 @@ make_two_bit_color_map(std::size_t n, const IndexMap& index_map)
 } // end namespace boost
 
 #endif // BOOST_TWO_BIT_COLOR_MAP_HPP
+
+#ifdef BOOST_GRAPH_USE_MPI
+#  include <boost/graph/distributed/two_bit_color_map.hpp>
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/undirected_graph.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/undirected_graph.hpp
new file mode 100644 (file)
index 0000000..abfa4ad
--- /dev/null
@@ -0,0 +1,689 @@
+// (C) Copyright 2007-2009 Andrew Sutton
+//
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0 (See accompanying file
+// LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_GRAPH_UNDIRECTED_GRAPH_HPP
+#define BOOST_GRAPH_UNDIRECTED_GRAPH_HPP
+
+#include <boost/utility.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/properties.hpp>
+
+// NOTE: The retag_property_list is used to "normalize" a proeprty such that
+// any non-property conforming parameter is wrapped in a vertex_bundle
+// property. For example (with bad syntax) retag<property<X>> -> property<X>,
+// but retag<foo> -> property<vertex_bundle_t, foo>.
+
+namespace boost
+{
+struct undirected_graph_tag { };
+
+/**
+ * The undirected_graph class template is a simplified version of the BGL
+ * adjacency list. This class is provided for ease of use, but may not
+ * perform as well as custom-defined adjacency list classes. Instances of
+ * this template model the VertexIndexGraph, and EdgeIndexGraph concepts. The
+ * graph is also fully mutable, supporting both insertions and removals of
+ * vertices and edges.
+ *
+ * @note Special care must be taken when removing vertices or edges since
+ * those operations can invalidate the numbering of vertices.
+ */
+template <
+    typename VertexProp = no_property,
+    typename EdgeProp= no_property,
+    typename GraphProp = no_property>
+class undirected_graph
+{
+public:
+    typedef typename graph_detail::vertex_prop<VertexProp>::type vertex_property_type;
+    typedef typename graph_detail::vertex_prop<VertexProp>::bundle vertex_bundled;
+    typedef typename graph_detail::edge_prop<EdgeProp>::type edge_property_type;
+    typedef typename graph_detail::edge_prop<EdgeProp>::bundle edge_bundled;
+
+private:
+    typedef property<vertex_index_t, unsigned, vertex_property_type> vertex_property;
+    typedef property<edge_index_t, unsigned, edge_property_type> edge_property;
+public:
+    typedef adjacency_list<listS,
+                listS,
+                undirectedS,
+                vertex_property,
+                edge_property,
+                GraphProp,
+                listS> graph_type;
+private:
+    // storage selectors
+    typedef typename graph_type::vertex_list_selector vertex_list_selector;
+    typedef typename graph_type::edge_list_selector edge_list_selector;
+    typedef typename graph_type::out_edge_list_selector out_edge_list_selector;
+    typedef typename graph_type::directed_selector directed_selector;
+
+public:
+    typedef undirected_graph_tag graph_tag;
+    typedef typename graph_type::graph_property_type graph_property_type;
+
+    // more commonly used graph types
+    typedef typename graph_type::stored_vertex stored_vertex;
+    typedef typename graph_type::vertices_size_type vertices_size_type;
+    typedef typename graph_type::edges_size_type edges_size_type;
+    typedef typename graph_type::degree_size_type degree_size_type;
+    typedef typename graph_type::vertex_descriptor vertex_descriptor;
+    typedef typename graph_type::edge_descriptor edge_descriptor;
+
+    // iterator types
+    typedef typename graph_type::vertex_iterator vertex_iterator;
+    typedef typename graph_type::edge_iterator edge_iterator;
+    typedef typename graph_type::out_edge_iterator out_edge_iterator;
+    typedef typename graph_type::in_edge_iterator in_edge_iterator;
+    typedef typename graph_type::adjacency_iterator adjacency_iterator;
+
+    // miscellaneous types
+    typedef typename graph_type::directed_category directed_category;
+    typedef typename graph_type::edge_parallel_category edge_parallel_category;
+    typedef typename graph_type::traversal_category traversal_category;
+
+    typedef std::size_t vertex_index_type;
+    typedef std::size_t edge_index_type;
+
+    inline undirected_graph(GraphProp const& p = GraphProp())
+        : m_graph(p), m_num_vertices(0), m_num_edges(0), m_max_vertex_index(0)
+        , m_max_edge_index(0)
+    { }
+
+    inline undirected_graph(undirected_graph const& x)
+        : m_graph(x), m_num_vertices(x.m_num_vertices), m_num_edges(x.m_num_edges)
+        , m_max_vertex_index(x.m_max_vertex_index), m_max_edge_index(x.m_max_edge_index)
+    { }
+
+    inline undirected_graph(vertices_size_type n,
+                            GraphProp const& p = GraphProp())
+        : m_graph(n, p), m_num_vertices(n), m_num_edges(0), m_max_vertex_index(n)
+        , m_max_edge_index(0)
+    { renumber_vertex_indices(); }
+
+    template <typename EdgeIterator>
+    inline undirected_graph(EdgeIterator f,
+                            EdgeIterator l,
+                            vertices_size_type n,
+                            edges_size_type m = 0,
+                            GraphProp const& p = GraphProp())
+        : m_graph(f, l, n, m, p), m_num_vertices(n), m_num_edges(0)
+        , m_max_vertex_index(n), m_max_edge_index(0)
+    {
+        // Unfortunately, we have to renumber to ensure correct indexing.
+        renumber_indices();
+
+        // Can't always guarantee that the number of edges is actually
+        // m if distance(f, l) != m (or is undefined).
+        m_num_edges = m_max_edge_index = boost::num_edges(m_graph);
+    }
+
+    undirected_graph& operator =(undirected_graph const& g) {
+        if(&g != this) {
+            m_graph = g.m_graph;
+            m_num_vertices = g.m_num_vertices;
+            m_num_edges = g.m_num_edges;
+            m_max_vertex_index = g.m_max_vertex_index;
+        }
+        return *this;
+    }
+
+    // The impl_() methods are not part of the public interface.
+    graph_type& impl()
+    { return m_graph; }
+
+    graph_type const& impl() const
+    { return m_graph; }
+
+    // The following methods are not part of the public interface
+    vertices_size_type num_vertices() const
+    { return m_num_vertices; }
+
+
+private:
+    // This helper function manages the attribution of vertex indices.
+    vertex_descriptor make_index(vertex_descriptor v) {
+        boost::put(vertex_index, m_graph, v, m_max_vertex_index);
+        m_num_vertices++;
+        m_max_vertex_index++;
+        return v;
+    }
+public:
+    vertex_descriptor add_vertex()
+    { return make_index(boost::add_vertex(m_graph)); }
+
+    vertex_descriptor add_vertex(vertex_property_type const& p)
+    { return make_index(boost::add_vertex(vertex_property(0u, p), m_graph)); }
+
+    void clear_vertex(vertex_descriptor v) {
+        std::pair<out_edge_iterator, out_edge_iterator>
+        p = boost::out_edges(v, m_graph);
+        m_num_edges -= std::distance(p.first, p.second);
+        boost::clear_vertex(v, m_graph);
+    }
+
+    void remove_vertex(vertex_descriptor v) {
+        boost::remove_vertex(v, m_graph);
+        --m_num_vertices;
+    }
+
+    edges_size_type num_edges() const
+    { return m_num_edges; }
+
+private:
+    // A helper fucntion for managing edge index attributes.
+    std::pair<edge_descriptor, bool> const&
+    make_index(std::pair<edge_descriptor, bool> const& x)
+    {
+        if(x.second) {
+            boost::put(edge_index, m_graph, x.first, m_max_edge_index);
+            ++m_num_edges;
+            ++m_max_edge_index;
+        }
+        return x;
+    }
+public:
+    std::pair<edge_descriptor, bool>
+    add_edge(vertex_descriptor u, vertex_descriptor v)
+    { return make_index(boost::add_edge(u, v, m_graph)); }
+
+    std::pair<edge_descriptor, bool>
+    add_edge(vertex_descriptor u, vertex_descriptor v,
+             edge_property_type const& p)
+    { return make_index(boost::add_edge(u, v, edge_property(0u, p), m_graph)); }
+
+    void remove_edge(vertex_descriptor u, vertex_descriptor v) {
+        // find all edges, (u, v)
+        std::vector<edge_descriptor> edges;
+        out_edge_iterator i, i_end;
+        for(tie(i, i_end) = boost::out_edges(u, m_graph); i != i_end; ++i) {
+            if(boost::target(*i, m_graph) == v) {
+                edges.push_back(*i);
+            }
+        }
+        // remove all edges, (u, v)
+        typename std::vector<edge_descriptor>::iterator
+        j = edges.begin(), j_end = edges.end();
+        for( ; j != j_end; ++j) {
+            remove_edge(*j);
+        }
+    }
+
+    void remove_edge(edge_iterator i) {
+        remove_edge(*i);
+    }
+
+    void remove_edge(edge_descriptor e) {
+        boost::remove_edge(e, m_graph);
+        --m_num_edges;
+    }
+
+    vertex_index_type max_vertex_index() const
+    { return m_max_vertex_index; }
+
+    void renumber_vertex_indices() {
+        vertex_iterator i, i_end;
+        tie(i, i_end) = vertices(m_graph);
+        m_max_vertex_index = renumber_vertex_indices(i, i_end, 0);
+    }
+
+    void remove_vertex_and_renumber_indices(vertex_iterator i) {
+        vertex_iterator j = next(i), end = vertices(m_graph).second;
+        vertex_index_type n = get(vertex_index, m_graph, *i);
+
+        // remove the offending vertex and renumber everything after
+        remove_vertex(*i);
+        m_max_vertex_index = renumber_vertex_indices(j, end, n);
+    }
+
+
+    edge_index_type max_edge_index() const
+    { return m_max_edge_index; }
+
+    void renumber_edge_indices() {
+        edge_iterator i, end;
+        tie(i, end) = edges(m_graph);
+        m_max_edge_index = renumber_edge_indices(i, end, 0);
+    }
+
+    void remove_edge_and_renumber_indices(edge_iterator i) {
+        edge_iterator j = next(i), end = edges(m_graph.second);
+        edge_index_type n = get(edge_index, m_graph, *i);
+
+        // remove the edge and renumber everything after it
+        remove_edge(*i);
+        m_max_edge_index = renumber_edge_indices(j, end, n);
+    }
+
+    void renumber_indices() {
+        renumber_vertex_indices();
+        renumber_edge_indices();
+    }
+
+    // bundled property support
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+    vertex_bundled& operator[](vertex_descriptor v)
+    { return m_graph[v]; }
+
+    vertex_bundled const& operator[](vertex_descriptor v) const
+    { return m_graph[v]; }
+
+    edge_bundled& operator[](edge_descriptor e)
+    { return m_graph[e]; }
+
+    edge_bundled const& operator[](edge_descriptor e) const
+    { return m_graph[e]; }
+#endif
+
+    // Graph concepts
+    static vertex_descriptor null_vertex()
+    { return graph_type::null_vertex(); }
+
+    void clear() {
+        m_graph.clear();
+        m_num_vertices = m_max_vertex_index = 0;
+        m_num_edges = m_max_edge_index = 0;
+    }
+
+    void swap(undirected_graph& g) {
+        m_graph.swap(g);
+        std::swap(m_num_vertices, g.m_num_vertices);
+        std::swap(m_max_vertex_index, g.m_max_vertex_index);
+        std::swap(m_num_edges, g.m_num_edges);
+        std::swap(m_max_edge_index, g.m_max_edge_index);
+    }
+
+private:
+    vertices_size_type renumber_vertex_indices(vertex_iterator i,
+                                               vertex_iterator end,
+                                               vertices_size_type n)
+    {
+        typedef typename property_map<graph_type, vertex_index_t>::type IndexMap;
+        IndexMap indices = get(vertex_index, m_graph);
+        for( ; i != end; ++i) {
+            indices[*i] = n++;
+        }
+        return n;
+    }
+
+    edges_size_type renumber_edge_indices(edge_iterator i,
+                                          edge_iterator end,
+                                          edges_size_type n)
+    {
+        typedef typename property_map<graph_type, edge_index_t>::type IndexMap;
+        IndexMap indices = get(edge_index, m_graph);
+        for( ; i != end; ++i) {
+            indices[*i] = n++;
+        }
+        return n;
+    }
+
+    graph_type m_graph;
+    vertices_size_type m_num_vertices;
+    edges_size_type m_num_edges;
+    vertex_index_type m_max_vertex_index;
+    edge_index_type m_max_edge_index;
+};
+
+#define UNDIRECTED_GRAPH_PARAMS typename VP, typename EP, typename GP
+#define UNDIRECTED_GRAPH undirected_graph<VP,EP,GP>
+
+// IncidenceGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertex_descriptor
+source(typename UNDIRECTED_GRAPH::edge_descriptor e,
+       UNDIRECTED_GRAPH const& g)
+{ return source(e, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertex_descriptor
+target(typename UNDIRECTED_GRAPH::edge_descriptor e,
+       UNDIRECTED_GRAPH const& g)
+{ return target(e, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::degree_size_type
+out_degree(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+           UNDIRECTED_GRAPH const& g)
+{ return out_degree(v, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::out_edge_iterator,
+    typename UNDIRECTED_GRAPH::out_edge_iterator
+>
+out_edges(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+          UNDIRECTED_GRAPH const& g)
+{ return out_edges(v, g.impl()); }
+
+// BidirectionalGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::degree_size_type
+in_degree(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+          UNDIRECTED_GRAPH const& g)
+{ return in_degree(v, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::in_edge_iterator,
+    typename UNDIRECTED_GRAPH::in_edge_iterator
+>
+in_edges(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+         UNDIRECTED_GRAPH const& g)
+{ return in_edges(v, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::out_edge_iterator,
+    typename UNDIRECTED_GRAPH::out_edge_iterator
+>
+incident_edges(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+               UNDIRECTED_GRAPH const& g)
+{ return out_edges(v, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::degree_size_type
+degree(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+       UNDIRECTED_GRAPH const& g)
+{ return degree(v, g.impl()); }
+
+// AdjacencyGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::adjacency_iterator,
+    typename UNDIRECTED_GRAPH::adjacency_iterator
+    >
+adjacent_vertices(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+                  UNDIRECTED_GRAPH const& g)
+{ return adjacent_vertices(v, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+typename UNDIRECTED_GRAPH::vertex_descriptor
+vertex(typename UNDIRECTED_GRAPH::vertices_size_type n,
+       UNDIRECTED_GRAPH const& g)
+{ return vertex(g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+std::pair<typename UNDIRECTED_GRAPH::edge_descriptor, bool>
+edge(typename UNDIRECTED_GRAPH::vertex_descriptor u,
+    typename UNDIRECTED_GRAPH::vertex_descriptor v,
+    UNDIRECTED_GRAPH const& g)
+{ return edge(u, v, g.impl()); }
+
+// VertexListGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertices_size_type
+num_vertices(UNDIRECTED_GRAPH const& g)
+{ return g.num_vertices(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::vertex_iterator,
+    typename UNDIRECTED_GRAPH::vertex_iterator
+>
+vertices(UNDIRECTED_GRAPH const& g)
+{ return vertices(g.impl()); }
+
+// EdgeListGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::edges_size_type
+num_edges(UNDIRECTED_GRAPH const& g)
+{ return g.num_edges(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<
+    typename UNDIRECTED_GRAPH::edge_iterator,
+    typename UNDIRECTED_GRAPH::edge_iterator
+>
+edges(UNDIRECTED_GRAPH const& g)
+{ return edges(g.impl()); }
+
+// MutableGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertex_descriptor
+add_vertex(UNDIRECTED_GRAPH& g)
+{ return g.add_vertex(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertex_descriptor
+add_vertex(typename UNDIRECTED_GRAPH::vertex_property_type const& p,
+           UNDIRECTED_GRAPH& g)
+{ return g.add_vertex(p); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+clear_vertex(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+             UNDIRECTED_GRAPH& g)
+{ return g.clear_vertex(v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_vertex(typename UNDIRECTED_GRAPH::vertex_descriptor v, UNDIRECTED_GRAPH& g)
+{ return g.remove_vertex(v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<typename UNDIRECTED_GRAPH::edge_descriptor, bool>
+add_edge(typename UNDIRECTED_GRAPH::vertex_descriptor u,
+         typename UNDIRECTED_GRAPH::vertex_descriptor v,
+         UNDIRECTED_GRAPH& g)
+{ return g.add_edge(u, v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline std::pair<typename UNDIRECTED_GRAPH::edge_descriptor, bool>
+add_edge(typename UNDIRECTED_GRAPH::vertex_descriptor u,
+         typename UNDIRECTED_GRAPH::vertex_descriptor v,
+         typename UNDIRECTED_GRAPH::edge_property_type const& p,
+         UNDIRECTED_GRAPH& g)
+{ return g.add_edge(u, v, p); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_edge(typename UNDIRECTED_GRAPH::vertex_descriptor u,
+            typename UNDIRECTED_GRAPH::vertex_descriptor v,
+            UNDIRECTED_GRAPH& g)
+{ return g.remove_edge(u, v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_edge(typename UNDIRECTED_GRAPH::edge_descriptor e, UNDIRECTED_GRAPH& g)
+{ return g.remove_edge(e); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_edge(typename UNDIRECTED_GRAPH::edge_iterator i, UNDIRECTED_GRAPH& g)
+{ return g.remove_edge(i); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Predicate>
+inline void remove_edge_if(Predicate pred, UNDIRECTED_GRAPH& g)
+{ return remove_edge_if(pred, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Predicate>
+inline void
+remove_incident_edge_if(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+                        Predicate pred,
+                        UNDIRECTED_GRAPH& g)
+{ return remove_out_edge_if(v, pred, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Predicate>
+inline void
+remove_out_edge_if(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+                   Predicate pred,
+                   UNDIRECTED_GRAPH& g)
+{ return remove_out_edge_if(v, pred, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Predicate>
+inline void
+remove_in_edge_if(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+                  Predicate pred,
+                  UNDIRECTED_GRAPH& g)
+{ return remove_in_edge_if(v, pred, g.impl()); }
+
+// Helper code for working with property maps
+namespace detail {
+    struct undirected_graph_vertex_property_selector {
+        template <class UndirectedGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename UndirectedGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+
+    struct undirected_graph_edge_property_selector {
+        template <class UndirectedGraph, class Property, class Tag>
+        struct bind_ {
+            typedef typename UndirectedGraph::graph_type Graph;
+            typedef property_map<Graph, Tag> PropertyMap;
+            typedef typename PropertyMap::type type;
+            typedef typename PropertyMap::const_type const_type;
+        };
+    };
+} // namespace detail
+
+template <>
+struct vertex_property_selector<undirected_graph_tag>
+{ typedef detail::undirected_graph_vertex_property_selector type; };
+
+template <>
+struct edge_property_selector<undirected_graph_tag>
+{ typedef detail::undirected_graph_edge_property_selector type; };
+
+// PropertyGraph concepts
+template <UNDIRECTED_GRAPH_PARAMS, typename Property>
+inline typename property_map<UNDIRECTED_GRAPH, Property>::type
+get(Property p, UNDIRECTED_GRAPH& g)
+{ return get(p, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Property>
+inline typename property_map<UNDIRECTED_GRAPH, Property>::const_type
+get(Property p, UNDIRECTED_GRAPH const& g)
+{ return get(p, g.impl()); }
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Property, typename Key>
+inline typename property_traits<
+    typename property_map<
+        typename UNDIRECTED_GRAPH::graph_type, Property
+    >::const_type
+>::value_type
+get(Property p, UNDIRECTED_GRAPH const& g, Key const& k)
+{ return get(p, g.impl(), k); }
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Property, typename Key, typename Value>
+inline void put(Property p, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
+{ put(p, g.impl(), k, v); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Property>
+inline typename graph_property<UNDIRECTED_GRAPH, Property>::type&
+get_property(UNDIRECTED_GRAPH& g, Property p)
+{ return get_property(g.impl(), p); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Property>
+inline typename graph_property<UNDIRECTED_GRAPH, Property>::type const&
+get_property(UNDIRECTED_GRAPH const& g, Property p)
+{ return get_property(g.impl(), p); }
+
+template <UNDIRECTED_GRAPH_PARAMS, class Property, class Value>
+inline void set_property(UNDIRECTED_GRAPH& g, Property p, Value v)
+{ return set_property(g.impl(), p, v); }
+
+#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
+template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
+inline typename property_map<UNDIRECTED_GRAPH, Type Bundle::*>::type
+get(Type Bundle::* p, UNDIRECTED_GRAPH& g) {
+    typedef typename property_map<
+        UNDIRECTED_GRAPH, Type Bundle::*
+    >::type return_type;
+    return return_type(&g, p);
+}
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle>
+inline typename property_map<UNDIRECTED_GRAPH, Type Bundle::*>::const_type
+get(Type Bundle::* p, UNDIRECTED_GRAPH const& g) {
+    typedef typename property_map<
+        UNDIRECTED_GRAPH, Type Bundle::*
+    >::const_type return_type;
+    return return_type(&g, p);
+}
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key>
+inline Type
+get(Type Bundle::* p, UNDIRECTED_GRAPH const& g, Key const& k)
+{ return get(p, g.impl(), k); }
+
+template <UNDIRECTED_GRAPH_PARAMS, typename Type, typename Bundle, typename Key, typename Value>
+inline void
+put(Type Bundle::* p, UNDIRECTED_GRAPH& g, Key const& k, Value const& v)
+{ put(p, g.impl(), k, v); }
+#endif
+
+// Indexed Vertex graph
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::vertex_index_type
+get_vertex_index(typename UNDIRECTED_GRAPH::vertex_descriptor v,
+                 UNDIRECTED_GRAPH const& g)
+{ return get(vertex_index, g, v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+typename UNDIRECTED_GRAPH::vertex_index_type
+max_vertex_index(UNDIRECTED_GRAPH const& g)
+{ return g.max_vertex_index(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+renumber_vertex_indices(UNDIRECTED_GRAPH& g)
+{ g.renumber_vertex_indices(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_vertex_and_renumber_indices(typename UNDIRECTED_GRAPH::vertex_iterator i,
+                                   UNDIRECTED_GRAPH& g)
+{ g.remove_vertex_and_renumber_indices(i); }
+
+
+// Edge index management
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline typename UNDIRECTED_GRAPH::edge_index_type
+get_edge_index(typename UNDIRECTED_GRAPH::edge_descriptor v,
+               UNDIRECTED_GRAPH const& g)
+{ return get(edge_index, g, v); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+typename UNDIRECTED_GRAPH::edge_index_type
+max_edge_index(UNDIRECTED_GRAPH const& g)
+{ return g.max_edge_index(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+renumber_edge_indices(UNDIRECTED_GRAPH& g)
+{ g.renumber_edge_indices(); }
+
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+remove_edge_and_renumber_indices(typename UNDIRECTED_GRAPH::edge_iterator i,
+                                 UNDIRECTED_GRAPH& g)
+{ g.remove_edge_and_renumber_indices(i); }
+
+// Index management
+template <UNDIRECTED_GRAPH_PARAMS>
+inline void
+renumber_indices(UNDIRECTED_GRAPH& g)
+{ g.renumber_indices(); }
+
+// Mutability Traits
+template <UNDIRECTED_GRAPH_PARAMS>
+struct graph_mutability_traits<UNDIRECTED_GRAPH> {
+    typedef mutable_property_graph_tag category;
+};
+
+#undef UNDIRECTED_GRAPH_PARAMS
+#undef UNDIRECTED_GRAPH
+
+} /* namespace boost */
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/use_mpi.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/use_mpi.hpp
new file mode 100644 (file)
index 0000000..b77f9c0
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright (C) 2004-2009 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Nick Edmonds
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_USE_MPI_HPP
+#define BOOST_GRAPH_USE_MPI_HPP
+
+#define BOOST_GRAPH_USE_MPI
+
+#endif // BOOST_GRAPH_USE_MPI_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/graph/vector_as_graph.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/vector_as_graph.hpp
index 711b799ec56e77576550b62fe1b9cc32339afd81..8ca1b916f8cfd88a32af874c89bb186acea3c513 100644 (file)
@@ -21,7 +21,7 @@
 #include <boost/iterator.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/pending/integer_range.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/properties.hpp>
 #include <algorithm>
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/graph/vertex_and_edge_range.hpp b/deal.II/contrib/boost-1.41.0/include/boost/graph/vertex_and_edge_range.hpp
new file mode 100644 (file)
index 0000000..bcba2bf
--- /dev/null
@@ -0,0 +1,141 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+#ifndef BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
+#define BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
+
+#include <boost/graph/graph_traits.hpp>
+#include <iterator>
+
+namespace boost { 
+
+namespace graph {
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  class vertex_and_edge_range
+  {
+    typedef graph_traits<Graph> traits_type;
+
+  public:
+    typedef typename traits_type::directed_category directed_category;
+    typedef typename traits_type::edge_parallel_category
+      edge_parallel_category;
+    struct traversal_category 
+      : public virtual vertex_list_graph_tag,
+        public virtual edge_list_graph_tag { };
+
+    typedef std::size_t vertices_size_type;
+    typedef VertexIterator vertex_iterator;
+    typedef typename std::iterator_traits<VertexIterator>::value_type 
+      vertex_descriptor;
+
+    typedef EdgeIterator edge_iterator;
+    typedef typename std::iterator_traits<EdgeIterator>::value_type
+      edge_descriptor;
+
+    typedef std::size_t edges_size_type;
+
+    typedef void adjacency_iterator;
+    typedef void out_edge_iterator;
+    typedef void in_edge_iterator;
+    typedef void degree_size_type;
+
+    static vertex_descriptor null_vertex() 
+    { return traits_type::null_vertex(); }
+
+    vertex_and_edge_range(const Graph& g,
+                          VertexIterator first_v, VertexIterator last_v,
+                          vertices_size_type n,
+                          EdgeIterator first_e, EdgeIterator last_e,
+                          edges_size_type m)
+      : g(&g), 
+        first_vertex(first_v), last_vertex(last_v), m_num_vertices(n),
+        first_edge(first_e), last_edge(last_e), m_num_edges(m)
+    {
+    }
+
+    vertex_and_edge_range(const Graph& g, 
+                          VertexIterator first_v, VertexIterator last_v,
+                          EdgeIterator first_e, EdgeIterator last_e)
+      : g(&g), 
+        first_vertex(first_v), last_vertex(last_v),
+        first_edge(first_e), last_edge(last_e)
+    {
+      m_num_vertices = std::distance(first_v, last_v);
+      m_num_edges = std::distance(first_e, last_e);
+    }
+
+    const Graph* g;
+    vertex_iterator first_vertex;
+    vertex_iterator last_vertex;
+    vertices_size_type m_num_vertices;
+    edge_iterator first_edge;
+    edge_iterator last_edge;
+    edges_size_type m_num_edges;
+  };
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline std::pair<VertexIterator, VertexIterator>
+  vertices(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
+  { return std::make_pair(g.first_vertex, g.last_vertex); }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::vertices_size_type
+  num_vertices(const vertex_and_edge_range<Graph, VertexIterator, 
+                                           EdgeIterator>& g)
+  { return g.m_num_vertices; }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline std::pair<EdgeIterator, EdgeIterator>
+  edges(const vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>& g)
+  { return std::make_pair(g.first_edge, g.last_edge); }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::edges_size_type
+  num_edges(const vertex_and_edge_range<Graph, VertexIterator, 
+                                        EdgeIterator>& g)
+  { return g.m_num_edges; }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::vertex_descriptor
+  source(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::edge_descriptor e,
+         const vertex_and_edge_range<Graph, VertexIterator, 
+                                        EdgeIterator>& g)
+  { return source(e, *g.g); }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::vertex_descriptor
+  target(typename vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+                    ::edge_descriptor e,
+         const vertex_and_edge_range<Graph, VertexIterator, 
+                                        EdgeIterator>& g)
+  { return target(e, *g.g); }
+
+  template<typename Graph, typename VertexIterator, typename EdgeIterator>
+  inline vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+  make_vertex_and_edge_range(const Graph& g,
+                             VertexIterator first_v, VertexIterator last_v,
+                             EdgeIterator first_e, EdgeIterator last_e)
+  { 
+    typedef vertex_and_edge_range<Graph, VertexIterator, EdgeIterator>
+      result_type;
+    return result_type(g, first_v, last_v, first_e, last_e);
+  }
+
+} // end namespace graph
+
+using graph::vertex_and_edge_range;
+using graph::make_vertex_and_edge_range;
+
+} // end namespace boost
+#endif // BOOST_GRAPH_VERTEX_AND_EDGE_RANGE_HPP
similarity index 94%
rename from deal.II/contrib/boost/include/boost/graph/visitors.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/graph/visitors.hpp
index 2b88ed061046c2aba6247266087c2c4a53347a1d..1091f101573992a62345f8aef07f12a734d82337 100644 (file)
 
 #include <iosfwd>
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/graph/graph_traits.hpp>
 #include <boost/limits.hpp>
-#include <boost/graph/detail/is_same.hpp>
 
 #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
 // Stay out of the way of the concept checking class
@@ -82,9 +83,6 @@ namespace boost {
   struct on_edge_not_minimized {
     enum { num = detail::on_edge_not_minimized_num }; };
 
-  struct true_tag { enum { num = true }; };
-  struct false_tag { enum { num = false }; };
-
   //========================================================================
   // base_visitor and null_visitor
 
@@ -107,21 +105,20 @@ namespace boost {
 
   namespace detail {
     template <class Visitor, class T, class Graph>
-    inline void
-    invoke_dispatch(Visitor& v, T x, Graph& g, true_tag) {
+    inline void invoke_dispatch(Visitor& v, T x, Graph& g, mpl::true_) {
        v(x, g);
     }
+
     template <class Visitor, class T, class Graph>
-    inline void
-    invoke_dispatch(Visitor&, T, Graph&, false_tag) { }
+    inline void invoke_dispatch(Visitor&, T, Graph&, mpl::false_)
+    { }
   } // namespace detail
 
   template <class Visitor, class Rest, class T, class Graph, class Tag>
   inline void
   invoke_visitors(std::pair<Visitor, Rest>& vlist, T x, Graph& g, Tag tag) {
     typedef typename Visitor::event_filter Category;
-    typedef typename graph_detail::is_same<Category, Tag>::is_same_tag
-      IsSameTag;
+    typedef typename is_same<Category, Tag>::type IsSameTag;
     detail::invoke_dispatch(vlist.first, x, g, IsSameTag());
     invoke_visitors(vlist.second, x, g, tag);
   }
@@ -130,8 +127,7 @@ namespace boost {
   inline void
   invoke_visitors(base_visitor<Visitor>& vis, T x, Graph& g, Tag) {
     typedef typename Visitor::event_filter Category;
-    typedef typename graph_detail::is_same<Category, Tag>::is_same_tag
-      IsSameTag;
+    typedef typename is_same<Category, Tag>::type IsSameTag;
     Visitor& v = static_cast<Visitor&>(vis);
     detail::invoke_dispatch(v, x, g, IsSameTag());
   }
@@ -140,8 +136,7 @@ namespace boost {
   inline void
   invoke_visitors(Visitor& v, T x, Graph& g, Tag) {
     typedef typename Visitor::event_filter Category;
-    typedef typename graph_detail::is_same<Category, Tag>::is_same_tag
-      IsSameTag;
+    typedef typename is_same<Category, Tag>::type IsSameTag;
     detail::invoke_dispatch(v, x, g, IsSameTag());
   }
 #endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/integer/static_log2.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/integer/static_log2.hpp
index 19e048bd032b637690e602909b9c288bbf556c74..219a48e34116ef5b61027afafc634c5ef239630f 100644 (file)
@@ -48,7 +48,7 @@ namespace boost {
      template <result_type n>
      struct choose_initial_n {
 
-         enum { c = (argument_type(1) << n << n) != 0 };
+         BOOST_STATIC_CONSTANT(bool, c = (argument_type(1) << n << n) != 0);
          BOOST_STATIC_CONSTANT(
              result_type,
              value = !c*n + choose_initial_n<2*c*n>::value
@@ -85,7 +85,7 @@ namespace boost {
      template <argument_type x, result_type n = initial_n>
      struct static_log2_impl {
 
-         enum { c = (x >> n) > 0 }; // x >= 2**n ?
+         BOOST_STATIC_CONSTANT(bool, c = (x >> n) > 0); // x >= 2**n ?
          BOOST_STATIC_CONSTANT(
              result_type,
              value = c*n + (static_log2_impl< (x>>c*n), n/2 >::value)
similarity index 98%
rename from deal.II/contrib/boost/include/boost/intrusive/any_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/any_hook.hpp
index 4690cef4e3334f05dcc323b9669a419c46282106..b1b0194757954a4faf5527aae621b5bc25200ccd 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2008
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -309,7 +309,7 @@ struct any_to_set_hook
 {};
 
 //!This option setter specifies that
-//!any hook should behave as a set hook
+//!any hook should behave as an avl_set hook
 template<class BaseHook>
 struct any_to_avl_set_hook
 /// @cond
@@ -318,7 +318,7 @@ struct any_to_avl_set_hook
 {};
 
 //!This option setter specifies that any
-//!hook should behave as a set hook
+//!hook should behave as a bs_set hook
 template<class BaseHook>
 struct any_to_bs_set_hook
 /// @cond
similarity index 92%
rename from deal.II/contrib/boost/include/boost/intrusive/avl_set.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/avl_set.hpp
index a550232117c487d5adcd41e725290046e90aabd7..a9440774e992c636809c16aa223b6f82afa11ac9 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -15,6 +15,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <boost/intrusive/avltree.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <iterator>
 
 namespace boost {
@@ -342,7 +343,7 @@ class avl_set_impl
 
    //! <b>Requires</b>: value must be an lvalue
    //! 
-   //! <b>Effects</b>: Tries to inserts value into the avl_set.
+   //! <b>Effects</b>: Treaps to inserts value into the avl_set.
    //!
    //! <b>Returns</b>: If the value
    //!   is not already present inserts it and returns a pair containing the
@@ -362,7 +363,7 @@ class avl_set_impl
 
    //! <b>Requires</b>: value must be an lvalue
    //! 
-   //! <b>Effects</b>: Tries to to insert x into the avl_set, using "hint" 
+   //! <b>Effects</b>: Treaps to to insert x into the avl_set, using "hint" 
    //!   as a hint to where it will be inserted.
    //!
    //! <b>Returns</b>: An iterator that points to the position where the 
@@ -380,7 +381,7 @@ class avl_set_impl
 
    //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
    //!   the same strict weak ordering as value_compare. The difference is that
-   //!   key_value_comp compares an aavlitrary key with the contained values.
+   //!   key_value_comp compares an arbitrary key with the contained values.
    //! 
    //! <b>Effects</b>: Checks if a value can be inserted in the avl_set, using
    //!   a user provided key instead of the value itself.
@@ -415,7 +416,7 @@ class avl_set_impl
 
    //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
    //!   the same strict weak ordering as value_compare. The difference is that
-   //!   key_value_comp compares an aavlitrary key with the contained values.
+   //!   key_value_comp compares an arbitrary key with the contained values.
    //! 
    //! <b>Effects</b>: Checks if a value can be inserted in the avl_set, using
    //!   a user provided key instead of the value itself, using "hint" 
@@ -488,6 +489,60 @@ class avl_set_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_unique(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate. "value" must not be equal to any
+   //!   inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" or "value" is not unique tree ordering and uniqueness
+   //! invariants will be broken respectively.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be greater than
+   //!   any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than or equal to the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be less
+   //!   than any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than or equal to the the mimum inserted key tree ordering or uniqueness
+   //!   invariants will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity is constant time.
@@ -498,7 +553,7 @@ class avl_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -512,7 +567,7 @@ class avl_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -540,7 +595,11 @@ class avl_set_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -557,9 +616,15 @@ class avl_set_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -575,7 +640,7 @@ class avl_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -610,7 +675,11 @@ class avl_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
@@ -1517,9 +1586,63 @@ class avl_multiset_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_equal(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate. "value" must not be equal to any
+   //!   inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" or "value" is not unique tree ordering and uniqueness
+   //! invariants will be broken respectively.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be greater than
+   //!   any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than or equal to the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be less
+   //!   than any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than or equal to the the mimum inserted key tree ordering or uniqueness
+   //!   invariants will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
-   //! <b>Complexity</b>: Average complexity is constant time. 
+   //! <b>Complexity</b>: Average complexity is constant time.
    //! 
    //! <b>Returns</b>: An iterator to the element after the erased element.
    //!
@@ -1527,7 +1650,7 @@ class avl_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -1541,7 +1664,7 @@ class avl_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -1569,7 +1692,11 @@ class avl_multiset_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1586,9 +1713,15 @@ class avl_multiset_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Returns</b>: An iterator to the element after the erased elements.
@@ -1604,7 +1737,7 @@ class avl_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1639,7 +1772,11 @@ class avl_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/avl_set_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/avl_set_hook.hpp
index 76fa739da0ffb530080245384fb759be9b0ddddf..23b1f0bd8f24b86f38ad7fd76e6a4958f3b0e25c 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -96,6 +96,7 @@ class avl_set_base_hook
       ::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -221,6 +222,7 @@ class avl_set_member_hook
       ::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 83%
rename from deal.II/contrib/boost/include/boost/intrusive/avltree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/avltree.hpp
index 46038a862207d166e03f999208a17e577b1e7dac..e65f18253b83b337bea2741a8b2277b901f77cb7 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -26,7 +26,9 @@
 #include <boost/intrusive/detail/avltree_node.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/avltree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -77,7 +79,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class avltree_impl
+   :  private detail::clear_on_destructor_base<avltree_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    public:
    typedef typename Config::value_traits                             value_traits;
    /// @cond
@@ -200,9 +204,11 @@ class avltree_impl
    //!   
    //! <b>Complexity</b>: Constant. 
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws. 
-   avltree_impl( value_compare cmp = value_compare()
-              , const value_traits &v_traits = value_traits()) 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor of the value_compare object throws. Basic guarantee.
+   avltree_impl( const value_compare &cmp = value_compare()
+               , const value_traits &v_traits = value_traits()) 
       :  data_(cmp, v_traits)
    {  
       node_algorithms::init_header(&priv_header());  
@@ -218,10 +224,12 @@ class avltree_impl
    //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
    //!   comp and otherwise N * log N, where N is the distance between first and last.
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws.
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare object throws. Basic guarantee.
    template<class Iterator>
    avltree_impl( bool unique, Iterator b, Iterator e
-              , value_compare cmp = value_compare()
+              , const value_compare &cmp     = value_compare()
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
@@ -237,11 +245,11 @@ class avltree_impl
    //!   are not deleted (i.e. no destructors are called), but the nodes according to 
    //!   the value_traits template parameter are reinitialized and thus can be reused. 
    //! 
-   //! <b>Complexity</b>: Linear to elements contained in *this. 
+   //! <b>Complexity</b>: Linear to elements contained in *this.
    //! 
    //! <b>Throws</b>: Nothing.
    ~avltree_impl() 
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Returns an iterator pointing to the beginning of the tree.
    //! 
@@ -397,7 +405,7 @@ class avltree_impl
    value_compare value_comp() const
    {  return priv_comp();   }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -407,7 +415,8 @@ class avltree_impl
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //! 
-   //! <b>Complexity</b>: Linear to elements contained in *this.
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
    //! 
    //! <b>Throws</b>: Nothing.
    size_type size() const
@@ -419,7 +428,7 @@ class avltree_impl
       }
    }
 
-   //! <b>Effects</b>: Swaps the contents of two multisets.
+   //! <b>Effects</b>: Swaps the contents of two avltrees.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -445,7 +454,7 @@ class avltree_impl
    //! <b>Complexity</b>: Average complexity for insert element is at
    //!   most logarithmic.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -471,7 +480,7 @@ class avltree_impl
    //! <b>Complexity</b>: Logarithmic in general, but it is amortized
    //!   constant time if t is inserted immediately before hint.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -524,7 +533,7 @@ class avltree_impl
    std::pair<iterator, bool> insert_unique(reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(value, priv_comp(), commit_data);
       if(!ret.second)
          return ret;
       return std::pair<iterator, bool> (insert_unique_commit(value, commit_data), true);
@@ -547,7 +556,7 @@ class avltree_impl
    iterator insert_unique(const_iterator hint, reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(hint, value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(hint, value, priv_comp(), commit_data);
       if(!ret.second)
          return ret.first;
       return insert_unique_commit(value, commit_data);
@@ -580,10 +589,36 @@ class avltree_impl
       }
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data)
@@ -596,10 +631,38 @@ class avltree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_iterator hint, const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(hint, value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const_iterator hint, const KeyType &key
@@ -613,6 +676,23 @@ class avltree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the container between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the avl_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
    iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
    {
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
@@ -624,6 +704,76 @@ class avltree_impl
       return iterator(to_insert, this);
    }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" tree ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      return iterator(node_algorithms::insert_before
+         (node_ptr(&priv_header()), pos.pointed_node(), to_insert), this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      node_algorithms::push_back(node_ptr(&priv_header()), to_insert);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      node_algorithms::push_front(node_ptr(&priv_header()), to_insert);
+   }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity for erase element is constant time. 
@@ -632,9 +782,9 @@ class avltree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {
-      iterator ret(i);
+      const_iterator ret(i);
       ++ret;
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
@@ -643,7 +793,7 @@ class avltree_impl
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
-      return ret;
+      return ret.unconst();
    }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -655,7 +805,7 @@ class avltree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  size_type n;   return private_erase(b, e, n);   }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -683,7 +833,11 @@ class avltree_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -703,7 +857,7 @@ class avltree_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {
       node_ptr to_erase(i.pointed_node());
       iterator ret(this->erase(i));
@@ -711,6 +865,12 @@ class avltree_impl
       return ret;
    }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -724,7 +884,7 @@ class avltree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  size_type n;   return private_erase(b, e, n, disposer);   }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -764,7 +924,11 @@ class avltree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -1212,20 +1376,21 @@ class avltree_impl
 */
 
    /// @cond
+
    private:
    template<class Disposer>
-   iterator private_erase(iterator b, iterator e, size_type &n, Disposer disposer)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer)
    {
       for(n = 0; b != e; ++n)
         this->erase_and_dispose(b++, disposer);
-      return b;
+      return b.unconst();
    }
 
-   iterator private_erase(iterator b, iterator e, size_type &n)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n)
    {
       for(n = 0; b != e; ++n)
         this->erase(b++);
-      return b;
+      return b.unconst();
    }
    /// @endcond
 
@@ -1446,8 +1611,8 @@ class avltree
    //Assert if passed value traits are compatible with the type
    BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
 
-   avltree( const value_compare &cmp = value_compare()
-         , const value_traits &v_traits = value_traits())
+   avltree( const value_compare &cmp      = value_compare()
+          , const value_traits &v_traits  = value_traits())
       :  Base(cmp, v_traits)
    {}
 
similarity index 85%
rename from deal.II/contrib/boost/include/boost/intrusive/avltree_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/avltree_algorithms.hpp
index 307dbc8c5bbf4a543a4a1dfca875640a58b253d5..a632581c1c2d57bcae790325050366d231c6c116 100644 (file)
@@ -530,6 +530,66 @@ class avltree_algorithms
       return new_node;
    }
 
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "pos" must be a valid iterator or header (end) node.
+   //!   "pos" must be an iterator pointing to the successor to "new_node"
+   //!   once inserted according to the order of already inserted nodes. This function does not
+   //!   check "pos" and this precondition must be guaranteed by the caller.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
+   //! tree invariants might be broken.
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node)
+   {
+      tree_algorithms::insert_before(header, pos, new_node);
+      rebalance_after_insertion(header, new_node);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering no less than the
+   //!   greatest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is less than the greatest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_back(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_back(header, new_node);
+      rebalance_after_insertion(header, new_node);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering, no greater than the
+   //!   lowest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_front(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_front(header, new_node);
+      rebalance_after_insertion(header, new_node);
+   }
+
    //! <b>Requires</b>: "header" must be the header node of a tree.
    //!   KeyNodePtrCompare is a function object that induces a strict weak
    //!   ordering compatible with the strict weak ordering used to create the
@@ -664,8 +724,7 @@ class avltree_algorithms
 
    static void rebalance_after_erasure(node_ptr header, node_ptr x, node_ptr x_parent)
    {
-      node_ptr root = NodeTraits::get_parent(header);
-      while (x != root) {
+      for (node_ptr root = NodeTraits::get_parent(header); x != root; root = NodeTraits::get_parent(header)) {
          const balance x_parent_balance = NodeTraits::get_balance(x_parent);
          if(x_parent_balance == NodeTraits::zero()){
             NodeTraits::set_balance(x_parent, 
@@ -686,16 +745,14 @@ class avltree_algorithms
                if (NodeTraits::get_balance(a) == NodeTraits::positive()) {
                   // a MUST have a right child
                   BOOST_INTRUSIVE_INVARIANT_ASSERT(NodeTraits::get_right(a));
-                  rotate_left_right(x_parent, root);
-                  
+                  rotate_left_right(x_parent, header);
                   x = NodeTraits::get_parent(x_parent);
                   x_parent = NodeTraits::get_parent(x);
                }
                else {
-                  rotate_right(x_parent, root);
+                  rotate_right(x_parent, header);
                   x = NodeTraits::get_parent(x_parent);
                   x_parent = NodeTraits::get_parent(x);
-
                }
 
                // if changed from negative to NodeTraits::positive(), no need to check above
@@ -718,15 +775,15 @@ class avltree_algorithms
                if (NodeTraits::get_balance(a) == NodeTraits::negative()) {
                   // a MUST have then a left child
                   BOOST_INTRUSIVE_INVARIANT_ASSERT(NodeTraits::get_left(a));
-                  rotate_right_left(x_parent, root);
+                  rotate_right_left(x_parent, header);
 
                   x = NodeTraits::get_parent(x_parent);
                   x_parent = NodeTraits::get_parent(x);
                }
                else {
-                     rotate_left(x_parent, root);
-                     x = NodeTraits::get_parent(x_parent);
-                     x_parent = NodeTraits::get_parent(x);
+                  rotate_left(x_parent, header);
+                  x = NodeTraits::get_parent(x_parent);
+                  x_parent = NodeTraits::get_parent(x);
                }
                // if changed from NodeTraits::positive() to negative, no need to check above
                if (NodeTraits::get_balance(x) == NodeTraits::negative()){
@@ -738,17 +795,14 @@ class avltree_algorithms
             BOOST_INTRUSIVE_INVARIANT_ASSERT(false);  // never reached
          }
       }
-      NodeTraits::set_parent(header, root);
    }
 
-
    static void rebalance_after_insertion(node_ptr header, node_ptr x)
    {
-      node_ptr root = NodeTraits::get_parent(header);
       NodeTraits::set_balance(x, NodeTraits::zero());
 
       // Rebalance.
-      while (x != root){
+      for(node_ptr root = NodeTraits::get_parent(header); x != root; root = NodeTraits::get_parent(header)){
          const balance x_parent_balance = NodeTraits::get_balance(NodeTraits::get_parent(x));
 
          if(x_parent_balance == NodeTraits::zero()){
@@ -765,9 +819,9 @@ class avltree_algorithms
                NodeTraits::set_balance(NodeTraits::get_parent(x), NodeTraits::zero());
             else{        // x is a right child, needs rebalancing
                if (NodeTraits::get_balance(x) == NodeTraits::negative())
-                  rotate_right_left(NodeTraits::get_parent(x), root);
+                  rotate_right_left(NodeTraits::get_parent(x), header);
                else
-                  rotate_left(NodeTraits::get_parent(x), root);
+                  rotate_left(NodeTraits::get_parent(x), header);
             }
             break;
          }
@@ -775,9 +829,9 @@ class avltree_algorithms
             // if x is a left child, needs rebalancing
             if (x == NodeTraits::get_left(NodeTraits::get_parent(x))) {
                if (NodeTraits::get_balance(x) == NodeTraits::positive())
-                  rotate_left_right(NodeTraits::get_parent(x), root);
+                  rotate_left_right(NodeTraits::get_parent(x), header);
                else
-                  rotate_right(NodeTraits::get_parent(x), root);
+                  rotate_right(NodeTraits::get_parent(x), header);
             }
             else
                NodeTraits::set_balance(NodeTraits::get_parent(x), NodeTraits::zero());
@@ -787,67 +841,49 @@ class avltree_algorithms
             BOOST_INTRUSIVE_INVARIANT_ASSERT(false);  // never reached
          }
       }
-      NodeTraits::set_parent(header, root);
    }
 
-   static void rotate_left_right(node_ptr a, node_ptr &root)
+   static void left_right_balancing(node_ptr a, node_ptr b, node_ptr c)
    {
-      //             |                               |         //
-      //             a(-2)                           c         //
-      //            / \                             / \        //
-      //           /   \        ==>                /   \       //
-      //      (pos)b    [g]                       b     a      //
-      //          / \                            / \   / \     //
-      //        [d]  c                         [d]  e f  [g]   //
-      //           / \                                         //
-      //          e   f                                        //
-      node_ptr b = NodeTraits::get_left(a), c = NodeTraits::get_right(b);
-
-      // switch
-      NodeTraits::set_left(a, NodeTraits::get_right(c));
-      NodeTraits::set_right(b, NodeTraits::get_left(c));
-
-      NodeTraits::set_right(c, a);
-      NodeTraits::set_left(c, b);
-
-      // set the parents
-      NodeTraits::set_parent(c, NodeTraits::get_parent(a));
-      NodeTraits::set_parent(a, c);
-      NodeTraits::set_parent(b, c);
-
-      if (NodeTraits::get_left(a))   // do we have f?
-         NodeTraits::set_parent(NodeTraits::get_left(a), a);
-      if (NodeTraits::get_right(b))    // do we have e?
-         NodeTraits::set_parent(NodeTraits::get_right(b), b);
-
-      if (a==root)   root = c;
-      else    // a had a parent, his child is now c
-         if (a == NodeTraits::get_left(NodeTraits::get_parent(c)))
-            NodeTraits::set_left(NodeTraits::get_parent(c), c);
-         else
-            NodeTraits::set_right(NodeTraits::get_parent(c), c);
-
       // balancing...
       const balance c_balance = NodeTraits::get_balance(c);
+      const balance zero_balance = NodeTraits::zero();
+      NodeTraits::set_balance(c, zero_balance);
       if(c_balance == NodeTraits::negative()){
          NodeTraits::set_balance(a, NodeTraits::positive());
-         NodeTraits::set_balance(b, NodeTraits::zero());
+         NodeTraits::set_balance(b, zero_balance);
       }
-      else if(c_balance == NodeTraits::zero()){
-         NodeTraits::set_balance(a, NodeTraits::zero());
-         NodeTraits::set_balance(b, NodeTraits::zero());
+      else if(c_balance == zero_balance){
+         NodeTraits::set_balance(a, zero_balance);
+         NodeTraits::set_balance(b, zero_balance);
       }
       else if(c_balance == NodeTraits::positive()){
-         NodeTraits::set_balance(a, NodeTraits::zero());
+         NodeTraits::set_balance(a, zero_balance);
          NodeTraits::set_balance(b, NodeTraits::negative());
       }
       else{
          BOOST_INTRUSIVE_INVARIANT_ASSERT(false); // never reached
       }
-      NodeTraits::set_balance(c, NodeTraits::zero());
    }
 
-   static void rotate_right_left(node_ptr a, node_ptr &root)
+   static void rotate_left_right(const node_ptr a, node_ptr hdr)
+   {
+      //             |                               |         //
+      //             a(-2)                           c         //
+      //            / \                             / \        //
+      //           /   \        ==>                /   \       //
+      //      (pos)b    [g]                       b     a      //
+      //          / \                            / \   / \     //
+      //        [d]  c                         [d]  e f  [g]   //
+      //           / \                                         //
+      //          e   f                                        //
+      node_ptr b = NodeTraits::get_left(a), c = NodeTraits::get_right(b);
+      tree_algorithms::rotate_left(b, hdr);
+      tree_algorithms::rotate_right(a, hdr);
+      left_right_balancing(a, b, c);
+   }
+
+   static void rotate_right_left(const node_ptr a, node_ptr hdr)
    {
       //              |                               |           //
       //              a(pos)                          c           //
@@ -859,81 +895,15 @@ class avltree_algorithms
       //             / \                                          //
       //            e   f                                         //
       node_ptr b = NodeTraits::get_right(a), c = NodeTraits::get_left(b);
-
-      // switch
-      NodeTraits::set_right(a, NodeTraits::get_left(c));
-      NodeTraits::set_left(b, NodeTraits::get_right(c));
-
-      NodeTraits::set_left(c, a);
-      NodeTraits::set_right(c, b);
-
-      // set the parents
-      NodeTraits::set_parent(c, NodeTraits::get_parent(a));
-      NodeTraits::set_parent(a, c);
-      NodeTraits::set_parent(b, c);
-
-      if (NodeTraits::get_right(a))   // do we have e?
-         NodeTraits::set_parent(NodeTraits::get_right(a), a);
-      if (NodeTraits::get_left(b))    // do we have f?
-         NodeTraits::set_parent(NodeTraits::get_left(b), b);
-
-      if (a==root)   root = c;
-      else    // a had a parent, his child is now c
-         if (a == NodeTraits::get_left(NodeTraits::get_parent(c)))
-            NodeTraits::set_left(NodeTraits::get_parent(c), c);
-         else
-            NodeTraits::set_right(NodeTraits::get_parent(c), c);
-
-      // balancing...
-      const balance c_balance = NodeTraits::get_balance(c);
-      if(c_balance == NodeTraits::negative()){
-         NodeTraits::set_balance(a, NodeTraits::zero());
-         NodeTraits::set_balance(b, NodeTraits::positive());
-      }
-      else if(c_balance == NodeTraits::zero()){
-         NodeTraits::set_balance(a, NodeTraits::zero());
-         NodeTraits::set_balance(b, NodeTraits::zero());
-      }
-      else if(c_balance == NodeTraits::positive()){
-         NodeTraits::set_balance(a, NodeTraits::negative());
-         NodeTraits::set_balance(b, NodeTraits::zero());
-      }
-      else{
-         BOOST_INTRUSIVE_INVARIANT_ASSERT(false);
-      }
-      NodeTraits::set_balance(c, NodeTraits::zero());
+      tree_algorithms::rotate_right(b, hdr);
+      tree_algorithms::rotate_left(a, hdr);
+      left_right_balancing(b, a, c);
    }
 
-   static void rotate_left(node_ptr x, node_ptr & root)
+   static void rotate_left(const node_ptr x, node_ptr hdr)
    {
-      //            |                          |         //
-      //            x(2)                       y(0)      //
-      //           / \          ==>           / \        //
-      //        n[a]  y(1)n+2          n+1(0)x  [c]n+1   //
-      //             / \                    / \          //
-      //          n[b] [c]n+1            n[a] [b]n       //
-      node_ptr y = NodeTraits::get_right(x);
-
-      // switch
-      NodeTraits::set_right(x, NodeTraits::get_left(y));
-      NodeTraits::set_left(y, x);
-
-      // rearrange parents
-      NodeTraits::set_parent(y, NodeTraits::get_parent(x));
-      NodeTraits::set_parent(x, y);
-
-      // do we have [b]?
-      if (NodeTraits::get_right(x))
-         NodeTraits::set_parent(NodeTraits::get_right(x), x);
-
-      if (x == root)
-         root = y;
-      else
-         // need to reparent y
-         if (NodeTraits::get_left(NodeTraits::get_parent(y)) == x)
-            NodeTraits::set_left(NodeTraits::get_parent(y), y);
-         else
-            NodeTraits::set_right(NodeTraits::get_parent(y), y);
+      const node_ptr y = NodeTraits::get_right(x);
+      tree_algorithms::rotate_left(x, hdr);
 
       // reset the balancing factor
       if (NodeTraits::get_balance(y) == NodeTraits::positive()) {
@@ -946,30 +916,10 @@ class avltree_algorithms
       }
    }
 
-   static void rotate_right(node_ptr x, node_ptr &root)
+   static void rotate_right(const node_ptr x, node_ptr hdr)
    {
-      node_ptr y = NodeTraits::get_left(x);
-
-      // switch
-      NodeTraits::set_left(x, NodeTraits::get_right(y));
-      NodeTraits::set_right(y, x);
-
-      // rearrange parents
-      NodeTraits::set_parent(y, NodeTraits::get_parent(x));
-      NodeTraits::set_parent(x, y);
-
-      // do we have [b]?
-      if (NodeTraits::get_left(x))
-         NodeTraits::set_parent(NodeTraits::get_left(x), x);
-
-      if (x == root)
-         root = y;
-      else
-         // need to reparent y
-         if (NodeTraits::get_left(NodeTraits::get_parent(y)) == x)
-            NodeTraits::set_left(NodeTraits::get_parent(y), y);
-         else
-            NodeTraits::set_right(NodeTraits::get_parent(y), y);
+      const node_ptr y = NodeTraits::get_left(x);
+      tree_algorithms::rotate_right(x, hdr);
 
       // reset the balancing factor
       if (NodeTraits::get_balance(y) == NodeTraits::negative()) {
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/bs_set_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/bs_set_hook.hpp
index d4726b08e4d05b1da6ecdc1e613c1c5b6273fd5f..bf8e2de09a6e042942f5bf023d22c12ca2c4f966 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -96,6 +96,7 @@ class bs_set_base_hook
 
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -220,6 +221,7 @@ class bs_set_member_hook
       ::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/circular_list_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/circular_list_algorithms.hpp
index d48fffc07653e0653804701481a5a9dd9670ee1b..16b1971b296116dd3b4ecb15b1129e932563d37c 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -110,7 +110,7 @@ class circular_list_algorithms
    //! <b>Effects</b>: Returns the number of nodes in a circular list. If the circular list
    //!  is empty, returns 1.
    //! 
-   //! <b>Complexity</b>: Constant 
+   //! <b>Complexity</b>: Linear 
    //! 
    //! <b>Throws</b>: Nothing.
    static std::size_t count(const_node_ptr this_node) 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/circular_slist_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/circular_slist_algorithms.hpp
index 5247f57e87fd4094d6b1c90ff1dae6a813df8c54..ae06396ed9268eb6437bbd7ae573cd2a2bf17cb8 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -199,7 +199,7 @@ class circular_slist_algorithms
    //! <b>Effects</b>: Returns the number of nodes in a circular list. If the circular list
    //!  is empty, returns 1.
    //! 
-   //! <b>Complexity</b>: Constant 
+   //! <b>Complexity</b>: Linear 
    //! 
    //! <b>Throws</b>: Nothing.
    static std::size_t count(const_node_ptr this_node) 
similarity index 94%
rename from deal.II/contrib/boost/include/boost/intrusive/derivation_value_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/derivation_value_traits.hpp
index 2036890105148f22096588aa834c4ed67876bfff..7b5b0131e967686c4d9f31ce9373b3c694e74d89 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -47,7 +47,7 @@ struct derivation_value_traits
    {  return pointer(static_cast<T*>(detail::get_pointer(n))); }
 
    static const_pointer to_value_ptr(const_node_ptr n)
-   {  return const_pointer(static_cast<T*>(detail::get_pointer(n))); }
+   {  return const_pointer(static_cast<const T*>(detail::get_pointer(n))); }
 };
 
 } //namespace intrusive 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/any_node_and_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/any_node_and_algorithms.hpp
index 6a3d955a8c672012d4b31393b4448e3e65ed2445..e2fbbfac69317ae8c4d6adec98f60593fa7968b4 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2008
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/assert.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/assert.hpp
index e742b7e97eb06199e92ad9af66dbc53ffd00b47c..cfe392bfb0821937fb1a914cda8392cd7cf90f94 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/clear_on_destructor_base.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/clear_on_destructor_base.hpp
new file mode 100644 (file)
index 0000000..6765dfa
--- /dev/null
@@ -0,0 +1,36 @@
+//////}  // ///////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008-2009. 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)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
+#define BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class Derived>
+class clear_on_destructor_base
+{
+   protected:
+   ~clear_on_destructor_base()
+   {
+      static_cast<Derived*>(this)->clear();
+   }
+};
+
+}  // namespace detail {
+}  // namespace intrusive {
+}  // namespace boost {
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif   //#ifndef BOOST_INTRUSIVE_DETAIL_CLEAR_ON_DESTRUCTOR_HPP
similarity index 80%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/common_slist_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/common_slist_algorithms.hpp
index d837ad0a0d8d33f6b3ca96198e0a9ac385e584c0..c6bdb20d1f66193e89e447b3ad1f68815a09236f 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007-2008
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -74,15 +74,22 @@ class common_slist_algorithms
       NodeTraits::set_next(prev_node, this_node);
    }
 
-   static void transfer_after(node_ptr p, node_ptr b, node_ptr e)
+   static void incorporate_after(node_ptr bp, node_ptr b, node_ptr be)
    {
-      if (p != b && p != e && b != e) {
-         node_ptr next_b = NodeTraits::get_next(b);
-         node_ptr next_e = NodeTraits::get_next(e);
-         node_ptr next_p = NodeTraits::get_next(p);
-         NodeTraits::set_next(b, next_e);
-         NodeTraits::set_next(e, next_p);
-         NodeTraits::set_next(p, next_b);
+      node_ptr p(NodeTraits::get_next(bp));
+      NodeTraits::set_next(bp, b);
+      NodeTraits::set_next(be, p);
+   }
+   
+   static void transfer_after(node_ptr bp, node_ptr bb, node_ptr be)
+   {
+      if (bp != bb && bp != be && bb != be) {
+         node_ptr next_b = NodeTraits::get_next(bb);
+         node_ptr next_e = NodeTraits::get_next(be);
+         node_ptr next_p = NodeTraits::get_next(bp);
+         NodeTraits::set_next(bb, next_e);
+         NodeTraits::set_next(be, next_p);
+         NodeTraits::set_next(bp, next_b);
       }
    }
 };
similarity index 88%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/config_begin.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/config_begin.hpp
index 411b8aec7069cf2fd38b24cb912573879996668d..bb126fcdf06cfac383bbe08c30e19f0da4b5ce19 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -44,6 +44,8 @@
    #pragma warning (disable : 4267) //conversion from 'X' to 'Y', possible loss of data
    #pragma warning (disable : 4127) //conditional expression is constant
    #pragma warning (disable : 4706) //assignment within conditional expression
+   #pragma warning (disable : 4541) //'typeid' used on polymorphic type 'boost::exception' with /GR-
+   #pragma warning (disable : 4512) //'typeid' used on polymorphic type 'boost::exception' with /GR-
 #endif
 
 //#define BOOST_INTRUSIVE_USE_ITERATOR_FACADE
similarity index 91%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/config_end.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/config_end.hpp
index 703d038225b6321ec26b4e58a2f9d1a336d592e0..4277cb576f83a2419569c8c7c1088701bf45b663 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 88%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/ebo_functor_holder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/ebo_functor_holder.hpp
index 369d2ca9390bcb3c7018bc9f2fc59c3c49490b93..d4c2d1593bf4b6dda84ec8137f189e876689a895 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Joaquin M Lopez Munoz  2006-2007
+// (C) Copyright Joaquin M Lopez Munoz  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -13,6 +13,7 @@
 #ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP
 #define BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP
 
+#include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 
 namespace boost {
@@ -26,18 +27,18 @@ class ebo_functor_holder_impl
    ebo_functor_holder_impl()
    {}
    ebo_functor_holder_impl(const T& t)
-      :  t(t)
+      :  t_(t)
    {}
    template<class Arg1, class Arg2>
    ebo_functor_holder_impl(const Arg1& arg1, const Arg2& arg2)
-      :  t(arg1, arg2)
+      :  t_(arg1, arg2)
    {}
 
-   T&       get(){return t;}
-   const T& get()const{return t;}
+   T&       get(){return t_;}
+   const T& get()const{return t_;}
 
    private:
-   T t;
+   T t_;
 };
 
 template<typename T>
@@ -89,4 +90,6 @@ class ebo_functor_holder
 }  //namespace intrusive {
 }  //namespace boost {
 
+#include <boost/intrusive/detail/config_end.hpp>
+
 #endif   //#ifndef BOOST_INTRUSIVE_DETAIL_EBO_HOLDER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/function_detector.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/function_detector.hpp
new file mode 100644 (file)
index 0000000..a20db6d
--- /dev/null
@@ -0,0 +1,87 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2009-2009.
+//
+// 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)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+//  This code was modified from the code posted by Alexandre Courpron in his
+//  article "Interface Detection" in The Code Project:
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2007 Alexandre Courpron
+//
+// Permission to use, copy, modify, redistribute and sell this software, 
+// provided that this copyright notice appears on all copies of the software.
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
+#define BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace function_detector {
+
+    typedef char NotFoundType;
+    struct StaticFunctionType { NotFoundType x [2]; };
+    struct NonStaticFunctionType { NotFoundType x [3]; };
+
+    enum
+         { NotFound          = 0,
+           StaticFunction    = sizeof( StaticFunctionType )    - sizeof( NotFoundType ),
+           NonStaticFunction = sizeof( NonStaticFunctionType ) - sizeof( NotFoundType )
+         };
+
+}  //namespace boost {
+}  //namespace intrusive {
+}  //namespace function_detector {
+
+#define BOOST_INTRUSIVE_CREATE_FUNCTION_DETECTOR(Identifier, InstantiationKey) \
+   namespace boost { \
+   namespace intrusive { \
+   namespace function_detector { \
+   template < class T, \
+            class NonStaticType, \
+            class NonStaticConstType, \
+            class StaticType > \
+   class DetectMember_##InstantiationKey_##Identifier { \
+      template < NonStaticType > \
+      struct TestNonStaticNonConst ; \
+      \
+      template < NonStaticConstType > \
+      struct TestNonStaticConst ; \
+      \
+      template < StaticType > \
+      struct TestStatic ; \
+      \
+      template <class U > \
+      static NonStaticFunctionType Test( TestNonStaticNonConst<&U::Identifier>*, int ); \
+      \
+      template <class U > \
+      static NonStaticFunctionType Test( TestNonStaticConst<&U::Identifier>*, int ); \
+      \
+      template <class U> \
+      static StaticFunctionType Test( TestStatic<&U::Identifier>*, int ); \
+      \
+      template <class U> \
+      static NotFoundType Test( ... ); \
+   public : \
+      static const int check = NotFound + (sizeof(Test<T>(0, 0)) - sizeof(NotFoundType));\
+   };\
+}}} //namespace boost::intrusive::function_detector { 
+
+#define BOOST_INTRUSIVE_DETECT_FUNCTION(Class, InstantiationKey, ReturnType, Identifier, Params) \
+    ::boost::intrusive::function_detector::DetectMember_##InstantiationKey_##Identifier< Class,\
+                                         ReturnType (Class::*)Params,\
+                                         ReturnType (Class::*)Params const,\
+                                         ReturnType (*)Params \
+                                       >::check
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif   //@ifndef BOOST_INTRUSIVE_DETAIL_FUNCTION_DETECTOR_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/generic_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/generic_hook.hpp
index 837f9280806c6a83b19e9e6f6a1b1e9468325ea7..ae1282eaba462943082d59a002e5f156aad36c87 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 87%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/hashtable_node.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/hashtable_node.hpp
index 44a5f5a90fd7f66506bb0a505d47ce17f885b017..1676b1c88ebca48a8169dea8631a4ceceb63f194 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -100,8 +100,12 @@ template<class Container, bool IsConst>
 class hashtable_iterator
    :  public std::iterator
          < std::forward_iterator_tag
+         , typename Container::value_type
+         , typename std::iterator_traits<typename Container::value_type*>::difference_type
          , typename detail::add_const_if_c
-            <typename Container::value_type, IsConst>::type
+                     <typename Container::value_type, IsConst>::type *
+         , typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type &
          >
 {
    typedef typename Container::real_value_traits                  real_value_traits;
@@ -116,8 +120,11 @@ class hashtable_iterator
    {  return typename Container::node_ptr(&static_cast<typename Container::node&>(*p));   }
 
    public:
+   typedef typename Container::value_type    value_type;
+   typedef  typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type *pointer;
    typedef typename detail::add_const_if_c
-      <typename Container::value_type, IsConst>::type          value_type;
+                     <typename Container::value_type, IsConst>::type &reference;
 
    hashtable_iterator ()
    {}
@@ -133,6 +140,9 @@ class hashtable_iterator
    const siterator &slist_it() const
    { return slist_it_; }
 
+   hashtable_iterator<Container, false> unconst() const
+   {  return hashtable_iterator<Container, false>(this->slist_it(), this->get_container());   }
+
    public:
    hashtable_iterator& operator++() 
    {  this->increment();   return *this;   }
@@ -150,10 +160,10 @@ class hashtable_iterator
    friend bool operator!= (const hashtable_iterator& i, const hashtable_iterator& i2)
    { return !(i == i2); }
 
-   value_type& operator*() const
+   reference operator*() const
    { return *this->operator ->(); }
 
-   value_type* operator->() const
+   pointer operator->() const
    { return detail::get_pointer(this->get_real_value_traits()->to_value_ptr(downcast_bucket(slist_it_.pointed_node()))); }
 
    const Container *get_container() const
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/is_stateful_value_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/is_stateful_value_traits.hpp
new file mode 100644 (file)
index 0000000..e38f4de
--- /dev/null
@@ -0,0 +1,77 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2009-2009.
+//
+// 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)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_DETAIL_IS_STATEFUL_VALUE_TRAITS_HPP
+#define BOOST_INTRUSIVE_DETAIL_IS_STATEFUL_VALUE_TRAITS_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1310)
+
+#include <boost/intrusive/detail/mpl.hpp>
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class ValueTraits>
+struct is_stateful_value_traits
+{
+   static const bool value = !detail::is_empty_class<ValueTraits>::value;
+};
+
+}}}
+
+#else
+
+#include <boost/intrusive/detail/function_detector.hpp>
+
+BOOST_INTRUSIVE_CREATE_FUNCTION_DETECTOR(to_node_ptr, boost_intrusive)
+BOOST_INTRUSIVE_CREATE_FUNCTION_DETECTOR(to_value_ptr, boost_intrusive)
+
+namespace boost {
+namespace intrusive {
+namespace detail {
+
+template<class ValueTraits>
+struct is_stateful_value_traits
+{
+   typedef typename ValueTraits::node_ptr       node_ptr;
+   typedef typename ValueTraits::pointer        pointer;
+   typedef typename ValueTraits::value_type     value_type;
+   typedef typename ValueTraits::const_node_ptr const_node_ptr;
+   typedef typename ValueTraits::const_pointer  const_pointer;
+
+   typedef ValueTraits value_traits;
+
+   static const bool value =
+      (boost::intrusive::function_detector::NonStaticFunction ==
+         (BOOST_INTRUSIVE_DETECT_FUNCTION(ValueTraits, boost_intrusive, node_ptr, to_node_ptr, (value_type&) )))
+      ||
+      (boost::intrusive::function_detector::NonStaticFunction ==
+         (BOOST_INTRUSIVE_DETECT_FUNCTION(ValueTraits, boost_intrusive, pointer, to_value_ptr, (node_ptr) )))
+      ||
+      (boost::intrusive::function_detector::NonStaticFunction ==
+         (BOOST_INTRUSIVE_DETECT_FUNCTION(ValueTraits, boost_intrusive, const_node_ptr, to_node_ptr, (const value_type&) )))
+      ||
+      (boost::intrusive::function_detector::NonStaticFunction ==
+         (BOOST_INTRUSIVE_DETECT_FUNCTION(ValueTraits, boost_intrusive, const_pointer, to_value_ptr, (const_node_ptr) )))
+      ;
+};
+
+}}}
+
+#endif
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif   //@ifndef BOOST_INTRUSIVE_DETAIL_IS_STATEFUL_VALUE_TRAITS_HPP
similarity index 88%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/list_node.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/list_node.hpp
index a0bc8ba84f6e07d75b8eda62b4128c3578c4833c..935c522fabf3e197d175be1dca47cb128b854315 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -63,8 +63,12 @@ template<class Container, bool IsConst>
 class list_iterator
    :  public std::iterator
          < std::bidirectional_iterator_tag
+         , typename Container::value_type
+         , typename std::iterator_traits<typename Container::value_type*>::difference_type
          , typename detail::add_const_if_c
-            <typename Container::value_type, IsConst>::type
+                     <typename Container::value_type, IsConst>::type *
+         , typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type &
          >
 {
    protected:
@@ -78,11 +82,11 @@ class list_iterator
       detail::store_cont_ptr_on_it<Container>::value;
 
    public:
+   typedef typename Container::value_type    value_type;
+   typedef  typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type *pointer;
    typedef typename detail::add_const_if_c
-      <typename Container::value_type, IsConst>
-      ::type                                       value_type;
-   typedef value_type & reference;
-   typedef value_type * pointer;
+                     <typename Container::value_type, IsConst>::type &reference;
 
    list_iterator()
       : members_ (node_ptr(0), 0)
@@ -135,7 +139,7 @@ class list_iterator
    bool operator!= (const list_iterator& i) const
    {  return !operator== (i); }
 
-   value_type& operator*() const
+   reference operator*() const
    {  return *operator->();   }
 
    pointer operator->() const
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/mpl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/mpl.hpp
index 27e7f375a989463bfa9721fdd290945a421c8bb1..5f57e37af4d69f7f2f3a779d1e576a5873a00e40 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -13,6 +13,7 @@
 #ifndef BOOST_INTRUSIVE_DETAIL_MPL_HPP
 #define BOOST_INTRUSIVE_DETAIL_MPL_HPP
 
+#include <boost/intrusive/detail/config_begin.hpp>
 #include <cstddef>
 
 namespace boost {
@@ -64,7 +65,7 @@ class is_convertible
    class false_t { char dummy[2]; };
    static true_t dispatch(U);
    static false_t dispatch(...);
-   static trigger();
+   static const T &trigger();
    public:
    static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);
 };
@@ -129,7 +130,7 @@ struct identity
 #define BOOST_INTRUSIVE_TT_DECL 
 #endif
 
-#if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__)
+#if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__) && !defined(_WIN64)
 #define BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS
 #endif
 
@@ -364,4 +365,6 @@ struct ls_zeros<1>
 } //namespace intrusive 
 } //namespace boost 
 
+#include <boost/intrusive/detail/config_end.hpp>
+
 #endif //BOOST_INTRUSIVE_DETAIL_MPL_HPP
similarity index 94%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/parent_from_member.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/parent_from_member.hpp
index d5fc96aae64ffbf3b50a7e8ba9759428f42f34d2..0b30867abcd900cbe5d95dbb95432fa2bafaecb9 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -15,7 +15,8 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <cstddef>
 
-#if defined(BOOST_MSVC) || (defined (BOOST_WINDOWS) && defined(BOOST_INTEL))
+#if defined(BOOST_MSVC) || ((defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && defined(BOOST_INTEL))
+
 #define BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER
 #include <boost/cstdint.hpp>
 #endif
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/rbtree_node.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/rbtree_node.hpp
index 5345209d5c37005ad8514ea7590f85cc92fdc126..87ba59d25a38ad72cec135afb2f514e6a23f2dd5 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007.
+// (C) Copyright Ion Gaztanaga  2006-2009.
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 87%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/slist_node.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/slist_node.hpp
index c0636e189a8d56e7e17911df33b557d6e2d97886..a7df9e19d805127e810ae72fe303855da6ea3134 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -55,8 +55,12 @@ template<class Container, bool IsConst>
 class slist_iterator
    :  public std::iterator
          < std::forward_iterator_tag
+         , typename Container::value_type
+         , typename std::iterator_traits<typename Container::value_type*>::difference_type
          , typename detail::add_const_if_c
-            <typename Container::value_type, IsConst>::type
+                     <typename Container::value_type, IsConst>::type *
+         , typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type &
          >
 {
    protected:
@@ -70,11 +74,11 @@ class slist_iterator
       detail::store_cont_ptr_on_it<Container>::value;
 
    public:
+   typedef typename Container::value_type    value_type;
+   typedef  typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type *pointer;
    typedef typename detail::add_const_if_c
-      <typename Container::value_type, IsConst>
-      ::type                                       value_type;
-   typedef value_type & reference;
-   typedef value_type * pointer;
+                     <typename Container::value_type, IsConst>::type &reference;
 
    slist_iterator()
       : members_ (node_ptr(0), 0)
@@ -114,7 +118,7 @@ class slist_iterator
    bool operator!= (const slist_iterator& i) const
    {  return !operator== (i); }
 
-   value_type& operator*() const
+   reference operator*() const
    {  return *operator->();   }
 
    pointer operator->() const
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/transform_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/transform_iterator.hpp
index f5fe05c6b2f03de35e7b363bf7fe55bed2b1218f..a9de49eb9dfd38a889b599d1f34a77b8090bb0a3 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 86%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/tree_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/tree_algorithms.hpp
index 0aa06f72cb164d02f64f2eee5f605df5ac525bad..32bbfb58c763304d74c6c55a9c571865f2c0d8c8 100644 (file)
@@ -160,7 +160,7 @@ class tree_algorithms
    //! 
    //! <b>Throws</b>: Nothing.
    static bool unique(const_node_ptr node)
-   { return NodeTraits::get_parent(node) == 0; }
+   { return !NodeTraits::get_parent(node); }
 
    static node_ptr get_header(const_node_ptr node)
    {
@@ -460,7 +460,8 @@ class tree_algorithms
    static node_ptr prev_node(node_ptr p)
    {
       if(is_header(p)){
-         return maximum(NodeTraits::get_parent(p));
+         return NodeTraits::get_right(p);
+         //return maximum(NodeTraits::get_parent(p));
       }
       else if(NodeTraits::get_left(p)){
          return maximum(NodeTraits::get_left(p));
@@ -721,37 +722,19 @@ class tree_algorithms
 
    static bool is_header(const_node_ptr p)
    {
-/*
-      node_ptr p_parent = NodeTraits::get_parent(p);
-      if(!p_parent)
+      node_ptr p_left (NodeTraits::get_left(p));
+      node_ptr p_right(NodeTraits::get_right(p));
+      if(!NodeTraits::get_parent(p) || //Header condition when empty tree
+         (p_left && p_right &&         //Header always has leftmost and rightmost
+            (p_left == p_right ||      //Header condition when only node
+               (NodeTraits::get_parent(p_left)  != p ||
+                NodeTraits::get_parent(p_right) != p ))
+               //When tree size > 1 headers can't be leftmost's
+               //and rightmost's parent 
+          )){
          return true;
-      if(!NodeTraits::get_parent(p_parent) != p)
-         return false;
-      if(NodeTraits::get_left(p) != 0){
-         if(NodeTraits::get_parent(NodeTraits::get_left(p)) != p){
-            is_header = true;
-         }
-         if(NodeTraits::get_parent(p) == NodeTraits::get_left(p)){
-            is_header = true;
-         }
-      }
-*/
-      
-      bool is_header = false;
-      if(NodeTraits::get_parent(p) == p){
-         is_header = true;
-      }
-      else if(NodeTraits::get_parent(NodeTraits::get_parent(p)) == p){
-         if(NodeTraits::get_left(p) != 0){
-            if(NodeTraits::get_parent(NodeTraits::get_left(p)) != p){
-               is_header = true;
-            }
-            if(NodeTraits::get_parent(p) == NodeTraits::get_left(p)){
-               is_header = true;
-            }
-         }
       }
-      return is_header;
+      return false;
    }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -910,10 +893,32 @@ class tree_algorithms
    //!   erased between the "insert_check" and "insert_commit" calls.
    static void insert_unique_commit
       (node_ptr header, node_ptr new_value, const insert_commit_data &commit_data)
+   {  return insert_commit(header, new_value, commit_data); }
+
+   static void insert_commit
+      (node_ptr header, node_ptr new_node, const insert_commit_data &commit_data)
    {
       //Check if commit_data has not been initialized by a insert_unique_check call.
       BOOST_INTRUSIVE_INVARIANT_ASSERT(commit_data.node != 0);
-      link(header, new_value, commit_data.node, commit_data.link_left);
+      node_ptr parent_node(commit_data.node);
+      if(parent_node == header){
+         NodeTraits::set_parent(header, new_node);
+         NodeTraits::set_right(header, new_node);
+         NodeTraits::set_left(header, new_node);
+      }
+      else if(commit_data.link_left){
+         NodeTraits::set_left(parent_node, new_node);
+         if(parent_node == NodeTraits::get_left(header))
+             NodeTraits::set_left(header, new_node);
+      }
+      else{
+         NodeTraits::set_right(parent_node, new_node);
+         if(parent_node == NodeTraits::get_right(header))
+             NodeTraits::set_right(header, new_node);
+      }
+      NodeTraits::set_parent(new_node, parent_node);
+      NodeTraits::set_right(new_node, node_ptr(0));
+      NodeTraits::set_left(new_node, node_ptr(0));
    }
 
    //! <b>Requires</b>: "header" must be the header node of a tree.
@@ -995,9 +1000,9 @@ class tree_algorithms
    {
       //hint must be bigger than the key
       if(hint == header || comp(key, hint)){
-         node_ptr prev = hint;
-         //The previous value should be less than the key
-         if(prev == NodeTraits::get_left(header) || comp((prev = prev_node(hint)), key)){
+         node_ptr prev(hint);
+         //Previous value should be less than the key
+         if(hint == begin_node(header)|| comp((prev = prev_node(hint)), key)){
             commit_data.link_left = unique(header) || !NodeTraits::get_left(hint);
             commit_data.node      = commit_data.link_left ? hint : prev;
             if(pdepth){
@@ -1005,52 +1010,138 @@ class tree_algorithms
             }
             return std::pair<node_ptr, bool>(node_ptr(), true);
          }
-         else{
-            return insert_unique_check(header, key, comp, commit_data, pdepth);
-         }
-      }
-      //The hint was wrong, use hintless insert
-      else{
-         return insert_unique_check(header, key, comp, commit_data, pdepth);
       }
+      //Hint was wrong, use hintless insertion
+      return insert_unique_check(header, key, comp, commit_data, pdepth);
    }
 
-   //! <b>Requires</b>: "header" must be the header node of a tree.
-   //!   NodePtrCompare is a function object that induces a strict weak
-   //!   ordering compatible with the strict weak ordering used to create the
-   //!   the tree. NodePtrCompare compares two node_ptrs. "hint" is node from
-   //!   the "header"'s tree.
-   //!   
-   //! <b>Effects</b>: Inserts new_node into the tree, using "hint" as a hint to
-   //!   where it will be inserted. If "hint" is the upper_bound
-   //!   the insertion takes constant time (two comparisons in the worst case).
-   //!
-   //! <b>Complexity</b>: Logarithmic in general, but it is amortized
-   //!   constant time if new_node is inserted immediately before "hint".
-   //! 
-   //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
-   static node_ptr insert_equal
-      (node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+   static void insert_equal_check
+      ( node_ptr header, node_ptr hint, node_ptr new_node, NodePtrCompare comp
+      , insert_commit_data &commit_data, std::size_t *pdepth = 0)
    {
       if(hint == header || !comp(hint, new_node)){
          node_ptr prev(hint);
          if(hint == NodeTraits::get_left(header) || 
             !comp(new_node, (prev = prev_node(hint)))){
             bool link_left = unique(header) || !NodeTraits::get_left(hint);
-            link(header, new_node, link_left ? hint : prev, link_left);
-            if(pdepth)  *pdepth = depth(new_node) + 1;
-            return new_node;
+            commit_data.link_left = link_left;
+            commit_data.node = link_left ? hint : prev;
+            if(pdepth){
+               *pdepth = commit_data.node == header ? 0 : depth(commit_data.node) + 1;
+            }
          }
          else{
-            return insert_equal_upper_bound(header, new_node, comp, pdepth);
+            insert_equal_upper_bound_check(header, new_node, comp, commit_data, pdepth);
          }
       }
       else{
-         return insert_equal_lower_bound(header, new_node, comp, pdepth);
+         insert_equal_lower_bound_check(header, new_node, comp, commit_data, pdepth);
       }
    }
 
+   template<class NodePtrCompare>
+   static void insert_equal_upper_bound_check
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+   {  insert_equal_check_impl(true, h, new_node, comp, commit_data, pdepth);  }
+
+   template<class NodePtrCompare>
+   static void insert_equal_lower_bound_check
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+   {  insert_equal_check_impl(false, h, new_node, comp, commit_data, pdepth);  }
+
+   template<class NodePtrCompare>
+   static node_ptr insert_equal
+      (node_ptr h, node_ptr hint, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      insert_equal_check(h, hint, new_node, comp, commit_data, pdepth);
+      insert_commit(h, new_node, commit_data);
+      return new_node;
+   }
+
+   template<class NodePtrCompare>
+   static node_ptr insert_equal_upper_bound
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      insert_equal_upper_bound_check(h, new_node, comp, commit_data, pdepth);
+      insert_commit(h, new_node, commit_data);
+      return new_node;
+   }
+
+   template<class NodePtrCompare>
+   static node_ptr insert_equal_lower_bound
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      insert_equal_lower_bound_check(h, new_node, comp, commit_data, pdepth);
+      insert_commit(h, new_node, commit_data);
+      return new_node;
+   }
+
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      insert_before_check(header, pos, commit_data, pdepth);
+      insert_commit(header, new_node, commit_data);
+      return new_node;
+   }
+
+   static void insert_before_check
+      ( node_ptr header, node_ptr pos
+      , insert_commit_data &commit_data, std::size_t *pdepth = 0)
+   {
+      node_ptr prev(pos);
+      if(pos != NodeTraits::get_left(header))
+         prev = prev_node(pos);
+      bool link_left = unique(header) || !NodeTraits::get_left(pos);
+      commit_data.link_left = link_left;
+      commit_data.node = link_left ? pos : prev;
+      if(pdepth){
+         *pdepth = commit_data.node == header ? 0 : depth(commit_data.node) + 1;
+      }
+   }
+
+   static void push_back
+      (node_ptr header, node_ptr new_node, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      push_back_check(header, commit_data, pdepth);
+      insert_commit(header, new_node, commit_data);
+   }
+
+   static void push_back_check
+      (node_ptr header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
+   {
+      node_ptr prev(NodeTraits::get_right(header));
+      if(pdepth){
+         *pdepth = prev == header ? 0 : depth(prev) + 1;
+      }
+      commit_data.link_left = false;
+      commit_data.node = prev;
+   }
+
+   static void push_front
+      (node_ptr header, node_ptr new_node, std::size_t *pdepth = 0)
+   {
+      insert_commit_data commit_data;
+      push_front_check(header, commit_data, pdepth);
+      insert_commit(header, new_node, commit_data);
+   }
+
+   static void push_front_check
+      (node_ptr header, insert_commit_data &commit_data, std::size_t *pdepth = 0)
+   {
+      node_ptr pos(NodeTraits::get_left(header));
+      if(pdepth){
+         *pdepth = pos == header ? 0 : depth(pos) + 1;
+      }
+      commit_data.link_left = true;
+      commit_data.node = pos;
+   }
+
    //! <b>Requires</b>: p can't be a header node.
    //! 
    //! <b>Effects</b>: Calculates the depth of a node: the depth of a
@@ -1071,48 +1162,6 @@ class tree_algorithms
       return depth;
    }
 
-   template<class NodePtrCompare>
-   static node_ptr insert_equal_upper_bound
-      (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
-   {
-      std::size_t depth = 0;
-      node_ptr y(h);
-      node_ptr x(NodeTraits::get_parent(y));
-
-      while(x){
-         ++depth;
-         y = x;
-         x = comp(new_node, x) ? 
-               NodeTraits::get_left(x) : NodeTraits::get_right(x);
-      }
-
-      bool link_left = (y == h) || comp(new_node, y);
-      link(h, new_node, y, link_left);
-      if(pdepth)  *pdepth = depth;
-      return new_node;
-   }
-
-   template<class NodePtrCompare>
-   static node_ptr insert_equal_lower_bound
-      (node_ptr h, node_ptr new_node, NodePtrCompare comp, std::size_t *pdepth = 0)
-   {
-      std::size_t depth = 0;
-      node_ptr y(h);
-      node_ptr x(NodeTraits::get_parent(y));
-
-      while(x){
-         ++depth;
-         y = x;
-         x = !comp(x, new_node) ? 
-               NodeTraits::get_left(x) : NodeTraits::get_right(x);
-      }
-
-      bool link_left = (y == h) || !comp(y, new_node);
-      link(h, new_node, y, link_left);
-      if(pdepth)  *pdepth = depth;
-      return new_node;
-   }
-
    //! <b>Requires</b>: "cloner" must be a function
    //!   object taking a node_ptr and returning a new cloned node of it. "disposer" must
    //!   take a node_ptr and shouldn't throw.
@@ -1261,97 +1310,81 @@ class tree_algorithms
    //! <b>Complexity</b>: Constant.
    //! 
    //! <b>Throws</b>: Nothing.
-   static bool is_right_child (node_ptr p)
+   static bool is_right_child(node_ptr p)
    {  return NodeTraits::get_right(NodeTraits::get_parent(p)) == p;  }
 
-   static void replace_own (node_ptr own, node_ptr x, node_ptr header)
+   //Fix header and own's parent data when replacing x with own, providing own's old data with parent
+   static void replace_own_impl(node_ptr own, node_ptr x, node_ptr header, node_ptr own_parent, bool own_was_left)
    {
       if(NodeTraits::get_parent(header) == own)
          NodeTraits::set_parent(header, x);
-      else if(is_left_child(own))
-         NodeTraits::set_left(NodeTraits::get_parent(own), x);
+      else if(own_was_left)
+         NodeTraits::set_left(own_parent, x);
       else
-         NodeTraits::set_right(NodeTraits::get_parent(own), x);
+         NodeTraits::set_right(own_parent, x);
    }
 
-   static void rotate_left(node_ptr p, node_ptr header)
+   //Fix header and own's parent data when replacing x with own, supposing own
+   //links with its parent are still ok
+   static void replace_own(node_ptr own, node_ptr x, node_ptr header)
    {
-      node_ptr x = NodeTraits::get_right(p);
-      NodeTraits::set_right(p, NodeTraits::get_left(x));
-      if(NodeTraits::get_left(x) != 0)
-         NodeTraits::set_parent(NodeTraits::get_left(x), p);
-      NodeTraits::set_parent(x, NodeTraits::get_parent(p));
-      replace_own (p, x, header);
-      NodeTraits::set_left(x, p);
-      NodeTraits::set_parent(p, x);
+      node_ptr own_parent(NodeTraits::get_parent(own));
+      bool own_is_left(NodeTraits::get_left(own_parent) == own);
+      replace_own_impl(own, x, header, own_parent, own_is_left);
    }
 
-   static void rotate_right(node_ptr p, node_ptr header)
+   // rotate parent p to left (no header and p's parent fixup)
+   static node_ptr rotate_left(node_ptr p)
    {
-      node_ptr x(NodeTraits::get_left(p));
-      node_ptr x_right(NodeTraits::get_right(x));
-      NodeTraits::set_left(p, x_right);
-      if(x_right)
-         NodeTraits::set_parent(x_right, p);
-      NodeTraits::set_parent(x, NodeTraits::get_parent(p));
-      replace_own (p, x, header);
-      NodeTraits::set_right(x, p);
+      node_ptr x(NodeTraits::get_right(p));
+      node_ptr x_left(NodeTraits::get_left(x));
+      NodeTraits::set_right(p, x_left);
+      if(x_left){
+         NodeTraits::set_parent(x_left, p);
+      }
+      NodeTraits::set_left(x, p);
       NodeTraits::set_parent(p, x);
+      return x;
    }
 
-   // rotate node t with left child            | complexity : constant        | exception : nothrow
-   static node_ptr rotate_left(node_ptr t)
+   // rotate parent p to left (with header and p's parent fixup)
+   static void rotate_left(node_ptr p, node_ptr header)
    {
-      node_ptr x = NodeTraits::get_right(t);
-      NodeTraits::set_right(t, NodeTraits::get_left(x));
-
-      if( NodeTraits::get_right(t) != 0 ){
-         NodeTraits::set_parent(NodeTraits::get_right(t), t );
-      }
-      NodeTraits::set_left(x, t);
-      NodeTraits::set_parent(t, x);
-      return x;
+      bool     p_was_left(is_left_child(p));
+      node_ptr p_old_parent(NodeTraits::get_parent(p));
+      node_ptr x(rotate_left(p));
+      NodeTraits::set_parent(x, p_old_parent);
+      replace_own_impl(p, x, header, p_old_parent, p_was_left);
    }
 
-   // rotate node t with right child            | complexity : constant        | exception : nothrow
-   static node_ptr rotate_right(node_ptr t)
+   // rotate parent p to right (no header and p's parent fixup)
+   static node_ptr rotate_right(node_ptr p)
    {
-      node_ptr x = NodeTraits::get_left(t);
-      NodeTraits::set_left(t, NodeTraits::get_right(x));
-      if( NodeTraits::get_left(t) != 0 ){
-         NodeTraits::set_parent(NodeTraits::get_left(t), t);
+      node_ptr x(NodeTraits::get_left(p));
+      node_ptr x_right(NodeTraits::get_right(x));
+      NodeTraits::set_left(p, x_right);
+      if(x_right){
+         NodeTraits::set_parent(x_right, p);
       }
-      NodeTraits::set_right(x, t);
-      NodeTraits::set_parent(t, x);
+      NodeTraits::set_right(x, p);
+      NodeTraits::set_parent(p, x);
       return x;
    }
 
-   static void link(node_ptr header, node_ptr z, node_ptr par, bool left)
+   // rotate parent p to right (with header and p's parent fixup)
+   static void rotate_right(node_ptr p, node_ptr header)
    {
-      if(par == header){
-         NodeTraits::set_parent(header, z);
-         NodeTraits::set_right(header, z);
-         NodeTraits::set_left(header, z);
-      }
-      else if(left){
-         NodeTraits::set_left(par, z);
-         if(par == NodeTraits::get_left(header))
-             NodeTraits::set_left(header, z);
-      }
-      else{
-         NodeTraits::set_right(par, z);
-         if(par == NodeTraits::get_right(header))
-             NodeTraits::set_right(header, z);
-      }
-      NodeTraits::set_parent(z, par);
-      NodeTraits::set_right(z, node_ptr(0));
-      NodeTraits::set_left(z, node_ptr(0));
+      bool     p_was_left(is_left_child(p));
+      node_ptr p_old_parent(NodeTraits::get_parent(p));
+      node_ptr x(rotate_right(p));
+      NodeTraits::set_parent(x, p_old_parent);
+      replace_own_impl(p, x, header, p_old_parent, p_was_left);
    }
 
    static void erase(node_ptr header, node_ptr z)
    {
       data_for_rebalance ignored;
-      erase(header, z, nop_erase_fixup(), ignored);
+      erase_impl(header, z, ignored);
    }
 
    struct data_for_rebalance
@@ -1557,6 +1590,39 @@ class tree_algorithms
    }
 
    private:
+   template<class NodePtrCompare>
+   static void insert_equal_check_impl
+      (bool upper, node_ptr h, node_ptr new_node, NodePtrCompare comp, insert_commit_data & commit_data, std::size_t *pdepth = 0)
+   {
+      std::size_t depth = 0;
+      node_ptr y(h);
+      node_ptr x(NodeTraits::get_parent(y));
+      bool link_left;
+
+      if(upper){
+         while(x){
+            ++depth;
+            y = x;
+            x = comp(new_node, x) ? 
+                  NodeTraits::get_left(x) : NodeTraits::get_right(x);
+         }
+         link_left = (y == h) || comp(new_node, y);
+      }
+      else{
+         while(x){
+            ++depth;
+            y = x;
+            x = !comp(x, new_node) ? 
+                  NodeTraits::get_left(x) : NodeTraits::get_right(x);
+         }
+         link_left = (y == h) || !comp(y, new_node);
+      }
+
+      commit_data.link_left = link_left;
+      commit_data.node = y;
+      if(pdepth)  *pdepth = depth;
+   }
+
    static void erase_impl(node_ptr header, node_ptr z, data_for_rebalance &info)
    {
       node_ptr y(z);
@@ -1599,12 +1665,12 @@ class tree_algorithms
             NodeTraits::set_parent(x, x_parent);
          tree_algorithms::replace_own (z, x, header);
          if(NodeTraits::get_left(header) == z){
-            NodeTraits::set_left(header, NodeTraits::get_right(z) == 0 ?        // z->get_left() must be null also
+            NodeTraits::set_left(header, !NodeTraits::get_right(z) ?        // z->get_left() must be null also
                NodeTraits::get_parent(z) :  // makes leftmost == header if z == root
                tree_algorithms::minimum (x));
          }
          if(NodeTraits::get_right(header) == z){
-            NodeTraits::set_right(header, NodeTraits::get_left(z) == 0 ?        // z->get_right() must be null also
+            NodeTraits::set_right(header, !NodeTraits::get_left(z) ?        // z->get_right() must be null also
                               NodeTraits::get_parent(z) :  // makes rightmost == header if z == root
                               tree_algorithms::maximum(x));
          }
similarity index 81%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/tree_node.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/tree_node.hpp
index a375cbae567c19d5fbabb9f659797f373a6834bf..3508e85bf59b67f0066632c90dff1051f79bef6b 100644 (file)
@@ -72,8 +72,12 @@ template<class Container, bool IsConst>
 class tree_iterator
    :  public std::iterator
          < std::bidirectional_iterator_tag
+         , typename Container::value_type
+         , typename std::iterator_traits<typename Container::value_type*>::difference_type
          , typename detail::add_const_if_c
-            <typename Container::value_type, IsConst>::type
+                     <typename Container::value_type, IsConst>::type *
+         , typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type &
          >
 {
    protected:
@@ -88,19 +92,18 @@ class tree_iterator
       detail::store_cont_ptr_on_it<Container>::value;
 
    public:
-   public:
+   typedef typename Container::value_type    value_type;
+   typedef  typename detail::add_const_if_c
+                     <typename Container::value_type, IsConst>::type *pointer;
    typedef typename detail::add_const_if_c
-      <typename Container::value_type, IsConst>
-      ::type                                       value_type;
-   typedef value_type & reference;
-   typedef value_type * pointer;
+                     <typename Container::value_type, IsConst>::type &reference;
 
    tree_iterator()
       : members_ (0, 0)
    {}
 
-   explicit tree_iterator(node_ptr node, const Container *cont_ptr)
-      : members_ (node, cont_ptr)
+   explicit tree_iterator(node_ptr nodeptr, const Container *cont_ptr)
+      : members_ (nodeptr, cont_ptr)
    {}
 
    tree_iterator(tree_iterator<Container, false> const& other)
@@ -110,8 +113,8 @@ class tree_iterator
    const node_ptr &pointed_node() const
    { return members_.nodeptr_; }
 
-   tree_iterator &operator=(const node_ptr &node)
-   {  members_.nodeptr_ = node;  return static_cast<tree_iterator&>(*this);  }
+   tree_iterator &operator=(const node_ptr &nodeptr)
+   {  members_.nodeptr_ = nodeptr;  return static_cast<tree_iterator&>(*this);  }
 
    public:
    tree_iterator& operator++() 
@@ -146,33 +149,26 @@ class tree_iterator
    bool operator!= (const tree_iterator& i) const
    { return !operator== (i); }
 
-   value_type& operator*() const
+   reference operator*() const
    {  return *operator->();   }
 
    pointer operator->() const
    { return detail::get_pointer(this->get_real_value_traits()->to_value_ptr(members_.nodeptr_)); }
 
    const Container *get_container() const
-   {
-      if(store_container_ptr)
-         return static_cast<const Container*>(members_.get_ptr());
-      else
-         return 0;
-   }
+   {  return static_cast<const Container*>(members_.get_ptr());   }
 
    const real_value_traits *get_real_value_traits() const
-   {
-      if(store_container_ptr)
-         return &this->get_container()->get_real_value_traits();
-      else
-         return 0;
-   }
+   {  return &this->get_container()->get_real_value_traits();  }
 
    tree_iterator end_iterator_from_it() const
    {
       return tree_iterator(node_algorithms::get_header(this->pointed_node()), this->get_container());
    }
 
+   tree_iterator<Container, false> unconst() const
+   {  return tree_iterator<Container, false>(this->pointed_node(), this->get_container());   }
+
    private:
    struct members
       :  public detail::select_constptr
similarity index 93%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/utilities.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/utilities.hpp
index 7a92449b9c770e64946b2da579eac55cb7dbdb5d..c548911739dc31a89980f34e4d489ae627010caa 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -20,6 +20,7 @@
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/detail/assert.hpp>
+#include <boost/intrusive/detail/is_stateful_value_traits.hpp>
 #include <boost/cstdint.hpp>
 #include <cstddef>
 #include <climits>
@@ -45,8 +46,7 @@ struct internal_base_hook_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::boost_intrusive_tags::is_base_hook>
-      test (detail::bool_<U::boost_intrusive_tags::is_base_hook>* = 0);
+   template <class U> static two_or_three<U::boost_intrusive_tags::is_base_hook> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -62,8 +62,7 @@ struct internal_any_hook_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::is_any_hook>
-      test (detail::bool_<U::is_any_hook>* = 0);
+   template <class U> static two_or_three<U::is_any_hook> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -80,8 +79,7 @@ struct external_value_traits_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::external_value_traits>
-      test (detail::bool_<U::external_value_traits>* = 0);
+   template <class U> static two_or_three<U::external_value_traits> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -91,8 +89,7 @@ struct external_bucket_traits_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::external_bucket_traits>
-      test (detail::bool_<U::external_bucket_traits>* = 0);
+   template <class U> static two_or_three<U::external_bucket_traits> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -211,20 +208,25 @@ struct key_nodeptr_comp
 {
    typedef typename Container::real_value_traits         real_value_traits;
    typedef typename real_value_traits::node_ptr          node_ptr;
+   typedef typename real_value_traits::const_node_ptr    const_node_ptr;
    typedef detail::ebo_functor_holder<KeyValueCompare>   base_t;
    key_nodeptr_comp(KeyValueCompare kcomp, const Container *cont)
       :  base_t(kcomp), cont_(cont)
    {}
 
    template<class KeyType>
-   bool operator()(node_ptr node, const KeyType &key) const
+   bool operator()( const_node_ptr node, const KeyType &key
+                  , typename enable_if_c
+                     <!is_convertible<KeyType, const_node_ptr>::value>::type * = 0) const
    {  return base_t::get()(*cont_->get_real_value_traits().to_value_ptr(node), key); }
 
    template<class KeyType>
-   bool operator()(const KeyType &key, node_ptr node) const
+   bool operator()(const KeyType &key, const_node_ptr node
+                  , typename enable_if_c
+                     <!is_convertible<KeyType, const_node_ptr>::value>::type * = 0) const
    {  return base_t::get()(key, *cont_->get_real_value_traits().to_value_ptr(node)); }
 
-   bool operator()(node_ptr node1, node_ptr node2) const
+   bool operator()(const_node_ptr node1, const_node_ptr node2) const
    {
       return base_t::get()
          ( *cont_->get_real_value_traits().to_value_ptr(node1)
@@ -332,16 +334,6 @@ struct select_constptr
       >::type type;
 };
 
-template <class Container>
-struct store_cont_ptr_on_it
-{
-   typedef typename Container::value_traits value_traits;
-   static const bool value = 
-      !detail::is_empty_class<value_traits>::value
-   || detail::external_value_traits_is_true<value_traits>::value
-   ;
-};
-
 template<class T, bool Add>
 struct add_const_if_c
 {
@@ -352,58 +344,6 @@ struct add_const_if_c
       >::type type;
 };
 
-template<class Container, bool IsConst>
-struct node_to_value
-   :  public detail::select_constptr
-      < typename boost::pointer_to_other
-            <typename Container::pointer, void>::type
-      , detail::store_cont_ptr_on_it<Container>::value
-      >::type
-{
-   static const bool store_container_ptr = 
-      detail::store_cont_ptr_on_it<Container>::value;
-
-   typedef typename Container::real_value_traits         real_value_traits;
-   typedef typename real_value_traits::value_type        value_type;
-   typedef typename detail::select_constptr
-      < typename boost::pointer_to_other
-         <typename Container::pointer, void>::type
-      , store_container_ptr >::type                      Base;
-   typedef typename real_value_traits::node_traits::node node;
-   typedef typename detail::add_const_if_c
-         <value_type, IsConst>::type                  vtype;
-   typedef typename detail::add_const_if_c
-         <node, IsConst>::type                        ntype;
-   typedef typename boost::pointer_to_other
-      <typename Container::pointer, ntype>::type      npointer;
-
-   node_to_value(const Container *cont)
-      :  Base(cont)
-   {}
-
-   typedef vtype &                                 result_type;
-   typedef ntype &                                 first_argument_type;
-
-   const Container *get_container() const
-   {
-      if(store_container_ptr)
-         return static_cast<const Container*>(Base::get_ptr());
-      else
-         return 0;
-   }
-
-   const real_value_traits *get_real_value_traits() const
-   {
-      if(store_container_ptr)
-         return &this->get_container()->get_real_value_traits();
-      else
-         return 0;
-   }
-
-   result_type operator()(first_argument_type arg) const
-   {  return *(this->get_real_value_traits()->to_value_ptr(npointer(&arg))); }
-};
-
 template <link_mode_type LinkMode>
 struct link_dispatch
 {};
@@ -620,6 +560,79 @@ class exception_array_disposer
    }
 };
 
+template<class ValueTraits, bool ExternalValueTraits>
+struct store_cont_ptr_on_it_impl
+{
+   static const bool value = is_stateful_value_traits<ValueTraits>::value;
+};
+
+template<class ValueTraits>
+struct  store_cont_ptr_on_it_impl<ValueTraits, true>
+{
+   static const bool value = true;
+};
+
+template <class Container>
+struct store_cont_ptr_on_it
+{
+   typedef typename Container::value_traits value_traits;
+   static const bool value = store_cont_ptr_on_it_impl
+      <value_traits, external_value_traits_is_true<value_traits>::value>::value;
+};
+
+template<class Container, bool IsConst>
+struct node_to_value
+   :  public detail::select_constptr
+      < typename boost::pointer_to_other
+            <typename Container::pointer, void>::type
+      , detail::store_cont_ptr_on_it<Container>::value
+      >::type
+{
+   static const bool store_container_ptr = 
+      detail::store_cont_ptr_on_it<Container>::value;
+
+   typedef typename Container::real_value_traits         real_value_traits;
+   typedef typename real_value_traits::value_type        value_type;
+   typedef typename detail::select_constptr
+      < typename boost::pointer_to_other
+         <typename Container::pointer, void>::type
+      , store_container_ptr >::type                      Base;
+   typedef typename real_value_traits::node_traits::node node;
+   typedef typename detail::add_const_if_c
+         <value_type, IsConst>::type                  vtype;
+   typedef typename detail::add_const_if_c
+         <node, IsConst>::type                        ntype;
+   typedef typename boost::pointer_to_other
+      <typename Container::pointer, ntype>::type      npointer;
+
+   node_to_value(const Container *cont)
+      :  Base(cont)
+   {}
+
+   typedef vtype &                                 result_type;
+   typedef ntype &                                 first_argument_type;
+
+   const Container *get_container() const
+   {
+      if(store_container_ptr)
+         return static_cast<const Container*>(Base::get_ptr());
+      else
+         return 0;
+   }
+
+   const real_value_traits *get_real_value_traits() const
+   {
+      if(store_container_ptr)
+         return &this->get_container()->get_real_value_traits();
+      else
+         return 0;
+   }
+
+   result_type operator()(first_argument_type arg) const
+   {  return *(this->get_real_value_traits()->to_value_ptr(npointer(&arg))); }
+};
+
+
 } //namespace detail
 } //namespace intrusive 
 } //namespace boost 
similarity index 94%
rename from deal.II/contrib/boost/include/boost/intrusive/detail/workaround.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/detail/workaround.hpp
index a4c097489366154f20ef181408612ba34e477a9a..dd70862f851402fda7c2fc5cd414d17aa92f8bbe 100644 (file)
@@ -1,6 +1,6 @@
 //////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2005-2008. Distributed under the Boost
+// (C) Copyright Ion Gaztanaga 2005-2009. 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)
 //
similarity index 96%
rename from deal.II/contrib/boost/include/boost/intrusive/hashtable.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/hashtable.hpp
index c0ef630e6a0bf3a9bea2061db37e0e6aa823df6c..51cc6c1953ab51bf050e8037121a9a08e2f9ae71 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -30,6 +30,7 @@
 #include <boost/intrusive/detail/transform_iterator.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 //Implementation utilities
 #include <boost/intrusive/trivial_value_traits.hpp>
 #include <boost/intrusive/unordered_set_hook.hpp>
@@ -185,8 +186,7 @@ struct store_hash_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::store_hash>
-      test (detail::bool_<U::store_hash>* = 0);
+   template <class U> static two_or_three<U::store_hash> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -202,8 +202,7 @@ struct optimize_multikey_bool
    template<bool Add>
    struct two_or_three {one _[2 + Add];};
    template <class U> static one test(...);
-   template <class U> static two_or_three<U::optimize_multikey>
-      test (detail::bool_<U::optimize_multikey>* = 0);
+   template <class U> static two_or_three<U::optimize_multikey> test (int);
    static const std::size_t value = sizeof(test<T>(0));
 };
 
@@ -572,7 +571,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class hashtable_impl
+   :  private detail::clear_on_destructor_base<hashtable_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    public:
    typedef typename Config::value_traits                             value_traits;
 
@@ -600,7 +601,7 @@ class hashtable_impl
 
    typedef typename real_value_traits::pointer                       pointer;
    typedef typename real_value_traits::const_pointer                 const_pointer;
-   typedef typename std::iterator_traits<pointer>::value_type        value_type;
+   typedef typename real_value_traits::value_type                                                value_type;
    typedef typename std::iterator_traits<pointer>::reference         reference;
    typedef typename std::iterator_traits<const_pointer>::reference   const_reference;
    typedef typename std::iterator_traits<pointer>::difference_type   difference_type;
@@ -623,7 +624,7 @@ class hashtable_impl
       <node_ptr, const node>::type                                   const_node_ptr;
    typedef typename slist_impl::node_algorithms                      node_algorithms;
 
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<hashtable_impl>::value;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
    static const bool store_hash = detail::store_hash_is_true<node_traits>::value;
 
    static const bool unique_keys          = 0 != (Config::bool_flags  & detail::hash_bool_flags::unique_keys_pos);
@@ -715,6 +716,8 @@ class hashtable_impl
 
    //Constant-time size is incompatible with auto-unlink hooks!
    BOOST_STATIC_ASSERT(!(constant_time_size && ((int)real_value_traits::link_mode == (int)auto_unlink)));
+   //Cache begin is incompatible with auto-unlink hooks!
+   BOOST_STATIC_ASSERT(!(cache_begin && ((int)real_value_traits::link_mode == (int)auto_unlink)));
 
    template<class Disposer>
    node_cast_adaptor<detail::node_disposer<Disposer, hashtable_impl> >
@@ -795,7 +798,7 @@ class hashtable_impl
    //! 
    //! <b>Throws</b>: Nothing.
    ~hashtable_impl() 
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Returns an iterator pointing to the beginning of the unordered_set.
    //! 
@@ -866,9 +869,9 @@ class hashtable_impl
    key_equal key_eq() const
    {  return this->priv_equal();   }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
-   //! <b>Complexity</b>: if constant-time size and cache_last options are disabled,
+   //! <b>Complexity</b>: if constant-time size and cache_begin options are disabled,
    //!   average constant time (worst case, with empty() == true: O(this->bucket_count()).
    //!   Otherwise constant.
    //! 
@@ -1045,6 +1048,18 @@ class hashtable_impl
       }
    }
 
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Inserts the value into the unordered_set.
+   //!
+   //! <b>Returns</b>: An iterator to the inserted value.
+   //! 
+   //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
+   //! 
+   //! <b>Throws</b>: If the internal hasher or the equality functor throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
    iterator insert_equal(reference value)
    {
       size_type bucket_num;
@@ -1055,6 +1070,18 @@ class hashtable_impl
       return priv_insert_equal_find(value, bucket_num, hash_value, it);
    }
 
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
+   //!   of type value_type.
+   //! 
+   //! <b>Effects</b>: Equivalent to this->insert_equal(t) for each element in [b, e).
+   //! 
+   //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
+   //!   Worst case O(N*this->size()).
+   //! 
+   //! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
    template<class Iterator>
    void insert_equal(Iterator b, Iterator e)
    {
@@ -1092,7 +1119,7 @@ class hashtable_impl
    //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
    //!   of type value_type.
    //! 
-   //! <b>Effects</b>: Equivalent to this->insert(t) for each element in [b, e).
+   //! <b>Effects</b>: Equivalent to this->insert_unique(t) for each element in [b, e).
    //! 
    //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
    //!   Worst case O(N*this->size()).
@@ -1202,8 +1229,8 @@ class hashtable_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased element. No destructors are called.
-   void erase(const_iterator i)
-   {  this->erase_and_dispose(i, detail::null_disposer());  }
+   iterator erase(const_iterator i)
+   {  return this->erase_and_dispose(i, detail::null_disposer());  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
    //! 
@@ -1214,8 +1241,8 @@ class hashtable_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   void erase(const_iterator b, const_iterator e)
-   {  this->erase_and_dispose(b, e, detail::null_disposer());  }
+   iterator erase(const_iterator b, const_iterator e)
+   {  return this->erase_and_dispose(b, e, detail::null_disposer());  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
    //! 
@@ -1268,11 +1295,18 @@ class hashtable_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   void erase_and_dispose(const_iterator i, Disposer disposer)
-   {
+   iterator erase_and_dispose(const_iterator i, Disposer disposer
+                              /// @cond
+                              , typename detail::enable_if_c<!detail::is_convertible<Disposer, const_iterator>::value >::type * = 0
+                              /// @endcond
+                              )
+   {
+      iterator ret(i.unconst());
+      ++ret;
       priv_erase(i, disposer, optimize_multikey_t());
       this->priv_size_traits().decrement();
       priv_erasure_update_cache();
+      return ret;
    }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1288,31 +1322,32 @@ class hashtable_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
-   {
-      if(b == e)  return;
-
-      //Get the bucket number and local iterator for both iterators
-      siterator first_local_it(b.slist_it());
-      size_type first_bucket_num = this->priv_get_bucket_num(first_local_it);
-
-      siterator before_first_local_it
-         = priv_get_previous(priv_buckets()[first_bucket_num], first_local_it);
-      size_type last_bucket_num;
-      siterator last_local_it;
-
-      //For the end iterator, we will assign the end iterator
-      //of the last bucket
-      if(e == this->end()){
-         last_bucket_num   = this->bucket_count() - 1;
-         last_local_it     = priv_buckets()[last_bucket_num].end();
-      }
-      else{
-         last_local_it     = e.slist_it();
-         last_bucket_num = this->priv_get_bucket_num(last_local_it);
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {
+      if(b != e){
+         //Get the bucket number and local iterator for both iterators
+         siterator first_local_it(b.slist_it());
+         size_type first_bucket_num = this->priv_get_bucket_num(first_local_it);
+
+         siterator before_first_local_it
+            = priv_get_previous(priv_buckets()[first_bucket_num], first_local_it);
+         size_type last_bucket_num;
+         siterator last_local_it;
+
+         //For the end iterator, we will assign the end iterator
+         //of the last bucket
+         if(e == this->end()){
+            last_bucket_num   = this->bucket_count() - 1;
+            last_local_it     = priv_buckets()[last_bucket_num].end();
+         }
+         else{
+            last_local_it     = e.slist_it();
+            last_bucket_num = this->priv_get_bucket_num(last_local_it);
+         }
+         priv_erase_range(before_first_local_it, first_bucket_num, last_local_it, last_bucket_num, disposer);
+         priv_erasure_update_cache(first_bucket_num, last_bucket_num);
       }
-      priv_erase_range(before_first_local_it, first_bucket_num, last_local_it, last_bucket_num, disposer);
-      priv_erasure_update_cache(first_bucket_num, last_bucket_num);
+      return e.unconst();
    }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
similarity index 91%
rename from deal.II/contrib/boost/include/boost/intrusive/intrusive_fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/intrusive_fwd.hpp
index 38a622f8874b010814e3869864f303f89de2c451..7c9b2a1ef880a877a8a4d848bac13809cad5fc60 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -311,6 +311,51 @@ template<class ...Options>
 #endif
 class avl_set_member_hook;
 
+
+//treap/treap_set/treap_multiset
+#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES
+template
+   < class T
+   , class O1  = none
+   , class O2  = none
+   , class O3  = none
+   , class O4  = none
+   >
+#else
+template<class T, class ...Options>
+#endif
+class treap;
+
+#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES
+template
+   < class T
+   , class O1  = none
+   , class O2  = none
+   , class O3  = none
+   , class O4  = none
+   >
+#else
+template<class T, class ...Options>
+#endif
+class treap_set;
+
+#ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES
+template
+   < class T
+   , class O1  = none
+   , class O2  = none
+   , class O3  = none
+   , class O4  = none
+   >
+#else
+template<class T, class ...Options>
+#endif
+class treap_multiset;
+
+//Default priority comparison functor
+template <class T>
+struct priority_compare;
+
 //sgtree/sg_set/sg_multiset
 #ifndef BOOST_INTRUSIVE_VARIADIC_TEMPLATES
 template
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/linear_slist_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/linear_slist_algorithms.hpp
index a181a51d7b6f6dc0d36932ef01458b7cb954eb53..193b449b40fa10ca94aa825c56b37b48da5f833a 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -156,7 +156,7 @@ class linear_slist_algorithms
    //! <b>Effects</b>: Returns the number of nodes in a linear list. If the linear list
    //!  is empty, returns 1.
    //! 
-   //! <b>Complexity</b>: Constant 
+   //! <b>Complexity</b>: Linear 
    //! 
    //! <b>Throws</b>: Nothing.
    static std::size_t count(const_node_ptr this_node) 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/link_mode.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/link_mode.hpp
index 525e15000f4da25ccd46f13a46f5c2c825d27758..17012c93cb006471fb55fbd48a49c63debe7547d 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/list.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/list.hpp
index c6d94f24f2121b06a2324d7ec43e872aa3cbbfd9..965baa70423b37510de5d70c31893220f2f540d0 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -20,6 +20,7 @@
 #include <boost/intrusive/list_hook.hpp>
 #include <boost/intrusive/circular_list_algorithms.hpp>
 #include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/static_assert.hpp>
@@ -72,7 +73,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class list_impl
+   :  private detail::clear_on_destructor_base< list_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    //Public typedefs
    public:
    typedef typename Config::value_traits                             value_traits;
@@ -103,7 +106,7 @@ class list_impl
    typedef circular_list_algorithms<node_traits>                     node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<list_impl>::value;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
 
    /// @cond
 
@@ -219,11 +222,7 @@ class list_impl
    //! <b>Complexity</b>: Linear to the number of elements in the list, if 
    //!   it's a safe-mode or auto-unlink value . Otherwise constant. 
    ~list_impl() 
-   {
-      if(safemode_or_autounlink){
-         this->clear(); 
-      }
-   }
+   {}
 
    //! <b>Requires</b>: value must be an lvalue.
    //! 
@@ -651,6 +650,12 @@ class list_impl
       return i.unconst();
    }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the element range pointed by b and e
@@ -973,7 +978,8 @@ class list_impl
             carry.splice(carry.cbegin(), *this, this->cbegin());
             int i = 0;
             while(i < fill && !counter[i].empty()) {
-               carry.merge(counter[i++], p);
+               counter[i].merge(carry, p);
+               carry.swap(counter[i++]);
             }
             carry.swap(counter[i]);
             if(i == fill)
@@ -1016,21 +1022,26 @@ class list_impl
    template<class Predicate>
    void merge(list_impl& x, Predicate p)
    {
-      const_iterator e(this->end());
-      const_iterator bx(x.begin());
-      const_iterator ex(x.end());
-
-      for (const_iterator b = this->cbegin(); b != e; ++b) {
-         size_type n(0);
-         const_iterator ix(bx);
-         while(ix != ex && p(*ix, *b)){
-            ++ix; ++n;
+      const_iterator e(this->cend()), ex(x.cend());
+      const_iterator b(this->cbegin());
+      while(!x.empty()){
+         const_iterator ix(x.cbegin());
+         while (b != e && !p(*ix, *b)){
+            ++b;
+         }
+         if(b == e){
+            //Now transfer the rest to the end of the container
+            this->splice(e, x);
+            break;
+         }
+         else{
+            size_type n(0);
+            do{
+               ++ix; ++n;
+            } while(ix != ex && p(*ix, *b));
+            this->splice(b, x, x.begin(), ix, n);
          }
-         this->splice(b, x, bx, ix, n);
-         bx = ix;
       }
-      //Now transfer the rest at the end of the container
-      this->splice(e, x);
    }
 
    //! <b>Effects</b>: Reverses the order of elements in the list. 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/list_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/list_hook.hpp
index 86745cf195bfb98c0d30a5c8084957648ff13859..ed93434a3fe23a158e851a9d9db1c17f4eab5c93 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -93,6 +93,7 @@ class list_base_hook
       ::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -214,6 +215,7 @@ class list_member_hook
       ::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/intrusive/member_value_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/member_value_traits.hpp
index b32f8c431e7e3cadaa88acec5d4163e73b5338f4..ce7e56b3a416d9d1942b293e3945fd53a9916bd0 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 98%
rename from deal.II/contrib/boost/include/boost/intrusive/options.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/options.hpp
index b937698958b598c31920217184e077e69f561060..d692b1ea408ea39bb8494ddc8d2bf5f9c4be49a7 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -278,6 +278,20 @@ struct equal
 /// @endcond
 };
 
+//!This option setter specifies the equality
+//!functor for the value type
+template<class Priority>
+struct priority
+{
+/// @cond
+    template<class Base>
+    struct pack : Base
+    {
+        typedef Priority priority;
+    };
+/// @endcond
+};
+
 //!This option setter specifies the hash
 //!functor for the value type
 template<class Hash>
similarity index 95%
rename from deal.II/contrib/boost/include/boost/intrusive/pointer_plus_bits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/pointer_plus_bits.hpp
index ec1fe51c91070ea00daadec854ebfe16df55b57e..10b2fe0eb933cbb7d1c060523bcf0613a9926aaf 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -50,7 +50,7 @@ template<class Pointer, std::size_t NumBits>
 struct pointer_plus_bits;
 
 //!This is the specialization to embed extra bits of information
-//!in a raw pointer. The extra bits are stored in the lower bit of the pointer.
+//!in a raw pointer. The extra bits are stored in the lower bits of the pointer.
 template<class T, std::size_t NumBits>
 struct pointer_plus_bits<T*, NumBits>
 {
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/priority_compare.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/priority_compare.hpp
new file mode 100644 (file)
index 0000000..abde27a
--- /dev/null
@@ -0,0 +1,39 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP
+#define BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/intrusive_fwd.hpp>
+
+#include <functional>
+
+namespace boost {
+namespace intrusive {
+
+template <class T>
+struct priority_compare
+   : public std::binary_function<T, T, bool>
+{
+   bool operator()(const T &val, const T &val2) const
+   {
+      return priority_order(val, val2);
+   }
+};
+
+} //namespace intrusive 
+} //namespace boost 
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP
similarity index 83%
rename from deal.II/contrib/boost/include/boost/intrusive/rbtree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/rbtree.hpp
index 94d1a3996a8729a508b577f3d38ed2c8e62f3328..8d9cacf4944f417779f75e51c814f3ee0c57c10a 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
 #include <boost/intrusive/detail/rbtree_node.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
+#include <boost/intrusive/detail/function_detector.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/rbtree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -77,7 +80,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class rbtree_impl
+   :  private detail::clear_on_destructor_base<rbtree_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    public:
    typedef typename Config::value_traits                             value_traits;
    /// @cond
@@ -112,8 +117,7 @@ class rbtree_impl
    typedef rbtree_algorithms<node_traits>                            node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<rbtree_impl>::value;
-
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
    /// @cond
    private:
    typedef detail::size_holder<constant_time_size, size_type>        size_traits;
@@ -200,8 +204,10 @@ class rbtree_impl
    //!   
    //! <b>Complexity</b>: Constant. 
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws. 
-   rbtree_impl( value_compare cmp = value_compare()
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructorof the value_compare object throws. Basic guarantee.
+   rbtree_impl( const value_compare &cmp = value_compare()
               , const value_traits &v_traits = value_traits()) 
       :  data_(cmp, v_traits)
    {  
@@ -218,10 +224,12 @@ class rbtree_impl
    //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
    //!   comp and otherwise N * log N, where N is the distance between first and last.
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws.
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare object throws. Basic guarantee.
    template<class Iterator>
    rbtree_impl( bool unique, Iterator b, Iterator e
-              , value_compare cmp = value_compare()
+              , const value_compare &cmp     = value_compare()
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
@@ -241,7 +249,7 @@ class rbtree_impl
    //! 
    //! <b>Throws</b>: Nothing.
    ~rbtree_impl() 
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Returns an iterator pointing to the beginning of the tree.
    //! 
@@ -397,7 +405,7 @@ class rbtree_impl
    value_compare value_comp() const
    {  return priv_comp();   }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -407,7 +415,8 @@ class rbtree_impl
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //! 
-   //! <b>Complexity</b>: Linear to elements contained in *this.
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
    //! 
    //! <b>Throws</b>: Nothing.
    size_type size() const
@@ -419,7 +428,7 @@ class rbtree_impl
       }
    }
 
-   //! <b>Effects</b>: Swaps the contents of two multisets.
+   //! <b>Effects</b>: Swaps the contents of two rbtrees.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -445,7 +454,7 @@ class rbtree_impl
    //! <b>Complexity</b>: Average complexity for insert element is at
    //!   most logarithmic.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -471,7 +480,7 @@ class rbtree_impl
    //! <b>Complexity</b>: Logarithmic in general, but it is amortized
    //!   constant time if t is inserted immediately before hint.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -504,9 +513,9 @@ class rbtree_impl
    template<class Iterator>
    void insert_equal(Iterator b, Iterator e)
    {
-      iterator end(this->end());
+      iterator iend(this->end());
       for (; b != e; ++b)
-         this->insert_equal(end, *b);
+         this->insert_equal(iend, *b);
    }
 
    //! <b>Requires</b>: value must be an lvalue
@@ -524,7 +533,7 @@ class rbtree_impl
    std::pair<iterator, bool> insert_unique(reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(value, priv_comp(), commit_data);
       if(!ret.second)
          return ret;
       return std::pair<iterator, bool> (insert_unique_commit(value, commit_data), true);
@@ -547,7 +556,7 @@ class rbtree_impl
    iterator insert_unique(const_iterator hint, reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(hint, value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(hint, value, priv_comp(), commit_data);
       if(!ret.second)
          return ret.first;
       return insert_unique_commit(value, commit_data);
@@ -570,9 +579,9 @@ class rbtree_impl
    void insert_unique(Iterator b, Iterator e)
    {
       if(this->empty()){
-         iterator end(this->end());
+         iterator iend(this->end());
          for (; b != e; ++b)
-            this->insert_unique(end, *b);
+            this->insert_unique(iend, *b);
       }
       else{
          for (; b != e; ++b)
@@ -580,10 +589,36 @@ class rbtree_impl
       }
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data)
@@ -596,10 +631,38 @@ class rbtree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_iterator hint, const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(hint, value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const_iterator hint, const KeyType &key
@@ -613,6 +676,23 @@ class rbtree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the container between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the avl_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
    iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
    {
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
@@ -624,6 +704,76 @@ class rbtree_impl
       return iterator(to_insert, this);
    }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" tree ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      return iterator(node_algorithms::insert_before
+         (node_ptr(&priv_header()), pos.pointed_node(), to_insert), this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      node_algorithms::push_back(node_ptr(&priv_header()), to_insert);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      node_algorithms::push_front(node_ptr(&priv_header()), to_insert);
+   }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity for erase element is constant time. 
@@ -632,9 +782,9 @@ class rbtree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {
-      iterator ret(i);
+      const_iterator ret(i);
       ++ret;
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
@@ -643,7 +793,7 @@ class rbtree_impl
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
-      return ret;
+      return ret.unconst();
    }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -655,7 +805,7 @@ class rbtree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  size_type n;   return private_erase(b, e, n);   }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -683,7 +833,11 @@ class rbtree_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -703,7 +857,7 @@ class rbtree_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {
       node_ptr to_erase(i.pointed_node());
       iterator ret(this->erase(i));
@@ -711,21 +865,11 @@ class rbtree_impl
       return ret;
    }
 
-   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
-   //!
-   //! <b>Effects</b>: Erases the range pointed to by b end e.
-   //!   Disposer::operator()(pointer) is called for the removed elements.
-   //! 
-   //! <b>Complexity</b>: Average complexity for erase range is at most 
-   //!   O(log(size() + N)), where N is the number of elements in the range.
-   //! 
-   //! <b>Throws</b>: Nothing.
-   //! 
-   //! <b>Note</b>: Invalidates the iterators
-   //!    to the erased elements.
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
-   {  size_type n;   return private_erase(b, e, n, disposer);   }
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
@@ -749,6 +893,22 @@ class rbtree_impl
       return n;
    }
 
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases the range pointed to by b end e.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {  size_type n;   return private_erase(b, e, n, disposer);   }
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases all the elements with the given key.
@@ -764,7 +924,11 @@ class rbtree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -1207,18 +1371,18 @@ class rbtree_impl
    /// @cond
    private:
    template<class Disposer>
-   iterator private_erase(iterator b, iterator e, size_type &n, Disposer disposer)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer)
    {
       for(n = 0; b != e; ++n)
         this->erase_and_dispose(b++, disposer);
-      return b;
+      return b.unconst();
    }
 
-   iterator private_erase(iterator b, iterator e, size_type &n)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n)
    {
       for(n = 0; b != e; ++n)
         this->erase(b++);
-      return b;
+      return b.unconst();
    }
    /// @endcond
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/intrusive/rbtree_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/rbtree_algorithms.hpp
index c40819350af7859059cdf834158fe5eee9fabae4..ca6f7eb969cf4757b3a242e52d8c265faa2cb38d 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007.
+// (C) Copyright Ion Gaztanaga  2006-2009.
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -585,6 +585,66 @@ class rbtree_algorithms
       return new_node;
    }
 
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "pos" must be a valid iterator or header (end) node.
+   //!   "pos" must be an iterator pointing to the successor to "new_node"
+   //!   once inserted according to the order of already inserted nodes. This function does not
+   //!   check "pos" and this precondition must be guaranteed by the caller.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
+   //! tree invariants might be broken.
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node)
+   {
+      tree_algorithms::insert_before(header, pos, new_node);
+      rebalance_after_insertion(header, new_node);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering no less than the
+   //!   greatest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is less than the greatest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_back(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_back(header, new_node);
+      rebalance_after_insertion(header, new_node);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering, no greater than the
+   //!   lowest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_front(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_front(header, new_node);
+      rebalance_after_insertion(header, new_node);
+   }
+
    //! <b>Requires</b>: "header" must be the header node of a tree.
    //!   KeyNodePtrCompare is a function object that induces a strict weak
    //!   ordering compatible with the strict weak ordering used to create the
similarity index 92%
rename from deal.II/contrib/boost/include/boost/intrusive/set.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/set.hpp
index d2dff1ec675116121408becac084ae2ee502c1b9..54c5a65ade16d053afc8ebb13125fe2761c744d6 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -15,6 +15,7 @@
 
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/rbtree.hpp>
 #include <iterator>
 
@@ -297,7 +298,7 @@ class set_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -489,6 +490,60 @@ class set_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_unique(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate. "value" must not be equal to any
+   //!   inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" or "value" is not unique tree ordering and uniqueness
+   //! invariants will be broken respectively.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be greater than
+   //!   any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than or equal to the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be less
+   //!   than any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than or equal to the the mimum inserted key tree ordering or uniqueness
+   //!   invariants will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity is constant time.
@@ -499,7 +554,7 @@ class set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -513,7 +568,7 @@ class set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -541,7 +596,11 @@ class set_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -558,9 +617,15 @@ class set_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -576,7 +641,7 @@ class set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -611,7 +676,11 @@ class set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
@@ -1419,7 +1488,7 @@ class multiset_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -1518,6 +1587,57 @@ class multiset_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_equal(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" tree ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity is constant time. 
@@ -1528,7 +1648,7 @@ class multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -1542,7 +1662,7 @@ class multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -1570,7 +1690,11 @@ class multiset_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1587,9 +1711,15 @@ class multiset_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Returns</b>: An iterator to the element after the erased elements.
@@ -1605,7 +1735,7 @@ class multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1640,7 +1770,11 @@ class multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/set_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/set_hook.hpp
index 473dfe356285f04f52421f0943ebec849a568f65..35746a29a5814ff2839d4eef58ea03c25cec8b18 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -98,6 +98,7 @@ class set_base_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -224,6 +225,7 @@ class set_member_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 92%
rename from deal.II/contrib/boost/include/boost/intrusive/sg_set.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/sg_set.hpp
index b3570fb41b90eb0ccec9e9ba83ce9d40ca1a1e13..3a7c77a89e505ceee435eb4919221398c27e42a0 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -15,6 +15,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <boost/intrusive/sgtree.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <iterator>
 
 namespace boost {
@@ -296,7 +297,7 @@ class sg_set_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -380,7 +381,7 @@ class sg_set_impl
 
    //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
    //!   the same strict weak ordering as value_compare. The difference is that
-   //!   key_value_comp compares an ascapegoatitrary key with the contained values.
+   //!   key_value_comp compares an arbitrary key with the contained values.
    //! 
    //! <b>Effects</b>: Checks if a value can be inserted in the sg_set, using
    //!   a user provided key instead of the value itself.
@@ -415,7 +416,7 @@ class sg_set_impl
 
    //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
    //!   the same strict weak ordering as value_compare. The difference is that
-   //!   key_value_comp compares an ascapegoatitrary key with the contained values.
+   //!   key_value_comp compares an arbitrary key with the contained values.
    //! 
    //! <b>Effects</b>: Checks if a value can be inserted in the sg_set, using
    //!   a user provided key instead of the value itself, using "hint" 
@@ -488,6 +489,60 @@ class sg_set_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_unique(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate. "value" must not be equal to any
+   //!   inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" or "value" is not unique tree ordering and uniqueness
+   //! invariants will be broken respectively.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be greater than
+   //!   any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than or equal to the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be less
+   //!   than any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than or equal to the the mimum inserted key tree ordering or uniqueness
+   //!   invariants will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity is constant time.
@@ -498,7 +553,7 @@ class sg_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -512,7 +567,7 @@ class sg_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -540,7 +595,11 @@ class sg_set_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -557,9 +616,15 @@ class sg_set_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -575,7 +640,7 @@ class sg_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -610,7 +675,11 @@ class sg_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
@@ -1458,7 +1527,7 @@ class sg_multiset_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -1557,6 +1626,57 @@ class sg_multiset_impl
    void insert(Iterator b, Iterator e)
    {  tree_.insert_equal(b, e);  }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" tree ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity is constant time. 
@@ -1567,7 +1687,7 @@ class sg_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -1581,7 +1701,7 @@ class sg_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -1609,7 +1729,11 @@ class sg_multiset_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1626,9 +1750,15 @@ class sg_multiset_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Returns</b>: An iterator to the element after the erased elements.
@@ -1644,7 +1774,7 @@ class sg_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1679,7 +1809,11 @@ class sg_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
similarity index 84%
rename from deal.II/contrib/boost/include/boost/intrusive/sgtree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/sgtree.hpp
index 63022a40954140b20be85b850acef6e46f19376a..5507893ddb19afa7f85bb97d3e7ca9edd05ba607 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga 2007
+// (C) Copyright Ion Gaztanaga 2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -24,7 +24,7 @@
 #include <functional>
 #include <iterator>
 #include <utility>
-#include <boost/config/no_tr1/cmath.hpp>
+#include <cmath>
 #include <cstddef>
 #include <boost/intrusive/detail/assert.hpp>
 #include <boost/static_assert.hpp>
@@ -33,6 +33,8 @@
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
 #include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/sgtree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -204,7 +206,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class sgtree_impl
+   :  private detail::clear_on_destructor_base<sgtree_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    public:
    typedef typename Config::value_traits                             value_traits;
    /// @cond
@@ -240,7 +244,7 @@ class sgtree_impl
 
    static const bool floating_point    = Config::floating_point;
    static const bool constant_time_size    = true;
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<sgtree_impl>::value;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
 
    /// @cond
    private:
@@ -354,8 +358,10 @@ class sgtree_impl
    //!   
    //! <b>Complexity</b>: Constant. 
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws. 
-   sgtree_impl( value_compare cmp = value_compare()
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructorof the value_compare object throws. Basic guarantee.
+   sgtree_impl( const value_compare &cmp     = value_compare()
               , const value_traits &v_traits = value_traits()) 
       :  data_(cmp, v_traits)
    {  
@@ -372,10 +378,12 @@ class sgtree_impl
    //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
    //!   comp and otherwise N * log N, where N is the distance between first and last.
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws.
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare object throws. Basic guarantee.
    template<class Iterator>
    sgtree_impl( bool unique, Iterator b, Iterator e
-              , value_compare cmp = value_compare()
+              , const value_compare &cmp     = value_compare()
               , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
@@ -395,7 +403,7 @@ class sgtree_impl
    //! 
    //! <b>Throws</b>: Nothing.
    ~sgtree_impl() 
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Returns an iterator pointing to the beginning of the tree.
    //! 
@@ -551,7 +559,7 @@ class sgtree_impl
    value_compare value_comp() const
    {  return priv_comp();   }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -561,7 +569,8 @@ class sgtree_impl
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //! 
-   //! <b>Complexity</b>: Linear to elements contained in *this.
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
    //! 
    //! <b>Throws</b>: Nothing.
    size_type size() const
@@ -573,7 +582,7 @@ class sgtree_impl
       }
    }
 
-   //! <b>Effects</b>: Swaps the contents of two multisets.
+   //! <b>Effects</b>: Swaps the contents of two sgtrees.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -601,7 +610,7 @@ class sgtree_impl
    //! <b>Complexity</b>: Average complexity for insert element is at
    //!   most logarithmic.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -688,7 +697,7 @@ class sgtree_impl
    std::pair<iterator, bool> insert_unique(reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(value, priv_comp(), commit_data);
       if(!ret.second)
          return ret;
       return std::pair<iterator, bool> (insert_unique_commit(value, commit_data), true);
@@ -711,7 +720,7 @@ class sgtree_impl
    iterator insert_unique(const_iterator hint, reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(hint, value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(hint, value, priv_comp(), commit_data);
       if(!ret.second)
          return ret.first;
       return insert_unique_commit(value, commit_data);
@@ -744,10 +753,36 @@ class sgtree_impl
       }
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data)
@@ -760,10 +795,38 @@ class sgtree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_iterator hint, const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(hint, value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const_iterator hint, const KeyType &key
@@ -777,6 +840,23 @@ class sgtree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the container between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the avl_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
    iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
    {
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
@@ -791,6 +871,88 @@ class sgtree_impl
       return iterator(to_insert, this);
    }
 
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the tree before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" tree ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
+      node_ptr p = node_algorithms::insert_before
+         ( node_ptr(&priv_header()), pos.pointed_node(), to_insert
+         , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
+      data_.max_tree_size_ = (size_type)max_tree_size;
+      return iterator(p, this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
+      node_algorithms::push_back
+         ( node_ptr(&priv_header()), to_insert 
+         , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
+      data_.max_tree_size_ = (size_type)max_tree_size;
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the tree in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key tree ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      std::size_t max_tree_size = (std::size_t)data_.max_tree_size_;
+      node_algorithms::push_front
+         ( node_ptr(&priv_header()), to_insert
+         , (size_type)this->size(), this->get_h_alpha_func(), max_tree_size);
+      data_.max_tree_size_ = (size_type)max_tree_size;
+   }
+
    //! <b>Effects</b>: Erases the element pointed to by pos. 
    //! 
    //! <b>Complexity</b>: Average complexity for erase element is constant time. 
@@ -799,9 +961,9 @@ class sgtree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {
-      iterator ret(i);
+      const_iterator ret(i);
       ++ret;
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
@@ -814,7 +976,7 @@ class sgtree_impl
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
-      return ret;
+      return ret.unconst();
    }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -826,7 +988,7 @@ class sgtree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  size_type n;   return private_erase(b, e, n);   }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -854,7 +1016,11 @@ class sgtree_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp                  
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -874,7 +1040,7 @@ class sgtree_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {
       node_ptr to_erase(i.pointed_node());
       iterator ret(this->erase(i));
@@ -882,6 +1048,12 @@ class sgtree_impl
       return ret;
    }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -895,7 +1067,7 @@ class sgtree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  size_type n;   return private_erase(b, e, n, disposer);   }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -935,7 +1107,11 @@ class sgtree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -977,7 +1153,6 @@ class sgtree_impl
    {
       node_algorithms::clear_and_dispose(node_ptr(&priv_header())
          , detail::node_disposer<Disposer, sgtree_impl>(disposer, this));
-      node_algorithms::init_header(&priv_header());
       this->priv_size_traits().set_size(0);
    }
 
@@ -1437,18 +1612,18 @@ class sgtree_impl
    /// @cond
    private:
    template<class Disposer>
-   iterator private_erase(iterator b, iterator e, size_type &n, Disposer disposer)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer)
    {
       for(n = 0; b != e; ++n)
         this->erase_and_dispose(b++, disposer);
-      return b;
+      return b.unconst();
    }
 
-   iterator private_erase(iterator b, iterator e, size_type &n)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n)
    {
       for(n = 0; b != e; ++n)
         this->erase(b++);
-      return b;
+      return b.unconst();
    }
    /// @endcond
 
similarity index 91%
rename from deal.II/contrib/boost/include/boost/intrusive/sgtree_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/sgtree_algorithms.hpp
index c9af84f5efa9d27d993d1560d3c40441e6216667..bb6ef062ebe18f9a5d94a46922a702f84b607363 100644 (file)
@@ -539,6 +539,76 @@ class sgtree_algorithms
       return ret;
    }
 
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "pos" must be a valid iterator or header (end) node.
+   //!   "pos" must be an iterator pointing to the successor to "new_node"
+   //!   once inserted according to the order of already inserted nodes. This function does not
+   //!   check "pos" and this precondition must be guaranteed by the caller.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
+   //! tree invariants might be broken.
+   template<class H_Alpha>
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node
+      ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
+   {
+      std::size_t depth;
+      tree_algorithms::insert_before(header, pos, new_node, &depth);
+      rebalance_after_insertion(new_node, depth, tree_size+1, h_alpha, max_tree_size);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering no less than the
+   //!   greatest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is less than the greatest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   template<class H_Alpha>
+   static void push_back(node_ptr header, node_ptr new_node
+         ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
+   {
+      std::size_t depth;
+      tree_algorithms::push_back(header, new_node, &depth);
+      rebalance_after_insertion(new_node, depth, tree_size+1, h_alpha, max_tree_size);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering, no greater than the
+   //!   lowest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   template<class H_Alpha>
+   static void push_front(node_ptr header, node_ptr new_node
+         ,std::size_t tree_size, H_Alpha h_alpha, std::size_t &max_tree_size)
+   {
+      std::size_t depth;
+      tree_algorithms::push_front(header, new_node, &depth);
+      rebalance_after_insertion(new_node, depth, tree_size+1, h_alpha, max_tree_size);
+   }
+
    //! <b>Requires</b>: "header" must be the header node of a tree.
    //!   KeyNodePtrCompare is a function object that induces a strict weak
    //!   ordering compatible with the strict weak ordering used to create the
similarity index 88%
rename from deal.II/contrib/boost/include/boost/intrusive/slist.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/slist.hpp
index 0577d7179c5a3182c5207c0f6f095098f550e0c6..8314a755e80f6c3728d4c6959d6165adc91d4de8 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -22,6 +22,7 @@
 #include <boost/intrusive/circular_slist_algorithms.hpp>
 #include <boost/intrusive/linear_slist_algorithms.hpp>
 #include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
 #include <boost/intrusive/link_mode.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/detail/utilities.hpp>
@@ -102,7 +103,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class slist_impl
+   :  private detail::clear_on_destructor_base<slist_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    //Public typedefs
    public:
    typedef typename Config::value_traits                             value_traits;
@@ -137,7 +140,7 @@ class slist_impl
       >::type                                                        node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<slist_impl>::value;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
    static const bool linear = Config::linear;
    static const bool cache_last = Config::cache_last;
 
@@ -295,7 +298,7 @@ class slist_impl
    //! <b>Complexity</b>: Linear to the number of elements in the list, if 
    //!   it's a safe-mode or auto-unlink value. Otherwise constant.
    ~slist_impl()
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Erases all the elements of the container.
    //! 
@@ -536,6 +539,36 @@ class slist_impl
    const_iterator cbefore_begin() const 
    { return this->before_begin(); }
 
+   //! <b>Effects</b>: Returns an iterator to the last element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: This function is present only if cached_last<> option is true.
+   iterator last() 
+   { return iterator (this->get_last_node(), this); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: This function is present only if cached_last<> option is true.
+   const_iterator last() const 
+   { return const_iterator (this->get_last_node(), this); }
+
+   //! <b>Effects</b>: Returns a const_iterator to the first element contained in the list.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Note</b>: This function is present only if cached_last<> option is true.
+   const_iterator clast() const 
+   { return const_iterator(this->get_last_node(), this); }
+
    //! <b>Precondition</b>: end_iterator must be a valid end iterator
    //!   of slist.
    //! 
@@ -595,7 +628,7 @@ class slist_impl
    void swap(slist_impl& other)
    {
       if(cache_last){
-         this->priv_swap_cache_last(other);
+         priv_swap_cache_last(this, &other);
       }
       else{
          this->priv_swap_lists(this->get_root_node(), other.get_root_node(), detail::bool_<linear>());
@@ -978,6 +1011,12 @@ class slist_impl
    iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return this->erase_after_and_dispose(this->previous(i), disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: first and last must be valid iterator to elements in *this.
    //!                  Disposer::operator()(pointer) shouldn't throw.
    //! 
@@ -1049,20 +1088,31 @@ class slist_impl
    //! <b>Effects</b>: Transfers all the elements of list x to this list, after the
    //! the element pointed by prev. No destructors or copy constructors are called.
    //! 
-   //! <b>Returns</b>: The last element inserted of x or prev if x is empty.
-   //!   This iterator can be used as new "prev" iterator for a new splice_after call.
-   //!   that will splice new values after the previously spliced values.
+   //! <b>Returns</b>: Nothing.
    //! 
    //! <b>Throws</b>: Nothing.
    //!
-   //! <b>Complexity</b>: Linear to the elements contained in x.
-   //!   Constant-time if cache_last<> option is true.
+   //! <b>Complexity</b>: In general, linear to the elements contained in x.
+   //!   Constant-time if cache_last<> option is true and also constant-time if 
+   //!   linear<> option is true "this" is empty and "last" is not used.
    //! 
    //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
    //! list. Iterators of this list and all the references are not invalidated.
-   iterator splice_after(const_iterator prev, slist_impl &x)
+   //!
+   //! <b>Additional note</b>: If the optional parameter "last" is provided, it will be
+   //!   assigned to the last spliced element or prev if x is empty.
+   //!   This iterator can be used as new "prev" iterator for a new splice_after call.
+   //!   that will splice new values after the previously spliced values.
+   void splice_after(const_iterator prev, slist_impl &x, const_iterator *last = 0)
    {
-      if (!x.empty()){
+      if(x.empty()){
+         if(last) *last = prev;
+      }
+      else if(linear && this->empty()){
+         this->swap(x);
+         if(last) *last = this->previous(this->cend());
+      }
+      else{
          const_iterator last_x(x.previous(x.end()));  //<- constant time if cache_last is active
          node_ptr prev_n(prev.pointed_node());
          node_ptr last_x_n(last_x.pointed_node());
@@ -1075,10 +1125,7 @@ class slist_impl
          node_algorithms::transfer_after( prev_n, x.before_begin().pointed_node(), last_x_n);
          this->priv_size_traits().set_size(this->priv_size_traits().get_size() + x.priv_size_traits().get_size());
          x.priv_size_traits().set_size(size_type(0));
-         return last_x.unconst();
-      }
-      else{
-         return prev.unconst();
+         if(last) *last = last_x;
       }
    }
 
@@ -1157,10 +1204,7 @@ class slist_impl
    //! <b>Effects</b>: Transfers all the elements of list x to this list, before the
    //! the element pointed by it. No destructors or copy constructors are called.
    //! 
-   //! <b>Returns</b>: The last element inserted of x or the previous element
-   //!   of it if x is empty.
-   //!   This iterator can be used as new "prev" iterator for a new splice call.
-   //!   that will splice new values after the previously spliced values.
+   //! <b>Returns</b>: Nothing.
    //! 
    //! <b>Throws</b>: Nothing.
    //!
@@ -1171,8 +1215,13 @@ class slist_impl
    //! 
    //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
    //! list. Iterators of this list and all the references are not invalidated.
-   iterator splice(const_iterator it, slist_impl &x)
-   {  return this->splice_after(this->previous(it), x);   }
+   //!
+   //! <b>Additional note</b>: If the optional parameter "last" is provided, it will be
+   //!   assigned to the last spliced element or prev if x is empty.
+   //!   This iterator can be used as new "prev" iterator for a new splice_after call.
+   //!   that will splice new values after the previously spliced values.
+   void splice(const_iterator it, slist_impl &x, iterator *last = 0)
+   {  this->splice_after(this->previous(it), x, last);   }
 
    //! <b>Requires</b>: it p must be a valid iterator of *this.
    //!   elem must point to an element contained in list
@@ -1245,7 +1294,7 @@ class slist_impl
    void sort(Predicate p)
    {
       if (node_traits::get_next(node_traits::get_next(this->get_root_node()))
-               != this->get_root_node()) {
+         != this->get_root_node()) {
          slist_impl carry;
          slist_impl counter[64];
          int fill = 0;
@@ -1255,33 +1304,29 @@ class slist_impl
             carry.splice_after(carry.cbefore_begin(), *this, this->cbefore_begin());
             int i = 0;
             while(i < fill && !counter[i].empty()) {
-               last_inserted = carry.merge(counter[i++], p);
+               carry.swap(counter[i]);
+               carry.merge(counter[i++], p, &last_inserted);
             }
             BOOST_INTRUSIVE_INVARIANT_ASSERT(counter[i].empty());
+            const_iterator last_element(carry.previous(last_inserted, carry.end()));
 
-            node_ptr p = node_algorithms::get_previous_node
-               (last_inserted.pointed_node(), carry.cend().pointed_node());
-            const_iterator last_element(p, this);
             if(constant_time_size){
                counter[i].splice_after( counter[i].cbefore_begin(), carry
-                                      , carry.cbefore_begin(), last_element
-                                      , carry.size());
+                                    , carry.cbefore_begin(), last_element
+                                    , carry.size());
             }
             else{
                counter[i].splice_after( counter[i].cbefore_begin(), carry
-                                      , carry.cbefore_begin(), last_element);
+                                    , carry.cbefore_begin(), last_element);
             }
             if(i == fill)
                ++fill;
          }
 
          for (int i = 1; i < fill; ++i)
-            last_inserted = counter[i].merge(counter[i-1], p);
-         BOOST_INTRUSIVE_INVARIANT_ASSERT(this->empty());
-
-         node_ptr p = node_algorithms::get_previous_node
-            (last_inserted.pointed_node(), counter[--fill].end().pointed_node());
-         const_iterator last_element(p, this);
+            counter[i].merge(counter[i-1], p, &last_inserted);
+         --fill;
+         const_iterator last_element(counter[fill].previous(last_inserted, counter[fill].end()));
          if(constant_time_size){
             this->splice_after( cbefore_begin(), counter[fill], counter[fill].cbefore_begin()
                               , last_element, counter[fill].size());
@@ -1320,7 +1365,7 @@ class slist_impl
    //!   in order into *this. The merge is stable; that is, if an element from *this is 
    //!   equivalent to one from x, then the element from *this will precede the one from x. 
    //! 
-   //! <b>Returns</b>: An iterator to the last transferred value, end() is x is empty.
+   //! <b>Returns</b>: Nothing.
    //! 
    //! <b>Throws</b>: If the predicate throws. Basic guarantee.
    //! 
@@ -1328,29 +1373,34 @@ class slist_impl
    //!   size() + x.size() - 1 comparisons.
    //! 
    //! <b>Note</b>: Iterators and references are not invalidated.
+   //! 
+   //! <b>Additional note</b>: If optional "last" argument is passed, it is assigned
+   //! to an iterator to the last transferred value or end() is x is empty.
    template<class Predicate>
-   iterator merge(slist_impl& x, Predicate p
+   void merge(slist_impl& x, Predicate p, const_iterator *last = 0
    {
-      const_iterator a(cbefore_begin()), e(cend()), ax(x.cbefore_begin()), ex(x.cend());
-      const_iterator last_inserted(e);
-      const_iterator a_next;
-      while(++(a_next = a) != e && !x.empty()) {
-         const_iterator ix(ax);
-         const_iterator cx;
-         size_type n(0);
-         while(++(cx = ix) != ex && p(*cx, *a_next)){
-            ++ix; ++n;
+      const_iterator e(this->cend()), ex(x.cend()), bb(this->cbefore_begin()),
+                     bb_next;
+      if(last) *last = e.unconst();
+      while(!x.empty()){
+         const_iterator ibx_next(x.cbefore_begin()), ibx(ibx_next++);
+         while (++(bb_next = bb) != e && !p(*ibx_next, *bb_next)){
+            bb = bb_next;
          }
-         if(ax != ix){
-            this->splice_after(a, x, ax, ix, n);
-            last_inserted = ix;
+         if(bb_next == e){
+            //Now transfer the rest to the end of the container
+            this->splice_after(bb, x, last);
+            break;
+         }
+         else{
+            size_type n(0);
+            do{
+               ibx = ibx_next; ++n;
+            } while(++(ibx_next = ibx) != ex && p(*ibx_next, *bb_next));
+            this->splice_after(bb, x, x.before_begin(), ibx, n);
+            if(last) *last = ibx;
          }
-         a = a_next;
-      }  
-      if (!x.empty()){
-         last_inserted = this->splice_after(a, x);
       }
-      return last_inserted.unconst();
    }
 
    //! <b>Effects</b>: This function removes all of x's elements and inserts them
@@ -1606,14 +1656,7 @@ class slist_impl
    //! <b>Complexity</b>: Linear to the number of elements before i.
    //!   Constant if cache_last<> is true and i == end().
    iterator previous(iterator i)
-   {
-      if(cache_last && (i.pointed_node() == this->get_end_node())){
-         return iterator(this->get_last_node(), this);
-      }
-      return iterator
-         (node_algorithms::get_previous_node
-            (this->before_begin().pointed_node(), i.pointed_node()), this);
-   }
+   {  return this->previous(this->cbefore_begin(), i); }
 
    //! <b>Returns</b>: The const_iterator to the element before i in the list. 
    //!   Returns the end-const_iterator, if either i is the begin-const_iterator or 
@@ -1624,13 +1667,86 @@ class slist_impl
    //! <b>Complexity</b>: Linear to the number of elements before i. 
    //!   Constant if cache_last<> is true and i == end().
    const_iterator previous(const_iterator i) const
+   {  return this->previous(this->cbefore_begin(), i); }
+
+   //! <b>Returns</b>: The iterator to the element before i in the list,
+   //!   starting the search on element after prev_from.
+   //!   Returns the end-iterator, if either i is the begin-iterator or the 
+   //!   list is empty. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements before i.
+   //!   Constant if cache_last<> is true and i == end().
+   iterator previous(const_iterator prev_from, iterator i)
+   {  return this->previous(prev_from, const_iterator(i)).unconst(); }
+
+   //! <b>Returns</b>: The const_iterator to the element before i in the list,
+   //!   starting the search on element after prev_from.
+   //!   Returns the end-const_iterator, if either i is the begin-const_iterator or 
+   //!   the list is empty. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements before i. 
+   //!   Constant if cache_last<> is true and i == end().
+   const_iterator previous(const_iterator prev_from, const_iterator i) const
    {
       if(cache_last && (i.pointed_node() == this->get_end_node())){
          return const_iterator(uncast(this->get_last_node()), this);
       }
       return const_iterator
          (node_algorithms::get_previous_node
-            (this->before_begin().pointed_node(), i.pointed_node()), this);
+            (prev_from.pointed_node(), i.pointed_node()), this);
+   }
+
+   //! <b>Requires</b>: prev_pos must be a dereferenceable iterator in *this or be
+   //!   before_begin(), and before_first and before_last belong to x and
+   //!   ++before_first != x.end() && before_last != x.end(). 
+   //! 
+   //! <b>Effects</b>: Transfers the range (before_first, before_last] to this
+   //!   list, after the element pointed by prev_pos.
+   //!   No destructors or copy constructors are called.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements transferred
+   //!   if constant_time_size is true. Constant-time otherwise.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void incorporate_after(const_iterator prev_from, node_ptr first, node_ptr before_last)
+   {
+      if(constant_time_size)
+         this->incorporate_after(prev_from, first, before_last, std::distance(first, before_last)+1);
+      else
+         this->priv_incorporate_after
+            (prev_from.pointed_node(), first, before_last);
+   }
+
+   //! <b>Requires</b>: prev_pos must be a dereferenceable iterator in *this or be
+   //!   before_begin(), and before_first and before_last belong to x and
+   //!   ++before_first != x.end() && before_last != x.end() and
+   //!   n == std::distance(first, before_last) + 1.
+   //! 
+   //! <b>Effects</b>: Transfers the range (before_first, before_last] from list x to this
+   //!   list, after the element pointed by p. No destructors or copy constructors are called.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Note</b>: Iterators of values obtained from list x now point to elements of this
+   //!   list. Iterators of this list and all the references are not invalidated.
+   void incorporate_after(const_iterator prev_pos, node_ptr first, node_ptr before_last, difference_type n)
+   {
+      if(n){
+         BOOST_INTRUSIVE_INVARIANT_ASSERT(std::distance(iterator(first, this), iterator(before_last, this))+1 == n);
+         this->priv_incorporate_after(prev_pos.pointed_node(), first, before_last);
+         if(constant_time_size){
+            this->priv_size_traits().set_size(this->priv_size_traits().get_size() + n);
+         }
+      }
    }
 
    private:
@@ -1650,6 +1766,16 @@ class slist_impl
       }
    }
 
+   void priv_incorporate_after(node_ptr prev_pos_n, node_ptr first_n, node_ptr before_last_n)
+   {
+      if(cache_last){
+         if(node_traits::get_next(prev_pos_n) == this->get_end_node()){
+            this->set_last_node(before_last_n);
+         }
+      }
+      node_algorithms::incorporate_after(prev_pos_n, first_n, before_last_n);
+   }
+
    void priv_reverse(detail::bool_<false>)
    {  node_algorithms::reverse(this->get_root_node());   }
 
@@ -1702,22 +1828,40 @@ class slist_impl
       }
    }
 
-   void priv_swap_cache_last(slist_impl &other)
+   static void priv_swap_cache_last(slist_impl *this_impl, slist_impl *other_impl)
    {
-      node_ptr other_last(other.get_last_node());
-      node_ptr this_last(this->get_last_node());
-      node_ptr other_bfirst(other.get_root_node());
-      node_ptr this_bfirst(this->get_root_node());
-      node_algorithms::transfer_after(this_bfirst, other_bfirst, other_last);
-      node_algorithms::transfer_after(other_bfirst, other_last != other_bfirst? other_last : this_bfirst, this_last);
-      node_ptr tmp(this->get_last_node());
-      this->set_last_node(other.get_last_node());
-      other.set_last_node(tmp);
-      if(this->get_last_node() == other_bfirst){
-         this->set_last_node(this_bfirst);
+      bool other_was_empty = false;
+      if(this_impl->empty()){
+         //Check if both are empty or 
+         if(other_impl->empty())
+            return;
+         //If this is empty swap pointers
+         slist_impl *tmp = this_impl;
+         this_impl  = other_impl;
+         other_impl = tmp;
+         other_was_empty = true;
       }
-      if(other.get_last_node() == this_bfirst){
-         other.set_last_node(other_bfirst);
+      else{
+         other_was_empty = other_impl->empty();
+      }
+
+      //Precondition: this is not empty
+      node_ptr other_old_last(other_impl->get_last_node());
+      node_ptr other_bfirst(other_impl->get_root_node());
+      node_ptr this_bfirst(this_impl->get_root_node());
+      node_ptr this_old_last(this_impl->get_last_node());
+
+      //Move all nodes from this to other's beginning
+      node_algorithms::transfer_after(other_bfirst, this_bfirst, this_old_last);
+      other_impl->set_last_node(this_old_last);
+
+      if(other_was_empty){
+         this_impl->set_last_node(this_bfirst);
+      }
+      else{
+         //Move trailing nodes from other to this
+         node_algorithms::transfer_after(this_bfirst, this_old_last, other_old_last);
+         this_impl->set_last_node(other_old_last);
       }
    }
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/slist_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/slist_hook.hpp
index 8164d6283eb849de9297790c249e141e5c78d929..1debe66c86df289ed84ea65dc85ffa02e7b7efbc 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -96,6 +96,7 @@ class slist_base_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -218,6 +219,7 @@ class slist_member_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/splay_set.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/splay_set.hpp
index f86ae8b93f11fc0c648c2b5172c5d9de1e278709..9727d14787511c4ee20540fe3cbc178b9ec81470 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -15,6 +15,7 @@
 #include <boost/intrusive/detail/config_begin.hpp>
 #include <boost/intrusive/intrusive_fwd.hpp>
 #include <boost/intrusive/splaytree.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <iterator>
 
 namespace boost {
@@ -296,7 +297,7 @@ class splay_set_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -497,7 +498,7 @@ class splay_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -511,7 +512,7 @@ class splay_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -539,7 +540,11 @@ class splay_set_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -556,9 +561,15 @@ class splay_set_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -574,7 +585,7 @@ class splay_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -609,7 +620,11 @@ class splay_set_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
@@ -1494,7 +1509,7 @@ class splay_multiset_impl
    value_compare value_comp() const
    { return tree_.value_comp(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -1602,7 +1617,7 @@ class splay_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {  return tree_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -1616,7 +1631,7 @@ class splay_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  return tree_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -1644,7 +1659,11 @@ class splay_multiset_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase(key, comp);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1661,9 +1680,15 @@ class splay_multiset_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {  return tree_.erase_and_dispose(i, disposer);  }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Returns</b>: An iterator to the element after the erased elements.
@@ -1679,7 +1704,7 @@ class splay_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  return tree_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1714,7 +1739,11 @@ class splay_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {  return tree_.erase_and_dispose(key, comp, disposer);  }
 
    //! <b>Effects</b>: Erases all the elements of the container.
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/splay_set_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/splay_set_hook.hpp
index 17f18bc252fa209950eb4aa6a4e2b9190ba7abf5..d42f4c8beeaa672fcbcf0c207679cbb7829d7258 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -93,6 +93,7 @@ class splay_set_base_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -216,6 +217,7 @@ class splay_set_member_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
similarity index 87%
rename from deal.II/contrib/boost/include/boost/intrusive/splaytree.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/splaytree.hpp
index 94a098557dfe6c8cf78c02350c72fe810daf3908..4020c8574e5637b6b3ca8a4dcbd0ec7324cf395b 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2007
+// (C) Copyright Ion Gaztanaga  2007-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -25,6 +25,8 @@
 #include <boost/intrusive/splay_set_hook.hpp>
 #include <boost/intrusive/detail/tree_node.hpp>
 #include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
 #include <boost/intrusive/options.hpp>
 #include <boost/intrusive/splaytree_algorithms.hpp>
 #include <boost/intrusive/link_mode.hpp>
@@ -76,7 +78,9 @@ template<class T, class ...Options>
 template<class Config>
 #endif
 class splaytree_impl
+   :  private detail::clear_on_destructor_base<splaytree_impl<Config> >
 {
+   template<class C> friend class detail::clear_on_destructor_base;
    public:
    typedef typename Config::value_traits                             value_traits;
    /// @cond
@@ -111,7 +115,7 @@ class splaytree_impl
    typedef splaytree_algorithms<node_traits>                         node_algorithms;
 
    static const bool constant_time_size = Config::constant_time_size;
-   static const bool stateful_value_traits = detail::store_cont_ptr_on_it<splaytree_impl>::value;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
 
    /// @cond
    private:
@@ -199,9 +203,11 @@ class splaytree_impl
    //!   
    //! <b>Complexity</b>: Constant.
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws. 
-   splaytree_impl( value_compare cmp = value_compare()
-              , const value_traits &v_traits = value_traits()) 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructorof the value_compare object throws. Basic guarantee.
+   splaytree_impl( const value_compare &cmp     = value_compare()
+                 , const value_traits &v_traits = value_traits()) 
       :  data_(cmp, v_traits)
    {  
       node_algorithms::init_header(&priv_header());  
@@ -217,11 +223,13 @@ class splaytree_impl
    //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
    //!   comp and otherwise amortized N * log N, where N is the distance between first and last.
    //! 
-   //! <b>Throws</b>: Nothing unless the copy constructor of the value_compare object throws.
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare object throws. Basic guarantee.
    template<class Iterator>
-   splaytree_impl( bool unique, Iterator b, Iterator e
-              , value_compare cmp = value_compare()
-              , const value_traits &v_traits = value_traits())
+   splaytree_impl ( bool unique, Iterator b, Iterator e
+                  , const value_compare &cmp     = value_compare()
+                  , const value_traits &v_traits = value_traits())
       : data_(cmp, v_traits)
    {
       node_algorithms::init_header(&priv_header());
@@ -241,7 +249,7 @@ class splaytree_impl
    //! 
    //! <b>Throws</b>: Nothing.
    ~splaytree_impl() 
-   {  this->clear(); }
+   {}
 
    //! <b>Effects</b>: Returns an iterator pointing to the beginning of the tree.
    //! 
@@ -397,7 +405,7 @@ class splaytree_impl
    value_compare value_comp() const
    {  return priv_comp();   }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -407,7 +415,8 @@ class splaytree_impl
 
    //! <b>Effects</b>: Returns the number of elements stored in the tree.
    //! 
-   //! <b>Complexity</b>: Linear to elements contained in *this.
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
    //! 
    //! <b>Throws</b>: Nothing.
    size_type size() const
@@ -420,7 +429,7 @@ class splaytree_impl
       }
    }
 
-   //! <b>Effects</b>: Swaps the contents of two multisets.
+   //! <b>Effects</b>: Swaps the contents of two splaytrees.
    //! 
    //! <b>Complexity</b>: Constant.
    //! 
@@ -446,7 +455,7 @@ class splaytree_impl
    //! <b>Complexity</b>: Average complexity for insert element is amortized
    //!   logarithmic.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -472,7 +481,7 @@ class splaytree_impl
    //! <b>Complexity</b>: Amortized logarithmic in general, but it is amortized
    //!   constant time if t is inserted immediately before hint.
    //! 
-   //! <b>Throws</b>: Nothing.
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Strong guarantee.
    //! 
    //! <b>Note</b>: Does not affect the validity of iterators and references.
    //!   No copy-constructors are called.
@@ -526,7 +535,7 @@ class splaytree_impl
    std::pair<iterator, bool> insert_unique(reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(value, priv_comp(), commit_data);
       if(!ret.second)
          return ret;
       return std::pair<iterator, bool> (insert_unique_commit(value, commit_data), true);
@@ -549,7 +558,7 @@ class splaytree_impl
    iterator insert_unique(const_iterator hint, reference value)
    {
       insert_commit_data commit_data;
-      std::pair<iterator, bool> ret = insert_unique_check(hint, value, commit_data);
+      std::pair<iterator, bool> ret = insert_unique_check(hint, value, priv_comp(), commit_data);
       if(!ret.second)
          return ret.first;
       return insert_unique_commit(value, commit_data);
@@ -575,10 +584,36 @@ class splaytree_impl
          this->insert_unique(*b);
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data)
@@ -591,10 +626,38 @@ class splaytree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
-   std::pair<iterator, bool> insert_unique_check
-      (const_iterator hint, const_reference value, insert_commit_data &commit_data)
-   {  return insert_unique_check(hint, value, priv_comp(), commit_data); }
-
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare. The difference is that
+   //!   key_value_comp compares an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If the key_value_comp ordering function throws. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
    template<class KeyType, class KeyValueCompare>
    std::pair<iterator, bool> insert_unique_check
       (const_iterator hint, const KeyType &key
@@ -608,6 +671,23 @@ class splaytree_impl
       return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
    }
 
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the container between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the avl_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
    iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
    {
       node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
@@ -627,9 +707,9 @@ class splaytree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator i)
+   iterator erase(const_iterator i)
    {
-      iterator ret(i);
+      const_iterator ret(i);
       ++ret;
       node_ptr to_erase(i.pointed_node());
       if(safemode_or_autounlink)
@@ -638,7 +718,7 @@ class splaytree_impl
       this->priv_size_traits().decrement();
       if(safemode_or_autounlink)
          node_algorithms::init(to_erase);
-      return ret;
+      return ret.unconst();
    }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
@@ -650,7 +730,7 @@ class splaytree_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   iterator erase(iterator b, iterator e)
+   iterator erase(const_iterator b, const_iterator e)
    {  size_type n;   return private_erase(b, e, n);   }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
@@ -678,7 +758,11 @@ class splaytree_impl
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
    template<class KeyType, class KeyValueCompare>
-   size_type erase(const KeyType& key, KeyValueCompare comp)
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -698,7 +782,7 @@ class splaytree_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
    {
       node_ptr to_erase(i.pointed_node());
       iterator ret(this->erase(i));
@@ -706,6 +790,12 @@ class splaytree_impl
       return ret;
    }
 
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
    //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -719,7 +809,7 @@ class splaytree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(iterator b, iterator e, Disposer disposer)
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
    {  size_type n;   return private_erase(b, e, n, disposer);   }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -759,7 +849,11 @@ class splaytree_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class KeyType, class KeyValueCompare, class Disposer>
-   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer)
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
    {
       std::pair<iterator,iterator> p = this->equal_range(key, comp);
       size_type n;
@@ -801,7 +895,6 @@ class splaytree_impl
    {
       node_algorithms::clear_and_dispose(node_ptr(&priv_header())
          , detail::node_disposer<Disposer, splaytree_impl>(disposer, this));
-      node_algorithms::init_header(&priv_header());
       this->priv_size_traits().set_size(0);
    }
 
@@ -1293,18 +1386,18 @@ class splaytree_impl
    /// @cond
    private:
    template<class Disposer>
-   iterator private_erase(iterator b, iterator e, size_type &n, Disposer disposer)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer)
    {
       for(n = 0; b != e; ++n)
         this->erase_and_dispose(b++, disposer);
-      return b;
+      return b.unconst();
    }
 
-   iterator private_erase(iterator b, iterator e, size_type &n)
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n)
    {
       for(n = 0; b != e; ++n)
         this->erase(b++);
-      return b;
+      return b.unconst();
    }
    /// @endcond
 
@@ -1529,14 +1622,14 @@ class splaytree
    BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
 
    splaytree( const value_compare &cmp = value_compare()
-         , const value_traits &v_traits = value_traits())
+            , const value_traits &v_traits = value_traits())
       :  Base(cmp, v_traits)
    {}
 
    template<class Iterator>
    splaytree( bool unique, Iterator b, Iterator e
-         , const value_compare &cmp = value_compare()
-         , const value_traits &v_traits = value_traits())
+            , const value_compare &cmp = value_compare()
+            , const value_traits &v_traits = value_traits())
       :  Base(unique, b, e, cmp, v_traits)
    {}
 
similarity index 90%
rename from deal.II/contrib/boost/include/boost/intrusive/splaytree_algorithms.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/splaytree_algorithms.hpp
index e727ab6d13054a1825f3464b91a784356c086053..eb25e9f61f7c0027f6ce815a235e1bd53df6e3a0 100644 (file)
@@ -543,6 +543,79 @@ class splaytree_algorithms
       return tree_algorithms::insert_equal(header, hint, new_node, comp);
    }
 
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "pos" must be a valid iterator or header (end) node.
+   //!   "pos" must be an iterator pointing to the successor to "new_node"
+   //!   once inserted according to the order of already inserted nodes. This function does not
+   //!   check "pos" and this precondition must be guaranteed by the caller.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
+   //! tree invariants might be broken.
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node)
+   {
+      tree_algorithms::insert_before(header, pos, new_node);
+      splay_up(new_node, header);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering no less than the
+   //!   greatest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is less than the greatest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_back(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_back(header, new_node);
+      splay_up(new_node, header);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering, no greater than the
+   //!   lowest inserted key.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   static void push_front(node_ptr header, node_ptr new_node)
+   {
+      tree_algorithms::push_front(header, new_node);
+      splay_up(new_node, header);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   NodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares two node_ptrs.
+   //!
+   //! <b>Effects</b>: Inserts new_node into the tree before the upper bound
+   //!   according to "comp".
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_upper_bound
       (node_ptr header, node_ptr new_node, NodePtrCompare comp)
@@ -551,6 +624,18 @@ class splaytree_algorithms
       return tree_algorithms::insert_equal_upper_bound(header, new_node, comp);
    }
 
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   NodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares two node_ptrs.
+   //!
+   //! <b>Effects</b>: Inserts new_node into the tree before the lower bound
+   //!   according to "comp".
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
    template<class NodePtrCompare>
    static node_ptr insert_equal_lower_bound
       (node_ptr header, node_ptr new_node, NodePtrCompare comp)
@@ -605,9 +690,8 @@ class splaytree_algorithms
 //      if( data_->parent == t )
 //         data_->parent = find_leftmost();
          //posibility 1
-      if(splay && NodeTraits::get_left(z) != 0 ){
-         node_ptr l = prev_node(z);
-         splay_up(l, header);
+      if(splay && NodeTraits::get_left(z)){
+         splay_up(prev_node(z), header);
       }
       /*
       //possibility 2
@@ -644,8 +728,8 @@ class splaytree_algorithms
       if( n == t ) return;
       
       for( ;; ){
-         node_ptr p = NodeTraits::get_parent(n);
-         node_ptr g = NodeTraits::get_parent(p);
+         node_ptr p(NodeTraits::get_parent(n));
+         node_ptr g(NodeTraits::get_parent(p));
 
          if( p == t )   break;
          
@@ -688,9 +772,8 @@ class splaytree_algorithms
       if(!NodeTraits::get_left(t) && !NodeTraits::get_right(t))
          return t;
       //Backup leftmost/rightmost
-      node_ptr leftmost    = NodeTraits::get_left(header);
-      node_ptr rightmost   = NodeTraits::get_right(header);
-
+      node_ptr leftmost (NodeTraits::get_left(header));
+      node_ptr rightmost(NodeTraits::get_right(header));
       {
          detail::splaydown_rollback<NodeTraits> rollback(&t, header, leftmost, rightmost);
          node_ptr null = header;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap.hpp
new file mode 100644 (file)
index 0000000..b7c9ed2
--- /dev/null
@@ -0,0 +1,1746 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2008
+//
+// Distributed under the Boost Software License, Version 1.0.
+//    (See accompanying file LICENSE_1_0.txt or copy at
+//          http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTRUSIVE_TRIE_HPP
+#define BOOST_INTRUSIVE_TRIE_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <algorithm>
+#include <cstddef>
+#include <functional>
+#include <iterator>
+#include <utility>
+
+#include <boost/intrusive/detail/assert.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/intrusive/intrusive_fwd.hpp>
+#include <boost/intrusive/bs_set_hook.hpp>
+#include <boost/intrusive/detail/tree_node.hpp>
+#include <boost/intrusive/detail/ebo_functor_holder.hpp>
+#include <boost/intrusive/detail/pointer_to_other.hpp>
+#include <boost/intrusive/detail/clear_on_destructor_base.hpp>
+#include <boost/intrusive/options.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <boost/intrusive/treap_algorithms.hpp>
+#include <boost/intrusive/link_mode.hpp>
+#include <boost/intrusive/priority_compare.hpp>
+
+namespace boost {
+namespace intrusive {
+
+/// @cond
+
+template <class ValueTraits, class Compare, class PrioCompare, class SizeType, bool ConstantTimeSize>
+struct treap_setopt
+{
+   typedef ValueTraits  value_traits;
+   typedef Compare      compare;
+   typedef PrioCompare  priority_compare;
+   typedef SizeType     size_type;
+   static const bool constant_time_size = ConstantTimeSize;
+};
+
+template <class T>
+struct treap_set_defaults
+   :  pack_options
+      < none
+      , base_hook<detail::default_bs_set_hook>
+      , constant_time_size<true>
+      , size_type<std::size_t>
+      , compare<std::less<T> >
+      , priority<boost::intrusive::priority_compare<T> >
+      >::type
+{};
+
+/// @endcond
+
+//! The class template treap is an intrusive treap container that
+//! is used to construct intrusive set and multiset containers. The no-throw 
+//! guarantee holds only, if the value_compare object and priority_compare object
+//! don't throw.
+//!
+//! The template parameter \c T is the type to be managed by the container.
+//! The user can specify additional options and if no options are provided
+//! default options are used.
+//!
+//! The container supports the following options:
+//! \c base_hook<>/member_hook<>/value_traits<>,
+//! \c constant_time_size<>, \c size_type<>,
+//! \c compare<> and \c priority_compare<>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+class treap_impl
+   :  private detail::clear_on_destructor_base<treap_impl<Config> >
+{
+   template<class C> friend class detail::clear_on_destructor_base;
+   public:
+   typedef typename Config::value_traits                             value_traits;
+   /// @cond
+   static const bool external_value_traits =
+      detail::external_value_traits_is_true<value_traits>::value;
+   typedef typename detail::eval_if_c
+      < external_value_traits
+      , detail::eval_value_traits<value_traits>
+      , detail::identity<value_traits>
+      >::type                                                        real_value_traits;
+   /// @endcond
+   typedef typename real_value_traits::pointer                       pointer;
+   typedef typename real_value_traits::const_pointer                 const_pointer;
+   typedef typename std::iterator_traits<pointer>::value_type        value_type;
+   typedef value_type                                                key_type;
+   typedef typename std::iterator_traits<pointer>::reference         reference;
+   typedef typename std::iterator_traits<const_pointer>::reference   const_reference;
+   typedef typename std::iterator_traits<pointer>::difference_type   difference_type;
+   typedef typename Config::size_type                                size_type;
+   typedef typename Config::compare                                  value_compare;
+   typedef typename Config::priority_compare                         priority_compare;
+   typedef value_compare                                             key_compare;
+   typedef tree_iterator<treap_impl, false>                           iterator;
+   typedef tree_iterator<treap_impl, true>                            const_iterator;
+   typedef std::reverse_iterator<iterator>                           reverse_iterator;
+   typedef std::reverse_iterator<const_iterator>                     const_reverse_iterator;
+   typedef typename real_value_traits::node_traits                   node_traits;
+   typedef typename node_traits::node                                node;
+   typedef typename boost::pointer_to_other
+      <pointer, node>::type                                          node_ptr;
+   typedef typename boost::pointer_to_other
+      <node_ptr, const node>::type                                   const_node_ptr;
+   typedef treap_algorithms<node_traits>                              node_algorithms;
+
+   static const bool constant_time_size = Config::constant_time_size;
+   static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
+
+   /// @cond
+   private:
+   typedef detail::size_holder<constant_time_size, size_type>        size_traits;
+
+   //noncopyable
+   treap_impl (const treap_impl&);
+   treap_impl operator =(const treap_impl&);
+
+   enum { safemode_or_autounlink  = 
+            (int)real_value_traits::link_mode == (int)auto_unlink   ||
+            (int)real_value_traits::link_mode == (int)safe_link     };
+
+   //Constant-time size is incompatible with auto-unlink hooks!
+   BOOST_STATIC_ASSERT(!(constant_time_size && ((int)real_value_traits::link_mode == (int)auto_unlink)));
+
+   struct header_plus_size : public size_traits
+   {  node header_;  };
+
+   struct node_plus_pred_t : public detail::ebo_functor_holder<value_compare>
+   {
+      node_plus_pred_t(const value_compare &comp, const priority_compare &p_comp)
+         :  detail::ebo_functor_holder<value_compare>(comp)
+         ,  header_plus_priority_size_(p_comp)
+      {}
+      struct header_plus_priority_size
+         : public detail::ebo_functor_holder<priority_compare>
+      {
+         header_plus_priority_size(const priority_compare &p_comp)
+            :  detail::ebo_functor_holder<priority_compare>(p_comp)
+         {}
+         header_plus_size header_plus_size_;
+      }  header_plus_priority_size_;
+   };
+
+   struct data_t : public treap_impl::value_traits
+   {
+      typedef typename treap_impl::value_traits value_traits;
+      data_t(const value_compare & comp, const priority_compare &pcomp, const value_traits &val_traits)
+         :  value_traits(val_traits), node_plus_pred_(comp, pcomp)
+      {}
+      node_plus_pred_t node_plus_pred_;
+   } data_;
+  
+   const value_compare &priv_comp() const
+   {  return data_.node_plus_pred_.get();  }
+
+   value_compare &priv_comp()
+   {  return data_.node_plus_pred_.get();  }
+
+   const priority_compare &priv_pcomp() const
+   {  return data_.node_plus_pred_.header_plus_priority_size_.get();  }
+
+   priority_compare &priv_pcomp()
+   {  return data_.node_plus_pred_.header_plus_priority_size_.get();  }
+
+   const node &priv_header() const
+   {  return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_;  }
+
+   node &priv_header()
+   {  return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_;  }
+
+   static node_ptr uncast(const_node_ptr ptr)
+   {
+      return node_ptr(const_cast<node*>(detail::get_pointer(ptr)));
+   }
+
+   size_traits &priv_size_traits()
+   {  return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_;  }
+
+   const size_traits &priv_size_traits() const
+   {  return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_;  }
+
+   const real_value_traits &get_real_value_traits(detail::bool_<false>) const
+   {  return data_;  }
+
+   const real_value_traits &get_real_value_traits(detail::bool_<true>) const
+   {  return data_.get_value_traits(*this);  }
+
+   real_value_traits &get_real_value_traits(detail::bool_<false>)
+   {  return data_;  }
+
+   real_value_traits &get_real_value_traits(detail::bool_<true>)
+   {  return data_.get_value_traits(*this);  }
+
+   /// @endcond
+
+   public:
+
+   const real_value_traits &get_real_value_traits() const
+   {  return this->get_real_value_traits(detail::bool_<external_value_traits>());  }
+
+   real_value_traits &get_real_value_traits()
+   {  return this->get_real_value_traits(detail::bool_<external_value_traits>());  }
+
+   typedef typename node_algorithms::insert_commit_data insert_commit_data;
+
+   //! <b>Effects</b>: Constructs an empty treap. 
+   //!   
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor of the value_compare/priority_compare objects throw. Basic guarantee.
+   treap_impl( const value_compare &cmp     = value_compare()
+            , const priority_compare &pcmp = priority_compare()
+            , const value_traits &v_traits = value_traits()) 
+      :  data_(cmp, pcmp, v_traits)
+   {  
+      node_algorithms::init_header(&priv_header());  
+      this->priv_size_traits().set_size(size_type(0));
+   }
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue of type value_type.
+   //!   cmp must be a comparison function that induces a strict weak ordering.
+   //!
+   //! <b>Effects</b>: Constructs an empty treap and inserts elements from
+   //!   [b, e).
+   //!
+   //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
+   //!   comp and otherwise N * log N, where N is the distance between first and last.
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare/priority_compare objects 
+   //!   throw. Basic guarantee.
+   template<class Iterator>
+   treap_impl( bool unique, Iterator b, Iterator e
+            , const value_compare &cmp     = value_compare()
+            , const priority_compare &pcmp = priority_compare()
+            , const value_traits &v_traits = value_traits())
+      : data_(cmp, pcmp, v_traits)
+   {
+      node_algorithms::init_header(&priv_header());
+      this->priv_size_traits().set_size(size_type(0));
+      if(unique)
+         this->insert_unique(b, e);
+      else
+         this->insert_equal(b, e);
+   }
+
+   //! <b>Effects</b>: Detaches all elements from this. The objects in the set 
+   //!   are not deleted (i.e. no destructors are called), but the nodes according to 
+   //!   the value_traits template parameter are reinitialized and thus can be reused. 
+   //! 
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   ~treap_impl() 
+   {}
+
+   //! <b>Effects</b>: Returns an iterator pointing to the beginning of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator begin()
+   {  return iterator (node_traits::get_left(node_ptr(&priv_header())), this);   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator begin() const
+   {  return this->cbegin();   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cbegin() const
+   {  return const_iterator (node_traits::get_left(const_node_ptr(&priv_header())), this);   }
+
+   //! <b>Effects</b>: Returns an iterator pointing to the end of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator end()
+   {  return iterator (node_ptr(&priv_header()), this);  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap.
+   //!
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator end() const
+   {  return this->cend();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cend() const
+   {  return const_iterator (uncast(const_node_ptr(&priv_header())), this);  }
+
+
+   //! <b>Effects</b>: Returns an iterator pointing to the highest priority object of the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator top()
+   {  return this->empty() ? this->end() : iterator (node_traits::get_parent(node_ptr(&priv_header())), this);   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the treap..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator top() const
+   {  return this->ctop();   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the treap..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator ctop() const
+   {  return this->empty() ? this->cend() : const_iterator (node_traits::get_parent(const_node_ptr(&priv_header())), this);   }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
+   //!    reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rbegin()
+   {  return reverse_iterator(this->end());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rbegin() const
+   {  return const_reverse_iterator(this->end());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crbegin() const
+   {  return const_reverse_iterator(this->end());  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rend()
+   {  return reverse_iterator(this->begin());   }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rend() const
+   {  return const_reverse_iterator(this->begin());   }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crend() const
+   {  return const_reverse_iterator(this->begin());   }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the highest priority object of the
+   //!    reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rtop()
+   {  return reverse_iterator(this->top());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority objec
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rtop() const
+   {  return const_reverse_iterator(this->top());  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority object
+   //!    of the reversed treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crtop() const
+   {  return const_reverse_iterator(this->top());  }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end iterator
+   //!   of treap.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static treap_impl &container_from_end_iterator(iterator end_iterator)
+   {  return priv_container_from_end_iterator(end_iterator);   }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end const_iterator
+   //!   of treap.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static const treap_impl &container_from_end_iterator(const_iterator end_iterator)
+   {  return priv_container_from_end_iterator(end_iterator);   }
+
+   //! <b>Precondition</b>: it must be a valid iterator
+   //!   of treap.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   static treap_impl &container_from_iterator(iterator it)
+   {  return priv_container_from_iterator(it);   }
+
+   //! <b>Precondition</b>: it must be a valid end const_iterator
+   //!   of treap.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   static const treap_impl &container_from_iterator(const_iterator it)
+   {  return priv_container_from_iterator(it);   }
+
+   //! <b>Effects</b>: Returns the value_compare object used by the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If value_compare copy-constructor throws.
+   value_compare value_comp() const
+   {  return this->priv_comp();   }
+
+   //! <b>Effects</b>: Returns the priority_compare object used by the treap.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If priority_compare copy-constructor throws.
+   priority_compare priority_comp() const
+   {  return this->priv_pcomp();   }
+
+   //! <b>Effects</b>: Returns true if the container is empty.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   bool empty() const
+   {  return node_algorithms::unique(const_node_ptr(&priv_header()));   }
+
+   //! <b>Effects</b>: Returns the number of elements stored in the treap.
+   //! 
+   //! <b>Complexity</b>: Linear to elements contained in *this
+   //!   if constant-time size option is disabled. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   size_type size() const
+   {
+      if(constant_time_size)
+         return this->priv_size_traits().get_size();
+      else{
+         return (size_type)node_algorithms::size(const_node_ptr(&priv_header()));
+      }
+   }
+
+   //! <b>Effects</b>: Swaps the contents of two treaps.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If the comparison functor's swap call throws.
+   void swap(treap_impl& other)
+   {
+      //This can throw
+      using std::swap;
+      swap(priv_comp(), priv_comp());
+      swap(priv_pcomp(), priv_pcomp());
+      //These can't throw
+      node_algorithms::swap_tree(node_ptr(&priv_header()), node_ptr(&other.priv_header()));
+      if(constant_time_size){
+         size_type backup = this->priv_size_traits().get_size();
+         this->priv_size_traits().set_size(other.priv_size_traits().get_size());
+         other.priv_size_traits().set_size(backup);
+      }
+   }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Inserts value into the treap before the upper bound.
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert_equal(reference value)
+   {
+      detail::key_nodeptr_comp<value_compare, treap_impl>
+         key_node_comp(priv_comp(), this);
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         key_node_pcomp(priv_pcomp(), this);
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      return iterator(node_algorithms::insert_equal_upper_bound
+         (node_ptr(&priv_header()), to_insert, key_node_comp, key_node_pcomp), this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and "hint" must be
+   //!   a valid iterator.
+   //! 
+   //! <b>Effects</b>: Inserts x into the treap, using "hint" as a hint to
+   //!   where it will be inserted. If "hint" is the upper_bound
+   //!   the insertion takes constant time (two comparisons in the worst case)
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it is amortized
+   //!   constant time if t is inserted immediately before hint.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert_equal(const_iterator hint, reference value)
+   {
+      detail::key_nodeptr_comp<value_compare, treap_impl>
+         key_node_comp(priv_comp(), this);
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         key_node_pcomp(priv_pcomp(), this);
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      return iterator(node_algorithms::insert_equal
+         (node_ptr(&priv_header()), hint.pointed_node(), to_insert, key_node_comp, key_node_pcomp), this);
+   }
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
+   //!   of type value_type.
+   //! 
+   //! <b>Effects</b>: Inserts a each element of a range into the treap
+   //!   before the upper bound of the key of each element.
+   //! 
+   //! <b>Complexity</b>: Insert range is in general O(N * log(N)), where N is the
+   //!   size of the range. However, it is linear in N if the range is already sorted
+   //!   by value_comp().
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   template<class Iterator>
+   void insert_equal(Iterator b, Iterator e)
+   {
+      iterator end(this->end());
+      for (; b != e; ++b)
+         this->insert_equal(end, *b);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Inserts value into the treap if the value
+   //!   is not already present.
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   std::pair<iterator, bool> insert_unique(reference value)
+   {
+      insert_commit_data commit_data;
+      std::pair<iterator, bool> ret = insert_unique_check(value, priv_comp(), priv_pcomp(), commit_data);
+      if(!ret.second)
+         return ret;
+      return std::pair<iterator, bool> (insert_unique_commit(value, commit_data), true);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and "hint" must be
+   //!   a valid iterator
+   //! 
+   //! <b>Effects</b>: Tries to insert x into the treap, using "hint" as a hint
+   //!   to where it will be inserted.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it is amortized
+   //!   constant time (two comparisons in the worst case)
+   //!   if t is inserted immediately before hint.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert_unique(const_iterator hint, reference value)
+   {
+      insert_commit_data commit_data;
+      std::pair<iterator, bool> ret = insert_unique_check(hint, value, priv_comp(), priv_pcomp(), commit_data);
+      if(!ret.second)
+         return ret.first;
+      return insert_unique_commit(value, commit_data);
+   }
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
+   //!   of type value_type.
+   //! 
+   //! <b>Effects</b>: Tries to insert each element of a range into the treap.
+   //! 
+   //! <b>Complexity</b>: Insert range is in general O(N * log(N)), where N is the 
+   //!   size of the range. However, it is linear in N if the range is already sorted 
+   //!   by value_comp().
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare functions throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   template<class Iterator>
+   void insert_unique(Iterator b, Iterator e)
+   {
+      if(this->empty()){
+         iterator end(this->end());
+         for (; b != e; ++b)
+            this->insert_unique(end, *b);
+      }
+      else{
+         for (; b != e; ++b)
+            this->insert_unique(*b);
+      }
+   }
+
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare.
+   //!   key_value_pcomp must be a comparison function that induces 
+   //!   the same strict weak ordering as priority_compare. The difference is that
+   //!   key_value_pcomp and key_value_comp compare an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If the key_value_comp or key_value_pcomp
+   //!   ordering functions throw. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
+   template<class KeyType, class KeyValueCompare, class KeyValuePrioCompare>
+   std::pair<iterator, bool> insert_unique_check
+      ( const KeyType &key, KeyValueCompare key_value_comp
+      , KeyValuePrioCompare key_value_pcomp, insert_commit_data &commit_data)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         comp(key_value_comp, this);
+      detail::key_nodeptr_comp<KeyValuePrioCompare, treap_impl>
+         pcomp(key_value_pcomp, this);
+      std::pair<node_ptr, bool> ret = 
+         (node_algorithms::insert_unique_check
+            (node_ptr(&priv_header()), key, comp, pcomp, commit_data));
+      return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
+   }
+
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare.
+   //!   key_value_pcomp must be a comparison function that induces 
+   //!   the same strict weak ordering as priority_compare. The difference is that
+   //!   key_value_pcomp and key_value_comp compare an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the container, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If the key_value_comp or key_value_pcomp
+   //!   ordering functions throw. Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the container.
+   template<class KeyType, class KeyValueCompare, class KeyValuePrioCompare>
+   std::pair<iterator, bool> insert_unique_check
+      ( const_iterator hint, const KeyType &key
+      , KeyValueCompare key_value_comp
+      , KeyValuePrioCompare key_value_pcomp
+      , insert_commit_data &commit_data)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         comp(key_value_comp, this);
+      detail::key_nodeptr_comp<KeyValuePrioCompare, treap_impl>
+         pcomp(key_value_pcomp, this);
+      std::pair<node_ptr, bool> ret = 
+         (node_algorithms::insert_unique_check
+            (node_ptr(&priv_header()), hint.pointed_node(), key, comp, pcomp, commit_data));
+      return std::pair<iterator, bool>(iterator(ret.first, this), ret.second);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the container between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the avl_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
+   iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      node_algorithms::insert_unique_commit(node_ptr(&priv_header()), to_insert, commit_data);
+      return iterator(to_insert, this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the treap before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" treap ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         pcomp(priv_pcomp(), this);
+      return iterator(node_algorithms::insert_before
+         (node_ptr(&priv_header()), pos.pointed_node(), to_insert, pcomp), this);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         pcomp(priv_pcomp(), this);
+      node_algorithms::push_back(node_ptr(&priv_header()), to_insert, pcomp);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {
+      node_ptr to_insert(get_real_value_traits().to_node_ptr(value));
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(to_insert));
+      this->priv_size_traits().increment();
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         pcomp(priv_pcomp(), this);
+      node_algorithms::push_front(node_ptr(&priv_header()), to_insert, pcomp);
+   }
+
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase element is constant time. 
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator i)
+   {
+      const_iterator ret(i);
+      ++ret;
+      node_ptr to_erase(i.pointed_node());
+      if(safemode_or_autounlink)
+         BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!node_algorithms::unique(to_erase));
+      detail::key_nodeptr_comp<priority_compare, treap_impl>
+         key_node_pcomp(priv_pcomp(), this);
+      node_algorithms::erase(&priv_header(), to_erase, key_node_pcomp);
+      this->priv_size_traits().decrement();
+      if(safemode_or_autounlink)
+         node_algorithms::init(to_erase);
+      return ret.unconst();
+   }
+
+   //! <b>Effects</b>: Erases the range pointed to by b end e. 
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator b, const_iterator e)
+   {  size_type n;   return private_erase(b, e, n);   }
+
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + N).
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   size_type erase(const_reference value)
+   {  return this->erase(value, priv_comp());   }
+
+   //! <b>Effects</b>: Erases all the elements with the given key.
+   //!   according to the comparison functor "comp".
+   //!
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + N).
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws.
+   //!   Equivalent guarantee to <i>while(beg != end) erase(beg++);</i>
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class KeyType, class KeyValueCompare>
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {
+      std::pair<iterator,iterator> p = this->equal_range(key, comp);
+      size_type n;
+      private_erase(p.first, p.second, n);
+      return n;
+   }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //!   Disposer::operator()(pointer) is called for the removed element.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase element is constant time. 
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators 
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
+   {
+      node_ptr to_erase(i.pointed_node());
+      iterator ret(this->erase(i));
+      disposer(get_real_value_traits().to_value_ptr(to_erase));
+      return ret;
+   }
+
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases the range pointed to by b end e.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Throws</b>: if the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {  size_type n;   return private_erase(b, e, n, disposer);   }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + N).
+   //! 
+   //! <b>Throws</b>: if the priority_compare function throws then weak guarantee and heap invariants are broken.
+   //!   The safest thing would be to clear or destroy the container.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class Disposer>
+   size_type erase_and_dispose(const_reference value, Disposer disposer)
+   {
+      std::pair<iterator,iterator> p = this->equal_range(value);
+      size_type n;
+      private_erase(p.first, p.second, n, disposer);
+      return n;
+   }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given key.
+   //!   according to the comparison functor "comp".
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //!
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + N).
+   //! 
+   //! <b>Throws</b>: if the priority_compare function throws then weak guarantee and heap invariants are broken.
+   //!   The safest thing would be to clear or destroy the container.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class KeyType, class KeyValueCompare, class Disposer>
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {
+      std::pair<iterator,iterator> p = this->equal_range(key, comp);
+      size_type n;
+      private_erase(p.first, p.second, n, disposer);
+      return n;
+   }
+
+   //! <b>Effects</b>: Erases all of the elements. 
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   void clear()
+   {
+      if(safemode_or_autounlink){
+         this->clear_and_dispose(detail::null_disposer());
+      }
+      else{
+         node_algorithms::init_header(&priv_header());
+         this->priv_size_traits().set_size(0);
+      }
+   }
+
+   //! <b>Effects</b>: Erases all of the elements calling disposer(p) for
+   //!   each node to be erased.
+   //! <b>Complexity</b>: Average complexity for is at most O(log(size() + N)),
+   //!   where N is the number of elements in the container.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. Calls N times to disposer functor.
+   template<class Disposer>
+   void clear_and_dispose(Disposer disposer)
+   {
+      node_algorithms::clear_and_dispose(node_ptr(&priv_header())
+         , detail::node_disposer<Disposer, treap_impl>(disposer, this));
+      node_algorithms::init_header(&priv_header());
+      this->priv_size_traits().set_size(0);
+   }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the given value
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given value.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   size_type count(const_reference value) const
+   {  return this->count(value, priv_comp());   }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the given key
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given key.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   size_type count(const KeyType &key, KeyValueCompare comp) const
+   {
+      std::pair<const_iterator, const_iterator> ret = this->equal_range(key, comp);
+      return std::distance(ret.first, ret.second);
+   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator lower_bound(const_reference value)
+   {  return this->lower_bound(value, priv_comp());   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator lower_bound(const_reference value) const
+   {  return this->lower_bound(value, priv_comp());   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   iterator lower_bound(const KeyType &key, KeyValueCompare comp)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return iterator(node_algorithms::lower_bound
+         (const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Returns a const iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator lower_bound(const KeyType &key, KeyValueCompare comp) const
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return const_iterator(node_algorithms::lower_bound
+         (const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator upper_bound(const_reference value)
+   {  return this->upper_bound(value, priv_comp());   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k according to comp or end() if that element
+   //!   does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   iterator upper_bound(const KeyType &key, KeyValueCompare comp)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return iterator(node_algorithms::upper_bound
+         (const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator upper_bound(const_reference value) const
+   {  return this->upper_bound(value, priv_comp());   }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k according to comp or end() if that element
+   //!   does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator upper_bound(const KeyType &key, KeyValueCompare comp) const
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return const_iterator(node_algorithms::upper_bound
+         (const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Finds an iterator to the first element whose key is 
+   //!   k or end() if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator find(const_reference value)
+   {  return this->find(value, priv_comp()); }
+
+   //! <b>Effects</b>: Finds an iterator to the first element whose key is 
+   //!   k or end() if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   iterator find(const KeyType &key, KeyValueCompare comp)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return iterator
+         (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose key is 
+   //!   k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator find(const_reference value) const
+   {  return this->find(value, priv_comp()); }
+
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose key is 
+   //!   k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator find(const KeyType &key, KeyValueCompare comp) const
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      return const_iterator
+         (node_algorithms::find(const_node_ptr(&priv_header()), key, key_node_comp), this);
+   }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   std::pair<iterator,iterator> equal_range(const_reference value)
+   {  return this->equal_range(value, priv_comp());   }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<iterator,iterator> equal_range(const KeyType &key, KeyValueCompare comp)
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      std::pair<node_ptr, node_ptr> ret
+         (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+      return std::pair<iterator, iterator>(iterator(ret.first, this), iterator(ret.second, this));
+   }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   std::pair<const_iterator, const_iterator>
+      equal_range(const_reference value) const
+   {  return this->equal_range(value, priv_comp());   }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<const_iterator, const_iterator>
+      equal_range(const KeyType &key, KeyValueCompare comp) const
+   {
+      detail::key_nodeptr_comp<KeyValueCompare, treap_impl>
+         key_node_comp(comp, this);
+      std::pair<node_ptr, node_ptr> ret
+         (node_algorithms::equal_range(const_node_ptr(&priv_header()), key, key_node_comp));
+      return std::pair<const_iterator, const_iterator>(const_iterator(ret.first, this), const_iterator(ret.second, this));
+   }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!   Cloner should yield to nodes equivalent to the original nodes.
+   //!
+   //! <b>Effects</b>: Erases all the elements from *this
+   //!   calling Disposer::operator()(pointer), clones all the 
+   //!   elements from src calling Cloner::operator()(const_reference )
+   //!   and inserts them on *this. Copies the predicate from the source container.
+   //!
+   //!   If cloner throws, all cloned elements are unlinked and disposed
+   //!   calling Disposer::operator()(pointer).
+   //!   
+   //! <b>Complexity</b>: Linear to erased plus inserted elements.
+   //! 
+   //! <b>Throws</b>: If cloner throws or predicate copy assignment throws. Basic guarantee.
+   template <class Cloner, class Disposer>
+   void clone_from(const treap_impl &src, Cloner cloner, Disposer disposer)
+   {
+      this->clear_and_dispose(disposer);
+      if(!src.empty()){
+         detail::exception_disposer<treap_impl, Disposer>
+            rollback(*this, disposer);
+         node_algorithms::clone
+            (const_node_ptr(&src.priv_header())
+            ,node_ptr(&this->priv_header())
+            ,detail::node_cloner<Cloner, treap_impl>(cloner, this)
+            ,detail::node_disposer<Disposer, treap_impl>(disposer, this));
+         this->priv_size_traits().set_size(src.priv_size_traits().get_size());
+         this->priv_comp() = src.priv_comp();
+         rollback.release();
+      }
+   }
+
+   //! <b>Effects</b>: Unlinks the leftmost node from the treap.
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function breaks the treap and the treap can
+   //!   only be used for more unlink_leftmost_without_rebalance calls.
+   //!   This function is normally used to achieve a step by step
+   //!   controlled destruction of the treap.
+   pointer unlink_leftmost_without_rebalance()
+   {
+      node_ptr to_be_disposed(node_algorithms::unlink_leftmost_without_rebalance
+                           (node_ptr(&priv_header())));
+      if(!to_be_disposed)
+         return 0;
+      this->priv_size_traits().decrement();
+      if(safemode_or_autounlink)//If this is commented does not work with normal_link
+         node_algorithms::init(to_be_disposed);
+      return get_real_value_traits().to_value_ptr(to_be_disposed);
+   }
+
+   //! <b>Requires</b>: replace_this must be a valid iterator of *this
+   //!   and with_this must not be inserted in any treap.
+   //! 
+   //! <b>Effects</b>: Replaces replace_this in its position in the
+   //!   treap with with_this. The treap does not need to be rebalanced.
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   with_this is not equivalent to *replace_this according to the
+   //!   ordering and priority rules. This function is faster than erasing and inserting
+   //!   the node, since no rebalancing or comparison is needed.
+   void replace_node(iterator replace_this, reference with_this)
+   {
+      node_algorithms::replace_node( get_real_value_traits().to_node_ptr(*replace_this)
+                                   , node_ptr(&priv_header())
+                                   , get_real_value_traits().to_node_ptr(with_this));
+   }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the set
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static iterator s_iterator_to(reference value)
+   {
+      BOOST_STATIC_ASSERT((!stateful_value_traits));
+      return iterator (value_traits::to_node_ptr(value), 0);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   set that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static const_iterator s_iterator_to(const_reference value) 
+   {
+      BOOST_STATIC_ASSERT((!stateful_value_traits));
+      return const_iterator (value_traits::to_node_ptr(const_cast<reference> (value)), 0);
+   }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the set
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator iterator_to(reference value)
+   {  return iterator (value_traits::to_node_ptr(value), this); }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   set that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator iterator_to(const_reference value) const
+   {  return const_iterator (value_traits::to_node_ptr(const_cast<reference> (value)), this); }
+
+   //! <b>Requires</b>: value shall not be in a treap.
+   //! 
+   //! <b>Effects</b>: init_node puts the hook of a value in a well-known default
+   //!   state.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Note</b>: This function puts the hook in the well-known default state
+   //!   used by auto_unlink and safe hooks.
+   static void init_node(reference value)
+   { node_algorithms::init(value_traits::to_node_ptr(value)); }
+
+   /// @cond
+   private:
+   template<class Disposer>
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer)
+   {
+      for(n = 0; b != e; ++n)
+        this->erase_and_dispose(b++, disposer);
+      return b.unconst();
+   }
+
+   iterator private_erase(const_iterator b, const_iterator e, size_type &n)
+   {
+      for(n = 0; b != e; ++n)
+        this->erase(b++);
+      return b.unconst();
+   }
+   /// @endcond
+
+   private:
+   static treap_impl &priv_container_from_end_iterator(const const_iterator &end_iterator)
+   {
+      header_plus_size *r = detail::parent_from_member<header_plus_size, node>
+         ( detail::get_pointer(end_iterator.pointed_node()), &header_plus_size::header_);
+      typename node_plus_pred_t::header_plus_priority_size *n =
+         detail::parent_from_member
+         < typename node_plus_pred_t::header_plus_priority_size
+         , header_plus_size>
+         (r, &node_plus_pred_t::header_plus_priority_size::header_plus_size_);
+      node_plus_pred_t *pn = detail::parent_from_member
+         < node_plus_pred_t
+         , typename node_plus_pred_t::header_plus_priority_size>
+         (n, &node_plus_pred_t::header_plus_priority_size_);
+      data_t *d = detail::parent_from_member<data_t, node_plus_pred_t>(pn, &data_t::node_plus_pred_);
+      treap_impl *tr  = detail::parent_from_member<treap_impl, data_t>(d, &treap_impl::data_);
+      return *tr;
+   }
+
+   static treap_impl &priv_container_from_iterator(const const_iterator &it)
+   {  return priv_container_from_end_iterator(it.end_iterator_from_it());   }
+};
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator<
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{  return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+bool operator==
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{
+   typedef treap_impl<Config> tree_type;
+   typedef typename tree_type::const_iterator const_iterator;
+
+   if(tree_type::constant_time_size && x.size() != y.size()){
+      return false;
+   }
+   const_iterator end1 = x.end();
+   const_iterator i1 = x.begin();
+   const_iterator i2 = y.begin();
+   if(tree_type::constant_time_size){
+      while (i1 != end1 && *i1 == *i2) {
+         ++i1;
+         ++i2;
+      }
+      return i1 == end1;
+   }
+   else{
+      const_iterator end2 = y.end();
+      while (i1 != end1 && i2 != end2 && *i1 == *i2) {
+         ++i1;
+         ++i2;
+      }
+      return i1 == end1 && i2 == end2;
+   }
+}
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator!=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{  return !(x == y); }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{  return y < x;  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator<=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{  return !(y < x);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_impl<T, Options...> &x, const treap_impl<T, Options...> &y)
+#else
+(const treap_impl<Config> &x, const treap_impl<Config> &y)
+#endif
+{  return !(x < y);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline void swap
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(treap_impl<T, Options...> &x, treap_impl<T, Options...> &y)
+#else
+(treap_impl<Config> &x, treap_impl<Config> &y)
+#endif
+{  x.swap(y);  }
+
+/// @cond
+#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class O1 = none, class O2 = none
+                , class O3 = none, class O4 = none
+                >
+#else
+template<class T, class ...Options>
+#endif
+struct make_treap_opt
+{
+   typedef typename pack_options
+      < treap_set_defaults<T>, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type packed_options;
+   typedef typename detail::get_value_traits
+      <T, typename packed_options::value_traits>::type value_traits;
+
+   typedef treap_setopt
+         < value_traits
+         , typename packed_options::compare
+         , typename packed_options::priority
+         , typename packed_options::size_type
+         , packed_options::constant_time_size
+         > type;
+};
+/// @endcond
+
+//! Helper metafunction to define a \c treap that yields to the same type when the
+//! same options (either explicitly or implicitly) are used.
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class ...Options>
+#else
+template<class T, class O1 = none, class O2 = none
+                , class O3 = none, class O4 = none>
+#endif
+struct make_trie
+{
+   /// @cond
+   typedef treap_impl
+      < typename make_treap_opt<T, 
+         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+         O1, O2, O3, O4
+         #else
+         Options...
+         #endif
+         >::type
+      > implementation_defined;
+   /// @endcond
+   typedef implementation_defined type;
+};
+
+#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class O1, class O2, class O3, class O4>
+#else
+template<class T, class ...Options>
+#endif
+class treap
+   :  public make_trie<T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type
+{
+   typedef typename make_trie
+      <T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type   Base;
+
+   public:
+   typedef typename Base::value_compare      value_compare;
+   typedef typename Base::priority_compare   priority_compare;
+   typedef typename Base::value_traits       value_traits;
+   typedef typename Base::real_value_traits  real_value_traits;
+   typedef typename Base::iterator           iterator;
+   typedef typename Base::const_iterator     const_iterator;
+
+   //Assert if passed value traits are compatible with the type
+   BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
+
+   treap( const value_compare &cmp = value_compare()
+       , const priority_compare &pcmp = priority_compare()
+       , const value_traits &v_traits = value_traits())
+      :  Base(cmp, pcmp, v_traits)
+   {}
+
+   template<class Iterator>
+   treap( bool unique, Iterator b, Iterator e
+       , const value_compare &cmp = value_compare()
+       , const priority_compare &pcmp = priority_compare()
+       , const value_traits &v_traits = value_traits())
+      :  Base(unique, b, e, cmp, pcmp, v_traits)
+   {}
+
+   static treap &container_from_end_iterator(iterator end_iterator)
+   {  return static_cast<treap &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static const treap &container_from_end_iterator(const_iterator end_iterator)
+   {  return static_cast<const treap &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static treap &container_from_it(iterator it)
+   {  return static_cast<treap &>(Base::container_from_iterator(it));   }
+
+   static const treap &container_from_it(const_iterator it)
+   {  return static_cast<const treap &>(Base::container_from_iterator(it));   }
+};
+
+#endif
+
+
+} //namespace intrusive 
+} //namespace boost 
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_TRIE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_algorithms.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_algorithms.hpp
new file mode 100644 (file)
index 0000000..6c05efa
--- /dev/null
@@ -0,0 +1,894 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga  2006-2009.
+//
+// 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)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP
+#define BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+
+#include <cstddef>
+#include <boost/intrusive/intrusive_fwd.hpp>
+
+#include <boost/intrusive/detail/assert.hpp>
+#include <boost/intrusive/detail/utilities.hpp>
+#include <boost/intrusive/detail/tree_algorithms.hpp>
+#include <algorithm>
+
+
+namespace boost {
+namespace intrusive {
+
+//! treap_algorithms provides basic algorithms to manipulate 
+//! nodes forming a treap.
+//! 
+//! (1) the header node is maintained with links not only to the root
+//! but also to the leftmost node of the tree, to enable constant time
+//! begin(), and to the rightmost node of the tree, to enable linear time
+//! performance when used with the generic set algorithms (set_union,
+//! etc.);
+//! 
+//! (2) when a node being deleted has two children its successor node is
+//! relinked into its place, rather than copied, so that the only
+//! pointers invalidated are those referring to the deleted node.
+//!
+//! treap_algorithms is configured with a NodeTraits class, which encapsulates the
+//! information about the node to be manipulated. NodeTraits must support the
+//! following interface:
+//!
+//! <b>Typedefs</b>:
+//!
+//! <tt>node</tt>: The type of the node that forms the circular list
+//!
+//! <tt>node_ptr</tt>: A pointer to a node
+//!
+//! <tt>const_node_ptr</tt>: A pointer to a const node
+//!
+//! <b>Static functions</b>:
+//!
+//! <tt>static node_ptr get_parent(const_node_ptr n);</tt>
+//! 
+//! <tt>static void set_parent(node_ptr n, node_ptr parent);</tt>
+//!
+//! <tt>static node_ptr get_left(const_node_ptr n);</tt>
+//! 
+//! <tt>static void set_left(node_ptr n, node_ptr left);</tt>
+//!
+//! <tt>static node_ptr get_right(const_node_ptr n);</tt>
+//! 
+//! <tt>static void set_right(node_ptr n, node_ptr right);</tt>
+template<class NodeTraits>
+class treap_algorithms
+{
+   public:
+   typedef NodeTraits                           node_traits;
+   typedef typename NodeTraits::node            node;
+   typedef typename NodeTraits::node_ptr        node_ptr;
+   typedef typename NodeTraits::const_node_ptr  const_node_ptr;
+
+   /// @cond
+   private:
+
+   class remove_on_destroy
+   {
+      remove_on_destroy(const remove_on_destroy&);
+      remove_on_destroy& operator=(const remove_on_destroy&);
+      public:
+      remove_on_destroy(node_ptr header, node_ptr z)
+         :  header_(header), z_(z), remove_it_(true)
+      {}
+      ~remove_on_destroy()
+      {
+         if(remove_it_){
+            tree_algorithms::erase(header_, z_);
+         }
+      }
+      
+      void release()
+      {  remove_it_ = false;  }
+
+      const node_ptr header_;
+      const node_ptr z_;
+      bool remove_it_;
+   };
+
+   class rerotate_on_destroy
+   {
+      rerotate_on_destroy(const remove_on_destroy&);
+      rerotate_on_destroy& operator=(const rerotate_on_destroy&);
+
+      public:
+      rerotate_on_destroy(node_ptr header, node_ptr p, std::size_t &n)
+         :  header_(header), p_(p), n_(n), remove_it_(true)
+      {}
+
+      ~rerotate_on_destroy()
+      {
+         if(remove_it_){
+            rotate_up_n(header_, p_, n_);
+         }
+      }
+      
+      void release()
+      {  remove_it_ = false;  }
+
+      const node_ptr header_;
+      const node_ptr p_;
+      std::size_t &n_;
+      bool remove_it_;
+   };
+
+   static void rotate_up_n(const node_ptr header, const node_ptr p, std::size_t n)
+   {
+      for( node_ptr p_parent = NodeTraits::get_parent(p)
+         ; n--
+         ; p_parent = NodeTraits::get_parent(p)){
+         //Check if left child
+         if(p == NodeTraits::get_left(p_parent)){
+            tree_algorithms::rotate_right(p_parent, header);
+         }
+         else{ //Right child
+            tree_algorithms::rotate_left(p_parent, header);
+         }
+      }
+   }
+
+   typedef detail::tree_algorithms<NodeTraits>  tree_algorithms;
+
+   static node_ptr uncast(const_node_ptr ptr)
+   {
+      return node_ptr(const_cast<node*>(::boost::intrusive::detail::get_pointer(ptr)));
+   }
+   /// @endcond
+
+   public:
+   static node_ptr begin_node(const_node_ptr header)
+   {  return tree_algorithms::begin_node(header);   }
+
+   static node_ptr end_node(const_node_ptr header)
+   {  return tree_algorithms::end_node(header);   }
+
+   //! This type is the information that will be
+   //! filled by insert_unique_check
+   struct insert_commit_data
+      /// @cond
+      :  public tree_algorithms::insert_commit_data
+      /// @endcond
+   {
+      /// @cond
+      std::size_t rotations;
+      /// @endcond
+   };
+
+   //! <b>Requires</b>: header1 and header2 must be the header nodes
+   //!  of two trees.
+   //! 
+   //! <b>Effects</b>: Swaps two trees. After the function header1 will contain 
+   //!   links to the second tree and header2 will have links to the first tree.
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static void swap_tree(node_ptr header1, node_ptr header2)
+   {  return tree_algorithms::swap_tree(header1, header2);  }
+
+   //! <b>Requires</b>: node1 and node2 can't be header nodes
+   //!  of two trees.
+   //! 
+   //! <b>Effects</b>: Swaps two nodes. After the function node1 will be inserted
+   //!   in the position node2 before the function. node2 will be inserted in the
+   //!   position node1 had before the function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   node1 and node2 are not equivalent according to the ordering rules.
+   //!
+   //!Experimental function
+   static void swap_nodes(node_ptr node1, node_ptr node2)
+   {
+      if(node1 == node2)
+         return;
+   
+      node_ptr header1(tree_algorithms::get_header(node1)), header2(tree_algorithms::get_header(node2));
+      swap_nodes(node1, header1, node2, header2);
+   }
+
+   //! <b>Requires</b>: node1 and node2 can't be header nodes
+   //!  of two trees with header header1 and header2.
+   //! 
+   //! <b>Effects</b>: Swaps two nodes. After the function node1 will be inserted
+   //!   in the position node2 before the function. node2 will be inserted in the
+   //!   position node1 had before the function.
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   node1 and node2 are not equivalent according to the ordering rules.
+   //!
+   //!Experimental function
+   static void swap_nodes(node_ptr node1, node_ptr header1, node_ptr node2, node_ptr header2)
+   {  tree_algorithms::swap_nodes(node1, header1, node2, header2);  }
+
+   //! <b>Requires</b>: node_to_be_replaced must be inserted in a tree
+   //!   and new_node must not be inserted in a tree.
+   //! 
+   //! <b>Effects</b>: Replaces node_to_be_replaced in its position in the
+   //!   tree with new_node. The tree does not need to be rebalanced
+   //! 
+   //! <b>Complexity</b>: Logarithmic. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   new_node is not equivalent to node_to_be_replaced according to the
+   //!   ordering rules. This function is faster than erasing and inserting
+   //!   the node, since no rebalancing and comparison is needed.
+   //!
+   //!Experimental function
+   static void replace_node(node_ptr node_to_be_replaced, node_ptr new_node)
+   {
+      if(node_to_be_replaced == new_node)
+         return;
+      replace_node(node_to_be_replaced, tree_algorithms::get_header(node_to_be_replaced), new_node);
+   }
+
+   //! <b>Requires</b>: node_to_be_replaced must be inserted in a tree
+   //!   with header "header" and new_node must not be inserted in a tree.
+   //! 
+   //! <b>Effects</b>: Replaces node_to_be_replaced in its position in the
+   //!   tree with new_node. The tree does not need to be rebalanced
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   new_node is not equivalent to node_to_be_replaced according to the
+   //!   ordering rules. This function is faster than erasing and inserting
+   //!   the node, since no rebalancing or comparison is needed.
+   //!
+   //!Experimental function
+   static void replace_node(node_ptr node_to_be_replaced, node_ptr header, node_ptr new_node)
+   {  tree_algorithms::replace_node(node_to_be_replaced, header, new_node);  }
+
+   //! <b>Requires</b>: node is a tree node but not the header.
+   //! 
+   //! <b>Effects</b>: Unlinks the node and rebalances the tree.
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Throws</b>: If "pcomp" throws, strong guarantee
+   template<class NodePtrPriorityCompare>
+   static void unlink(node_ptr node, NodePtrPriorityCompare pcomp)
+   {
+      node_ptr x = NodeTraits::get_parent(node);
+      if(x){
+         while(!is_header(x))
+            x = NodeTraits::get_parent(x);
+         erase(x, node, pcomp);
+      }
+   }
+
+   //! <b>Requires</b>: header is the header of a tree.
+   //! 
+   //! <b>Effects</b>: Unlinks the leftmost node from the tree, and
+   //!   updates the header link to the new leftmost node.
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function breaks the tree and the tree can
+   //!   only be used for more unlink_leftmost_without_rebalance calls.
+   //!   This function is normally used to achieve a step by step
+   //!   controlled destruction of the tree.
+   static node_ptr unlink_leftmost_without_rebalance(node_ptr header)
+   {  return tree_algorithms::unlink_leftmost_without_rebalance(header);   }
+
+   //! <b>Requires</b>: node is a node of the tree or an node initialized
+   //!   by init(...).
+   //! 
+   //! <b>Effects</b>: Returns true if the node is initialized by init().
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static bool unique(const_node_ptr node)
+   {  return tree_algorithms::unique(node);  }
+
+   //! <b>Requires</b>: node is a node of the tree but it's not the header.
+   //! 
+   //! <b>Effects</b>: Returns the number of nodes of the subtree.
+   //! 
+   //! <b>Complexity</b>: Linear time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static std::size_t count(const_node_ptr node)
+   {  return tree_algorithms::count(node);   }
+
+   //! <b>Requires</b>: header is the header node of the tree.
+   //! 
+   //! <b>Effects</b>: Returns the number of nodes above the header.
+   //! 
+   //! <b>Complexity</b>: Linear time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static std::size_t size(const_node_ptr header)
+   {  return tree_algorithms::size(header);   }
+
+   //! <b>Requires</b>: p is a node from the tree except the header.
+   //! 
+   //! <b>Effects</b>: Returns the next node of the tree.
+   //! 
+   //! <b>Complexity</b>: Average constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static node_ptr next_node(node_ptr p)
+   {  return tree_algorithms::next_node(p); }
+
+   //! <b>Requires</b>: p is a node from the tree except the leftmost node.
+   //! 
+   //! <b>Effects</b>: Returns the previous node of the tree.
+   //! 
+   //! <b>Complexity</b>: Average constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static node_ptr prev_node(node_ptr p)
+   {  return tree_algorithms::prev_node(p); }
+
+   //! <b>Requires</b>: node must not be part of any tree.
+   //!
+   //! <b>Effects</b>: After the function unique(node) == true.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
+   static void init(node_ptr node)
+   {  tree_algorithms::init(node);  }
+
+   //! <b>Requires</b>: node must not be part of any tree.
+   //!
+   //! <b>Effects</b>: Initializes the header to represent an empty tree.
+   //!   unique(header) == true.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //!
+   //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
+   static void init_header(node_ptr header)
+   {
+      tree_algorithms::init_header(header);
+   }
+
+   //! <b>Requires</b>: header must be the header of a tree, z a node
+   //!    of that tree and z != header.
+   //!
+   //! <b>Effects</b>: Erases node "z" from the tree with header "header".
+   //! 
+   //! <b>Complexity</b>: Amortized constant time.
+   //! 
+   //! <b>Throws</b>: If "pcomp" throws, strong guarantee.
+   template<class NodePtrPriorityCompare>
+   static node_ptr erase(node_ptr header, node_ptr z, NodePtrPriorityCompare pcomp)
+   {
+      rebalance_for_erasure(header, z, pcomp);
+      tree_algorithms::erase(header, z);
+//      assert(check_invariant(header, pcomp));
+      return z;
+   }
+
+   //! <b>Requires</b>: "cloner" must be a function
+   //!   object taking a node_ptr and returning a new cloned node of it. "disposer" must
+   //!   take a node_ptr and shouldn't throw.
+   //!
+   //! <b>Effects</b>: First empties target tree calling 
+   //!   <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+   //!    except the header.
+   //!    
+   //!   Then, duplicates the entire tree pointed by "source_header" cloning each
+   //!   source node with <tt>node_ptr Cloner::operator()(node_ptr)</tt> to obtain 
+   //!   the nodes of the target tree. If "cloner" throws, the cloned target nodes
+   //!   are disposed using <tt>void disposer(node_ptr)</tt>.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
+   //!   number of elements of tree target tree when calling this function.
+   //! 
+   //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
+   template <class Cloner, class Disposer>
+   static void clone
+      (const_node_ptr source_header, node_ptr target_header, Cloner cloner, Disposer disposer)
+   {
+      tree_algorithms::clone(source_header, target_header, cloner, disposer);
+   }
+
+   //! <b>Requires</b>: "disposer" must be an object function
+   //!   taking a node_ptr parameter and shouldn't throw.
+   //!
+   //! <b>Effects</b>: Empties the target tree calling 
+   //!   <tt>void disposer::operator()(node_ptr)</tt> for every node of the tree
+   //!    except the header.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of element of the source tree plus the.
+   //!   number of elements of tree target tree when calling this function.
+   //! 
+   //! <b>Throws</b>: If cloner functor throws. If this happens target nodes are disposed.
+   template<class Disposer>
+   static void clear_and_dispose(node_ptr header, Disposer disposer)
+   {  tree_algorithms::clear_and_dispose(header, disposer); }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. KeyNodePtrCompare can compare KeyType with tree's node_ptrs.
+   //!
+   //! <b>Effects</b>: Returns an node_ptr to the first element that is
+   //!   not less than "key" according to "comp" or "header" if that element does
+   //!   not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
+   template<class KeyType, class KeyNodePtrCompare>
+   static node_ptr lower_bound
+      (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+   {  return tree_algorithms::lower_bound(header, key, comp);  }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. KeyNodePtrCompare can compare KeyType with tree's node_ptrs.
+   //!
+   //! <b>Effects</b>: Returns an node_ptr to the first element that is greater
+   //!   than "key" according to "comp" or "header" if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
+   template<class KeyType, class KeyNodePtrCompare>
+   static node_ptr upper_bound
+      (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+   {  return tree_algorithms::upper_bound(header, key, comp);  }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. KeyNodePtrCompare can compare KeyType with tree's node_ptrs.
+   //!
+   //! <b>Effects</b>: Returns an node_ptr to the element that is equivalent to
+   //!   "key" according to "comp" or "header" if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
+   template<class KeyType, class KeyNodePtrCompare>
+   static node_ptr find
+      (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+   {  return tree_algorithms::find(header, key, comp);  }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. KeyNodePtrCompare can compare KeyType with tree's node_ptrs.
+   //!
+   //! <b>Effects</b>: Returns an a pair of node_ptr delimiting a range containing
+   //!   all elements that are equivalent to "key" according to "comp" or an
+   //!   empty range that indicates the position where those elements would be
+   //!   if they there are no equivalent elements.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
+   template<class KeyType, class KeyNodePtrCompare>
+   static std::pair<node_ptr, node_ptr> equal_range
+      (const_node_ptr header, const KeyType &key, KeyNodePtrCompare comp)
+   {  return tree_algorithms::equal_range(header, key, comp);  }
+
+   //! <b>Requires</b>: "h" must be the header node of a tree.
+   //!   NodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares two node_ptrs.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!
+   //! <b>Effects</b>: Inserts new_node into the tree before the upper bound
+   //!   according to "comp" and rotates the tree according to "pcomp".
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throw or "pcomp" throw.
+   template<class NodePtrCompare, class NodePtrPriorityCompare>
+   static node_ptr insert_equal_upper_bound
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::insert_equal_upper_bound_check(h, new_node, comp, commit_data);
+      rebalance_check_and_commit(h, new_node, pcomp, commit_data);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "h" must be the header node of a tree.
+   //!   NodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares two node_ptrs.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!
+   //! <b>Effects</b>: Inserts new_node into the tree before the upper bound
+   //!   according to "comp" and rotates the tree according to "pcomp".
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If "comp" throws.
+   template<class NodePtrCompare, class NodePtrPriorityCompare>
+   static node_ptr insert_equal_lower_bound
+      (node_ptr h, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::insert_equal_lower_bound_check(h, new_node, comp, commit_data);
+      rebalance_check_and_commit(h, new_node, pcomp, commit_data);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   NodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares two node_ptrs. "hint" is node from
+   //!   the "header"'s tree.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree, using "hint" as a hint to
+   //!   where it will be inserted. If "hint" is the upper_bound
+   //!   the insertion takes constant time (two comparisons in the worst case).
+   //!   Rotates the tree according to "pcomp".
+   //!
+   //! <b>Complexity</b>: Logarithmic in general, but it is amortized
+   //!   constant time if new_node is inserted immediately before "hint".
+   //! 
+   //! <b>Throws</b>: If "comp" throw or "pcomp" throw.
+   template<class NodePtrCompare, class NodePtrPriorityCompare>
+   static node_ptr insert_equal
+      (node_ptr h, node_ptr hint, node_ptr new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::insert_equal_check(h, hint, new_node, comp, commit_data);
+      rebalance_check_and_commit(h, new_node, pcomp, commit_data);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "pos" must be a valid node of the tree (including header end) node.
+   //!   "pos" must be a node pointing to the successor to "new_node"
+   //!   once inserted according to the order of already inserted nodes. This function does not
+   //!   check "pos" and this precondition must be guaranteed by the caller.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!   
+   //! <b>Effects</b>: Inserts new_node into the tree before "pos"
+   //!   and rotates the tree according to "pcomp".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: If "pcomp" throws, strong guarantee.
+   //! 
+   //! <b>Note</b>: If "pos" is not the successor of the newly inserted "new_node"
+   //! tree invariants might be broken.
+   template<class NodePtrPriorityCompare>
+   static node_ptr insert_before
+      (node_ptr header, node_ptr pos, node_ptr new_node, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::insert_before_check(header, pos, commit_data);
+      rebalance_check_and_commit(header, new_node, pcomp, commit_data);
+      return new_node;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering no less than the
+   //!   greatest inserted key.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!   
+   //! <b>Effects</b>: Inserts x into the tree in the last position
+   //!   and rotates the tree according to "pcomp".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: If "pcomp" throws, strong guarantee.
+   //! 
+   //! <b>Note</b>: If "new_node" is less than the greatest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   template<class NodePtrPriorityCompare>
+   static void push_back(node_ptr header, node_ptr new_node, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::push_back_check(header, commit_data);
+      rebalance_check_and_commit(header, new_node, pcomp, commit_data);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "new_node" must be, according to the used ordering, no greater than the
+   //!   lowest inserted key.
+   //!   NodePtrPriorityCompare is a priority function object that induces a strict weak
+   //!   ordering compatible with the one used to create the
+   //!   the tree. NodePtrPriorityCompare compares two node_ptrs.
+   //!   
+   //! <b>Effects</b>: Inserts x into the tree in the first position
+   //!   and rotates the tree according to "pcomp".
+   //!
+   //! <b>Complexity</b>: Constant-time.
+   //! 
+   //! <b>Throws</b>: If "pcomp" throws, strong guarantee.
+   //! 
+   //! <b>Note</b>: If "new_node" is greater than the lowest inserted key
+   //! tree invariants are broken. This function is slightly faster than
+   //! using "insert_before".
+   template<class NodePtrPriorityCompare>
+   static void push_front(node_ptr header, node_ptr new_node, NodePtrPriorityCompare pcomp)
+   {
+      insert_commit_data commit_data;
+      tree_algorithms::push_front_check(header, commit_data);
+      rebalance_check_and_commit(header, new_node, pcomp, commit_data);
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares KeyType with a node_ptr.
+   //! 
+   //! <b>Effects</b>: Checks if there is an equivalent node to "key" in the
+   //!   tree according to "comp" and obtains the needed information to realize
+   //!   a constant-time node insertion if there is no equivalent node.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing a node_ptr to the already present node
+   //!   and false. If there is not equivalent key can be inserted returns true
+   //!   in the returned pair's boolean and fills "commit_data" that is meant to
+   //!   be used with the "insert_commit" function to achieve a constant-time
+   //!   insertion function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If "comp" throws.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a node is expensive and the user does not want to have two equivalent nodes
+   //!   in the tree: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the node and this function offers the possibility to use that part
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the node and use
+   //!   "insert_commit" to insert the node in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_unique_commit" only
+   //!   if no more objects are inserted or erased from the set.
+   template<class KeyType, class KeyNodePtrCompare, class KeyNodePtrPrioCompare>
+   static std::pair<node_ptr, bool> insert_unique_check
+      (const_node_ptr header,  const KeyType &key
+      ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp
+      ,insert_commit_data &commit_data)
+   {
+      std::pair<node_ptr, bool> ret =
+         tree_algorithms::insert_unique_check(header, key, comp, commit_data);
+      if(ret.second)
+         rebalance_after_insertion_check(header, commit_data.node, key, pcomp, commit_data.rotations);
+      return ret;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   KeyNodePtrCompare is a function object that induces a strict weak
+   //!   ordering compatible with the strict weak ordering used to create the
+   //!   the tree. NodePtrCompare compares KeyType with a node_ptr.
+   //!   "hint" is node from the "header"'s tree.
+   //! 
+   //! <b>Effects</b>: Checks if there is an equivalent node to "key" in the
+   //!   tree according to "comp" using "hint" as a hint to where it should be
+   //!   inserted and obtains the needed information to realize
+   //!   a constant-time node insertion if there is no equivalent node. 
+   //!   If "hint" is the upper_bound the function has constant time 
+   //!   complexity (two comparisons in the worst case).
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing a node_ptr to the already present node
+   //!   and false. If there is not equivalent key can be inserted returns true
+   //!   in the returned pair's boolean and fills "commit_data" that is meant to
+   //!   be used with the "insert_commit" function to achieve a constant-time
+   //!   insertion function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic, but it is
+   //!   amortized constant time if new_node should be inserted immediately before "hint".
+   //!
+   //! <b>Throws</b>: If "comp" throws.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a node is expensive and the user does not want to have two equivalent nodes
+   //!   in the tree: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the node and this function offers the possibility to use that part
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the node and use
+   //!   "insert_commit" to insert the node in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_unique_commit" only
+   //!   if no more objects are inserted or erased from the set.
+   template<class KeyType, class KeyNodePtrCompare, class KeyNodePtrPrioCompare>
+   static std::pair<node_ptr, bool> insert_unique_check
+      (const_node_ptr header,  node_ptr hint, const KeyType &key
+      ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp, insert_commit_data &commit_data)
+   {
+      std::pair<node_ptr, bool> ret =
+         tree_algorithms::insert_unique_check(header, hint, key, comp, commit_data);
+      if(ret.second)
+         rebalance_after_insertion_check(header, commit_data.node, key, pcomp, commit_data.rotations);
+      return ret;
+   }
+
+   //! <b>Requires</b>: "header" must be the header node of a tree.
+   //!   "commit_data" must have been obtained from a previous call to
+   //!   "insert_unique_check". No objects should have been inserted or erased
+   //!   from the set between the "insert_unique_check" that filled "commit_data"
+   //!   and the call to "insert_commit". 
+   //! 
+   //! 
+   //! <b>Effects</b>: Inserts new_node in the set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_unique_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
+   static void insert_unique_commit
+      (node_ptr header, node_ptr new_node, const insert_commit_data &commit_data)
+   {
+      tree_algorithms::insert_unique_commit(header, new_node, commit_data);
+      rebalance_after_insertion_commit(header, new_node, commit_data.rotations);
+   }
+
+   //! <b>Requires</b>: "n" must be a node inserted in a tree.
+   //!
+   //! <b>Effects</b>: Returns a pointer to the header node of the tree.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static node_ptr get_header(node_ptr n)
+   {  return tree_algorithms::get_header(n);   }
+
+   /// @cond
+   private:
+
+   //! <b>Requires</b>: p is a node of a tree.
+   //! 
+   //! <b>Effects</b>: Returns true if p is the header of the tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   static bool is_header(const_node_ptr p)
+   {
+      return tree_algorithms::is_header(p);
+   }
+
+   template<class NodePtrPriorityCompare>
+   static void rebalance_for_erasure(node_ptr header, node_ptr z, NodePtrPriorityCompare pcomp)
+   {
+      std::size_t n = 0;
+      rerotate_on_destroy rb(header, z, n);
+
+      node_ptr z_left  = NodeTraits::get_left(z);
+      node_ptr z_right = NodeTraits::get_right(z);
+      while(z_left || z_right){
+         if(!z_right || (z_left && pcomp(z_left, z_right))){
+            tree_algorithms::rotate_right(z, header);
+         }
+         else{
+            tree_algorithms::rotate_left(z, header);
+         }
+         ++n;
+         z_left  = NodeTraits::get_left(z);
+         z_right = NodeTraits::get_right(z);
+      }
+      rb.release();
+   }
+
+   template<class NodePtrPriorityCompare>
+   static void rebalance_check_and_commit
+      (node_ptr h, node_ptr new_node, NodePtrPriorityCompare pcomp, insert_commit_data &commit_data)
+   {
+      rebalance_after_insertion_check(h, commit_data.node, new_node, pcomp, commit_data.rotations);
+      //No-throw
+      tree_algorithms::insert_unique_commit(h, new_node, commit_data);
+      rebalance_after_insertion_commit(h, new_node, commit_data.rotations);
+   }
+
+
+   template<class Key, class KeyNodePriorityCompare>
+   static void rebalance_after_insertion_check
+      ( const_node_ptr header, const_node_ptr upnode, const Key &k
+      , KeyNodePriorityCompare pcomp, std::size_t &num_rotations)
+   {
+      //First check rotations since pcomp can throw
+      num_rotations = 0;
+      std::size_t n = 0;
+      while(upnode != header && pcomp(k, upnode)){
+         ++n;
+         upnode = NodeTraits::get_parent(upnode);
+      }
+      num_rotations = n;
+   }
+
+   static void rebalance_after_insertion_commit(node_ptr header, node_ptr p, std::size_t n)
+   {
+      // Now execute n rotations
+      for( node_ptr p_parent = NodeTraits::get_parent(p)
+         ; n--
+         ; p_parent = NodeTraits::get_parent(p)){
+         //Check if left child
+         if(p == NodeTraits::get_left(p_parent)){
+            tree_algorithms::rotate_right(p_parent, header);
+         }
+         else{ //Right child
+            tree_algorithms::rotate_left(p_parent, header);
+         }
+      }
+   }
+
+   template<class NodePtrPriorityCompare>
+   static bool check_invariant(const_node_ptr header, NodePtrPriorityCompare pcomp)
+   {
+      node_ptr beg = begin_node(header);
+      node_ptr end = end_node(header);
+
+      while(beg != end){
+         node_ptr p = NodeTraits::get_parent(beg);
+         if(p != header){
+            if(pcomp(beg, p))
+               return false;
+         }
+         beg = next_node(beg);
+      }
+      return true;
+   }
+
+   /// @endcond
+};
+
+} //namespace intrusive 
+} //namespace boost 
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_set.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive/treap_set.hpp
new file mode 100644 (file)
index 0000000..12611ee
--- /dev/null
@@ -0,0 +1,2543 @@
+/////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Ion Gaztanaga 2007-2009
+//
+// 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)
+//
+// See http://www.boost.org/libs/intrusive for documentation.
+//
+/////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_INTRUSIVE_TRIE_SET_HPP
+#define BOOST_INTRUSIVE_TRIE_SET_HPP
+
+#include <boost/intrusive/detail/config_begin.hpp>
+#include <boost/intrusive/intrusive_fwd.hpp>
+#include <boost/intrusive/treap.hpp>
+#include <boost/intrusive/detail/mpl.hpp>
+#include <iterator>
+
+namespace boost {
+namespace intrusive {
+
+//! The class template treap_set is an intrusive container, that mimics most of 
+//! the interface of std::set as described in the C++ standard.
+//! 
+//! The template parameter \c T is the type to be managed by the container.
+//! The user can specify additional options and if no options are provided
+//! default options are used.
+//!
+//! The container supports the following options:
+//! \c base_hook<>/member_hook<>/value_traits<>,
+//! \c constant_time_size<>, \c size_type<>,
+//! \c compare<> and \c priority_compare<>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+class treap_set_impl
+{
+   /// @cond
+   typedef treap_impl<Config> tree_type;
+   //! This class is
+   //! non-copyable
+   treap_set_impl (const treap_set_impl&);
+
+   //! This class is
+   //! non-assignable
+   treap_set_impl &operator =(const treap_set_impl&);
+
+   typedef tree_type implementation_defined;
+   /// @endcond
+
+   public:
+   typedef typename implementation_defined::value_type               value_type;
+   typedef typename implementation_defined::value_traits             value_traits;
+   typedef typename implementation_defined::pointer                  pointer;
+   typedef typename implementation_defined::const_pointer            const_pointer;
+   typedef typename implementation_defined::reference                reference;
+   typedef typename implementation_defined::const_reference          const_reference;
+   typedef typename implementation_defined::difference_type          difference_type;
+   typedef typename implementation_defined::size_type                size_type;
+   typedef typename implementation_defined::value_compare            value_compare;
+   typedef typename implementation_defined::priority_compare         priority_compare;
+   typedef typename implementation_defined::key_compare              key_compare;
+   typedef typename implementation_defined::iterator                 iterator;
+   typedef typename implementation_defined::const_iterator           const_iterator;
+   typedef typename implementation_defined::reverse_iterator         reverse_iterator;
+   typedef typename implementation_defined::const_reverse_iterator   const_reverse_iterator;
+   typedef typename implementation_defined::insert_commit_data       insert_commit_data;
+   typedef typename implementation_defined::node_traits              node_traits;
+   typedef typename implementation_defined::node                     node;
+   typedef typename implementation_defined::node_ptr                 node_ptr;
+   typedef typename implementation_defined::const_node_ptr           const_node_ptr;
+   typedef typename implementation_defined::node_algorithms          node_algorithms;
+
+   /// @cond
+   private:
+   tree_type tree_;
+   /// @endcond
+
+   public:
+   //! <b>Effects</b>: Constructs an empty treap_set. 
+   //!   
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor of the value_compare object throws. 
+   treap_set_impl( const value_compare &cmp      = value_compare()
+                , const priority_compare &pcmp  = priority_compare()
+                , const value_traits &v_traits  = value_traits()) 
+      :  tree_(cmp, pcmp, v_traits)
+   {}
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue of type value_type. 
+   //!   cmp must be a comparison function that induces a strict weak ordering.
+   //! 
+   //! <b>Effects</b>: Constructs an empty treap_set and inserts elements from 
+   //!   [b, e).
+   //! 
+   //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using 
+   //!   comp and otherwise N * log N, where N is std::distance(last, first).
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare object throws. 
+   template<class Iterator>
+   treap_set_impl( Iterator b, Iterator e
+           , const value_compare &cmp = value_compare()
+           , const priority_compare &pcmp  = priority_compare()
+           , const value_traits &v_traits = value_traits())
+      : tree_(true, b, e, cmp, pcmp, v_traits)
+   {}
+
+   //! <b>Effects</b>: Detaches all elements from this. The objects in the treap_set 
+   //!   are not deleted (i.e. no destructors are called).
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   ~treap_set_impl() 
+   {}
+
+   //! <b>Effects</b>: Returns an iterator pointing to the beginning of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator begin()
+   { return tree_.begin();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator begin() const
+   { return tree_.begin();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cbegin() const
+   { return tree_.cbegin();  }
+
+   //! <b>Effects</b>: Returns an iterator pointing to the end of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator end()
+   { return tree_.end();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator end() const
+   { return tree_.end();  }
+
+   //! <b>Effects</b>: Returns an iterator pointing to the highest priority object of the tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator top()
+   { return tree_.top();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the tree..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator top() const
+   {  return this->ctop();   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the tree..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator ctop() const
+   { return tree_.ctop();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cend() const
+   { return tree_.cend();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
+   //!    reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rbegin()
+   { return tree_.rbegin();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rbegin() const
+   { return tree_.rbegin();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crbegin() const
+   { return tree_.crbegin();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //!    of the reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rend()
+   { return tree_.rend();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rend() const
+   { return tree_.rend();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crend() const
+   { return tree_.crend();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the highest priority object of the
+   //!    reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rtop()
+   {  return tree_.rtop();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority objec
+   //!    of the reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rtop() const
+   {  return tree_.crtop();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority object
+   //!    of the reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crtop() const
+   {  return tree_.crtop();  }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end iterator
+   //!   of treap_set.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap_set associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static treap_set_impl &container_from_end_iterator(iterator end_iterator)
+   {
+      return *detail::parent_from_member<treap_set_impl, tree_type>
+         ( &tree_type::container_from_end_iterator(end_iterator)
+         , &treap_set_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end const_iterator
+   //!   of treap_set.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap_set associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static const treap_set_impl &container_from_end_iterator(const_iterator end_iterator)
+   {
+      return *detail::parent_from_member<treap_set_impl, tree_type>
+         ( &tree_type::container_from_end_iterator(end_iterator)
+         , &treap_set_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: it must be a valid iterator of set.
+   //! 
+   //! <b>Effects</b>: Returns a reference to the set associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   static treap_set_impl &container_from_iterator(iterator it)
+   {
+      return *detail::parent_from_member<treap_set_impl, tree_type>
+         ( &tree_type::container_from_iterator(it)
+         , &treap_set_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: it must be a valid const_iterator of set.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the set associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   static const treap_set_impl &container_from_iterator(const_iterator it)
+   {
+      return *detail::parent_from_member<treap_set_impl, tree_type>
+         ( &tree_type::container_from_iterator(it)
+         , &treap_set_impl::tree_);
+   }
+
+   //! <b>Effects</b>: Returns the key_compare object used by the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If key_compare copy-constructor throws.
+   key_compare key_comp() const
+   { return tree_.value_comp(); }
+
+   //! <b>Effects</b>: Returns the value_compare object used by the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If value_compare copy-constructor throws.
+   value_compare value_comp() const
+   { return tree_.value_comp(); }
+
+   //! <b>Effects</b>: Returns the priority_compare object used by the treap_set.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If priority_compare copy-constructor throws.
+   priority_compare priority_comp() const
+   {  return tree_.priority_comp();   }
+
+   //! <b>Effects</b>: Returns true if the container is empty.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   bool empty() const
+   { return tree_.empty(); }
+
+   //! <b>Effects</b>: Returns the number of elements stored in the treap_set.
+   //! 
+   //! <b>Complexity</b>: Linear to elements contained in *this if,
+   //!   constant-time size option is enabled. Constant-time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   size_type size() const
+   { return tree_.size(); }
+
+   //! <b>Effects</b>: Swaps the contents of two sets.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If the swap() call for the comparison functor
+   //!   found using ADL throws. Strong guarantee.
+   void swap(treap_set_impl& other)
+   { tree_.swap(other.tree_); }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!   Cloner should yield to nodes equivalent to the original nodes.
+   //!
+   //! <b>Effects</b>: Erases all the elements from *this
+   //!   calling Disposer::operator()(pointer), clones all the 
+   //!   elements from src calling Cloner::operator()(const_reference )
+   //!   and inserts them on *this. Copies the predicate from the source container.
+   //!
+   //!   If cloner throws, all cloned elements are unlinked and disposed
+   //!   calling Disposer::operator()(pointer).
+   //!   
+   //! <b>Complexity</b>: Linear to erased plus inserted elements.
+   //! 
+   //! <b>Throws</b>: If cloner throws or predicate copy assignment throws. Basic guarantee.
+   template <class Cloner, class Disposer>
+   void clone_from(const treap_set_impl &src, Cloner cloner, Disposer disposer)
+   {  tree_.clone_from(src.tree_, cloner, disposer);  }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Tries to inserts value into the treap_set.
+   //!
+   //! <b>Returns</b>: If the value
+   //!   is not already present inserts it and returns a pair containing the
+   //!   iterator to the new value and true. If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false.
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare ordering function throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   std::pair<iterator, bool> insert(reference value)
+   {  return tree_.insert_unique(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Tries to to insert x into the treap_set, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: An iterator that points to the position where the 
+   //!   new element was inserted into the treap_set.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare ordering
+   //!   functions throw. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert(const_iterator hint, reference value)
+   {  return tree_.insert_unique(hint, value);  }
+
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare.
+   //!   key_value_pcomp must be a comparison function that induces 
+   //!   the same strict weak ordering as priority_compare. The difference is that
+   //!   key_value_pcomp and key_value_comp compare an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the treap_set, using
+   //!   a user provided key instead of the value itself.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Average complexity is at most logarithmic.
+   //!
+   //! <b>Throws</b>: If key_value_comp or key_value_pcomp ordering function throw.
+   //!    Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   node that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that 
+   //!   part to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This gives a total
+   //!   logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)).
+   //!
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the treap_set.
+   template<class KeyType, class KeyValueCompare, class KeyValuePriorityCompare>
+   std::pair<iterator, bool> insert_check
+      ( const KeyType &key, KeyValueCompare key_value_comp, KeyValuePriorityCompare key_value_pcomp
+      , insert_commit_data &commit_data)
+   {  return tree_.insert_unique_check(key, key_value_comp, key_value_pcomp, commit_data); }
+
+   //! <b>Requires</b>: key_value_comp must be a comparison function that induces 
+   //!   the same strict weak ordering as value_compare.
+   //!   key_value_pcomp must be a comparison function that induces 
+   //!   the same strict weak ordering as priority_compare. The difference is that
+   //!   key_value_pcomp and key_value_comp compare an arbitrary key with the contained values.
+   //! 
+   //! <b>Effects</b>: Checks if a value can be inserted in the treap_set, using
+   //!   a user provided key instead of the value itself, using "hint" 
+   //!   as a hint to where it will be inserted.
+   //!
+   //! <b>Returns</b>: If there is an equivalent value
+   //!   returns a pair containing an iterator to the already present value
+   //!   and false. If the value can be inserted returns true in the returned
+   //!   pair boolean and fills "commit_data" that is meant to be used with
+   //!   the "insert_commit" function.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it's amortized
+   //!   constant time if t is inserted immediately before hint.
+   //!
+   //! <b>Throws</b>: If key_value_comp or key_value_pcomp ordering function throw.
+   //!    Strong guarantee.
+   //! 
+   //! <b>Notes</b>: This function is used to improve performance when constructing
+   //!   a value_type is expensive: if there is an equivalent value
+   //!   the constructed object must be discarded. Many times, the part of the
+   //!   constructing that is used to impose the order is much cheaper to construct
+   //!   than the value_type and this function offers the possibility to use that key 
+   //!   to check if the insertion will be successful.
+   //!
+   //!   If the check is successful, the user can construct the value_type and use
+   //!   "insert_commit" to insert the object in constant-time. This can give a total
+   //!   constant-time complexity to the insertion: check(O(1)) + commit(O(1)).
+   //!   
+   //!   "commit_data" remains valid for a subsequent "insert_commit" only if no more
+   //!   objects are inserted or erased from the treap_set.
+   template<class KeyType, class KeyValueCompare, class KeyValuePriorityCompare>
+   std::pair<iterator, bool> insert_check
+      ( const_iterator hint, const KeyType &key
+      , KeyValueCompare key_value_comp, KeyValuePriorityCompare key_value_pcomp
+      , insert_commit_data &commit_data)
+   {  return tree_.insert_unique_check(hint, key, key_value_comp, key_value_pcomp, commit_data); }
+
+   //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
+   //!   must have been obtained from a previous call to "insert_check".
+   //!   No objects should have been inserted or erased from the treap_set between
+   //!   the "insert_check" that filled "commit_data" and the call to "insert_commit".
+   //! 
+   //! <b>Effects</b>: Inserts the value in the treap_set using the information obtained
+   //!   from the "commit_data" that a previous "insert_check" filled.
+   //!
+   //! <b>Returns</b>: An iterator to the newly inserted object.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function has only sense if a "insert_check" has been
+   //!   previously executed to fill "commit_data". No value should be inserted or
+   //!   erased between the "insert_check" and "insert_commit" calls.
+   iterator insert_commit(reference value, const insert_commit_data &commit_data)
+   {  return tree_.insert_unique_commit(value, commit_data); }
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
+   //!   of type value_type.
+   //! 
+   //! <b>Effects</b>: Inserts a range into the treap_set.
+   //! 
+   //! <b>Complexity</b>: Insert range is in general O(N * log(N)), where N is the
+   //!   size of the range. However, it is linear in N if the range is already sorted
+   //!   by value_comp().
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare ordering function
+   //!   throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   template<class Iterator>
+   void insert(Iterator b, Iterator e)
+   {  tree_.insert_unique(b, e);  }
+
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate. "value" must not be equal to any
+   //!   inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the treap before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" treap ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be greater than
+   //!   any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be less
+   //!   than any inserted key according to the predicate.
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Returns</b>: An iterator to the element after the erased element.
+   //!
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator i)
+   {  return tree_.erase(i);  }
+
+   //! <b>Effects</b>: Erases the range pointed to by b end e. 
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Returns</b>: An iterator to the element after the erased elements.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator b, const_iterator e)
+   {  return tree_.erase(b, e);  }
+
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size()) + this->count(value)).
+   //! 
+   //! <b>Throws</b>: If internal value_compare or priority_compare
+   //!   ordering functions throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   size_type erase(const_reference value)
+   {  return tree_.erase(value);  }
+
+   //! <b>Effects</b>: Erases all the elements that compare equal with
+   //!   the given key and the given comparison functor.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(key, comp)).
+   //! 
+   //! <b>Throws</b>: If comp or internal priority_compare
+   //!   ordering functions throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class KeyType, class KeyValueCompare>
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {  return tree_.erase(key, comp);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //!   Disposer::operator()(pointer) is called for the removed element.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase element is constant time. 
+   //! 
+   //! <b>Returns</b>: An iterator to the element after the erased element.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators 
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
+   {  return tree_.erase_and_dispose(i, disposer);  }
+
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases the range pointed to by b end e.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Returns</b>: An iterator to the element after the erased elements.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {  return tree_.erase_and_dispose(b, e, disposer);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(value)). Basic guarantee.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class Disposer>
+   size_type erase_and_dispose(const_reference value, Disposer disposer)
+   {  return tree_.erase_and_dispose(value, disposer);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given key.
+   //!   according to the comparison functor "comp".
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //!
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(key, comp)).
+   //! 
+   //! <b>Throws</b>: If comp or internal priority_compare ordering functions throw.
+   //!   Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class KeyType, class KeyValueCompare, class Disposer>
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {  return tree_.erase_and_dispose(key, comp, disposer);  }
+
+   //! <b>Effects</b>: Erases all the elements of the container.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   void clear()
+   {  return tree_.clear();  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //! 
+   //! <b>Effects</b>: Erases all the elements of the container.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class Disposer>
+   void clear_and_dispose(Disposer disposer)
+   {  return tree_.clear_and_dispose(disposer);  }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the given key
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given key.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   size_type count(const_reference value) const
+   {  return tree_.find(value) != end();  }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the same key
+   //!   compared with the given comparison functor.
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given key.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   template<class KeyType, class KeyValueCompare>
+   size_type count(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.find(key, comp) != end();  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator lower_bound(const_reference value)
+   {  return tree_.lower_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key according to the comparison functor is not less than k or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //! 
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator lower_bound(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.lower_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns a const iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator lower_bound(const_reference value) const
+   {  return tree_.lower_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns a const_iterator to the first element whose
+   //!   key according to the comparison functor is not less than k or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //! 
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.lower_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator upper_bound(const_reference value)
+   {  return tree_.upper_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key according to the comparison functor is greater than key or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator upper_bound(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.upper_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator upper_bound(const_reference value) const
+   {  return tree_.upper_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns a const_iterator to the first element whose
+   //!   key according to the comparison functor is greater than key or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.upper_bound(key, comp);  }
+
+   //! <b>Effects</b>: Finds an iterator to the first element whose value is 
+   //!   "value" or end() if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator find(const_reference value)
+   {  return tree_.find(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds an iterator to the first element whose key is 
+   //!   "key" according to the comparison functor or end() if that element 
+   //!   does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator find(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.find(key, comp);  }
+
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose value is 
+   //!   "value" or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator find(const_reference value) const
+   {  return tree_.find(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose key is 
+   //!   "key" according to the comparison functor or end() if that element 
+   //!   does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator find(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.find(key, comp);  }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   std::pair<iterator,iterator> equal_range(const_reference value)
+   {  return tree_.equal_range(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k 
+   //!   according to the comparison functor or an empty range 
+   //!   that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.equal_range(key, comp);  }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   std::pair<const_iterator, const_iterator>
+      equal_range(const_reference value) const
+   {  return tree_.equal_range(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k 
+   //!   according to the comparison functor or an empty range 
+   //!   that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<const_iterator, const_iterator>
+      equal_range(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.equal_range(key, comp);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the treap_set
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static iterator s_iterator_to(reference value)
+   {  return tree_type::s_iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   treap_set that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static const_iterator s_iterator_to(const_reference value)
+   {  return tree_type::s_iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the treap_set
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator iterator_to(reference value)
+   {  return tree_.iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_set of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   treap_set that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator iterator_to(const_reference value) const
+   {  return tree_.iterator_to(value);  }
+
+   //! <b>Requires</b>: value shall not be in a treap_set/treap_multiset.
+   //! 
+   //! <b>Effects</b>: init_node puts the hook of a value in a well-known default
+   //!   state.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Note</b>: This function puts the hook in the well-known default state
+   //!   used by auto_unlink and safe hooks.
+   static void init_node(reference value)
+   { tree_type::init_node(value);   }
+
+   //! <b>Effects</b>: Unlinks the leftmost node from the tree.
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function breaks the tree and the tree can
+   //!   only be used for more unlink_leftmost_without_rebalance calls.
+   //!   This function is normally used to achieve a step by step
+   //!   controlled destruction of the tree.
+   pointer unlink_leftmost_without_rebalance()
+   {  return tree_.unlink_leftmost_without_rebalance();  }
+
+   //! <b>Requires</b>: replace_this must be a valid iterator of *this
+   //!   and with_this must not be inserted in any tree.
+   //! 
+   //! <b>Effects</b>: Replaces replace_this in its position in the
+   //!   tree with with_this. The tree does not need to be rebalanced.
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   with_this is not equivalent to *replace_this according to the
+   //!   ordering rules. This function is faster than erasing and inserting
+   //!   the node, since no rebalancing or comparison is needed.
+   void replace_node(iterator replace_this, reference with_this)
+   {  tree_.replace_node(replace_this, with_this);   }
+
+   //! <b>Effects</b>: Rebalances the tree.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear.
+   void rebalance()
+   {  tree_.rebalance(); }
+
+   //! <b>Requires</b>: old_root is a node of a tree.
+   //! 
+   //! <b>Effects</b>: Rebalances the subtree rooted at old_root.
+   //!
+   //! <b>Returns</b>: The new root of the subtree.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements in the subtree.
+   iterator rebalance_subtree(iterator root)
+   {  return tree_.rebalance_subtree(root); }
+
+   //! <b>Returns</b>: The balance factor (alpha) used in this tree
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   float balance_factor() const
+   {  return tree_.balance_factor(); }
+
+   //! <b>Requires</b>: new_alpha must be a value between 0.5 and 1.0
+   //! 
+   //! <b>Effects</b>: Establishes a new balance factor (alpha) and rebalances
+   //!   the tree if the new balance factor is stricter (less) than the old factor.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements in the subtree.
+   void balance_factor(float new_alpha)
+   {  tree_.balance_factor(new_alpha); }
+
+   /// @cond
+   friend bool operator==(const treap_set_impl &x, const treap_set_impl &y)
+   {  return x.tree_ == y.tree_;  }
+
+   friend bool operator<(const treap_set_impl &x, const treap_set_impl &y)
+   {  return x.tree_ < y.tree_;  }
+   /// @endcond
+};
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator!=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_set_impl<T, Options...> &x, const treap_set_impl<T, Options...> &y)
+#else
+(const treap_set_impl<Config> &x, const treap_set_impl<Config> &y)
+#endif
+{  return !(x == y); }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_set_impl<T, Options...> &x, const treap_set_impl<T, Options...> &y)
+#else
+(const treap_set_impl<Config> &x, const treap_set_impl<Config> &y)
+#endif
+{  return y < x;  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator<=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_set_impl<T, Options...> &x, const treap_set_impl<T, Options...> &y)
+#else
+(const treap_set_impl<Config> &x, const treap_set_impl<Config> &y)
+#endif
+{  return !(y < x);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_set_impl<T, Options...> &x, const treap_set_impl<T, Options...> &y)
+#else
+(const treap_set_impl<Config> &x, const treap_set_impl<Config> &y)
+#endif
+{  return !(x < y);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline void swap
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(treap_set_impl<T, Options...> &x, treap_set_impl<T, Options...> &y)
+#else
+(treap_set_impl<Config> &x, treap_set_impl<Config> &y)
+#endif
+{  x.swap(y);  }
+
+//! Helper metafunction to define a \c treap_set that yields to the same type when the
+//! same options (either explicitly or implicitly) are used.
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class ...Options>
+#else
+template<class T, class O1 = none, class O2 = none
+                , class O3 = none, class O4 = none>
+#endif
+struct make_treap_set
+{
+   /// @cond
+   typedef treap_set_impl
+      < typename make_treap_opt<T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type
+      > implementation_defined;
+   /// @endcond
+   typedef implementation_defined type;
+};
+
+#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class O1, class O2, class O3, class O4>
+#else
+template<class T, class ...Options>
+#endif
+class treap_set
+   :  public make_treap_set<T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type
+{
+   typedef typename make_treap_set
+      <T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type   Base;
+
+   public:
+   typedef typename Base::value_compare      value_compare;
+   typedef typename Base::priority_compare   priority_compare;
+   typedef typename Base::value_traits       value_traits;
+   typedef typename Base::iterator           iterator;
+   typedef typename Base::const_iterator     const_iterator;
+
+   //Assert if passed value traits are compatible with the type
+   BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+
+   treap_set( const value_compare &cmp    = value_compare()
+           , const priority_compare &pcmp = priority_compare()
+           , const value_traits &v_traits = value_traits())
+      :  Base(cmp, pcmp, v_traits)
+   {}
+
+   template<class Iterator>
+   treap_set( Iterator b, Iterator e
+      , const value_compare &cmp = value_compare()
+      , const priority_compare &pcmp = priority_compare()
+      , const value_traits &v_traits = value_traits())
+      :  Base(b, e, cmp, pcmp, v_traits)
+   {}
+
+   static treap_set &container_from_end_iterator(iterator end_iterator)
+   {  return static_cast<treap_set &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static const treap_set &container_from_end_iterator(const_iterator end_iterator)
+   {  return static_cast<const treap_set &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static treap_set &container_from_iterator(iterator it)
+   {  return static_cast<treap_set &>(Base::container_from_iterator(it));   }
+
+   static const treap_set &container_from_iterator(const_iterator it)
+   {  return static_cast<const treap_set &>(Base::container_from_iterator(it));   }
+};
+
+#endif
+
+//! The class template treap_multiset is an intrusive container, that mimics most of 
+//! the interface of std::treap_multiset as described in the C++ standard.
+//! 
+//! The template parameter \c T is the type to be managed by the container.
+//! The user can specify additional options and if no options are provided
+//! default options are used.
+//!
+//! The container supports the following options:
+//! \c base_hook<>/member_hook<>/value_traits<>,
+//! \c constant_time_size<>, \c size_type<>,
+//! \c compare<> and \c priority_compare<>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+class treap_multiset_impl
+{
+   /// @cond
+   typedef treap_impl<Config> tree_type;
+
+   //Non-copyable and non-assignable
+   treap_multiset_impl (const treap_multiset_impl&);
+   treap_multiset_impl &operator =(const treap_multiset_impl&);
+   typedef tree_type implementation_defined;
+   /// @endcond
+
+   public:
+   typedef typename implementation_defined::value_type               value_type;
+   typedef typename implementation_defined::value_traits             value_traits;
+   typedef typename implementation_defined::pointer                  pointer;
+   typedef typename implementation_defined::const_pointer            const_pointer;
+   typedef typename implementation_defined::reference                reference;
+   typedef typename implementation_defined::const_reference          const_reference;
+   typedef typename implementation_defined::difference_type          difference_type;
+   typedef typename implementation_defined::size_type                size_type;
+   typedef typename implementation_defined::value_compare            value_compare;
+   typedef typename implementation_defined::priority_compare         priority_compare;
+   typedef typename implementation_defined::key_compare              key_compare;
+   typedef typename implementation_defined::iterator                 iterator;
+   typedef typename implementation_defined::const_iterator           const_iterator;
+   typedef typename implementation_defined::reverse_iterator         reverse_iterator;
+   typedef typename implementation_defined::const_reverse_iterator   const_reverse_iterator;
+   typedef typename implementation_defined::insert_commit_data       insert_commit_data;
+   typedef typename implementation_defined::node_traits              node_traits;
+   typedef typename implementation_defined::node                     node;
+   typedef typename implementation_defined::node_ptr                 node_ptr;
+   typedef typename implementation_defined::const_node_ptr           const_node_ptr;
+   typedef typename implementation_defined::node_algorithms          node_algorithms;
+
+   /// @cond
+   private:
+   tree_type tree_;
+   /// @endcond
+
+   public:
+   //! <b>Effects</b>: Constructs an empty treap_multiset. 
+   //!   
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor of the value_compare/priority_compare objects throw. 
+   treap_multiset_impl( const value_compare &cmp     = value_compare()
+                     , const priority_compare &pcmp = priority_compare()
+                     , const value_traits &v_traits = value_traits()) 
+      :  tree_(cmp, pcmp, v_traits)
+   {}
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue of type value_type. 
+   //!   cmp must be a comparison function that induces a strict weak ordering.
+   //! 
+   //! <b>Effects</b>: Constructs an empty treap_multiset and inserts elements from 
+   //!   [b, e).
+   //! 
+   //! <b>Complexity</b>: Linear in N if [b, e) is already sorted using
+   //!   comp and otherwise N * log N, where N is the distance between first and last
+   //! 
+   //! <b>Throws</b>: If value_traits::node_traits::node
+   //!   constructor throws (this does not happen with predefined Boost.Intrusive hooks)
+   //!   or the copy constructor/operator() of the value_compare/priority_compare objects throw. 
+   template<class Iterator>
+   treap_multiset_impl( Iterator b, Iterator e
+                , const value_compare &cmp     = value_compare()
+                , const priority_compare &pcmp = priority_compare()
+                , const value_traits &v_traits = value_traits())
+      : tree_(false, b, e, cmp, pcmp, v_traits)
+   {}
+
+   //! <b>Effects</b>: Detaches all elements from this. The objects in the treap_multiset 
+   //!   are not deleted (i.e. no destructors are called).
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   ~treap_multiset_impl() 
+   {}
+
+   //! <b>Effects</b>: Returns an iterator pointing to the beginning of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator begin()
+   { return tree_.begin();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator begin() const
+   { return tree_.begin();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the beginning of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cbegin() const
+   { return tree_.cbegin();  }
+
+   //! <b>Effects</b>: Returns an iterator pointing to the end of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator end()
+   { return tree_.end();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator end() const
+   { return tree_.end();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the end of the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator cend() const
+   { return tree_.cend();  }
+
+   //! <b>Effects</b>: Returns an iterator pointing to the highest priority object of the tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator top()
+   { return tree_.top();  }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the tree..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator top() const
+   {  return this->ctop();   }
+
+   //! <b>Effects</b>: Returns a const_iterator pointing to the highest priority object of the tree..
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator ctop() const
+   { return tree_.ctop();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning of the
+   //!    reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rbegin()
+   { return tree_.rbegin();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rbegin() const
+   { return tree_.rbegin();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
+   //!    of the reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crbegin() const
+   { return tree_.crbegin();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
+   //!    of the reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rend()
+   { return tree_.rend();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rend() const
+   { return tree_.rend();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
+   //!    of the reversed treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crend() const
+   { return tree_.crend();  }
+
+   //! <b>Effects</b>: Returns a reverse_iterator pointing to the highest priority object of the
+   //!    reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   reverse_iterator rtop()
+   {  return tree_.rtop();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority objec
+   //!    of the reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator rtop() const
+   {  return tree_.crtop();  }
+
+   //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the highest priority object
+   //!    of the reversed tree.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_reverse_iterator crtop() const
+   {  return tree_.crtop();  }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end iterator
+   //!   of treap_multiset.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap_multiset associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static treap_multiset_impl &container_from_end_iterator(iterator end_iterator)
+   {
+      return *detail::parent_from_member<treap_multiset_impl, tree_type>
+         ( &tree_type::container_from_end_iterator(end_iterator)
+         , &treap_multiset_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: end_iterator must be a valid end const_iterator
+   //!   of treap_multiset.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the treap_multiset associated to the end iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static const treap_multiset_impl &container_from_end_iterator(const_iterator end_iterator)
+   {
+      return *detail::parent_from_member<treap_multiset_impl, tree_type>
+         ( &tree_type::container_from_end_iterator(end_iterator)
+         , &treap_multiset_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: it must be a valid iterator of multiset.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the multiset associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static treap_multiset_impl &container_from_iterator(iterator it)
+   {
+      return *detail::parent_from_member<treap_multiset_impl, tree_type>
+         ( &tree_type::container_from_iterator(it)
+         , &treap_multiset_impl::tree_);
+   }
+
+   //! <b>Precondition</b>: it must be a valid const_iterator of multiset.
+   //! 
+   //! <b>Effects</b>: Returns a const reference to the multiset associated to the iterator
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   static const treap_multiset_impl &container_from_iterator(const_iterator it)
+   {
+      return *detail::parent_from_member<treap_multiset_impl, tree_type>
+         ( &tree_type::container_from_iterator(it)
+         , &treap_multiset_impl::tree_);
+   }
+
+   //! <b>Effects</b>: Returns the key_compare object used by the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If key_compare copy-constructor throws.
+   key_compare key_comp() const
+   { return tree_.value_comp(); }
+
+   //! <b>Effects</b>: Returns the value_compare object used by the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If value_compare copy-constructor throws.
+   value_compare value_comp() const
+   { return tree_.value_comp(); }
+
+   //! <b>Effects</b>: Returns the priority_compare object used by the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If priority_compare copy-constructor throws.
+   priority_compare priority_comp() const
+   {  return tree_.priority_comp();   }
+
+   //! <b>Effects</b>: Returns true if the container is empty.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   bool empty() const
+   { return tree_.empty(); }
+
+   //! <b>Effects</b>: Returns the number of elements stored in the treap_multiset.
+   //! 
+   //! <b>Complexity</b>: Linear to elements contained in *this if,
+   //!   constant-time size option is enabled. Constant-time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   size_type size() const
+   { return tree_.size(); }
+
+   //! <b>Effects</b>: Swaps the contents of two treap_multisets.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: If the swap() call for the comparison functor
+   //!   found using ADL throws. Strong guarantee.
+   void swap(treap_multiset_impl& other)
+   { tree_.swap(other.tree_); }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!   Cloner should yield to nodes equivalent to the original nodes.
+   //!
+   //! <b>Effects</b>: Erases all the elements from *this
+   //!   calling Disposer::operator()(pointer), clones all the 
+   //!   elements from src calling Cloner::operator()(const_reference )
+   //!   and inserts them on *this. Copies the predicate from the source container.
+   //!
+   //!   If cloner throws, all cloned elements are unlinked and disposed
+   //!   calling Disposer::operator()(pointer).
+   //!   
+   //! <b>Complexity</b>: Linear to erased plus inserted elements.
+   //! 
+   //! <b>Throws</b>: If cloner throws or predicate copy assignment throws. Basic guarantee.
+   template <class Cloner, class Disposer>
+   void clone_from(const treap_multiset_impl &src, Cloner cloner, Disposer disposer)
+   {  tree_.clone_from(src.tree_, cloner, disposer);  }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Inserts value into the treap_multiset.
+   //! 
+   //! <b>Returns</b>: An iterator that points to the position where the new
+   //!   element was inserted.
+   //! 
+   //! <b>Complexity</b>: Average complexity for insert element is at
+   //!   most logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare ordering
+   //!  function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert(reference value)
+   {  return tree_.insert_equal(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue
+   //! 
+   //! <b>Effects</b>: Inserts x into the treap_multiset, using pos as a hint to
+   //!   where it will be inserted.
+   //! 
+   //! <b>Returns</b>: An iterator that points to the position where the new
+   //!   element was inserted.
+   //! 
+   //! <b>Complexity</b>: Logarithmic in general, but it is amortized
+   //!   constant time if t is inserted immediately before hint.
+   //! 
+   //! <b>Throws</b>: If internal value_compare or priority_compare ordering functions throw.
+   //!   Strong guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   iterator insert(const_iterator hint, reference value)
+   {  return tree_.insert_equal(hint, value);  }
+
+   //! <b>Requires</b>: Dereferencing iterator must yield an lvalue 
+   //!   of type value_type.
+   //! 
+   //! <b>Effects</b>: Inserts a range into the treap_multiset.
+   //! 
+   //! <b>Returns</b>: An iterator that points to the position where the new
+   //!   element was inserted.
+   //! 
+   //! <b>Complexity</b>: Insert range is in general O(N * log(N)), where N is the
+   //!   size of the range. However, it is linear in N if the range is already sorted
+   //!   by value_comp().
+   //! 
+   //! <b>Throws</b>: If internal value_compare or priority_compare ordering functions throw.
+   //!   Basic guarantee.
+   //! 
+   //! <b>Note</b>: Does not affect the validity of iterators and references.
+   //!   No copy-constructors are called.
+   template<class Iterator>
+   void insert(Iterator b, Iterator e)
+   {  tree_.insert_equal(b, e);  }
+
+   //! <b>Requires</b>: value must be an lvalue, "pos" must be
+   //!   a valid iterator (or end) and must be the succesor of value
+   //!   once inserted according to the predicate
+   //!
+   //! <b>Effects</b>: Inserts x into the treap before "pos".
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if "pos" is not
+   //! the successor of "value" treap ordering invariant will be broken.
+   //! This is a low-level function to be used only for performance reasons
+   //! by advanced users.
+   iterator insert_before(const_iterator pos, reference value)
+   {  return tree_.insert_before(pos, value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no less
+   //!   than the greatest inserted key.
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the last position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   less than the greatest inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_back(reference value)
+   {  tree_.push_back(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue, and it must be no greater
+   //!   than the minimum inserted key
+   //!
+   //! <b>Effects</b>: Inserts x into the treap in the first position.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: This function does not check preconditions so if value is
+   //!   greater than the minimum inserted key treap ordering invariant will be broken.
+   //!   This function is slightly more efficient than using "insert_before".
+   //!   This is a low-level function to be used only for performance reasons
+   //!   by advanced users.
+   void push_front(reference value)
+   {  tree_.push_front(value);  }
+
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time. 
+   //! 
+   //! <b>Returns</b>: An iterator to the element after the erased element.
+   //!
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator i)
+   {  return tree_.erase(i);  }
+
+   //! <b>Effects</b>: Erases the range pointed to by b end e. 
+   //!
+   //! <b>Returns</b>: An iterator to the element after the erased elements.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   iterator erase(const_iterator b, const_iterator e)
+   {  return tree_.erase(b, e);  }
+
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(value)).
+   //! 
+   //! <b>Throws</b>: If the internal value_compare or priority_compare ordering
+   //!   functiona throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   size_type erase(const_reference value)
+   {  return tree_.erase(value);  }
+
+   //! <b>Effects</b>: Erases all the elements that compare equal with
+   //!   the given key and the given comparison functor.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(key, comp)).
+   //! 
+   //! <b>Throws</b>: If comp or internal priority_compare ordering functions throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class KeyType, class KeyValueCompare>
+   size_type erase(const KeyType& key, KeyValueCompare comp
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {  return tree_.erase(key, comp);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Returns</b>: An iterator to the element after the erased element.
+   //!
+   //! <b>Effects</b>: Erases the element pointed to by pos. 
+   //!   Disposer::operator()(pointer) is called for the removed element.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase element is constant time. 
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Strong guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators 
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
+   {  return tree_.erase_and_dispose(i, disposer);  }
+
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Returns</b>: An iterator to the element after the erased elements.
+   //!
+   //! <b>Effects</b>: Erases the range pointed to by b end e.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Complexity</b>: Average complexity for erase range is at most 
+   //!   O(log(size() + N)), where N is the number of elements in the range.
+   //! 
+   //! <b>Throws</b>: If the internal priority_compare function throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {  return tree_.erase_and_dispose(b, e, disposer);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given value.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(value)).
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class Disposer>
+   size_type erase_and_dispose(const_reference value, Disposer disposer)
+   {  return tree_.erase_and_dispose(value, disposer);  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //!
+   //! <b>Effects</b>: Erases all the elements with the given key.
+   //!   according to the comparison functor "comp".
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //!
+   //! <b>Returns</b>: The number of erased elements.
+   //! 
+   //! <b>Complexity</b>: O(log(size() + this->count(key, comp)).
+   //! 
+   //! <b>Throws</b>: If comp or internal priority_compare ordering functions throw. Basic guarantee.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators
+   //!    to the erased elements.
+   template<class KeyType, class KeyValueCompare, class Disposer>
+   size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer
+                  /// @cond
+                  , typename detail::enable_if_c<!detail::is_convertible<KeyValueCompare, const_iterator>::value >::type * = 0
+                  /// @endcond
+                  )
+   {  return tree_.erase_and_dispose(key, comp, disposer);  }
+
+   //! <b>Effects</b>: Erases all the elements of the container.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   void clear()
+   {  return tree_.clear();  }
+
+   //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
+   //! 
+   //! <b>Effects</b>: Erases all the elements of the container.
+   //! 
+   //! <b>Complexity</b>: Linear to the number of elements on the container.
+   //!   Disposer::operator()(pointer) is called for the removed elements.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: Invalidates the iterators (but not the references)
+   //!    to the erased elements. No destructors are called.
+   template<class Disposer>
+   void clear_and_dispose(Disposer disposer)
+   {  return tree_.clear_and_dispose(disposer);  }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the given key
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given key.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   size_type count(const_reference value) const
+   {  return tree_.count(value);  }
+
+   //! <b>Effects</b>: Returns the number of contained elements with the same key
+   //!   compared with the given comparison functor.
+   //! 
+   //! <b>Complexity</b>: Logarithmic to the number of elements contained plus lineal
+   //!   to number of objects with the given key.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   template<class KeyType, class KeyValueCompare>
+   size_type count(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.count(key, comp);  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator lower_bound(const_reference value)
+   {  return tree_.lower_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key according to the comparison functor is not less than k or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //! 
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator lower_bound(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.lower_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns a const iterator to the first element whose
+   //!   key is not less than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator lower_bound(const_reference value) const
+   {  return tree_.lower_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns a const_iterator to the first element whose
+   //!   key according to the comparison functor is not less than k or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //! 
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.lower_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator upper_bound(const_reference value)
+   {  return tree_.upper_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key according to the comparison functor is greater than key or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator upper_bound(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.upper_bound(key, comp);  }
+
+   //! <b>Effects</b>: Returns an iterator to the first element whose
+   //!   key is greater than k or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator upper_bound(const_reference value) const
+   {  return tree_.upper_bound(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Returns a const_iterator to the first element whose
+   //!   key according to the comparison functor is greater than key or 
+   //!   end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.upper_bound(key, comp);  }
+
+   //! <b>Effects</b>: Finds an iterator to the first element whose value is 
+   //!   "value" or end() if that element does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   iterator find(const_reference value)
+   {  return tree_.find(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds an iterator to the first element whose key is 
+   //!   "key" according to the comparison functor or end() if that element 
+   //!   does not exist.
+   //!
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   iterator find(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.find(key, comp);  }
+
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose value is 
+   //!   "value" or end() if that element does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   const_iterator find(const_reference value) const
+   {  return tree_.find(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a const_iterator to the first element whose key is 
+   //!   "key" according to the comparison functor or end() if that element 
+   //!   does not exist.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   const_iterator find(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.find(key, comp);  }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   std::pair<iterator,iterator> equal_range(const_reference value)
+   {  return tree_.equal_range(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k 
+   //!   according to the comparison functor or an empty range 
+   //!   that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp)
+   {  return tree_.equal_range(key, comp);  }
+
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k or
+   //!   an empty range that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If the internal value_compare ordering function throws.
+   std::pair<const_iterator, const_iterator>
+      equal_range(const_reference value) const
+   {  return tree_.equal_range(value);  }
+
+   //! <b>Requires</b>: comp must imply the same element order as
+   //!   value_compare. Usually key is the part of the value_type
+   //!   that is used in the ordering functor.
+   //!
+   //! <b>Effects</b>: Finds a range containing all elements whose key is k 
+   //!   according to the comparison functor or an empty range 
+   //!   that indicates the position where those elements would be
+   //!   if they there is no elements with key k.
+   //! 
+   //! <b>Complexity</b>: Logarithmic.
+   //! 
+   //! <b>Throws</b>: If comp ordering function throws.
+   //!
+   //! <b>Note</b>: This function is used when constructing a value_type
+   //!   is expensive and the value_type can be compared with a cheaper
+   //!   key type. Usually this key is part of the value_type.
+   template<class KeyType, class KeyValueCompare>
+   std::pair<const_iterator, const_iterator>
+      equal_range(const KeyType& key, KeyValueCompare comp) const
+   {  return tree_.equal_range(key, comp);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_multiset of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the treap_multiset
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static iterator s_iterator_to(reference value)
+   {  return tree_type::s_iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_multiset of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   treap_multiset that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This static function is available only if the <i>value traits</i>
+   //!   is stateless.
+   static const_iterator s_iterator_to(const_reference value)
+   {  return tree_type::s_iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_multiset of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid iterator i belonging to the treap_multiset
+   //!   that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   iterator iterator_to(reference value)
+   {  return tree_.iterator_to(value);  }
+
+   //! <b>Requires</b>: value must be an lvalue and shall be in a treap_multiset of
+   //!   appropriate type. Otherwise the behavior is undefined.
+   //! 
+   //! <b>Effects</b>: Returns: a valid const_iterator i belonging to the
+   //!   treap_multiset that points to the value
+   //! 
+   //! <b>Complexity</b>: Constant.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   const_iterator iterator_to(const_reference value) const
+   {  return tree_.iterator_to(value);  }
+
+   //! <b>Requires</b>: value shall not be in a treap_multiset/treap_multiset.
+   //! 
+   //! <b>Effects</b>: init_node puts the hook of a value in a well-known default
+   //!   state.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant time.
+   //! 
+   //! <b>Note</b>: This function puts the hook in the well-known default state
+   //!   used by auto_unlink and safe hooks.
+   static void init_node(reference value)
+   { tree_type::init_node(value);   }
+
+   //! <b>Effects</b>: Unlinks the leftmost node from the tree.
+   //! 
+   //! <b>Complexity</b>: Average complexity is constant time.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Notes</b>: This function breaks the tree and the tree can
+   //!   only be used for more unlink_leftmost_without_rebalance calls.
+   //!   This function is normally used to achieve a step by step
+   //!   controlled destruction of the tree.
+   pointer unlink_leftmost_without_rebalance()
+   {  return tree_.unlink_leftmost_without_rebalance();  }
+
+   //! <b>Requires</b>: replace_this must be a valid iterator of *this
+   //!   and with_this must not be inserted in any tree.
+   //! 
+   //! <b>Effects</b>: Replaces replace_this in its position in the
+   //!   tree with with_this. The tree does not need to be rebalanced.
+   //! 
+   //! <b>Complexity</b>: Constant. 
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Note</b>: This function will break container ordering invariants if
+   //!   with_this is not equivalent to *replace_this according to the
+   //!   ordering rules. This function is faster than erasing and inserting
+   //!   the node, since no rebalancing or comparison is needed.
+   void replace_node(iterator replace_this, reference with_this)
+   {  tree_.replace_node(replace_this, with_this);   }
+
+   //! <b>Effects</b>: Rebalances the tree.
+   //! 
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear.
+   void rebalance()
+   {  tree_.rebalance(); }
+
+   //! <b>Requires</b>: old_root is a node of a tree.
+   //! 
+   //! <b>Effects</b>: Rebalances the subtree rooted at old_root.
+   //!
+   //! <b>Returns</b>: The new root of the subtree.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements in the subtree.
+   iterator rebalance_subtree(iterator root)
+   {  return tree_.rebalance_subtree(root); }
+
+   //! <b>Returns</b>: The balance factor (alpha) used in this tree
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Constant.
+   float balance_factor() const
+   {  return tree_.balance_factor(); }
+
+   //! <b>Requires</b>: new_alpha must be a value between 0.5 and 1.0
+   //! 
+   //! <b>Effects</b>: Establishes a new balance factor (alpha) and rebalances
+   //!   the tree if the new balance factor is stricter (less) than the old factor.
+   //!
+   //! <b>Throws</b>: Nothing.
+   //! 
+   //! <b>Complexity</b>: Linear to the elements in the subtree.
+   void balance_factor(float new_alpha)
+   {  tree_.balance_factor(new_alpha); }
+
+   /// @cond
+   friend bool operator==(const treap_multiset_impl &x, const treap_multiset_impl &y)
+   {  return x.tree_ == y.tree_;  }
+
+   friend bool operator<(const treap_multiset_impl &x, const treap_multiset_impl &y)
+   {  return x.tree_ < y.tree_;  }
+   /// @endcond
+};
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator!=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_multiset_impl<T, Options...> &x, const treap_multiset_impl<T, Options...> &y)
+#else
+(const treap_multiset_impl<Config> &x, const treap_multiset_impl<Config> &y)
+#endif
+{  return !(x == y); }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_multiset_impl<T, Options...> &x, const treap_multiset_impl<T, Options...> &y)
+#else
+(const treap_multiset_impl<Config> &x, const treap_multiset_impl<Config> &y)
+#endif
+{  return y < x;  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator<=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_multiset_impl<T, Options...> &x, const treap_multiset_impl<T, Options...> &y)
+#else
+(const treap_multiset_impl<Config> &x, const treap_multiset_impl<Config> &y)
+#endif
+{  return !(y < x);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline bool operator>=
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(const treap_multiset_impl<T, Options...> &x, const treap_multiset_impl<T, Options...> &y)
+#else
+(const treap_multiset_impl<Config> &x, const treap_multiset_impl<Config> &y)
+#endif
+{  return !(x < y);  }
+
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+template<class T, class ...Options>
+#else
+template<class Config>
+#endif
+inline void swap
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+(treap_multiset_impl<T, Options...> &x, treap_multiset_impl<T, Options...> &y)
+#else
+(treap_multiset_impl<Config> &x, treap_multiset_impl<Config> &y)
+#endif
+{  x.swap(y);  }
+
+//! Helper metafunction to define a \c treap_multiset that yields to the same type when the
+//! same options (either explicitly or implicitly) are used.
+#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class ...Options>
+#else
+template<class T, class O1 = none, class O2 = none
+                , class O3 = none, class O4 = none>
+#endif
+struct make_treap_multiset
+{
+   /// @cond
+   typedef treap_multiset_impl
+      < typename make_treap_opt<T, 
+         #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+         O1, O2, O3, O4
+         #else
+         Options...
+         #endif
+         >::type
+      > implementation_defined;
+   /// @endcond
+   typedef implementation_defined type;
+};
+
+#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
+
+#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+template<class T, class O1, class O2, class O3, class O4>
+#else
+template<class T, class ...Options>
+#endif
+class treap_multiset
+   :  public make_treap_multiset<T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type
+{
+   typedef typename make_treap_multiset
+      <T, 
+      #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
+      O1, O2, O3, O4
+      #else
+      Options...
+      #endif
+      >::type   Base;
+
+   public:
+   typedef typename Base::value_compare      value_compare;
+   typedef typename Base::priority_compare   priority_compare;
+   typedef typename Base::value_traits       value_traits;
+   typedef typename Base::iterator           iterator;
+   typedef typename Base::const_iterator     const_iterator;
+
+   //Assert if passed value traits are compatible with the type
+   BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
+
+   treap_multiset( const value_compare &cmp = value_compare()
+                , const priority_compare &pcmp = priority_compare()
+                , const value_traits &v_traits = value_traits())
+      :  Base(cmp, pcmp, v_traits)
+   {}
+
+   template<class Iterator>
+   treap_multiset( Iterator b, Iterator e
+           , const value_compare &cmp = value_compare()
+           , const priority_compare &pcmp = priority_compare()
+           , const value_traits &v_traits = value_traits())
+      :  Base(b, e, cmp, pcmp, v_traits)
+   {}
+
+   static treap_multiset &container_from_end_iterator(iterator end_iterator)
+   {  return static_cast<treap_multiset &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static const treap_multiset &container_from_end_iterator(const_iterator end_iterator)
+   {  return static_cast<const treap_multiset &>(Base::container_from_end_iterator(end_iterator));   }
+
+   static treap_multiset &container_from_iterator(iterator it)
+   {  return static_cast<treap_multiset &>(Base::container_from_iterator(it));   }
+
+   static const treap_multiset &container_from_iterator(const_iterator it)
+   {  return static_cast<const treap_multiset &>(Base::container_from_iterator(it));   }
+};
+
+#endif
+
+} //namespace intrusive 
+} //namespace boost 
+
+#include <boost/intrusive/detail/config_end.hpp>
+
+#endif //BOOST_INTRUSIVE_TRIE_SET_HPP
similarity index 97%
rename from deal.II/contrib/boost/include/boost/intrusive/trivial_value_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/trivial_value_traits.hpp
index 3d8797e7ee49c75d40f8fe519b6232830e780289..4527d7c4c416aee87231bc08111d5e17213356ec 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 //
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
similarity index 98%
rename from deal.II/contrib/boost/include/boost/intrusive/unordered_set.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/unordered_set.hpp
index 8f1f9d14642d7cbd0467efd572b9e4f2db84a552..47d1aab5abc705c910e0e3591cce55bd3cee7a1b 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -235,7 +235,7 @@ class unordered_set_impl
    key_equal key_eq() const
    { return table_.key_eq(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: if constant-time size and cache_last options are disabled,
    //!   average constant time (worst case, with empty() == true: O(this->bucket_count()).
@@ -395,8 +395,8 @@ class unordered_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased element. No destructors are called.
-   void erase(const_iterator i)
-   {  table_.erase(i);  }
+   iterator erase(const_iterator i)
+   {  return table_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
    //! 
@@ -407,8 +407,8 @@ class unordered_set_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   void erase(const_iterator b, const_iterator e)
-   {  table_.erase(b, e);  }
+   iterator erase(const_iterator b, const_iterator e)
+   {  return table_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
    //! 
@@ -460,7 +460,11 @@ class unordered_set_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   iterator erase_and_dispose(const_iterator i, Disposer disposer)
+   iterator erase_and_dispose(const_iterator i, Disposer disposer
+                              /// @cond
+                              , typename detail::enable_if_c<!detail::is_convertible<Disposer, const_iterator>::value >::type * = 0
+                              /// @endcond
+                              )
    {  return table_.erase_and_dispose(i, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -1288,7 +1292,7 @@ class unordered_multiset_impl
    key_equal key_eq() const
    { return table_.key_eq(); }
 
-   //! <b>Effects</b>: Returns true is the container is empty.
+   //! <b>Effects</b>: Returns true if the container is empty.
    //! 
    //! <b>Complexity</b>: if constant-time size and cache_last options are disabled,
    //!   average constant time (worst case, with empty() == true: O(this->bucket_count()).
@@ -1364,9 +1368,8 @@ class unordered_multiset_impl
    //! 
    //! <b>Effects</b>: Equivalent to this->insert(t) for each element in [b, e).
    //! 
-   //! <b>Complexity</b>: Insert range is in general O(N * log(N)), where N is the
-   //!   size of the range. However, it is linear in N if the range is already sorted
-   //!   by value_comp().
+   //! <b>Complexity</b>: Average case is O(N), where N is the
+   //!   size of the range.
    //! 
    //! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
    //! 
@@ -1384,8 +1387,8 @@ class unordered_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased element. No destructors are called.
-   void erase(const_iterator i)
-   {  table_.erase(i);  }
+   iterator erase(const_iterator i)
+   {  return table_.erase(i);  }
 
    //! <b>Effects</b>: Erases the range pointed to by b end e. 
    //! 
@@ -1396,8 +1399,8 @@ class unordered_multiset_impl
    //! 
    //! <b>Note</b>: Invalidates the iterators (but not the references)
    //!    to the erased elements. No destructors are called.
-   void erase(const_iterator b, const_iterator e)
-   {  table_.erase(b, e);  }
+   iterator erase(const_iterator b, const_iterator e)
+   {  return table_.erase(b, e);  }
 
    //! <b>Effects</b>: Erases all the elements with the given value.
    //! 
@@ -1450,8 +1453,18 @@ class unordered_multiset_impl
    //! <b>Note</b>: Invalidates the iterators 
    //!    to the erased elements.
    template<class Disposer>
-   void erase_and_dispose(const_iterator i, Disposer disposer)
-   {  table_.erase_and_dispose(i, disposer);  }
+   iterator erase_and_dispose(const_iterator i, Disposer disposer
+                              /// @cond
+                              , typename detail::enable_if_c<!detail::is_convertible<Disposer, const_iterator>::value >::type * = 0
+                              /// @endcond
+                              )
+   {  return table_.erase_and_dispose(i, disposer);  }
+
+   #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   template<class Disposer>
+   iterator erase_and_dispose(const_iterator i, Disposer disposer)
+   {  return this->erase_and_dispose(const_iterator(i), disposer);   }
+   #endif
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
@@ -1466,8 +1479,8 @@ class unordered_multiset_impl
    //! <b>Note</b>: Invalidates the iterators
    //!    to the erased elements.
    template<class Disposer>
-   void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
-   {  table_.erase_and_dispose(b, e, disposer);  }
+   iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
+   {  return table_.erase_and_dispose(b, e, disposer);  }
 
    //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
    //!
similarity index 99%
rename from deal.II/contrib/boost/include/boost/intrusive/unordered_set_hook.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/intrusive/unordered_set_hook.hpp
index 0d5d4e89ebd3a63a7a4dd8aedf237e4be1c8386d..286b318f9be11ff6464df8195572ea1b8105bbe7 100644 (file)
@@ -1,7 +1,7 @@
 /////////////////////////////////////////////////////////////////////////////
 //
 // (C) Copyright Olaf Krzikalla 2004-2006.
-// (C) Copyright Ion Gaztanaga  2006-2007
+// (C) Copyright Ion Gaztanaga  2006-2009
 //
 // Distributed under the Boost Software License, Version 1.0.
 //    (See accompanying file LICENSE_1_0.txt or copy at
@@ -222,6 +222,7 @@ class unordered_set_base_hook
       >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
@@ -351,6 +352,7 @@ class unordered_set_member_hook
    >::type
 {
    #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
+   public:
    //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
    //!   initializes the node to an unlinked state.
    //! 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/intrusive_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/intrusive_ptr.hpp
new file mode 100644 (file)
index 0000000..63036dc
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
+#define BOOST_INTRUSIVE_PTR_HPP_INCLUDED
+
+//
+//  intrusive_ptr.hpp
+//
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  See http://www.boost.org/libs/smart_ptr/intrusive_ptr.html for documentation.
+//
+
+#include <boost/smart_ptr/intrusive_ptr.hpp>
+
+#endif  // #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/chain.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/chain.hpp
index faea8f8670d7fde63bf5fb54c3fb37b61ace60cd..28718fafe9dd04158b7afde32c2d0247998647bd 100644 (file)
@@ -140,6 +140,10 @@ protected:
     chain_base(const chain_base& rhs): pimpl_(rhs.pimpl_) { }
 public:
 
+    // dual_use is a pseudo-mode to facilitate filter writing, 
+    // not a genuine mode.
+    BOOST_STATIC_ASSERT((!is_convertible<mode, dual_use>::value));
+
     //----------Buffer sizing-------------------------------------------------//
 
     // Sets the size of the buffer created for the devices to be added to this
@@ -225,9 +229,9 @@ private:
     void push_impl(const T& t, int buffer_size = -1, int pback_size = -1)
     {
         typedef typename iostreams::category_of<T>::type  category;
-        typedef typename unwrap_ios<T>::type              policy_type;
+        typedef typename unwrap_ios<T>::type              component_type;
         typedef stream_buffer<
-                    policy_type,
+                    component_type,
                     BOOST_IOSTREAMS_CHAR_TRAITS(char_type),
                     Alloc, Mode
                 >                                         streambuf_t;
@@ -248,7 +252,7 @@ private:
             buf(new streambuf_t(t, buffer_size, pback_size));
         list().push_back(buf.get());
         buf.release();
-        if (is_device<policy_type>::value) {
+        if (is_device<component_type>::value) {
             pimpl_->flags_ |= f_complete | f_open;
             for ( iterator first = list().begin(),
                            last = list().end();
@@ -408,7 +412,7 @@ private:
         typedef typename traits_type::int_type         int_type; \
         typedef typename traits_type::off_type         off_type; \
         name_() { } \
-        name_(const name_& rhs) { *this = rhs; } \
+        name_(const name_& rhs) : base_type(rhs) { } \
         name_& operator=(const name_& rhs) \
         { base_type::operator=(rhs); return *this; } \
     }; \
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/close.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/close.hpp
index b17d75111646f1fb166e4904c1a64679efedaa9a..9c544a35bbd8f25dcf0f6d8b2f745dc9bc38c001 100644 (file)
@@ -99,10 +99,10 @@ void close(T& t, BOOST_IOS::openmode which)
 #ifdef BOOST_IOSTREAMS_STRICT
     assert(which == BOOST_IOS::in || which == BOOST_IOS::out);
 #else
-       if (which == (BOOST_IOS::in | BOOST_IOS::out)) {
-               detail::close_all(t);
-               return;
-       }
+    if (which == (BOOST_IOS::in | BOOST_IOS::out)) {
+        detail::close_all(t);
+        return;
+    }
 #endif
     detail::close_impl<T>::close(detail::unwrap(t), which); 
 }
@@ -113,10 +113,10 @@ void close(T& t, Sink& snk, BOOST_IOS::openmode which)
 #ifdef BOOST_IOSTREAMS_STRICT
     assert(which == BOOST_IOS::in || which == BOOST_IOS::out);
 #else
-       if (which == (BOOST_IOS::in | BOOST_IOS::out)) {
-               detail::close_all(t, snk);
-               return;
-       }
+    if (which == (BOOST_IOS::in | BOOST_IOS::out)) {
+        detail::close_all(t, snk);
+        return;
+    }
 #endif
     detail::close_impl<T>::close(detail::unwrap(t), snk, which); 
 }
@@ -212,7 +212,6 @@ struct close_impl<close_filtering_stream> {
     }
 };
 
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // Borland.
 template<>
 struct close_impl<closable_tag> {
     template<typename T>
similarity index 97%
rename from deal.II/contrib/boost/include/boost/iostreams/code_converter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/code_converter.hpp
index f9f6c2af6728273cfe28112c04416db580b0b1a1..39526961550fd79d4f296c1957e867b4b2ca6999 100644 (file)
@@ -138,8 +138,8 @@ struct code_converter_impl {
                 is_direct<Device>,
                 direct_adapter<Device>,
                 Device
-            >::type                                         policy_type;
-    typedef optional< concept_adapter<policy_type> >        storage_type;
+            >::type                                         device_type;
+    typedef optional< concept_adapter<device_type> >        storage_type;
     typedef is_convertible<device_category, two_sequence>   is_double;
     typedef conversion_buffer<Codecvt, Alloc>               buffer_type;
 
@@ -168,7 +168,7 @@ struct code_converter_impl {
             buf_.second().resize(buffer_size);
             buf_.second().set(0, 0);
         }
-        dev_.reset(concept_adapter<policy_type>(dev));
+        dev_.reset(concept_adapter<device_type>(dev));
         flags_ = f_open;
     }
 
@@ -200,7 +200,7 @@ struct code_converter_impl {
 
     bool is_open() const { return (flags_ & f_open) != 0;}
 
-    policy_type& dev() { return **dev_; }
+    device_type& dev() { return **dev_; }
 
     enum flag_type {
         f_open             = 1,
@@ -243,7 +243,7 @@ private:
     typedef detail::code_converter_impl<
                 Device, Codecvt, Alloc
             >                                                       impl_type;
-    typedef typename impl_type::policy_type                         policy_type;
+    typedef typename impl_type::device_type                         device_type;
     typedef typename impl_type::buffer_type                         buffer_type;
     typedef typename detail::codecvt_holder<Codecvt>::codecvt_type  codecvt_type;
     typedef typename detail::codecvt_intern<Codecvt>::type          intern_type;
@@ -298,7 +298,7 @@ private:
     }
 
     const codecvt_type& cvt() { return impl().cvt_.get(); }
-    policy_type& dev() { return impl().dev(); }
+    device_type& dev() { return impl().dev(); }
     buffer_type& in() { return impl().buf_.first(); }
     buffer_type& out() { return impl().buf_.second(); }
     impl_type& impl() { return *this->pimpl_; }
similarity index 92%
rename from deal.II/contrib/boost/include/boost/iostreams/combine.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/combine.hpp
index fc7f7c795791517de9288faf505031680042278f..250de2a65bfda9418da9eded9ea86aa35ebf1a1a 100644 (file)
@@ -45,6 +45,10 @@ namespace detail {
 //
 template<typename Source, typename Sink>
 class combined_device {
+private:
+    typedef typename category_of<Source>::type  in_category;
+    typedef typename category_of<Sink>::type    out_category;
+    typedef typename char_type_of<Sink>::type   sink_char_type;
 public:
     typedef typename char_type_of<Source>::type char_type;
     struct category
@@ -53,6 +57,11 @@ public:
           closable_tag, 
           localizable_tag
         { };
+    BOOST_STATIC_ASSERT(is_device<Source>::value);
+    BOOST_STATIC_ASSERT(is_device<Sink>::value);
+    BOOST_STATIC_ASSERT((is_convertible<in_category, input>::value));
+    BOOST_STATIC_ASSERT((is_convertible<out_category, output>::value));
+    BOOST_STATIC_ASSERT((is_same<char_type, sink_char_type>::value));
     combined_device(const Source& src, const Sink& snk);
     std::streamsize read(char_type* s, std::streamsize n);
     std::streamsize write(const char_type* s, std::streamsize n);
@@ -61,8 +70,6 @@ public:
         void imbue(const std::locale& loc);
     #endif
 private:
-    typedef typename char_type_of<Sink>::type sink_char_type;
-    BOOST_STATIC_ASSERT((is_same<char_type, sink_char_type>::value));
     Source  src_;
     Sink    sink_;
 };
@@ -81,6 +88,7 @@ class combined_filter {
 private:
     typedef typename category_of<InputFilter>::type    in_category;
     typedef typename category_of<OutputFilter>::type   out_category;
+    typedef typename char_type_of<OutputFilter>::type  output_char_type;
 public:
     typedef typename char_type_of<InputFilter>::type   char_type;
     struct category 
@@ -88,6 +96,11 @@ public:
           closable_tag, 
           localizable_tag
         { };
+    BOOST_STATIC_ASSERT(is_filter<InputFilter>::value);
+    BOOST_STATIC_ASSERT(is_filter<OutputFilter>::value);
+    BOOST_STATIC_ASSERT((is_convertible<in_category, input>::value));
+    BOOST_STATIC_ASSERT((is_convertible<out_category, output>::value));
+    BOOST_STATIC_ASSERT((is_same<char_type, output_char_type>::value));
     combined_filter(const InputFilter& in, const OutputFilter& out);
 
     template<typename Source>
@@ -120,8 +133,6 @@ public:
         void imbue(const std::locale& loc);
     #endif
 private:
-    typedef typename char_type_of<OutputFilter>::type  output_char_type;
-    BOOST_STATIC_ASSERT((is_same<char_type, output_char_type>::value));
     InputFilter   in_;
     OutputFilter  out_;
 };
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/compose.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/compose.hpp
index 167a0472757bd1e603903f1371b9175e4044b0af..5bc5702ea9078b67516d311e875e980c18f60210 100644 (file)
@@ -74,6 +74,8 @@ private:
                 is_std_io<Device>,  Device&,
                 else_,              Device
             >::type                                         value_type;
+    BOOST_STATIC_ASSERT(is_filter<Filter>::value);
+    BOOST_STATIC_ASSERT(is_device<Device>::value);
 public:
     typedef typename char_type_of<Filter>::type             char_type;
     struct category
@@ -140,6 +142,8 @@ private:
         !(is_convertible<first_mode, output>::value) ||
          (is_convertible<first_mode, dual_use>::value)
     );
+    BOOST_STATIC_ASSERT(is_filter<Filter1>::value);
+    BOOST_STATIC_ASSERT(is_filter<Filter2>::value);
 public:
     typedef typename char_type_of<Filter1>::type  char_type;
     struct category
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/adapter/mode_adapter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/adapter/mode_adapter.hpp
index e75aa9fdad5fd69758128b6bbebf2ebf7be7b6b2..91fd97fbd455c1f353584182bcaadd4a48100264 100644 (file)
@@ -31,7 +31,7 @@ class mode_adapter {
 private:
     struct empty_base { };
 public:
-    typedef typename wrapped_type<T>::type  policy_type;
+    typedef typename wrapped_type<T>::type  component_type;
     typedef typename char_type_of<T>::type  char_type;
     struct category 
         : Mode, 
@@ -43,7 +43,7 @@ public:
           #endif
           localizable_tag
         { };
-    explicit mode_adapter(const policy_type& t) : t_(t) { }
+    explicit mode_adapter(const component_type& t) : t_(t) { }
 
         // Device member functions.
 
@@ -88,7 +88,7 @@ public:
     void imbue(const Locale& loc)
     { iostreams::imbue(t_, loc); }
 private:
-    policy_type t_;
+    component_type t_;
 };
                     
 //------------------Implementation of mode_adapter----------------------------//
similarity index 99%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/broken_overload_resolution/stream.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/broken_overload_resolution/stream.hpp
index 5fb5ff997c8bd232641e38414804eb2191d752b4..834f996f40e919a82cd18e5be66e1c5c9c788965 100644 (file)
@@ -35,7 +35,6 @@ private:
             detail::stream_traits<
                 Device, Tr
             >::stream_type                       stream_type;
-    typedef Device                               policy_type;
 public:
     stream() { }
     template<typename U0>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp
index a2c9c77873c02c5417bdfc13a1ec2b0609e8b6ca..5f98b2151d0ef3463dc34fc3dd292d659daef6c3 100644 (file)
@@ -35,7 +35,6 @@ private:
             detail::stream_buffer_traits<
                 T, Tr, Alloc, Mode
             >::type                           base_type;
-    typedef T                                 policy_type;
 public:
     typedef typename char_type_of<T>::type    char_type;
     struct category 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/buffer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/buffer.hpp
index 5ba9041b8510194abe8c995c4a765c48371410ff..f6b6f5cf07302da942a97f56ac4a64aa49b77375 100644 (file)
@@ -104,11 +104,6 @@ public:
             iostreams::read(src, this->data() + keep, this->size() - keep);
         if (result != -1)
             this->set(0, keep + result);
-        //return result == this->size() - keep ?
-        //    traits_type::good() :
-        //    keep == -1 ?
-        //        traits_type::eof() :
-        //        traits_type::would_block();
         return result == -1 ?
             traits_type::eof() :
                 result == 0 ?
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/codecvt_helper.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/codecvt_helper.hpp
index afd03779f1a9e944e138176d8a1a2afcd495484c..deb4e3068371383ba7ceba9a7c7c2b27387b3e4a 100644 (file)
@@ -134,8 +134,7 @@ protected:
     }
 
     std::codecvt_base::result
-    virtual do_unshift( State& state, Extern* first2, Extern* last2, 
-                        Extern*& next2 ) const
+    virtual do_unshift(State&, Extern*, Extern*, Extern*&) const
     {
         return std::codecvt_base::ok;
     }
@@ -146,7 +145,7 @@ protected:
 
     virtual int do_encoding() const throw() { return 1; }
 
-    virtual int do_length( BOOST_IOSTREAMS_CODECVT_CV_QUALIFIER State& state
+    virtual int do_length( BOOST_IOSTREAMS_CODECVT_CV_QUALIFIER State&, 
                            const Extern* first1, const Extern* last1,
                            std::size_t len2 ) const throw()
     {
similarity index 90%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/config/disable_warnings.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/disable_warnings.hpp
index 0109d974527f82c9142fdd77bf1b588487cb7d44..ef25cdb907ac4f51e6b9bd22512e33e85b1cc1f4 100644 (file)
@@ -16,6 +16,9 @@
 # pragma warning(disable:4244)    // Conversion: possible loss of data.
 # pragma warning(disable:4512)    // Assignment operator could not be generated.
 # pragma warning(disable:4706)    // Assignment within conditional expression.
+# if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#  pragma warning(disable:6334)   // sizeof applied to an expression with an operator.
+# endif
 #else
 # if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
 #  pragma warn -8008     // Condition always true/false.
similarity index 93%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/config/rtl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/config/rtl.hpp
index abe3438bbf1d51433c6692fd65b94dabfeeb925a..6995a50bbbd4285c9167445b08e63802a2855efb 100644 (file)
 
 #  define BOOST_IOSTREAMS_FD_SEEK      lseek64
 #  define BOOST_IOSTREAMS_FD_TRUNCATE  ftruncate64
+#  define BOOST_IOSTREAMS_FD_MMAP      mmap64
 #  define BOOST_IOSTREAMS_FD_STAT      stat64
+#  define BOOST_IOSTREAMS_FD_FSTAT     fstat64
 #  define BOOST_IOSTREAMS_FD_OFFSET    off64_t
 # else
 #  define BOOST_IOSTREAMS_FD_SEEK      lseek
 #  define BOOST_IOSTREAMS_FD_TRUNCATE  ftruncate
+#  define BOOST_IOSTREAMS_FD_MMAP      mmap
 #  define BOOST_IOSTREAMS_FD_STAT      stat
+#  define BOOST_IOSTREAMS_FD_FSTAT     fstat
 #  define BOOST_IOSTREAMS_FD_OFFSET    off_t
 # endif
 #endif
similarity index 93%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/current_directory.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/current_directory.hpp
index f9fb690cc67d244010430da046ed541c2a2f2e74..374444c59f10d54ec39a37c08d7449ef0c42a6ed 100644 (file)
@@ -30,6 +30,9 @@
 # include <unistd.h>        // sysconf.
 #endif
 
+// Must come last.
+#include <boost/iostreams/detail/config/disable_warnings.hpp>
+
 namespace boost { namespace iostreams { namespace detail {
 
 // Returns the current working directory
@@ -57,4 +60,6 @@ inline std::string current_directory()
 
 } } } // End namespaces detail, iostreams, boost.
 
+#include <boost/iostreams/detail/config/enable_warnings.hpp>
+
 #endif // #ifndef BOOST_IOSTREAMS_DETAIL_CURRENT_DIRECTORY_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/file_handle.hpp b/deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/file_handle.hpp
new file mode 100644 (file)
index 0000000..d797efb
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * 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.)
+ * 
+ * See http://www.boost.org/libs/iostreams for documentation.
+ *
+ * File:        boost/iostreams/detail/file_handle.hpp
+ * Date:        Sun Jun 22 14:23:12 MDT 2008
+ * Copyright:   2008 CodeRage, LLC
+ * Author:      Jonathan Turkanis
+ * Contact:     turkanis at coderage dot com
+ *
+ * Defines the type boost::iostreams::detail::file_handle, representing an
+ * operating system file handle.
+ */
+
+#ifndef BOOST_IOSTREAMS_DETAIL_FILE_HANDLE_HPP_INCLUDED
+#define BOOST_IOSTREAMS_DETAIL_FILE_HANDLE_HPP_INCLUDED
+
+#include <boost/iostreams/detail/config/windows_posix.hpp>
+
+namespace boost { namespace iostreams { namespace detail {
+
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    typedef void*  file_handle;  // A.k.a. HANDLE
+#else
+    typedef int    file_handle;
+#endif
+
+} } } // End namespaces detail, iostreams, boost.
+
+#endif // #ifndef BOOST_IOSTREAMS_DETAIL_FILE_HANDLE_HPP_INCLUDED
similarity index 66%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/forward.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/forward.hpp
index 527d4e7a3fe34fd4806904e71230c0ac18e632db..0ff2a35a9885f4ee4297866635afe45e59a30188 100644 (file)
@@ -12,7 +12,7 @@
 # pragma once
 #endif                  
  
-#include <boost/config.hpp> // BOOST_MSVC
+#include <boost/config.hpp> // BOOST_MSVC, BOOST_NO_SFINAE
 #include <boost/detail/workaround.hpp>
 #include <boost/iostreams/detail/config/limits.hpp>
 #include <boost/iostreams/detail/push_params.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
 #include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/type_traits/is_same.hpp>
 
 //------Macros for defining forwarding constructors and open overloads--------//
     
 //
-// Macro: BOOST_IOSTREAMS_DEFINE_FORWARDING_FUNCTIONS(mode, name, helper).
+// Macro: BOOST_IOSTREAMS_FORWARD(class, impl, device, params, args)
 // Description: Defines constructors and overloads of 'open' which construct
-//      a device using the given argument list and pass it to 'open_impl'. 
-//      Assumes that 'policy_type' is an alias for the device type.
-//      Not supported on Intel 7.1 and VC6.5.
+//      a device using the specified argument list and pass it to the specified
+//      helper function
+//   class - The class name
+//   impl - The helper function
+//   device - The device type
+//   params - The list of formal parameters trailing the device parameter in
+//     the helper function's signature
+//   params - The list of arguments passed to the helper function, following the
+//     device argument
 //
-#define BOOST_IOSTREAMS_FORWARD(class, impl, policy, params, args) \
-    class(const policy& t params()) \
+#define BOOST_IOSTREAMS_FORWARD(class, impl, device, params, args) \
+    class(const device& t params()) \
     { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
-    class(policy& t params()) \
+    class(device& t params()) \
     { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
-    class(const ::boost::reference_wrapper<policy>& ref params()) \
+    class(const ::boost::reference_wrapper<device>& ref params()) \
     { this->impl(ref args()); } \
-    void open(const policy& t params()) \
+    void open(const device& t params()) \
     { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
-    void open(policy& t params()) \
+    void open(device& t params()) \
     { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
-    void open(const ::boost::reference_wrapper<policy>& ref params()) \
+    void open(const ::boost::reference_wrapper<device>& ref params()) \
     { this->impl(ref args()); } \
     BOOST_PP_REPEAT_FROM_TO( \
         1, BOOST_PP_INC(BOOST_IOSTREAMS_MAX_FORWARDING_ARITY), \
-        BOOST_IOSTREAMS_FORWARDING_CTOR, (class, impl, policy) \
+        BOOST_IOSTREAMS_FORWARDING_CTOR, (class, impl, device) \
     ) \
     BOOST_PP_REPEAT_FROM_TO( \
         1, BOOST_PP_INC(BOOST_IOSTREAMS_MAX_FORWARDING_ARITY), \
-        BOOST_IOSTREAMS_FORWARDING_FN, (class, impl, policy) \
+        BOOST_IOSTREAMS_FORWARDING_FN, (class, impl, device) \
     ) \
     /**/
 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
@@ -61,7 +68,8 @@
               BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), typename U) > \
     BOOST_PP_TUPLE_ELEM(3, 0, tuple) \
     ( U100& u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
-      BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u)) \
+      BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u) \
+      BOOST_IOSTREAMS_DISABLE_IF_SAME(U100, BOOST_PP_TUPLE_ELEM(3, 2, tuple))) \
     { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
       ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
         ( u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
@@ -72,7 +80,8 @@
               BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), typename U) > \
     void open \
     ( U100& u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
-      BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u)) \
+      BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u) \
+      BOOST_IOSTREAMS_DISABLE_IF_SAME(U100, BOOST_PP_TUPLE_ELEM(3, 2, tuple))) \
     { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
       ( u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
         BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), u) ); } \
@@ -84,7 +93,8 @@
 #define BOOST_IOSTREAMS_FORWARDING_CTOR(z, n, tuple) \
     template<BOOST_PP_ENUM_PARAMS_Z(z, n, typename U)> \
     BOOST_PP_TUPLE_ELEM(3, 0, tuple) \
-    (BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u)) \
+    (BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u) \
+      BOOST_IOSTREAMS_DISABLE_IF_SAME(U0, BOOST_PP_TUPLE_ELEM(3, 2, tuple))) \
     { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
       ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
         (BOOST_PP_ENUM_PARAMS_Z(z, n, u)) ); } \
     /**/
 #define BOOST_IOSTREAMS_FORWARDING_FN(z, n, tuple) \
     template<BOOST_PP_ENUM_PARAMS_Z(z, n, typename U)> \
-    void open(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u)) \
+    void open(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u) \
+      BOOST_IOSTREAMS_DISABLE_IF_SAME(U0, BOOST_PP_TUPLE_ELEM(3, 2, tuple))) \
     { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
       ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
         (BOOST_PP_ENUM_PARAMS_Z(z, n, u)) ); } \
     BOOST_IOSTREAMS_FORWARDING_FN_I(z, n, tuple) \
     /**/
 
+// Disable forwarding constructors if first parameter type is the same
+// as the device type
+#if !defined(BOOST_NO_SFINAE) && \
+    !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+# define BOOST_IOSTREAMS_DISABLE_IF_SAME(device, param) \
+    , typename boost::disable_if< boost::is_same<device, param> >::type* = 0 \
+    /**/
+#else 
+# define BOOST_IOSTREAMS_DISABLE_IF_SAME(device, param)
+#endif
+
 #endif // #ifndef BOOST_IOSTREAMS_DETAIL_FORWARD_HPP_INCLUDED
similarity index 86%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/is_iterator_range.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/is_iterator_range.hpp
index b2c3e9458459ba8648ea3b3047a8649ea8df3f4f..ac610640220c5d3d66be0bf24f92b2df8bffc1f9 100644 (file)
@@ -8,8 +8,13 @@
 #ifndef BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED
 #define BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED       
  
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
 #include <boost/iostreams/detail/bool_trait_def.hpp>
 
+// Must come last.
+#include <boost/iostreams/detail/config/disable_warnings.hpp>
+
 namespace boost { 
 
 # if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) //---------------------------------//
@@ -39,4 +44,6 @@ namespace iostreams {
 
 } // End namespace boost.
 
+#include <boost/iostreams/detail/config/enable_warnings.hpp>
+
 #endif // #ifndef BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/path.hpp b/deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/path.hpp
new file mode 100644 (file)
index 0000000..af64c30
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * 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.)
+ * 
+ * See http://www.boost.org/libs/iostreams for documentation.
+ *
+ * File:        boost/iostreams/detail/path.hpp
+ * Date:        Sat Jun 21 21:24:05 MDT 2008
+ * Copyright:   2008 CodeRage, LLC
+ * Author:      Jonathan Turkanis
+ * Contact:     turkanis at coderage dot com
+ *
+ * Defines the class boost::iostreams::detail::path, for storing a 
+ * a std::string or std::wstring.
+ *
+ * This class allows interoperability with Boost.Filesystem without
+ * creating a dependence on Boost.Filesystem headers or implementation.
+ */
+
+#ifndef BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
+#define BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
+
+#include <cstring>
+#include <string>
+#include <boost/iostreams/detail/config/wide_streams.hpp>
+#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
+# include <cwchar>
+#endif
+#include <boost/static_assert.hpp>
+#include <boost/type.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost { namespace iostreams { namespace detail {
+
+#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //------------------------------------//
+
+class path {
+public:
+
+    // Default constructor
+    path() : narrow_(), wide_(), is_wide_(false) { }
+
+    // Constructor taking a std::string
+    path(const std::string& p) : narrow_(p), wide_(), is_wide_(false) { }
+
+    // Constructor taking a C-style string
+    path(const char* p) : narrow_(p), wide_(), is_wide_(false) { }
+
+    // Constructor taking a boost::filesystem::path or boost::filesystem::wpath
+    template<typename Path>
+    explicit path(const Path& p)
+    {
+        typedef typename Path::external_string_type string_type;
+        init(p, boost::type<string_type>());
+    }
+
+    // Copy constructor
+    path(const path& p) 
+        : narrow_(p.narrow_), wide_(p.wide_), is_wide_(p.is_wide_) 
+        { }
+
+    // Assignment operator taking another path
+    path& operator=(const path& p)
+    {
+        narrow_ = p.narrow_;
+        wide_ = p.wide_;
+        is_wide_ = p.is_wide_;
+        return *this;
+    }
+
+    // Assignment operator taking a std::string
+    path& operator=(const std::string& p)
+    {
+        narrow_ = p;
+        wide_.clear();
+        is_wide_ = false;
+        return *this;
+    }
+
+    // Assignment operator taking a C-style string
+    path& operator=(const char* p)
+    {
+        narrow_.assign(p);
+        wide_.clear();
+        is_wide_ = false;
+        return *this;
+    }
+
+    // Assignment operator taking a Boost.Filesystem path
+    template<typename Path>
+    path& operator=(const Path& p)
+    {
+        typedef typename Path::external_string_type string_type;
+        init(p, boost::type<string_type>());
+        return *this;
+    }
+
+    bool is_wide() const { return is_wide_; }
+
+    // Returns a representation of the underlying path as a std::string
+    // Requires: is_wide() returns false
+    const char* c_str() const { return narrow_.c_str(); }
+
+    // Returns a representation of the underlying path as a std::wstring
+    // Requires: is_wide() returns true
+    const wchar_t* c_wstr() const { return wide_.c_str(); }
+private:
+    
+    // For wide-character paths, use a boost::filesystem::wpath instead of a
+    // std::wstring
+    path(const std::wstring&);
+    path& operator=(const std::wstring&);
+
+    template<typename Path>
+    void init(const Path& p, boost::type<std::string>)
+    {
+        narrow_ = p.external_file_string();
+        wide_.clear();
+        is_wide_ = false;
+    }
+
+    template<typename Path>
+    void init(const Path& p, boost::type<std::wstring>)
+    {
+        narrow_.clear();
+        wide_ = p.external_file_string();
+        is_wide_ = true;
+    }
+
+    std::string   narrow_;
+    std::wstring  wide_;
+    bool          is_wide_;
+};
+
+inline bool operator==(const path& lhs, const path& rhs)
+{
+    return lhs.is_wide() ?
+        rhs.is_wide() && std::wcscmp(lhs.c_wstr(), rhs.c_wstr()) == 0 :
+        !rhs.is_wide() && std::strcmp(lhs.c_str(), rhs.c_str()) == 0;
+}
+
+#else // #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //---------------------------//
+
+class path {
+public:
+    path() { }
+    path(const std::string& p) : path_(p) { }
+    path(const char* p) : path_(p) { }
+    template<typename Path>
+        path(const Path& p) : path_(p.external_file_string()) { }
+    path(const path& p) : path_(p.path_) { }
+    path& operator=(const path& other) 
+    {
+        path_ = other.path_;
+        return *this;
+    }
+    path& operator=(const std::string& p) 
+    {
+        path_ = p;
+        return *this;
+    }
+    path& operator=(const char* p) 
+    {
+        path_ = p;
+        return *this;
+    }
+    template<typename Path>
+        path& operator=(const Path& p)
+        {
+            path_ = p.external_file_string();
+            return *this;
+        }
+    bool is_wide() const { return false; }
+    const char* c_str() const { return path_.c_str(); }
+    const wchar_t* c_wstr() const { return 0; }
+private:
+    std::string path_;
+};
+
+inline bool operator==(const path& lhs, const path& rhs)
+{
+    return std::strcmp(lhs.c_str(), rhs.c_str()) == 0 ;
+}
+
+#endif // #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS //--------------------------//
+
+} } } // End namespaces detail, iostreams, boost.
+
+#endif // #ifndef BOOST_IOSTREAMS_DETAIL_PATH_HPP_INCLUDED
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/restrict_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/restrict_impl.hpp
index 6e4662496cc2fd0fa9553200da0e8d745f9184f0..611b50cc0fdd23081332bba1cf21e8cf1ff305a9 100644 (file)
@@ -184,7 +184,7 @@ public:
                 bad_seek();
             return offset_to_position(pos_ - beg_);
         }
-        if (next < beg_ || end_ != -1 && next >= end_)
+        if (next < beg_ || (end_ != -1 && next >= end_))
             bad_seek();
         pos_ = this->component().seek(dev, next, BOOST_IOS::cur);
         return offset_to_position(pos_ - beg_);
@@ -296,7 +296,7 @@ std::streampos restricted_indirect_device<Device>::seek
             bad_seek();
         return offset_to_position(pos_ - beg_);
     }
-    if (next < beg_ || end_ != -1 && next >= end_)
+    if (next < beg_ || (end_ != -1 && next >= end_))
         bad_seek();
     pos_ = iostreams::seek(this->component(), next - pos_, BOOST_IOS::cur);
     return offset_to_position(pos_ - beg_);
@@ -312,7 +312,7 @@ restricted_direct_device<Device>::restricted_direct_device
     std::pair<char_type*, char_type*> seq =
         sequence(is_convertible<category, input>());
     if ( off < 0 || len < -1 || 
-         len != -1 && off + len > seq.second - seq.first )
+         (len != -1 && off + len > seq.second - seq.first) )
     {
         throw BOOST_IOSTREAMS_FAILURE("bad offset");
     }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/direct_streambuf.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/direct_streambuf.hpp
index 605989559aa4c523de53900b9dd62dd728e2d937..8872e0f63c83e80c859894eaae9d036810ebd8ce 100644 (file)
@@ -220,7 +220,7 @@ typename direct_streambuf<T, Tr>::pos_type direct_streambuf<T, Tr>::seek_impl
     bool one = one_head();
     if (one && (pptr() != 0 || gptr()== 0))
         init_get_area(); // Switch to input mode, for code reuse.
-    if (one || (which & BOOST_IOS::in) != 0 && ibeg_ != 0) {
+    if (one || ((which & BOOST_IOS::in) != 0 && ibeg_ != 0)) {
         if (!gptr()) setg(ibeg_, ibeg_, iend_);
         ptrdiff_t next = 0;
         switch (way) {
similarity index 99%
rename from deal.II/contrib/boost/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/detail/streambuf/indirect_streambuf.hpp
index 4744b5a3641d726c2bb50c9b83edbd1734142429..bb43050b6b470e07e38e78ba19b896b11d5248f7 100644 (file)
@@ -282,8 +282,8 @@ template<typename T, typename Tr, typename Alloc, typename Mode>
 typename indirect_streambuf<T, Tr, Alloc, Mode>::int_type
 indirect_streambuf<T, Tr, Alloc, Mode>::overflow(int_type c)
 {
-    if ( output_buffered() && pptr() == 0 ||
-         shared_buffer() && gptr() != 0 )
+    if ( (output_buffered() && pptr() == 0) ||
+         (shared_buffer() && gptr() != 0) )
     {
         init_put_area();
     }
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/device/file.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/file.hpp
index 685077647c50ee51537afc1c4684379d605e843e..0cbc152ae3dbb1596babff7393f39a76ad81a7f1 100644 (file)
@@ -5,14 +5,6 @@
 
 // See http://www.boost.org/libs/iostreams for documentation.
 
-//
-// Contains wrappers for standard file buffers, together
-// with convenience typedefs:
-//      - basic_file_source
-//      - basic_file_sink
-//      - basic_file
-//
-
 #ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
 #define BOOST_IOSTREAMS_FILE_HPP_INCLUDED
 
@@ -51,6 +43,7 @@ public:
                 BOOST_IOS::openmode base_mode =
                     BOOST_IOS::in | BOOST_IOS::out );
     std::streamsize read(char_type* s, std::streamsize n);
+    bool putback(char_type c);
     std::streamsize write(const char_type* s, std::streamsize n);
     std::streampos seek( stream_offset off, BOOST_IOS::seekdir way, 
                          BOOST_IOS::openmode which = 
@@ -87,6 +80,7 @@ struct basic_file_source : private basic_file<Ch> {
           closable_tag
         { };
     using basic_file<Ch>::read;
+    using basic_file<Ch>::putback;
     using basic_file<Ch>::seek;
     using basic_file<Ch>::is_open;
     using basic_file<Ch>::close;
@@ -149,6 +143,12 @@ inline std::streamsize basic_file<Ch>::read
     return result != 0 ? result : -1;
 }
 
+template<typename Ch>
+inline bool basic_file<Ch>::putback(char_type c)
+{ 
+    return !!pimpl_->file_.sputbackc(c); 
+}
+
 template<typename Ch>
 inline std::streamsize basic_file<Ch>::write
     (const char_type* s, std::streamsize n)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/file_descriptor.hpp b/deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/file_descriptor.hpp
new file mode 100644 (file)
index 0000000..9615ba1
--- /dev/null
@@ -0,0 +1,264 @@
+// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
+// (C) Copyright 2003-2007 Jonathan Turkanis
+// 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.)
+
+// See http://www.boost.org/libs/iostreams for documentation.
+
+// Inspired by fdstream.hpp, (C) Copyright Nicolai M. Josuttis 2001,
+// available at http://www.josuttis.com/cppcode/fdstream.html.
+
+#ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
+#define BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <string>
+#include <boost/cstdint.hpp>               // intmax_t.
+#include <boost/iostreams/categories.hpp>  // tags.
+#include <boost/iostreams/detail/config/auto_link.hpp>
+#include <boost/iostreams/detail/config/dyn_link.hpp>
+#include <boost/iostreams/detail/config/windows_posix.hpp>
+#include <boost/iostreams/detail/file_handle.hpp>
+#include <boost/iostreams/detail/ios.hpp>  // openmode, seekdir, int types.
+#include <boost/iostreams/detail/path.hpp>
+#include <boost/iostreams/positioning.hpp>
+#include <boost/shared_ptr.hpp>
+
+// Must come last.
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost { namespace iostreams {
+
+// Forward declarations
+class file_descriptor_source;
+class file_descriptor_sink;
+namespace detail { struct file_descriptor_impl; }
+
+class BOOST_IOSTREAMS_DECL file_descriptor {
+public:
+    friend class file_descriptor_source;
+    friend class file_descriptor_sink;
+    typedef detail::file_handle  handle_type;
+    typedef char                 char_type;
+    struct category
+        : seekable_device_tag,
+          closable_tag
+        { };
+
+    // Default constructor
+    file_descriptor();
+
+    // Constructors taking file desciptors
+    explicit file_descriptor(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    explicit file_descriptor(int fd, bool close_on_exit = false);
+#endif
+
+    // Constructor taking a std:: string
+    explicit file_descriptor( const std::string& path,
+                              BOOST_IOS::openmode mode =
+                                  BOOST_IOS::in | BOOST_IOS::out );
+
+    // Constructor taking a C-style string
+    explicit file_descriptor( const char* path,
+                              BOOST_IOS::openmode mode =
+                                  BOOST_IOS::in | BOOST_IOS::out );
+
+    // Constructor taking a Boost.Filesystem path
+    template<typename Path>
+    explicit file_descriptor( const Path& path,
+                              BOOST_IOS::openmode mode =
+                                  BOOST_IOS::in | BOOST_IOS::out )
+    { 
+        init();
+        open(detail::path(path), mode); 
+    }
+
+    // Copy constructor
+    file_descriptor(const file_descriptor& other);
+
+    // open overloads taking file descriptors
+    void open(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    void open(int fd, bool close_on_exit = false);
+#endif
+
+    // open overload taking a std::string
+    void open( const std::string& path,
+               BOOST_IOS::openmode mode =
+                   BOOST_IOS::in | BOOST_IOS::out );
+
+    // open overload taking C-style string
+    void open( const char* path,
+               BOOST_IOS::openmode mode =
+                   BOOST_IOS::in | BOOST_IOS::out );
+
+    // open overload taking a Boost.Filesystem path
+    template<typename Path>
+    void open( const Path& path,
+               BOOST_IOS::openmode mode =
+                   BOOST_IOS::in | BOOST_IOS::out )
+    { open(detail::path(path), mode); }
+
+    bool is_open() const;
+    void close();
+    std::streamsize read(char_type* s, std::streamsize n);
+    std::streamsize write(const char_type* s, std::streamsize n);
+    std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
+    handle_type handle() const;
+private:
+    void init();
+
+    // open overload taking a detail::path
+    void open( const detail::path& path, 
+               BOOST_IOS::openmode, 
+               BOOST_IOS::openmode = BOOST_IOS::in | BOOST_IOS::out );
+
+    typedef detail::file_descriptor_impl impl_type;
+    shared_ptr<impl_type> pimpl_;
+};
+
+class file_descriptor_source : private file_descriptor {
+public:
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    typedef void*  handle_type;  // A.k.a HANDLE
+#else
+    typedef int    handle_type;
+#endif
+    typedef char   char_type;
+    struct category
+      : input_seekable,
+        device_tag,
+        closable_tag
+      { };
+    using file_descriptor::is_open;
+    using file_descriptor::close;
+    using file_descriptor::read;
+    using file_descriptor::seek;
+    using file_descriptor::handle;
+
+    // Default constructor
+    file_descriptor_source() { }
+
+    // Constructors taking file desciptors
+    explicit file_descriptor_source(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    explicit file_descriptor_source(int fd, bool close_on_exit = false);
+#endif
+
+    // Constructor taking a std:: string
+    explicit file_descriptor_source( const std::string& path,
+                                     BOOST_IOS::openmode mode = BOOST_IOS::in );
+
+    // Constructor taking a C-style string
+    explicit file_descriptor_source( const char* path,
+                                     BOOST_IOS::openmode mode = BOOST_IOS::in );
+
+    // Constructor taking a Boost.Filesystem path
+    template<typename Path>
+    explicit file_descriptor_source( const Path& path,
+                                     BOOST_IOS::openmode mode = BOOST_IOS::in )
+    { open(detail::path(path), mode); }
+
+    // Copy constructor
+    file_descriptor_source(const file_descriptor_source& other);
+
+    // open overloads taking file descriptors
+    void open(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    void open(int fd, bool close_on_exit = false);
+#endif
+
+    // open overload taking a std::string
+    void open(const std::string& path, BOOST_IOS::openmode mode = BOOST_IOS::in);
+
+    // open overload taking C-style string
+    void open(const char* path, BOOST_IOS::openmode mode = BOOST_IOS::in);
+
+    // open overload taking a Boost.Filesystem path
+    template<typename Path>
+    void open(const Path& path, BOOST_IOS::openmode mode = BOOST_IOS::in);
+private:
+
+    // open overload taking a detail::path
+    void open(const detail::path& path, BOOST_IOS::openmode);
+};
+
+class file_descriptor_sink : private file_descriptor {
+public:
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    typedef void*  handle_type;  // A.k.a HANDLE
+#else
+    typedef int    handle_type;
+#endif
+    typedef char   char_type;
+    struct category
+      : output_seekable,
+        device_tag,
+        closable_tag
+      { };
+    using file_descriptor::is_open;
+    using file_descriptor::close;
+    using file_descriptor::write;
+    using file_descriptor::seek;
+    using file_descriptor::handle;
+
+    // Default constructor
+    file_descriptor_sink() { }
+
+    // Constructors taking file desciptors
+    explicit file_descriptor_sink(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    explicit file_descriptor_sink(int fd, bool close_on_exit = false);
+#endif
+
+    // Constructor taking a std:: string
+    explicit file_descriptor_sink( const std::string& path,
+                                   BOOST_IOS::openmode mode = BOOST_IOS::out );
+
+    // Constructor taking a C-style string
+    explicit file_descriptor_sink( const char* path,
+                                   BOOST_IOS::openmode mode = BOOST_IOS::out );
+
+    // Constructor taking a Boost.Filesystem path
+    template<typename Path>
+    explicit file_descriptor_sink( const Path& path,
+                                   BOOST_IOS::openmode mode = BOOST_IOS::out )
+    { open(detail::path(path), mode); }
+
+    // Copy constructor
+    file_descriptor_sink(const file_descriptor_sink& other);
+
+    // open overloads taking file descriptors
+    void open(handle_type fd, bool close_on_exit = false);
+#ifdef BOOST_IOSTREAMS_WINDOWS
+    void open(int fd, bool close_on_exit = false);
+#endif
+
+    // open overload taking a std::string
+    void open( const std::string& path, 
+               BOOST_IOS::openmode mode = BOOST_IOS::out );
+
+    // open overload taking C-style string
+    void open( const char* path, 
+               BOOST_IOS::openmode mode = BOOST_IOS::out );
+
+    // open overload taking a Boost.Filesystem path
+    template<typename Path>
+    void open( const Path& path, 
+               BOOST_IOS::openmode mode = BOOST_IOS::out )
+    { open(detail::path(path), mode); }
+private:
+
+    // open overload taking a detail::path
+    void open(const detail::path& path, BOOST_IOS::openmode);
+};
+
+} } // End namespaces iostreams, boost.
+
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // #ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/mapped_file.hpp b/deal.II/contrib/boost-1.41.0/include/boost/iostreams/device/mapped_file.hpp
new file mode 100644 (file)
index 0000000..9c13779
--- /dev/null
@@ -0,0 +1,593 @@
+// (C) Copyright Jorge Lodos 2008.
+// (C) Copyright Jonathan Turkanis 2003.
+// (C) Copyright Craig Henderson 2002.   'boost/memmap.hpp' from sandbox
+// 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(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>                   // make sure size_t is in std.
+#include <cstddef>                            // size_t.
+#include <string>                             // pathnames.
+#include <utility>                            // pair.
+#include <boost/config.hpp>                   // BOOST_MSVC.
+#include <boost/detail/workaround.hpp>
+#include <boost/iostreams/close.hpp>
+#include <boost/iostreams/concepts.hpp>
+#include <boost/iostreams/detail/config/auto_link.hpp>
+#include <boost/iostreams/detail/config/dyn_link.hpp>
+#include <boost/iostreams/detail/config/wide_streams.hpp>
+#include <boost/iostreams/detail/ios.hpp>     // openmode, failure
+#include <boost/iostreams/detail/path.hpp>
+#include <boost/iostreams/operations_fwd.hpp>
+#include <boost/iostreams/positioning.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+// Must come last.
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost { namespace iostreams {
+
+//------------------Definition of mapped_file_base and mapped_file_params-----//
+
+// Forward declarations
+class mapped_file_source;
+class mapped_file_sink;
+class mapped_file;
+namespace detail { class mapped_file_impl; }
+
+class mapped_file_base {
+public:
+    enum mapmode {
+        readonly = 1,
+        readwrite = 2,
+        priv = 4
+    };
+};
+
+// Bitmask operations for mapped_file_base::mapmode
+mapped_file_base::mapmode 
+operator|(mapped_file_base::mapmode a, mapped_file_base::mapmode b);
+
+mapped_file_base::mapmode 
+operator&(mapped_file_base::mapmode a, mapped_file_base::mapmode b);
+
+mapped_file_base::mapmode 
+operator^(mapped_file_base::mapmode a, mapped_file_base::mapmode b);
+
+mapped_file_base::mapmode 
+operator~(mapped_file_base::mapmode a);
+
+mapped_file_base::mapmode 
+operator|=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b);
+
+mapped_file_base::mapmode 
+operator&=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b);
+
+mapped_file_base::mapmode 
+operator^=(mapped_file_base::mapmode& a, mapped_file_base::mapmode b);
+
+//------------------Definition of mapped_file_params--------------------------//
+
+namespace detail {
+
+struct mapped_file_params_base {
+    mapped_file_params_base()
+        : flags(static_cast<mapped_file_base::mapmode>(0)), 
+          mode(), offset(0), length(static_cast<std::size_t>(-1)), 
+          new_file_size(0), hint(0)
+        { }
+private:
+    friend class mapped_file_impl;
+    void normalize();
+public:
+    mapped_file_base::mapmode   flags;
+    BOOST_IOS::openmode         mode;  // Deprecated
+    stream_offset               offset;
+    std::size_t                 length;
+    stream_offset               new_file_size;
+    const char*                 hint;
+};
+
+} // End namespace detail.
+
+// This template allows Boost.Filesystem paths to be specified when creating or
+// reopening a memory mapped file, without creating a dependence on
+// Boost.Filesystem. Possible values of Path include std::string,
+// boost::filesystem::path, boost::filesystem::wpath, 
+// and boost::iostreams::detail::path (used to store either a std::string or a
+// std::wstring).
+template<typename Path>
+struct basic_mapped_file_params 
+    : detail::mapped_file_params_base 
+{
+    typedef detail::mapped_file_params_base base_type;
+
+    // For wide paths, instantiate basic_mapped_file_params 
+    // with boost::filesystem::wpath
+#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
+    BOOST_STATIC_ASSERT((!is_same<Path, std::wstring>::value));
+#endif
+
+    // Default constructor
+    basic_mapped_file_params() { }
+
+    // Construction from a Path
+    explicit basic_mapped_file_params(const Path& p) : path(p) { }
+
+    // Construction from a path of a different type
+    template<typename PathT>
+    explicit basic_mapped_file_params(const PathT& p) : path(p) { }
+
+    // Copy constructor
+    basic_mapped_file_params(const basic_mapped_file_params& other)
+        : base_type(other), path(other.path)
+        { }
+
+    // Templated copy constructor
+    template<typename PathT>
+    basic_mapped_file_params(const basic_mapped_file_params<PathT>& other)
+        : base_type(other), path(other.path)
+        { }
+
+    typedef Path  path_type;
+    Path          path;
+};
+
+typedef basic_mapped_file_params<std::string> mapped_file_params;
+
+//------------------Definition of mapped_file_source--------------------------//
+
+class BOOST_IOSTREAMS_DECL mapped_file_source : public mapped_file_base {
+private:
+    struct safe_bool_helper { int x; };
+    typedef int safe_bool_helper::*                 safe_bool;
+    typedef detail::mapped_file_impl                impl_type;
+    typedef basic_mapped_file_params<detail::path>  param_type;
+    friend class mapped_file;
+    friend class detail::mapped_file_impl;
+    friend struct boost::iostreams::operations<mapped_file_source>;
+public:
+    typedef char                                    char_type;
+    struct category
+        : public source_tag,
+          public direct_tag,
+          public closable_tag
+        { };
+    typedef std::size_t                             size_type;
+    typedef const char*                             iterator;
+    BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));
+
+    // Default constructor
+    mapped_file_source();
+
+    // Constructor taking a parameters object
+    template<typename Path>
+    explicit mapped_file_source(const basic_mapped_file_params<Path>& p);
+
+    // Constructor taking a list of parameters
+    template<typename Path>
+    explicit mapped_file_source( const Path& path,
+                                 size_type length = max_length,
+                                 boost::intmax_t offset = 0 );
+
+    // Copy Constructor
+    mapped_file_source(const mapped_file_source& other);
+
+    //--------------Stream interface------------------------------------------//
+
+    template<typename Path>
+    void open(const basic_mapped_file_params<Path>& p);
+
+    template<typename Path>
+    void open( const Path& path,
+               size_type length = max_length,
+               boost::intmax_t offset = 0 );
+
+    bool is_open() const;
+    void close();
+    operator safe_bool() const;
+    bool operator!() const;
+    mapmode flags() const;
+
+    //--------------Container interface---------------------------------------//
+
+    size_type size() const;
+    const char* data() const;
+    iterator begin() const;
+    iterator end() const;
+
+    //--------------Query admissible offsets----------------------------------//
+
+    // Returns the allocation granularity for virtual memory. Values passed
+    // as offsets must be multiples of this value.
+    static int alignment();
+
+private:
+    void init();
+    void open_impl(const param_type& p);
+
+    boost::shared_ptr<impl_type> pimpl_;
+};
+
+//------------------Definition of mapped_file---------------------------------//
+
+class BOOST_IOSTREAMS_DECL mapped_file : public mapped_file_base {
+private:
+    typedef mapped_file_source                      delegate_type;
+    typedef delegate_type::safe_bool                safe_bool;
+    typedef basic_mapped_file_params<detail::path>  param_type;
+    friend struct boost::iostreams::operations<mapped_file >;
+    friend class mapped_file_sink;
+public:
+    typedef char                                    char_type;
+    struct category
+        : public seekable_device_tag,
+          public direct_tag,
+          public closable_tag
+        { };
+    typedef mapped_file_source::size_type           size_type;
+    typedef char*                                   iterator;
+    typedef const char*                             const_iterator;
+    BOOST_STATIC_CONSTANT(size_type, max_length = delegate_type::max_length);
+
+    // Default constructor
+    mapped_file() { }
+
+    // Construstor taking a parameters object
+    template<typename Path>
+    explicit mapped_file(const basic_mapped_file_params<Path>& p);
+
+    // Constructor taking a list of parameters
+    template<typename Path>
+    mapped_file( const Path& path,
+                 mapmode flags,
+                 size_type length = max_length,
+                 stream_offset offset = 0 );
+
+    // Constructor taking a list of parameters, including a 
+    // std::ios_base::openmode (deprecated)
+    template<typename Path>
+    explicit mapped_file( const Path& path,
+                          BOOST_IOS::openmode mode =
+                              BOOST_IOS::in | BOOST_IOS::out,
+                          size_type length = max_length,
+                          stream_offset offset = 0 );
+
+    // Copy Constructor
+    mapped_file(const mapped_file& other);
+
+    //--------------Conversion to mapped_file_source (deprecated)-------------//
+
+    operator mapped_file_source&() { return delegate_; }
+    operator const mapped_file_source&() const { return delegate_; }
+
+    //--------------Stream interface------------------------------------------//
+
+    // open overload taking a parameters object
+    template<typename Path>
+    void open(const basic_mapped_file_params<Path>& p);
+
+    // open overload taking a list of parameters
+    template<typename Path>
+    void open( const Path& path,
+               mapmode mode,
+               size_type length = max_length,
+               stream_offset offset = 0 );
+
+    // open overload taking a list of parameters, including a 
+    // std::ios_base::openmode (deprecated)
+    template<typename Path>
+    void open( const Path& path,
+               BOOST_IOS::openmode mode =
+                   BOOST_IOS::in | BOOST_IOS::out,
+               size_type length = max_length,
+               stream_offset offset = 0 );
+
+    bool is_open() const { return delegate_.is_open(); }
+    void close() { delegate_.close(); }
+    operator safe_bool() const { return delegate_; }
+    bool operator!() const { return !delegate_; }
+    mapmode flags() const { return delegate_.flags(); }
+
+    //--------------Container interface---------------------------------------//
+
+    size_type size() const { return delegate_.size(); }
+    char* data() const;
+    const char* const_data() const { return delegate_.data(); }
+    iterator begin() const { return data(); }
+    const_iterator const_begin() const { return const_data(); }
+    iterator end() const { return data() + size(); }
+    const_iterator const_end() const { return const_data() + size(); }
+
+    //--------------Query admissible offsets----------------------------------//
+
+    // Returns the allocation granularity for virtual memory. Values passed
+    // as offsets must be multiples of this value.
+    static int alignment() { return mapped_file_source::alignment(); }
+
+    //--------------File access----------------------------------------------//
+
+    void resize(stream_offset new_size);
+private:
+    delegate_type delegate_;
+};
+
+//------------------Definition of mapped_file_sink----------------------------//
+
+class BOOST_IOSTREAMS_DECL mapped_file_sink : private mapped_file {
+public:
+    friend struct boost::iostreams::operations<mapped_file_sink>;
+    using mapped_file::mapmode;
+    using mapped_file::readonly;
+    using mapped_file::readwrite;
+    using mapped_file::priv;
+    using mapped_file::char_type;
+    struct category
+        : public sink_tag,
+          public direct_tag,
+          public closable_tag
+        { };
+    using mapped_file::size_type;
+    using mapped_file::iterator;
+    using mapped_file::max_length;
+    using mapped_file::is_open;
+    using mapped_file::close;
+    using mapped_file::operator safe_bool;
+    using mapped_file::operator !;
+    using mapped_file::flags;
+    using mapped_file::size;
+    using mapped_file::data;
+    using mapped_file::begin;
+    using mapped_file::end;
+    using mapped_file::alignment;
+    using mapped_file::resize;
+
+    // Default constructor
+    mapped_file_sink() { }
+
+    // Constructor taking a parameters object
+    template<typename Path>
+    explicit mapped_file_sink(const basic_mapped_file_params<Path>& p);
+
+    // Constructor taking a list of parameters
+    template<typename Path>
+    explicit mapped_file_sink( const Path& path,
+                               size_type length = max_length,
+                               boost::intmax_t offset = 0,
+                               mapmode flags = readwrite );
+
+    // Copy Constructor
+    mapped_file_sink(const mapped_file_sink& other);
+
+    // open overload taking a parameters object
+    template<typename Path>
+    void open(const basic_mapped_file_params<Path>& p);
+
+    // open overload taking a list of parameters
+    template<typename Path>
+    void open( const Path& path,
+               size_type length = max_length,
+               boost::intmax_t offset = 0,
+               mapmode flags = readwrite );
+};
+
+//------------------Implementation of mapped_file_source----------------------//
+
+template<typename Path>
+mapped_file_source::mapped_file_source(const basic_mapped_file_params<Path>& p)
+{ init(); open(p); }
+
+template<typename Path>
+mapped_file_source::mapped_file_source( 
+    const Path& path, size_type length, boost::intmax_t offset)
+{ init(); open(path, length, offset); }
+
+template<typename Path>
+void mapped_file_source::open(const basic_mapped_file_params<Path>& p)
+{
+    param_type params(p);
+    if (params.flags) {
+        if (params.flags != mapped_file::readonly)
+            throw new BOOST_IOSTREAMS_FAILURE("invalid flags");
+    } else {
+        if (params.mode & BOOST_IOS::out)
+            throw new BOOST_IOSTREAMS_FAILURE("invalid mode");
+        params.mode |= BOOST_IOS::in;
+    }
+    open_impl(params);
+}
+
+template<typename Path>
+void mapped_file_source::open(
+    const Path& path, size_type length, boost::intmax_t offset)
+{
+    param_type p(path);
+    p.length = length;
+    p.offset = offset;
+    open(p);
+}
+
+//------------------Implementation of mapped_file-----------------------------//
+
+template<typename Path>
+mapped_file::mapped_file(const basic_mapped_file_params<Path>& p)
+{ open(p); }
+
+template<typename Path>
+mapped_file::mapped_file( 
+    const Path& path, mapmode flags, 
+    size_type length, stream_offset offset )
+{ open(path, flags, length, offset); }
+
+template<typename Path>
+mapped_file::mapped_file( 
+    const Path& path, BOOST_IOS::openmode mode, 
+    size_type length, stream_offset offset )
+{ open(path, mode, length, offset); }
+
+template<typename Path>
+void mapped_file::open(const basic_mapped_file_params<Path>& p)
+{ delegate_.open_impl(p); }
+
+template<typename Path>
+void mapped_file::open( 
+    const Path& path, mapmode flags, 
+    size_type length, stream_offset offset )
+{
+    param_type p(path);
+    p.flags = flags;
+    p.length = length;
+    p.offset = offset;
+    open(p);
+}
+
+template<typename Path>
+void mapped_file::open( 
+    const Path& path, BOOST_IOS::openmode mode, 
+    size_type length, stream_offset offset )
+{
+    param_type p(path);
+    p.mode = mode;
+    p.length = length;
+    p.offset = offset;
+    open(p);
+}
+
+inline char* mapped_file::data() const 
+{ return (flags() != readonly) ? const_cast<char*>(delegate_.data()) : 0; }
+
+//------------------Implementation of mapped_file_sink------------------------//
+
+template<typename Path>
+mapped_file_sink::mapped_file_sink(const basic_mapped_file_params<Path>& p)
+{ open(p); }
+
+template<typename Path>
+mapped_file_sink::mapped_file_sink(
+    const Path& path, size_type length,
+    boost::intmax_t offset, mapmode flags )
+{ open(path, length, offset, flags); }
+
+template<typename Path>
+void mapped_file_sink::open(const basic_mapped_file_params<Path>& p)
+{
+    param_type params(p);
+    if (params.flags) {
+        if (params.flags & mapped_file::readonly)
+            throw new BOOST_IOSTREAMS_FAILURE("invalid flags");
+    } else {
+        if (params.mode & BOOST_IOS::in)
+            throw new BOOST_IOSTREAMS_FAILURE("invalid mode");
+        params.mode |= BOOST_IOS::out;
+    }
+    mapped_file::open(params);
+}
+
+template<typename Path>
+void mapped_file_sink::open(
+    const Path& path, size_type length,
+    boost::intmax_t offset, mapmode flags )
+{
+    param_type p(path);
+    p.flags = flags;
+    p.length = length;
+    p.offset = offset;
+    open(p);
+}
+
+//------------------Specialization of direct_impl-----------------------------//
+
+template<>
+struct operations<mapped_file_source>
+    : boost::iostreams::detail::close_impl<closable_tag>
+{
+    static std::pair<char*, char*>
+    input_sequence(mapped_file_source& src)
+    {
+        return std::make_pair( const_cast<char*>(src.begin()),
+                               const_cast<char*>(src.end()) );
+    }
+};
+
+template<>
+struct operations<mapped_file>
+    : boost::iostreams::detail::close_impl<closable_tag>
+{
+    static std::pair<char*, char*>
+    input_sequence(mapped_file& file)
+    { 
+        return std::make_pair(file.begin(), file.end()); 
+    }
+    static std::pair<char*, char*>
+    output_sequence(mapped_file& file)
+    { 
+        return std::make_pair(file.begin(), file.end()); 
+    }
+};
+
+template<>
+struct operations<mapped_file_sink>
+    : boost::iostreams::detail::close_impl<closable_tag>
+{
+    static std::pair<char*, char*>
+    output_sequence(mapped_file_sink& sink)
+    { 
+        return std::make_pair(sink.begin(), sink.end()); 
+    }
+};
+                    
+//------------------Definition of mapmode operators---------------------------//
+
+inline mapped_file::mapmode 
+operator|(mapped_file::mapmode a, mapped_file::mapmode b)
+{
+    return static_cast<mapped_file::mapmode>
+        (static_cast<int>(a) | static_cast<int>(b));
+}
+
+inline mapped_file::mapmode 
+operator&(mapped_file::mapmode a, mapped_file::mapmode b)
+{
+    return static_cast<mapped_file::mapmode>
+        (static_cast<int>(a) & static_cast<int>(b));
+}
+
+inline mapped_file::mapmode 
+operator^(mapped_file::mapmode a, mapped_file::mapmode b)
+{
+    return static_cast<mapped_file::mapmode>
+        (static_cast<int>(a) ^ static_cast<int>(b));
+}
+
+inline mapped_file::mapmode
+operator~(mapped_file::mapmode a)
+{
+    return static_cast<mapped_file::mapmode>(~static_cast<int>(a));
+}
+
+inline mapped_file::mapmode 
+operator|=(mapped_file::mapmode& a, mapped_file::mapmode b)
+{
+    return a = a | b;
+}
+
+inline mapped_file::mapmode 
+operator&=(mapped_file::mapmode& a, mapped_file::mapmode b)
+{
+    return a = a & b;
+}
+
+inline mapped_file::mapmode 
+operator^=(mapped_file::mapmode& a, mapped_file::mapmode b)
+{
+    return a = a ^ b;
+}
+
+} } // End namespaces iostreams, boost.
+
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/grep.hpp b/deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/grep.hpp
new file mode 100644 (file)
index 0000000..a41da5b
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * 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.)
+ * 
+ * See http://www.boost.org/libs/iostreams for documentation.
+
+ * File:        boost/iostreams/filter/grep.hpp
+ * Date:        Mon May 26 17:48:45 MDT 2008
+ * Copyright:   2008 CodeRage, LLC
+ * Author:      Jonathan Turkanis
+ * Contact:     turkanis at coderage dot com
+ *
+ * Defines the class template basic_grep_filter and its specializations
+ * grep_filter and wgrep_filter.
+ */
+
+#ifndef BOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED
+#define BOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif              
+
+#include <iostream>
+
+#include <memory>  // allocator.
+#include <boost/iostreams/char_traits.hpp>   
+#include <boost/iostreams/filter/line.hpp>              
+#include <boost/iostreams/pipeline.hpp>
+#include <boost/regex.hpp>
+
+namespace boost { namespace iostreams {
+
+namespace grep {
+
+const int invert      = 1;
+const int whole_line  = invert << 1;
+
+} // End namespace grep.
+
+template< typename Ch,
+          typename Tr = regex_traits<Ch>,
+          typename Alloc = std::allocator<Ch> >
+class basic_grep_filter : public basic_line_filter<Ch, Alloc> {
+private:
+    typedef basic_line_filter<Ch, Alloc>               base_type;
+public:
+    typedef typename base_type::char_type              char_type;
+    typedef typename base_type::category               category;
+    typedef char_traits<char_type>                     traits_type;
+    typedef typename base_type::string_type            string_type;
+    typedef basic_regex<Ch, Tr>                        regex_type;
+    typedef regex_constants::match_flag_type           match_flag_type;
+    basic_grep_filter( const regex_type& re,
+                       match_flag_type match_flags = 
+                           regex_constants::match_default,
+                       int options = 0 );
+    int count() const { return count_; }
+
+    template<typename Sink>
+    void close(Sink& snk, BOOST_IOS::openmode which)
+    {
+        base_type::close(snk, which);
+        options_ &= ~f_initialized;
+    }
+private:
+    virtual string_type do_filter(const string_type& line)
+    {
+        if ((options_ & f_initialized) == 0) {
+            options_ |= f_initialized;
+            count_ = 0;
+        }
+        bool matches = (options_ & grep::whole_line) ?
+            regex_match(line, re_, match_flags_) :
+            regex_search(line, re_, match_flags_);
+        if (options_ & grep::invert)
+            matches = !matches;
+        if (matches)
+            ++count_;
+        return matches ? line + traits_type::newline() : string_type();
+    }
+
+    // Private flags bitwise OR'd with constants from namespace grep
+    enum flags_ {
+        f_initialized = 65536
+    };
+
+    regex_type       re_;
+    match_flag_type  match_flags_;
+    int              options_;
+    int              count_;
+};
+BOOST_IOSTREAMS_PIPABLE(basic_grep_filter, 3)
+
+typedef basic_grep_filter<char>     grep_filter;
+typedef basic_grep_filter<wchar_t>  wgrep_filter;
+                    
+//------------------Implementation of basic_grep_filter-----------------------//
+
+template<typename Ch, typename Tr, typename Alloc>
+basic_grep_filter<Ch, Tr, Alloc>::basic_grep_filter
+    (const regex_type& re, match_flag_type match_flags, int options)
+    : base_type(true), re_(re), match_flags_(match_flags), 
+      options_(options), count_(0)
+    { }
+
+} } // End namespaces iostreams, boost.
+
+#endif      // #ifndef BOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED
similarity index 65%
rename from deal.II/contrib/boost/include/boost/iostreams/filter/gzip.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/gzip.hpp
index 17bd1c4708ec9224270291bdfa114ba8eeb7338d..4faee788bcf02811165eeac04b2d3ead76756be8 100644 (file)
@@ -19,6 +19,7 @@
 #include <boost/config.hpp> // STATIC_CONSTANT, STDC_NAMESPACE, 
                             // DINKUMWARE_STDLIB, __STL_CONFIG_H.
 #include <algorithm>                      // min.
+#include <cassert>
 #include <cstdio>                         // EOF.
 #include <cstddef>                        // size_t.
 #include <ctime>                          // std::time_t.
@@ -34,7 +35,8 @@
 #include <boost/iostreams/operations.hpp>
 #include <boost/iostreams/device/back_inserter.hpp>
 #include <boost/iostreams/filter/zlib.hpp>
-#include <boost/iostreams/pipeline.hpp>         
+#include <boost/iostreams/pipeline.hpp>     
+#include <boost/iostreams/putback.hpp>         
 
 // Must come last.
 #if defined(BOOST_MSVC)
@@ -47,6 +49,8 @@ namespace std { using ::time_t; }
 #endif
 
 namespace boost { namespace iostreams {
+                    
+//------------------Definitions of constants----------------------------------//
 
 namespace gzip {
 
@@ -59,6 +63,7 @@ const int bad_crc           = 2; // Recorded crc doesn't match data.
 const int bad_length        = 3; // Recorded length doesn't match data.
 const int bad_header        = 4; // Malformed header.
 const int bad_footer        = 5; // Malformed footer.
+const int bad_method        = 6; // Unsupported compression method.
 
 namespace magic {
 
@@ -118,6 +123,8 @@ const int os_unknown        = 255;
 
 } // End namespace gzip.
 
+//------------------Definition of gzip_params---------------------------------//
+
 //
 // Class name: gzip_params.
 // Description: Subclass of zlib_params with an additional field
@@ -142,6 +149,8 @@ struct gzip_params : zlib_params {
     std::time_t  mtime;
 };
 
+//------------------Definition of gzip_error----------------------------------//
+
 //
 // Class name: gzip_error.
 // Description: Subclass of std::ios_base::failure thrown to indicate
@@ -163,6 +172,8 @@ private:
     int zlib_error_code_;
 };
 
+//------------------Definition of gzip_compressor-----------------------------//
+
 //
 // Template name: gzip_compressor
 // Description: Model of OutputFilter implementing compression in the
@@ -283,7 +294,7 @@ private:
         flags_ = 0;
     }
 
-    enum flag_type {
+    enum state_type {
         f_header_done = 1,
         f_body_done = f_header_done << 1,
         f_footer_done = f_body_done << 1
@@ -297,6 +308,81 @@ BOOST_IOSTREAMS_PIPABLE(basic_gzip_compressor, 1)
 
 typedef basic_gzip_compressor<> gzip_compressor;
 
+//------------------Definition of helper templates for decompression----------//
+
+namespace detail {
+
+// Processes gzip headers
+class BOOST_IOSTREAMS_DECL gzip_header {
+public:
+    gzip_header() { reset(); }
+
+    // Members for processing header data
+    void process(char c);
+    bool done() const { return state_ == s_done; }
+    void reset();
+
+    // Members for accessing header data
+    std::string file_name() const { return file_name_; }
+    std::string comment() const { return comment_; }
+    bool text() const { return (flags_ & gzip::flags::text) != 0; }
+    int os() const { return os_; }
+    std::time_t mtime() const { return mtime_; }
+private:
+    enum state_type {
+        s_id1       = 1,
+        s_id2       = s_id1 + 1,
+        s_cm        = s_id2 + 1,
+        s_flg       = s_cm + 1,
+        s_mtime     = s_flg + 1,
+        s_xfl       = s_mtime + 1,
+        s_os        = s_xfl + 1,
+        s_xlen      = s_os + 1,
+        s_extra     = s_xlen + 1,
+        s_name      = s_extra + 1,
+        s_comment   = s_name + 1,
+        s_hcrc      = s_comment + 1,
+        s_done      = s_hcrc + 1
+    };
+    std::string  file_name_;
+    std::string  comment_;
+    int          os_;
+    std::time_t  mtime_;
+    int          flags_;
+    int          state_;
+    int          offset_;  // Offset within fixed-length region.
+    int          xlen_;    // Bytes remaining in extra field.
+};
+
+// Processes gzip footers
+class BOOST_IOSTREAMS_DECL gzip_footer {
+public:
+    gzip_footer() { reset(); }
+    
+    // Members for processing footer data
+    void process(char c);
+    bool done() const { return state_ == s_done; }
+    void reset();
+    
+    // Members for accessing footer data
+    zlib::ulong crc() const { return crc_; }
+    zlib::ulong uncompressed_size() const { return isize_; }
+private:
+    enum state_type {
+        s_crc     = 1,
+        s_isize   = s_crc + 1,
+        s_done    = s_isize + 1
+    };
+    zlib::ulong  crc_;
+    zlib::ulong  isize_;
+    int          state_;
+    int          offset_; 
+};
+
+} // End namespace boost::iostreams::detail.
+
+//------------------Definition of basic_gzip_decompressor---------------------//
+
 //
 // Template name: basic_gzip_decompressor
 // Description: Model of InputFilter implementing compression in the
@@ -304,6 +390,9 @@ typedef basic_gzip_compressor<> gzip_compressor;
 //
 template<typename Alloc = std::allocator<char> >
 class basic_gzip_decompressor : basic_zlib_decompressor<Alloc> {
+private:
+    typedef basic_zlib_decompressor<Alloc>   base_type;
+    typedef typename base_type::string_type  string_type;
 public:
     typedef char char_type;
     struct category
@@ -316,35 +405,72 @@ public:
     template<typename Source>
     std::streamsize read(Source& src, char_type* s, std::streamsize n)
     {
-        if ((flags_ & f_header_read) == 0) {
-            non_blocking_adapter<Source> nb(src);
-            read_header(nb);
-            flags_ |= f_header_read;
-        }
-
-        if ((flags_ & f_footer_read) != 0)
-            return -1;
-        
-        try {
-            std::streamsize result = 0;
-            std::streamsize amt;
-            if ((amt = base_type::read(src, s, n)) != -1) {
-                result += amt;
-                if (amt < n) { // Double check for EOF.
-                    amt = base_type::read(src, s + result, n - result);
-                    if (amt != -1)
+        typedef char_traits<char>  traits_type;
+        std::streamsize            result = 0;
+        peekable_source<Source>    peek(src, putback_);
+        while (result < n && state_ != s_done) {
+            if (state_ == s_start) {
+                state_ = s_header;
+                header_.reset();
+                footer_.reset();
+            }
+            if (state_ == s_header) {
+                int c = boost::iostreams::get(peek);
+                if (traits_type::is_eof(c)) {
+                    throw gzip_error(gzip::bad_header);
+                } else if (traits_type::would_block(c)) {
+                    break;
+                }
+                header_.process(c);
+                if (header_.done())
+                    state_ = s_body;
+            } else if (state_ == s_body) {
+                try {
+                    std::streamsize amt = 
+                        base_type::read(peek, s + result, n - result);
+                    if (amt != -1) {
                         result += amt;
+                        if (amt < n - result)
+                            break;
+                    } else {
+                        peek.putback(this->unconsumed_input());
+                        state_ = s_footer;
+                    }
+                } catch (const zlib_error& e) {
+                    throw gzip_error(e);
+                }
+            } else { // state_ == s_footer
+                int c = boost::iostreams::get(peek);
+                if (traits_type::is_eof(c)) {
+                    throw gzip_error(gzip::bad_footer);
+                } else if (traits_type::would_block(c)) {
+                    break;
+                }
+                footer_.process(c);
+                if (footer_.done()) {
+                    if (footer_.crc() != this->crc())
+                        throw gzip_error(gzip::bad_crc);
+                    int c = boost::iostreams::get(peek);
+                    if (traits_type::is_eof(c)) {
+                        state_ = s_done;
+                    } else {
+                        peek.putback(c);
+                        base_type::close(peek, BOOST_IOS::in);
+                        state_ = s_start;
+                        header_.reset();
+                        footer_.reset();
+                    }
                 }
             }
-            if (amt == -1) {
-                non_blocking_adapter<Source> nb(src);
-                read_footer(nb);
-                flags_ |= f_footer_read;
-            }
-            return result;
-        } catch (const zlib_error& e) {
-            throw gzip_error(e);
         }
+        if (peek.has_unconsumed_input()) {
+            putback_ = peek.unconsumed_input();
+        } else {
+            putback_.clear();
+        }
+        return result != 0 || state_ != s_done ?
+            result :
+            -1;
     }
 
     template<typename Source>
@@ -353,136 +479,95 @@ public:
         try {
             base_type::close(src, BOOST_IOS::in);
         } catch (const zlib_error& e) {
-            flags_ = 0;
+            state_ = s_start;
+            header_.reset();
+            footer_.reset();
             throw gzip_error(e);
         }
-        flags_ = 0;
+        state_ = s_start;
     }
 
-    std::string file_name() const { return file_name_; }
-    std::string comment() const { return comment_; }
-    bool text() const { return (flags_ & gzip::flags::text) != 0; }
-    int os() const { return os_; }
-    std::time_t mtime() const { return mtime_; }
+    std::string file_name() const { return header_.file_name(); }
+    std::string comment() const { return header_.comment(); }
+    bool text() const { return header_.text(); }
+    int os() const { return header_.os(); }
+    std::time_t mtime() const { return header_.mtime(); }
 private:
-    typedef basic_zlib_decompressor<Alloc>     base_type;
-    typedef BOOST_IOSTREAMS_CHAR_TRAITS(char)  traits_type;
-    static bool is_eof(int c) { return traits_type::eq_int_type(c, EOF); }
     static gzip_params make_params(int window_bits);
 
+    // Source adapter allowing an arbitrary character sequence to be put back.
     template<typename Source>
-    static uint8_t read_uint8(Source& src, int error)
-     {
-        int c;
-        if ((c = boost::iostreams::get(src)) == EOF || c == WOULD_BLOCK)
-            throw gzip_error(error);
-        return static_cast<uint8_t>(traits_type::to_char_type(c));
-    }
+    struct peekable_source {
+        typedef char char_type;
+        struct category : source_tag, peekable_tag { };
+        explicit peekable_source(Source& src, const string_type& putback = "") 
+            : src_(src), putback_(putback), offset_(0)
+            { }
+        std::streamsize read(char* s, std::streamsize n)
+        {
+            std::streamsize result = 0;
 
-    template<typename Source>
-    static uint32_t read_uint32(Source& src, int error)
-    {
-        uint8_t b1 = read_uint8(src, error);
-        uint8_t b2 = read_uint8(src, error);
-        uint8_t b3 = read_uint8(src, error);
-        uint8_t b4 = read_uint8(src, error);
-        return b1 + (b2 << 8) + (b3 << 16) + (b4 << 24);
-    }
+            // Copy characters from putback buffer
+            std::streamsize pbsize = 
+                static_cast<std::streamsize>(putback_.size());
+            if (offset_ < pbsize) {
+                result = (std::min)(n, pbsize - offset_);
+                BOOST_IOSTREAMS_CHAR_TRAITS(char)::copy(
+                    s, putback_.data() + offset_, result);
+                offset_ += result;
+                if (result == n)
+                    return result;
+            }
 
-    template<typename Source>
-    std::string read_string(Source& src)
-    {
-        std::string result;
-        while (true) {
-            int c;
-            if (is_eof(c = boost::iostreams::get(src)))
-                throw gzip_error(gzip::bad_header);
-            else if (c == 0)
-                return result;
-            else
-                result += static_cast<char>(c);
+            // Read characters from src_
+            std::streamsize amt = 
+                boost::iostreams::read(src_, s + result, n - result);
+            return amt != -1 ? 
+                result + amt : 
+                result ? result : -1;
         }
-    }
-
-    template<typename Source>
-    void read_header(Source& src) // Source is non-blocking.
-    {
-        // Reset saved values.
-        #if BOOST_WORKAROUND(__GNUC__, == 2) && defined(__STL_CONFIG_H) || \
-            BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) \
-            /**/
-            file_name_.erase(0, std::string::npos);
-            comment_.erase(0, std::string::npos);
-        #else
-            file_name_.clear();
-            comment_.clear();
-        #endif
-        os_ = gzip::os_unknown;
-        mtime_ = 0;
-
-        int flags;
-
-        // Read header, without checking header crc.
-        if ( boost::iostreams::get(src) != gzip::magic::id1 ||   // ID1.
-             boost::iostreams::get(src) != gzip::magic::id2 ||   // ID2.
-             is_eof(boost::iostreams::get(src)) ||               // CM.
-             is_eof(flags = boost::iostreams::get(src)) )        // FLG.
+        bool putback(char c)
         {
-            throw gzip_error(gzip::bad_header);
+            if (offset_) {
+                putback_[--offset_] = c;
+                return true;
+            } else {
+                return boost::iostreams::putback(src_, c);
+            }
         }
-        mtime_ = read_uint32(src, gzip::bad_header);        // MTIME.
-        read_uint8(src, gzip::bad_header);                 // XFL.
-        os_ = read_uint8(src, gzip::bad_header);          // OS.
-        if (flags & boost::iostreams::gzip::flags::text)
-            flags_ |= f_text;
-
-        // Skip extra field. (From J. Halleaux; see note at top.)
-        if (flags & gzip::flags::extra) {
-            int length = 
-                static_cast<int>(
-                    read_uint8(src, gzip::bad_header) +
-                    (read_uint8(src, gzip::bad_header) << 8)
-                );
-            // length is garbage if EOF but the loop below will quit anyway.
-            do { }
-            while (length-- != 0 && !is_eof(boost::iostreams::get(src)));
+        void putback(const string_type& s)
+        {
+            putback_.replace(0, offset_, s);
+            offset_ = 0;
         }
 
-        if (flags & gzip::flags::name)          // Read file name.
-            file_name_ = read_string(src);
-        if (flags & gzip::flags::comment)       // Read comment.
-            comment_ = read_string(src);
-        if (flags & gzip::flags::header_crc) {  // Skip header crc.
-            read_uint8(src, gzip::bad_header);
-            read_uint8(src, gzip::bad_header);
+        // Returns true if some characters have been putback but not re-read.
+        bool has_unconsumed_input() const 
+        {
+            return offset_ < static_cast<std::streamsize>(putback_.size());
         }
-    }
 
-    template<typename Source>
-    void read_footer(Source& src)
-    {
-        typename base_type::string_type footer = 
-            this->unconsumed_input();
-        int c;
-        while (!is_eof(c = boost::iostreams::get(src)))
-            footer += c;
-        detail::range_adapter<input, std::string> 
-            rng(footer.begin(), footer.end());
-        if (read_uint32(rng, gzip::bad_footer) != this->crc())
-            throw gzip_error(gzip::bad_crc);
-        if (static_cast<int>(read_uint32(rng, gzip::bad_footer)) != this->total_out())
-            throw gzip_error(gzip::bad_length);
-    }
-    enum flag_type {
-        f_header_read  = 1,
-        f_footer_read  = f_header_read << 1,
-        f_text         = f_footer_read << 1
+        // Returns the sequence of characters that have been put back but not re-read.
+        string_type unconsumed_input() const
+        {
+            return string_type(putback_, offset_, putback_.size() - offset_);
+        }
+        Source&          src_;
+        string_type      putback_;
+        std::streamsize  offset_;
     };
-    std::string  file_name_;
-    std::string  comment_;
-    int          os_;
-    std::time_t  mtime_;
-    int          flags_;
+
+    enum state_type {
+        s_start   = 1,
+        s_header  = s_start + 1,
+        s_body    = s_header + 1,
+        s_footer  = s_body + 1,
+        s_done    = s_footer + 1
+    };
+    detail::gzip_header  header_;
+    detail::gzip_footer  footer_;
+    string_type          putback_;
+    int                  state_;
 };
 BOOST_IOSTREAMS_PIPABLE(basic_gzip_decompressor, 1)
 
@@ -580,7 +665,7 @@ template<typename Alloc>
 basic_gzip_decompressor<Alloc>::basic_gzip_decompressor
     (int window_bits, int buffer_size)
     : base_type(make_params(window_bits), buffer_size),
-      os_(gzip::os_unknown), mtime_(0), flags_(0)
+      state_(s_start)
     { }
 
 template<typename Alloc>
similarity index 87%
rename from deal.II/contrib/boost/include/boost/iostreams/filter/line.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/line.hpp
index 5f5cb460658eca234dec9938c34ac189364b71cf..081747e451712f31b1a2ae2b22f7a4897fb707a2 100644 (file)
@@ -18,6 +18,7 @@
 #include <string>
 #include <boost/config.hpp>                        // BOOST_STATIC_CONSTANT.
 #include <boost/iostreams/categories.hpp>
+#include <boost/iostreams/checked_operations.hpp>
 #include <boost/iostreams/detail/ios.hpp>          // openmode, streamsize.
 #include <boost/iostreams/read.hpp>                // check_eof 
 #include <boost/iostreams/pipeline.hpp>
@@ -61,7 +62,10 @@ public:
           closable_tag
         { };
 protected:
-    basic_line_filter() : pos_(string_type::npos), state_(0) { }
+    basic_line_filter(bool suppress_newlines = false) 
+        : pos_(string_type::npos), 
+          flags_(suppress_newlines ? f_suppress : 0) 
+        { }
 public:
     virtual ~basic_line_filter() { }
 
@@ -69,8 +73,8 @@ public:
     std::streamsize read(Source& src, char_type* s, std::streamsize n)
     {
         using namespace std;
-        assert(!(state_ & f_write));
-        state_ |= f_read;
+        assert(!(flags_ & f_write));
+        flags_ |= f_read;
 
         // Handle unfinished business.
         std::streamsize result = 0;
@@ -80,7 +84,7 @@ public:
         typename traits_type::int_type status = traits_type::good();
         while (result < n && !traits_type::is_eof(status)) {
 
-            // Call next_line() to retrieve a line of filtered test, and
+            // Call next_line() to retrieve a line of filtered text, and
             // read_line() to copy it into buffer s.
             if (traits_type::would_block(status = next_line(src)))
                 return result;
@@ -94,8 +98,8 @@ public:
     std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
     {
         using namespace std;
-        assert(!(state_ & f_read));
-        state_ |= f_write;
+        assert(!(flags_ & f_read));
+        flags_ |= f_write;
 
         // Handle unfinished business.
         if (pos_ != string_type::npos && !write_line(snk))
@@ -122,10 +126,10 @@ public:
     template<typename Sink>
     void close(Sink& snk, BOOST_IOS::openmode which)
     {
-        if ((state_ & f_read) && which == BOOST_IOS::in)
+        if ((flags_ & f_read) && which == BOOST_IOS::in)
             close_impl();
 
-        if ((state_ & f_write) && which == BOOST_IOS::out) {
+        if ((flags_ & f_write) && which == BOOST_IOS::out) {
             try {
                 if (!cur_line_.empty())
                     write_line(snk);
@@ -168,7 +172,7 @@ private:
         if (!traits_type::would_block(c)) {
             if (!cur_line_.empty() || c == traits_type::newline())
                 cur_line_ = do_filter(cur_line_);
-            if (c == traits_type::newline())
+            if (c == traits_type::newline() && (flags_ & f_suppress) == 0)
                 cur_line_ += c;
         }
         return c; // status indicator.
@@ -179,9 +183,11 @@ private:
     template<typename Sink>
     bool write_line(Sink& snk)
     {
-        string_type line = do_filter(cur_line_) + traits_type::newline();
+        string_type line = do_filter(cur_line_);
+        if ((flags_ & f_suppress) == 0)
+            line += traits_type::newline();
         std::streamsize amt = static_cast<std::streamsize>(line.size());
-        bool result = iostreams::write(snk, line.data(), amt) == amt;
+        bool result = iostreams::write_if(snk, line.data(), amt) == amt;
         if (result)
             clear();
         return result;
@@ -190,7 +196,7 @@ private:
     void close_impl()
     {
         clear();
-        state_ = 0;
+        flags_ &= f_suppress;
     }
 
     void clear()
@@ -200,13 +206,14 @@ private:
     }
 
     enum flag_type {
-        f_read   = 1,
-        f_write  = f_read << 1
+        f_read      = 1,
+        f_write     = f_read << 1,
+        f_suppress  = f_write << 1
     };
 
     string_type                      cur_line_;
     typename string_type::size_type  pos_;
-    int                              state_;
+    int                              flags_;
 };
 BOOST_IOSTREAMS_PIPABLE(basic_line_filter, 2)
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/filter/newline.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/newline.hpp
index 2e6d553fd67b6e1dade4001eeb56dcfb725f14f8..d6c5f1fc6418d7a066b056c191e4de243d6e3ff0 100644 (file)
@@ -20,7 +20,7 @@
 #include <stdexcept>                       // logic_error.
 #include <boost/config.hpp>                // BOOST_STATIC_CONSTANT.
 #include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>      
+#include <boost/iostreams/detail/char_traits.hpp>
 #include <boost/iostreams/detail/ios.hpp>  // BOOST_IOSTREAMS_FAILURE 
 #include <boost/iostreams/read.hpp>        // get 
 #include <boost/iostreams/write.hpp>       // put 
@@ -211,7 +211,7 @@ public:
     }
 
     template<typename Sink>
-    void close(Sink& dest, BOOST_IOS::openmode which)
+    void close(Sink& dest, BOOST_IOS::openmode)
     {
         typedef typename iostreams::category_of<Sink>::type category;
         if ((flags_ & f_write) != 0 && (flags_ & f_has_CR) != 0)
@@ -398,7 +398,7 @@ public:
     }
 
     template<typename Sink>
-    void close(Sink&, BOOST_IOS::openmode which)
+    void close(Sink&, BOOST_IOS::openmode)
     {
         using iostreams::newline::final_newline;
 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/filter/symmetric.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/symmetric.hpp
index 6fd72f2f93b51ba001c41699bf2243783382fa18..64c5cf89e06bb6c8ce0e574931a7a30369405c4d 100644 (file)
@@ -71,8 +71,9 @@ template< typename SymmetricFilter,
               > >
 class symmetric_filter {
 public:
-    typedef typename char_type_of<SymmetricFilter>::type  char_type;
-    typedef std::basic_string<char_type>                  string_type;
+    typedef typename char_type_of<SymmetricFilter>::type      char_type;
+    typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type)            traits_type;
+    typedef std::basic_string<char_type, traits_type, Alloc>  string_type;
     struct category
         : dual_use,
           filter_tag,
@@ -123,7 +124,7 @@ public:
 
             // If no more characters are available without blocking, or
             // if read request has been satisfied, return.
-            if ( status == f_would_block && buf.ptr() == buf.eptr() ||
+            if ( (status == f_would_block && buf.ptr() == buf.eptr()) ||
                  next_s == end_s )
             {
                 return static_cast<std::streamsize>(next_s - s);
@@ -152,7 +153,7 @@ public:
     }
 
     template<typename Sink>
-    void close(Sink& snk, BOOST_IOS::openmode which)
+    void close(Sink& snk, BOOST_IOS::openmode)
     {
         if ((state() & f_write) != 0) {
 
@@ -217,7 +218,6 @@ private:
     template<typename Sink>
     bool flush(Sink& snk, mpl::true_)
     {
-        typedef char_traits<char_type> traits_type;
         std::streamsize amt =
             static_cast<std::streamsize>(buf().ptr() - buf().data());
         std::streamsize result =
similarity index 96%
rename from deal.II/contrib/boost/include/boost/iostreams/filter/zlib.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/filter/zlib.hpp
index 59994ce59a8a9d3a10ccbe93612272e8bf581f07..56f7f71c870e2ff25412d43b28a4041a9c5fa07c 100644 (file)
@@ -47,8 +47,9 @@ typedef unsigned int uint;
 typedef unsigned char byte;
 typedef unsigned long ulong;
 
-typedef void* (*alloc_func)(void*, zlib::uint, zlib::uint);
-typedef void (*free_func)(void*, void*);
+// Prefix 'x' prevents symbols from being redefined when Z_PREFIX is defined
+typedef void* (*xalloc_func)(void*, zlib::uint, zlib::uint);
+typedef void (*xfree_func)(void*, void*);
 
                     // Compression levels
 
@@ -191,8 +192,8 @@ protected:
                  char*& dest_begin, char* dest_end );
     void after( const char*& src_begin, char*& dest_begin, 
                 bool compress );
-    int deflate(int flush);
-    int inflate(int flush);
+    int xdeflate(int flush);  // Prefix 'x' prevents symbols from being 
+    int xinflate(int flush);  // redefined when Z_PREFIX is defined
     void reset(bool compress, bool realloc);
 public:
     zlib::ulong crc() const { return crc_; }
@@ -201,8 +202,8 @@ public:
 private:
     void do_init( const zlib_params& p, bool compress, 
                   #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-                      zlib::alloc_func, 
-                      zlib::free_func, 
+                      zlib::xalloc_func, 
+                      zlib::xfree_func, 
                   #endif
                   void* derived );
     void*        stream_;         // Actual type: z_stream*.
@@ -341,7 +342,7 @@ bool zlib_compressor_impl<Alloc>::filter
       char*& dest_begin, char* dest_end, bool flush )
 {
     before(src_begin, src_end, dest_begin, dest_end);
-    int result = deflate(flush ? zlib::finish : zlib::no_flush);
+    int result = xdeflate(flush ? zlib::finish : zlib::no_flush);
     after(src_begin, dest_begin, true);
     zlib_error::check(result);
     return result != zlib::stream_end; 
@@ -374,7 +375,7 @@ bool zlib_decompressor_impl<Alloc>::filter
       char*& dest_begin, char* dest_end, bool /* flush */ )
 {
     before(src_begin, src_end, dest_begin, dest_end);
-    int result = inflate(zlib::sync_flush);
+    int result = xinflate(zlib::sync_flush);
     after(src_begin, dest_begin, false);
     zlib_error::check(result);
     return result != zlib::stream_end;
similarity index 99%
rename from deal.II/contrib/boost/include/boost/iostreams/invert.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/invert.hpp
index f26aad7e612079057d9f3c6f9497cdab9a7337e0..7c3620351ea77a75d749595dbb3949e86703a079 100644 (file)
@@ -44,6 +44,7 @@ namespace boost { namespace iostreams {
 template<typename Filter>
 class inverse {
 private:
+    BOOST_STATIC_ASSERT(is_filter<Filter>::value);
     typedef typename category_of<Filter>::type   base_category;
     typedef reference_wrapper<Filter>            filter_ref;
 public:
similarity index 97%
rename from deal.II/contrib/boost/include/boost/iostreams/skip.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/skip.hpp
index f3fcd797ef46900222fe3a50a9ee2fb47b8fa298..c99d1291b11eda6d23ed28c421297f245f232dd5 100644 (file)
@@ -100,8 +100,8 @@ void skip( Filter& flt, Device& dev, stream_offset off,
     >                                                      can_seek;
     BOOST_STATIC_ASSERT(
         ( can_seek::value || 
-          is_convertible<filter_mode, input>::value &&
-          is_convertible<device_mode, input>::value )
+          (is_convertible<filter_mode, input>::value &&
+          is_convertible<device_mode, input>::value) )
     );
     detail::skip(flt, dev, off, which, can_seek());
 }
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/stream.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/stream.hpp
index 36eeefc84dd961fb02e6ac192110985ed246b8bb..ac9f22547ac2df695f153d0fcacf753c46d5560c 100644 (file)
@@ -123,7 +123,6 @@ private:
             detail::stream_traits<
                 Device, Tr
             >::stream_type                       stream_type;
-    typedef Device                               policy_type;
 public:
     stream() { }
     BOOST_IOSTREAMS_FORWARD( stream, open_impl, Device,
similarity index 98%
rename from deal.II/contrib/boost/include/boost/iostreams/stream_buffer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/stream_buffer.hpp
index 95680cb47b072ba54f3e9834f00b63e3a546ca9b..6d7ade3f7b1a1329b5020ebe4692f387de8e40ee 100644 (file)
@@ -73,7 +73,6 @@ private:
             detail::stream_buffer_traits<
                 T, Tr, Alloc, Mode
             >::type                           base_type;
-    typedef T                                 policy_type;
 public:
     typedef typename char_type_of<T>::type    char_type;
     struct category 
similarity index 53%
rename from deal.II/contrib/boost/include/boost/iostreams/tee.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/tee.hpp
index 0106cda6a4647ce5e0a4cb2776c64359f2f147c6..3638456334d1feca5a9b2bdce155fea6d354f3f8 100644 (file)
@@ -40,13 +40,15 @@ public:
     typedef typename detail::param_type<Device>::type  param_type;
     typedef typename char_type_of<Device>::type        char_type;
     struct category
-        : multichar_output_filter_tag,
+        : dual_use_filter_tag,
+          multichar_tag,
           closable_tag,
           flushable_tag,
           localizable_tag,
           optimally_buffered_tag
         { };
 
+    BOOST_STATIC_ASSERT(is_device<Device>::value);
     BOOST_STATIC_ASSERT((
         is_convertible< // Using mode_of causes failures on VC6-7.0.
             BOOST_DEDUCED_TYPENAME iostreams::category_of<Device>::type, output
@@ -57,6 +59,18 @@ public:
         : detail::filter_adapter<Device>(dev) 
         { }
 
+    template<typename Source>
+    std::streamsize read(Source& src, char_type* s, std::streamsize n)
+    {
+        std::streamsize result = iostreams::read(src, s, n);
+        if (result != -1) {
+            std::streamsize result2 = iostreams::write(this->component(), s, result);
+            (void) result2; // Suppress 'unused variable' warning.
+            assert(result == result2);
+        }
+        return result;
+    }
+
     template<typename Sink>
     std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
     {
@@ -68,7 +82,7 @@ public:
     }
 
     template<typename Next>
-    void close(Next&)
+    void close(Next&, BOOST_IOS::openmode)
     { 
         detail::close_all(this->component());
     }
@@ -86,48 +100,77 @@ BOOST_IOSTREAMS_PIPABLE(tee_filter, 1)
 //
 // Template name: tee_device.
 // Template paramters:
-//      Sink1 - A blocking Sink.
-//      Sink2 - A blocking Sink.
+//      Device - A blocking Device.
+//      Sink - A blocking Sink.
 //
-template<typename Sink1, typename Sink2>
+template<typename Device, typename Sink>
 class tee_device {
 public:
-    typedef typename detail::param_type<Sink1>::type  param_type1;
-    typedef typename detail::param_type<Sink2>::type  param_type2;
-    typedef typename detail::value_type<Sink1>::type  value_type1;
-    typedef typename detail::value_type<Sink2>::type  value_type2;
-    typedef typename char_type_of<Sink1>::type        char_type;
+    typedef typename detail::param_type<Device>::type  device_param;
+    typedef typename detail::param_type<Sink>::type    sink_param;
+    typedef typename detail::value_type<Device>::type  device_value;
+    typedef typename detail::value_type<Sink>::type    sink_value;
+    typedef typename char_type_of<Device>::type        char_type;
+    typedef typename
+            mpl::if_<
+                 is_convertible<
+                     BOOST_DEDUCED_TYPENAME 
+                         iostreams::category_of<Device>::type, 
+                     output
+                 >,
+                 output,
+                 input
+            >::type                                    mode;
+    BOOST_STATIC_ASSERT(is_device<Device>::value);
+    BOOST_STATIC_ASSERT(is_device<Sink>::value);
     BOOST_STATIC_ASSERT((
         is_same<
             char_type, 
-            BOOST_DEDUCED_TYPENAME char_type_of<Sink2>::type
-        >::value
-    ));
-    BOOST_STATIC_ASSERT((
-        is_convertible< // Using mode_of causes failures on VC6-7.0.
-            BOOST_DEDUCED_TYPENAME iostreams::category_of<Sink1>::type, output
+            BOOST_DEDUCED_TYPENAME char_type_of<Sink>::type
         >::value
     ));
     BOOST_STATIC_ASSERT((
-        is_convertible< // Using mode_of causes failures on VC6-7.0.
-            BOOST_DEDUCED_TYPENAME iostreams::category_of<Sink2>::type, output
+        is_convertible<
+            BOOST_DEDUCED_TYPENAME iostreams::category_of<Sink>::type, 
+            output
         >::value
     ));
     struct category
-        : output,
+        : mode,
           device_tag,
           closable_tag,
           flushable_tag,
           localizable_tag,
           optimally_buffered_tag
         { };
-    tee_device(param_type1 sink1, param_type2 sink2
-        : sink1_(sink1), sink2_(sink2)
+    tee_device(device_param device, sink_param sink
+        : dev_(device), sink_(sink)
         { }
+    std::streamsize read(char_type* s, std::streamsize n)
+    {
+        BOOST_STATIC_ASSERT((
+            is_convertible<
+                BOOST_DEDUCED_TYPENAME iostreams::category_of<Device>::type, input
+            >::value
+        ));
+        std::streamsize result1 = iostreams::read(dev_, s, n);
+        if (result1 != -1) {
+            std::streamsize result2 = iostreams::write(sink_, s, result1);
+            (void) result1; // Suppress 'unused variable' warning.
+            (void) result2;
+            assert(result1 == result2);
+        }
+        return result1;
+    }
     std::streamsize write(const char_type* s, std::streamsize n)
     {
-        std::streamsize result1 = iostreams::write(sink1_, s, n);
-        std::streamsize result2 = iostreams::write(sink2_, s, n);
+        BOOST_STATIC_ASSERT((
+            is_convertible<
+                BOOST_DEDUCED_TYPENAME iostreams::category_of<Device>::type, output
+            >::value
+        ));
+        std::streamsize result1 = iostreams::write(dev_, s, n);
+        std::streamsize result2 = iostreams::write(sink_, s, n);
         (void) result1; // Suppress 'unused variable' warning.
         (void) result2;
         assert(result1 == n && result2 == n);
@@ -135,38 +178,38 @@ public:
     }
     void close()
     {
-        detail::execute_all( detail::call_close_all(sink1_),
-                             detail::call_close_all(sink2_) );
+        detail::execute_all( detail::call_close_all(dev_),
+                             detail::call_close_all(sink_) );
     }
     bool flush()
     {
-        bool r1 = iostreams::flush(sink1_);
-        bool r2 = iostreams::flush(sink2_);
+        bool r1 = iostreams::flush(dev_);
+        bool r2 = iostreams::flush(sink_);
         return r1 && r2;
     }
     template<typename Locale>
     void imbue(const Locale& loc)
     {
-        iostreams::imbue(sink1_, loc);
-        iostreams::imbue(sink2_, loc);
+        iostreams::imbue(dev_, loc);
+        iostreams::imbue(sink_, loc);
     }
     std::streamsize optimal_buffer_size() const 
     {
-        return (std::max) ( iostreams::optimal_buffer_size(sink1_), 
-                            iostreams::optimal_buffer_size(sink2_) );
+        return (std::max) ( iostreams::optimal_buffer_size(dev_), 
+                            iostreams::optimal_buffer_size(sink_) );
     }
 private:
-    value_type1 sink1_;
-    value_type2 sink2_;
+    device_value  dev_;
+    sink_value    sink_;
 };
 
 template<typename Sink>
 tee_filter<Sink> tee(const Sink& snk) 
 { return tee_filter<Sink>(snk); }
 
-template<typename Sink1, typename Sink2>
-tee_device<Sink1, Sink2> tee(const Sink1& sink1, const Sink2& sink2
-{ return tee_device<Sink1, Sink2>(sink1, sink2); }
+template<typename Device, typename Sink>
+tee_device<Device, Sink> tee(const Device& dev, const Sink& sink
+{ return tee_device<Device, Sink>(dev, sink); }
 
 } } // End namespaces iostreams, boost.
 
similarity index 92%
rename from deal.II/contrib/boost/include/boost/iostreams/traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/iostreams/traits.hpp
index 08515412c043b9ac73f45afa5c4f62f9b6ad4468..be7e98f1d9a8c8791010d84d31e8fe2300dfa643 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <iosfwd>            // stream types, char_traits.
 #include <boost/config.hpp>  // partial spec, deduced typename.
+#include <boost/detail/workaround.hpp>
 #include <boost/iostreams/categories.hpp>
 #include <boost/iostreams/detail/bool_trait_def.hpp> 
 #include <boost/iostreams/detail/config/wide_streams.hpp>
 # include <boost/range/iterator_range.hpp>
 # include <boost/range/value_type.hpp>
 #endif // #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
-#include <boost/type_traits/is_convertible.hpp>     
+#include <boost/ref.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+
+// Must come last.
+#include <boost/iostreams/detail/config/disable_warnings.hpp>
 
 namespace boost { namespace iostreams {
 
@@ -269,6 +274,16 @@ struct category_of {
             >::type type;
 };
 
+// Partial specialization for reference wrappers
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //---------------------------//
+
+template<typename T>
+struct category_of< reference_wrapper<T> >
+    : category_of<T>
+    { };
+
+#endif // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //-----------------//
+
 //------------------Definition of get_category--------------------------------//
 
 // 
@@ -292,7 +307,7 @@ struct int_type_of {
 #endif
 };
 
-//------------------Definition of mode----------------------------------------//
+//------------------Definition of mode_of-------------------------------------//
 
 namespace detail {
 
@@ -323,6 +338,16 @@ struct io_mode_id {
 
 template<typename T> // Borland 5.6.4 requires this circumlocution.
 struct mode_of : detail::io_mode_impl< detail::io_mode_id<T>::value > { };
+
+// Partial specialization for reference wrappers
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //---------------------------//
+
+template<typename T>
+struct mode_of< reference_wrapper<T> >
+    : mode_of<T>
+    { };
+
+#endif // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //-----------------//
                     
 //------------------Definition of is_device, is_filter and is_direct----------//
 
@@ -361,4 +386,6 @@ struct is_direct : detail::has_trait<T, direct_tag> { };
 
 } } // End namespaces iostreams, boost.
 
+#include <boost/iostreams/detail/config/enable_warnings.hpp>
+
 #endif // #ifndef BOOST_IOSTREAMS_IO_TRAITS_HPP_INCLUDED
similarity index 97%
rename from deal.II/contrib/boost/include/boost/lambda/casts.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/casts.hpp
index a5f68561c5e3112e2a7b7b05c76b0ba73faf75ed..29437a8becf2bcfc7f820bae702a71811b34be13 100644 (file)
@@ -14,6 +14,8 @@
 #if !defined(BOOST_LAMBDA_CASTS_HPP)
 #define BOOST_LAMBDA_CASTS_HPP
 
+#include "boost/lambda/detail/suppress_unused.hpp"
+
 #include <typeinfo>
 
 namespace boost { 
@@ -64,11 +66,12 @@ public:
   }
 };
 
-  // typedid action
+// typeid action
 class typeid_action {
 public:
   template<class RET, class Arg1>
   static RET apply(Arg1 &a1) {
+    detail::suppress_unused_variable_warnings(a1);
     return typeid(a1);
   }
 };
similarity index 98%
rename from deal.II/contrib/boost/include/boost/lambda/detail/lambda_functor_base.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_functor_base.hpp
index 652bddaed1edc95d5d0c59bbf22044e233c89b5d..e5bb02a2e1d9b4712ebc754bfbf5cf1a74abab7e 100644 (file)
 namespace boost { 
 namespace lambda {
 
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
 
   // for return type deductions we wrap bound argument to this class,
   // which fulfils the base class contract for lambda_functors
@@ -42,6 +46,10 @@ public:
   RET call(CALL_FORMAL_ARGS) const { CALL_USE_ARGS; return elem; }
 };
 
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
+
 template <class T> 
 inline lambda_functor<identity<T&> > var(T& t) { return identity<T&>(t); }
 
@@ -262,6 +270,8 @@ class lambda_functor_base<explicit_return_type_action<RET>, Args>
 public:
   Args args;
 
+  typedef RET result_type;
+
   explicit lambda_functor_base(const Args& a) : args(a) {}
 
   template <class SigArgs> struct sig { typedef RET type; };
@@ -337,7 +347,7 @@ class lambda_functor_base<action<0, Act>, Args>
 {  
 public:  
 //  Args args; not needed
-  explicit lambda_functor_base(const Args& a) {}  
+  explicit lambda_functor_base(const Args& /*a*/) {}  
   
   template<class SigArgs> struct sig {  
     typedef typename return_type_N<Act, null_type>::type type;
similarity index 83%
rename from deal.II/contrib/boost/include/boost/lambda/detail/lambda_functors.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_functors.hpp
index cb6060e035f0070e8de0ca9560eaff059cc7af5f..5187c7d1bdab9c547128dc8e8c71487c95f5bc37 100644 (file)
 #ifndef BOOST_LAMBDA_LAMBDA_FUNCTORS_HPP
 #define BOOST_LAMBDA_LAMBDA_FUNCTORS_HPP
 
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+
+#include <boost/mpl/or.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_array.hpp>
+
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY1(A1, R1)\
+  typename lazy_disable_if<is_array<A1>, typename R1 >::type
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY2(A1, A2, R1, R2) \
+  typename lazy_disable_if<mpl::or_<is_array<A1>, is_array<A2> >, typename R1, R2 >::type
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY3(A1, A2, A3, R1, R2, R3) \
+  typename lazy_disable_if<mpl::or_<is_array<A1>, is_array<A2>, is_array<A3> >, typename R1, R2, R3 >::type
+
+#else
+
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY1(A1, R1) typename R1::type
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY2(A1, A2, R1, R2) typename R1, R2::type
+#define BOOST_LAMBDA_DISABLE_IF_ARRAY3(A1, A2, A3, R1, R2, R3) typename R1, R2, R3::type
+
+#endif
+
 namespace boost { 
 namespace lambda {
 
@@ -105,7 +129,10 @@ typedef const lambda_functor<placeholder<THIRD> >  placeholder3_type;
 // other lambda_functors.
 // -------------------------------------------------------------------
 
-
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
 
 // -- lambda_functor NONE ------------------------------------------------
 template <class T>
@@ -149,7 +176,7 @@ public:
   }
 
   template<class A>
-  typename inherited::template sig<tuple<A const&> >::type
+  BOOST_LAMBDA_DISABLE_IF_ARRAY1(A, inherited::template sig<tuple<A const&> >)
   operator()(A const& a) const { 
     return inherited::template call<
       typename inherited::template sig<tuple<A const&> >::type
@@ -165,7 +192,7 @@ public:
   }
 
   template<class A, class B>
-  typename inherited::template sig<tuple<A const&, B&> >::type
+  BOOST_LAMBDA_DISABLE_IF_ARRAY2(A, B, inherited::template sig<tuple<A const&, B&> >)
   operator()(A const& a, B& b) const { 
     return inherited::template call<
       typename inherited::template sig<tuple<A const&, B&> >::type
@@ -173,7 +200,7 @@ public:
   }
 
   template<class A, class B>
-  typename inherited::template sig<tuple<A&, B const&> >::type
+  BOOST_LAMBDA_DISABLE_IF_ARRAY2(A, B, inherited::template sig<tuple<A&, B const&> >)
   operator()(A& a, B const& b) const { 
     return inherited::template call<
       typename inherited::template sig<tuple<A&, B const&> >::type
@@ -181,7 +208,7 @@ public:
   }
 
   template<class A, class B>
-  typename inherited::template sig<tuple<A const&, B const&> >::type
+  BOOST_LAMBDA_DISABLE_IF_ARRAY2(A, B, inherited::template sig<tuple<A const&, B const&> >)
   operator()(A const& a, B const& b) const { 
     return inherited::template call<
       typename inherited::template sig<tuple<A const&, B const&> >::type
@@ -198,7 +225,7 @@ public:
   }
 
   template<class A, class B, class C>
-  typename inherited::template sig<tuple<A const&, B const&, C const&> >::type
+  BOOST_LAMBDA_DISABLE_IF_ARRAY3(A, B, C, inherited::template sig<tuple<A const&, B const&, C const&> >)
   operator()(A const& a, B const& b, C const& c) const
   { 
     return inherited::template call<
@@ -244,6 +271,9 @@ public:
   } 
 };
 
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
 
 } // namespace lambda
 } // namespace boost
similarity index 88%
rename from deal.II/contrib/boost/include/boost/lambda/detail/lambda_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/lambda_traits.hpp
index 9a3a9b3a23bc0450601c9e19908af009e5f3d907..0e683c2ea7c88cca41a6e353aa78f16a03ec0927 100644 (file)
@@ -430,6 +430,56 @@ struct bind_traits<const volatile T[n]> {
   typedef const volatile T (&type)[n];
 };
 
+template<class R>
+struct bind_traits<R()> {
+    typedef R(&type)();
+};
+
+template<class R, class Arg1>
+struct bind_traits<R(Arg1)> {
+    typedef R(&type)(Arg1);
+};
+
+template<class R, class Arg1, class Arg2>
+struct bind_traits<R(Arg1, Arg2)> {
+    typedef R(&type)(Arg1, Arg2);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3>
+struct bind_traits<R(Arg1, Arg2, Arg3)> {
+    typedef R(&type)(Arg1, Arg2, Arg3);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4, Arg5)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4, Arg5);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8);
+};
+
+template<class R, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9>
+struct bind_traits<R(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9)> {
+    typedef R(&type)(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9);
+};
+
 template<class T> 
 struct bind_traits<reference_wrapper<T> >{
   typedef T& type;
similarity index 94%
rename from deal.II/contrib/boost/include/boost/lambda/detail/operator_return_type_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operator_return_type_traits.hpp
index 913fa86a000d1328baafae1bcef6fd892c711114..b2d3d3ad9c66915b34b3f580b4639485baecb099 100644 (file)
@@ -15,6 +15,7 @@
 #include "boost/type_traits/same_traits.hpp"
 
 #include "boost/indirect_reference.hpp"
+#include "boost/detail/container_fwd.hpp"
 
 #include <cstddef> // needed for the ptrdiff_t
 #include <iosfwd>  // for istream and ostream
@@ -58,10 +59,6 @@ template <> struct promote_code<long double> { static const int value = 700; };
 } // namespace lambda 
 } // namespace boost
 
-namespace std {
-  template<class T> class complex;
-}
-
 namespace boost { 
 namespace lambda {
 namespace detail {
@@ -228,34 +225,15 @@ template <> struct contentsof_type<null_type> {
 
 
 template <class A> struct contentsof_type<const A> {
-  typedef typename contentsof_type<A>::type type1;
-  // return a reference to the underlying const type
-  // the IF is because the A::reference in the primary template could
-  // be some class type rather than a real reference, hence
-  // we do not want to make it a reference here either
-    typedef typename detail::IF<
-      is_reference<type1>::value, 
-      const typename boost::remove_reference<type1>::type &,
-      const type1
-  >::RET type;
+  typedef typename contentsof_type<A>::type type;
 };
 
 template <class A> struct contentsof_type<volatile A> {
-  typedef typename contentsof_type<A>::type type1;
-  typedef typename detail::IF<
-    is_reference<type1>::value, 
-    volatile typename boost::remove_reference<type1>::type &,
-    volatile type1
-  >::RET type;
+  typedef typename contentsof_type<A>::type type;
 };
 
 template <class A> struct contentsof_type<const volatile A> {
-  typedef typename contentsof_type<A>::type type1;
-  typedef typename detail::IF<
-    is_reference<type1>::value, 
-    const volatile typename boost::remove_reference<type1>::type &,
-    const volatile type1
-  >::RET type;
+  typedef typename contentsof_type<A>::type type;
 };
 
   // standard iterator traits should take care of the pointer types 
@@ -853,44 +831,6 @@ struct return_type_2<other_action<subscript_action>, A, B> {
 
 };
 
-
-} // namespace lambda
-} // namespace boost
-
-
-// Forward declarations are incompatible with the libstdc++ debug mode.
-#if BOOST_WORKAROUND(__GNUC__, >= 3) && defined(_GLIBCXX_DEBUG)
-#include <string>
-#include <vector>
-#include <map>
-#include <deque>
-#else
-
-// The GCC 2.95.x uses a non-conformant deque
-#if BOOST_WORKAROUND(__GNUC__, == 2) && __GNUC_MINOR__ <= 96
-#include <deque>
-#else
-
-namespace std {
-  template <class T, class Allocator> class deque;
-}
-
-#endif
-
-namespace std {
- template <class Char, class Traits, class Allocator> class basic_string;
- template <class T, class Allocator> class vector;
- template <class Key, class T, class Cmp, class Allocator> class map;
- template <class Key, class T, class Cmp, class Allocator> class multimap;
-}
-
-#endif
-
-
-
-namespace boost { 
-namespace lambda {
-
 template<class Key, class T, class Cmp, class Allocator, class B> 
 struct plain_return_type_2<other_action<subscript_action>, std::map<Key, T, Cmp, Allocator>, B> { 
   typedef T& type;
@@ -933,6 +873,41 @@ struct plain_return_type_2<other_action<subscript_action>, const std::basic_stri
   typedef typename std::basic_string<Char, Traits, Allocator>::const_reference type;
 };
 
+template<class Char, class Traits, class Allocator> 
+struct plain_return_type_2<arithmetic_action<plus_action>,
+                           std::basic_string<Char, Traits, Allocator>,
+                           std::basic_string<Char, Traits, Allocator> > { 
+  typedef std::basic_string<Char, Traits, Allocator> type;
+};
+
+template<class Char, class Traits, class Allocator> 
+struct plain_return_type_2<arithmetic_action<plus_action>,
+                           const Char*,
+                           std::basic_string<Char, Traits, Allocator> > { 
+  typedef std::basic_string<Char, Traits, Allocator> type;
+};
+
+template<class Char, class Traits, class Allocator> 
+struct plain_return_type_2<arithmetic_action<plus_action>,
+                           std::basic_string<Char, Traits, Allocator>,
+                           const Char*> { 
+  typedef std::basic_string<Char, Traits, Allocator> type;
+};
+
+template<class Char, class Traits, class Allocator, std::size_t N> 
+struct plain_return_type_2<arithmetic_action<plus_action>,
+                           Char[N],
+                           std::basic_string<Char, Traits, Allocator> > { 
+  typedef std::basic_string<Char, Traits, Allocator> type;
+};
+
+template<class Char, class Traits, class Allocator, std::size_t N> 
+struct plain_return_type_2<arithmetic_action<plus_action>,
+                           std::basic_string<Char, Traits, Allocator>,
+                           Char[N]> { 
+  typedef std::basic_string<Char, Traits, Allocator> type;
+};
+
 
 } // namespace lambda
 } // namespace boost
similarity index 98%
rename from deal.II/contrib/boost/include/boost/lambda/detail/operators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/operators.hpp
index 4fdece20cc17bb5dcd2c729bc57f6867f8ba3a09..29eb1067240dfca8dcdbeee6d176f4c73eaca724 100644 (file)
@@ -258,17 +258,17 @@ operator>>(const lambda_functor<Arg>& a, Ret(&b)(ManipArg))
 #error "Multiple defines of  BOOST_LAMBDA_PTR_ARITHMETIC_E1"
 #endif
 
-#define BOOST_LAMBDA_PTR_ARITHMETIC_E1(OPER_NAME, ACTION, CONSTB)            \
+#define BOOST_LAMBDA_PTR_ARITHMETIC_E1(OPER_NAME, ACTION, CONSTB)           \
 template<class Arg, int N, class B>                                         \
 inline const                                                                \
 lambda_functor<                                                             \
-  lambda_functor_base<ACTION, tuple<lambda_functor<Arg>, CONSTB(&)[N]> >   \
+  lambda_functor_base<ACTION, tuple<lambda_functor<Arg>, CONSTB(&)[N]> >    \
 >                                                                           \
-OPER_NAME (const lambda_functor<Arg>& a, CONSTB(&b)[N])                    \
+OPER_NAME (const lambda_functor<Arg>& a, CONSTB(&b)[N])                     \
 {                                                                           \
-  return lambda_functor<                                                    \
-    lambda_functor_base<ACTION, tuple<lambda_functor<Arg>, CONSTB(&)[N]> > \
-  >(tuple<lambda_functor<Arg>, CONSTB(&)[N]>(a, b));                       \
+  return                                                                    \
+    lambda_functor_base<ACTION, tuple<lambda_functor<Arg>, CONSTB(&)[N]> >  \
+  (tuple<lambda_functor<Arg>, CONSTB(&)[N]>(a, b));                         \
 }
 
 
@@ -276,15 +276,15 @@ OPER_NAME (const lambda_functor<Arg>& a, CONSTB(&b)[N])                    \
 #error "Multiple defines of  BOOST_LAMBDA_PTR_ARITHMETIC_E2"
 #endif
 
-#define BOOST_LAMBDA_PTR_ARITHMETIC_E2(OPER_NAME, ACTION, CONSTA)             \
-template<int N, class A, class Arg>                                          \
-inline const                                                                 \
-lambda_functor<                                                              \
+#define BOOST_LAMBDA_PTR_ARITHMETIC_E2(OPER_NAME, ACTION, CONSTA)           \
+template<int N, class A, class Arg>                                         \
+inline const                                                                \
+lambda_functor<                                                             \
   lambda_functor_base<ACTION, tuple<CONSTA(&)[N], lambda_functor<Arg> > >   \
->                                                                            \
+>                                                                           \
 OPER_NAME (CONSTA(&a)[N], const lambda_functor<Arg>& b)                     \
-{                                                                            \
-  return                                                                     \
+{                                                                           \
+  return                                                                    \
     lambda_functor_base<ACTION, tuple<CONSTA(&)[N], lambda_functor<Arg> > > \
     (tuple<CONSTA(&)[N], lambda_functor<Arg> >(a, b));                      \
 }
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/suppress_unused.hpp b/deal.II/contrib/boost-1.41.0/include/boost/lambda/detail/suppress_unused.hpp
new file mode 100644 (file)
index 0000000..43999f1
--- /dev/null
@@ -0,0 +1,27 @@
+// Boost Lambda Library  suppress_unused.hpp -----------------------------
+//
+// Copyright (C) 2009 Steven Watanabe
+//
+// 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)
+//
+// For more information, see www.boost.org
+
+// ------------------------------------------------------------
+
+#ifndef BOOST_LAMBDA_SUPRESS_UNUSED_HPP
+#define BOOST_LAMBDA_SUPRESS_UNUSED_HPP
+
+namespace boost { 
+namespace lambda {
+namespace detail {
+
+template<class T>
+inline void suppress_unused_variable_warnings(const T&) {}
+
+}
+}
+}
+
+#endif
similarity index 99%
rename from deal.II/contrib/boost/include/boost/lambda/switch.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lambda/switch.hpp
index a2c3bad960026c6418d3759c09a03a1c36345e3e..05d02e98c31d49f1a4c17ff95144781bb3c9bb72 100644 (file)
@@ -465,12 +465,18 @@ BOOST_LAMBDA_SWITCH( BOOST_PP_INC(N) )
 #define BOOST_LAMBDA_SWITCH_STATEMENT_HELPER(z, N, A) \
 BOOST_LAMBDA_SWITCH_STATEMENT(BOOST_PP_INC(N))
 
-
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4065)
+#endif
 
   // up to 9 cases supported (counting default:)
 BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_HELPER,FOO)
 BOOST_PP_REPEAT_2ND(9,BOOST_LAMBDA_SWITCH_STATEMENT_HELPER,FOO)
 
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
 
 } // namespace lambda 
 } // namespace boost
similarity index 96%
rename from deal.II/contrib/boost/include/boost/lexical_cast.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/lexical_cast.hpp
index bc678fac0564f26be1d3c4b72608ff7616bdc629..d7d90521a1a7b6a1db903b765832e14cf4bfe1c6 100644 (file)
 #include <sstream>
 #endif
 
-#if defined(BOOST_NO_STRINGSTREAM) || \
-    defined(BOOST_NO_STD_WSTRING) || \
-    defined(BOOST_NO_STD_LOCALE) 
+#if defined(BOOST_NO_STRINGSTREAM) || defined(BOOST_NO_STD_WSTRING)
 #define BOOST_LCAST_NO_WCHAR_T
 #endif
 
+#ifdef BOOST_NO_TYPEID
+#define BOOST_LCAST_THROW_BAD_CAST(S, T) throw_exception(bad_lexical_cast())
+#else
+#define BOOST_LCAST_THROW_BAD_CAST(Source, Target) \
+    throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)))
+#endif
+
 namespace boost
 {
     // exception used to indicate runtime lexical_cast failure
@@ -60,15 +65,21 @@ namespace boost
     {
     public:
         bad_lexical_cast() :
-        source(&typeid(void)), target(&typeid(void))
+#ifndef BOOST_NO_TYPEID
+          source(&typeid(void)), target(&typeid(void))
+#else
+          source(0), target(0) // this breaks getters
+#endif
         {
         }
+
         bad_lexical_cast(
             const std::type_info &source_type_arg,
             const std::type_info &target_type_arg) :
             source(&source_type_arg), target(&target_type_arg)
         {
         }
+
         const std::type_info &source_type() const
         {
             return *source;
@@ -77,6 +88,7 @@ namespace boost
         {
             return *target;
         }
+
         virtual const char *what() const throw()
         {
             return "bad lexical cast: "
@@ -570,7 +582,7 @@ namespace boost
             lexical_stream(char_type* = 0, char_type* = 0)
             {
                 stream.unsetf(std::ios::skipws);
-                lcast_set_precision(stream, (Source*)0, (Target*)0);
+                lcast_set_precision(stream, static_cast<Source*>(0), static_cast<Target*>(0) );
             }
             ~lexical_stream()
             {
@@ -687,7 +699,7 @@ namespace boost
             {
                 this->setp(start, finish);
                 std::basic_ostream<CharT> stream(static_cast<Base*>(this));
-                lcast_set_precision(stream, (OutputStreamable*)0);
+                lcast_set_precision(stream, static_cast<OutputStreamable*>(0));
                 bool const result = !(stream << input).fail();
                 finish = this->pptr();
                 return result;
@@ -757,7 +769,7 @@ namespace boost
                 this->setg(start, start, finish);
                 std::basic_istream<CharT> stream(static_cast<Base*>(this));
                 stream.unsetf(std::ios::skipws);
-                lcast_set_precision(stream, (InputStreamable*)0);
+                lcast_set_precision(stream, static_cast<InputStreamable*>(0));
 #if (defined _MSC_VER)
 # pragma warning( pop )
 #endif
@@ -1104,6 +1116,12 @@ namespace boost
             typedef const T * type;
         };
 
+#if (defined _MSC_VER)
+# pragma warning( push )
+# pragma warning( disable : 4701 ) // possible use of ... before initialization
+# pragma warning( disable : 4702 ) // unreachable code
+#endif
+
         template< typename Target
                 , typename Source
                 , bool Unlimited // string representation of Source is unlimited
@@ -1129,24 +1147,14 @@ namespace boost
               , detail::lexical_stream_limited_src<CharT,base,traits>
               >::type interpreter(buf, buf + src_len);
 
-            // The original form, reproduced below, is more elegant
-            // but yields a spurious C4701 warning ("possible use of
-            // "result" before initialization") with VC7.1 (/W4).
-//
-//            Target result;
-//
-//            if(!(interpreter << arg && interpreter >> result))
-//                throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-//            return result;
-
-            if(interpreter << arg) {
-                Target result;
-                if (interpreter >> result)
-                    return result;
-            }
-            throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
-            return Target(); // normally never reached (throw_exception)
+            Target result;
+            if(!(interpreter << arg && interpreter >> result))
+                BOOST_LCAST_THROW_BAD_CAST(Source, Target);
+            return result;
         }
+#if (defined _MSC_VER)
+# pragma warning( pop )
+#endif
     }
 
     template<typename Target, typename Source>
@@ -1183,7 +1191,11 @@ namespace boost
         Target result;
 
         if(!(interpreter << arg && interpreter >> result))
+#ifndef BOOST_NO_TYPEID
             throw_exception(bad_lexical_cast(typeid(Source), typeid(Target)));
+#else
+            throw_exception(bad_lexical_cast());
+#endif
         return result;
     }
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/limits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/limits.hpp
index 6d01daa3539500021e383b9b84009fe465998111..d3747a1ad135cc6d5d0b69448851ae9ddc97835e 100644 (file)
@@ -6,7 +6,7 @@
 //
 // use this header as a workaround for missing <limits>
 
-//  See http://www.boost.org/libs/utility/limits.html for documentation.
+//  See http://www.boost.org/libs/compatibility/index.html for documentation.
 
 #ifndef BOOST_LIMITS
 #define BOOST_LIMITS
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/make_shared.hpp b/deal.II/contrib/boost-1.41.0/include/boost/make_shared.hpp
new file mode 100644 (file)
index 0000000..c04938f
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
+#define BOOST_MAKE_SHARED_HPP_INCLUDED
+
+//  make_shared.hpp
+//
+//  Copyright (c) 2007, 2008 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  See http://www.boost.org/libs/smart_ptr/make_shared.html
+//  for documentation.
+
+#include <boost/smart_ptr/make_shared.hpp>
+
+#endif // #ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_digamma.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_digamma.hpp
new file mode 100644 (file)
index 0000000..3d7819b
--- /dev/null
@@ -0,0 +1,294 @@
+//  (C) Copyright John Maddock 2006-8.
+//  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)
+
+#ifndef BOOST_MATH_NTL_DIGAMMA
+#define BOOST_MATH_NTL_DIGAMMA
+
+#include <boost/math/tools/rational.hpp>
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/constants/constants.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+T big_digamma_helper(T x)
+{
+      static const T P[61] = {
+         boost::lexical_cast<T>("0.6660133691143982067148122682345055274952e81"),
+         boost::lexical_cast<T>("0.6365271516829242456324234577164675383137e81"),
+         boost::lexical_cast<T>("0.2991038873096202943405966144203628966976e81"),
+         boost::lexical_cast<T>("0.9211116495503170498076013367421231351115e80"),
+         boost::lexical_cast<T>("0.2090792764676090716286400360584443891749e80"),
+         boost::lexical_cast<T>("0.3730037777359591428226035156377978092809e79"),
+         boost::lexical_cast<T>("0.5446396536956682043376492370432031543834e78"),
+         boost::lexical_cast<T>("0.6692523966335177847425047827449069256345e77"),
+         boost::lexical_cast<T>("0.7062543624100864681625612653756619116848e76"),
+         boost::lexical_cast<T>("0.6499914905966283735005256964443226879158e75"),
+         boost::lexical_cast<T>("0.5280364564853225211197557708655426736091e74"),
+         boost::lexical_cast<T>("0.3823205608981176913075543599005095206953e73"),
+         boost::lexical_cast<T>("0.2486733714214237704739129972671154532415e72"),
+         boost::lexical_cast<T>("0.1462562139602039577983434547171318011675e71"),
+         boost::lexical_cast<T>("0.7821169065036815012381267259559910324285e69"),
+         boost::lexical_cast<T>("0.3820552182348155468636157988764435365078e68"),
+         boost::lexical_cast<T>("0.1711618296983598244658239925535632505062e67"),
+         boost::lexical_cast<T>("0.7056661618357643731419080738521475204245e65"),
+         boost::lexical_cast<T>("0.2685246896473614017356264531791459936036e64"),
+         boost::lexical_cast<T>("0.9455168125599643085283071944864977592391e62"),
+         boost::lexical_cast<T>("0.3087541626972538362237309145177486236219e61"),
+         boost::lexical_cast<T>("0.9367928873352980208052601301625005737407e59"),
+         boost::lexical_cast<T>("0.2645306130689794942883818547314327466007e58"),
+         boost::lexical_cast<T>("0.6961815141171454309161007351079576190079e56"),
+         boost::lexical_cast<T>("0.1709637824471794552313802669803885946843e55"),
+         boost::lexical_cast<T>("0.3921553258481531526663112728778759311158e53"),
+         boost::lexical_cast<T>("0.8409006354449988687714450897575728228696e51"),
+         boost::lexical_cast<T>("0.1686755204461325935742097669030363344927e50"),
+         boost::lexical_cast<T>("0.3166653542877070999007425197729038754254e48"),
+         boost::lexical_cast<T>("0.5566029092358215049069560272835654229637e46"),
+         boost::lexical_cast<T>("0.9161766287916328133080586672953875116242e44"),
+         boost::lexical_cast<T>("1412317772330871298317974693514430627922000"),
+         boost::lexical_cast<T>("20387991986727877473732570146112459874790"),
+         boost::lexical_cast<T>("275557928713904105182512535678580359839.3"),
+         boost::lexical_cast<T>("3485719851040516559072031256589598330.723"),
+         boost::lexical_cast<T>("41247046743564028399938106707656877.40859"),
+         boost::lexical_cast<T>("456274078125709314602601667471879.0147312"),
+         boost::lexical_cast<T>("4714450683242899367025707077155.310613012"),
+         boost::lexical_cast<T>("45453933537925041680009544258.75073849996"),
+         boost::lexical_cast<T>("408437900487067278846361972.302331241052"),
+         boost::lexical_cast<T>("3415719344386166273085838.705771571751035"),
+         boost::lexical_cast<T>("26541502879185876562320.93134691487351145"),
+         boost::lexical_cast<T>("191261415065918713661.1571433274648417668"),
+         boost::lexical_cast<T>("1275349770108718421.645275944284937551702"),
+         boost::lexical_cast<T>("7849171120971773.318910987434906905704272"),
+         boost::lexical_cast<T>("44455946386549.80866460312682983576538056"),
+         boost::lexical_cast<T>("230920362395.3198137186361608905136598046"),
+         boost::lexical_cast<T>("1095700096.240863858624279930600654130254"),
+         boost::lexical_cast<T>("4727085.467506050153744334085516289728134"),
+         boost::lexical_cast<T>("18440.75118859447173303252421991479005424"),
+         boost::lexical_cast<T>("64.62515887799460295677071749181651317052"),
+         boost::lexical_cast<T>("0.201851568864688406206528472883512147547"),
+         boost::lexical_cast<T>("0.0005565091674187978029138500039504078098143"),
+         boost::lexical_cast<T>("0.1338097668312907986354698683493366559613e-5"),
+         boost::lexical_cast<T>("0.276308225077464312820179030238305271638e-8"),
+         boost::lexical_cast<T>("0.4801582970473168520375942100071070575043e-11"),
+         boost::lexical_cast<T>("0.6829184144212920949740376186058541800175e-14"),
+         boost::lexical_cast<T>("0.7634080076358511276617829524639455399182e-17"),
+         boost::lexical_cast<T>("0.6290035083727140966418512608156646142409e-20"),
+         boost::lexical_cast<T>("0.339652245667538733044036638506893821352e-23"),
+         boost::lexical_cast<T>("0.9017518064256388530773585529891677854909e-27")
+      };
+      static const T Q[61] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("0.1386831185456898357379390197203894063459e81"),
+         boost::lexical_cast<T>("0.6467076379487574703291056110838151259438e81"),
+         boost::lexical_cast<T>("0.1394967823848615838336194279565285465161e82"),
+         boost::lexical_cast<T>("0.1872927317344192945218570366455046340458e82"),
+         boost::lexical_cast<T>("0.1772461045338946243584650759986310355937e82"),
+         boost::lexical_cast<T>("0.1267294892200258648315971144069595555118e82"),
+         boost::lexical_cast<T>("0.7157764838362416821508872117623058626589e81"),
+         boost::lexical_cast<T>("0.329447266909948668265277828268378274513e81"),
+         boost::lexical_cast<T>("0.1264376077317689779509250183194342571207e81"),
+         boost::lexical_cast<T>("0.4118230304191980787640446056583623228873e80"),
+         boost::lexical_cast<T>("0.1154393529762694616405952270558316515261e80"),
+         boost::lexical_cast<T>("0.281655612889423906125295485693696744275e79"),
+         boost::lexical_cast<T>("0.6037483524928743102724159846414025482077e78"),
+         boost::lexical_cast<T>("0.1145927995397835468123576831800276999614e78"),
+         boost::lexical_cast<T>("0.1938624296151985600348534009382865995154e77"),
+         boost::lexical_cast<T>("0.293980925856227626211879961219188406675e76"),
+         boost::lexical_cast<T>("0.4015574518216966910319562902099567437832e75"),
+         boost::lexical_cast<T>("0.4961475457509727343545565970423431880907e74"),
+         boost::lexical_cast<T>("0.5565482348278933960215521991000378896338e73"),
+         boost::lexical_cast<T>("0.5686112924615820754631098622770303094938e72"),
+         boost::lexical_cast<T>("0.5305988545844796293285410303747469932856e71"),
+         boost::lexical_cast<T>("0.4533363413802585060568537458067343491358e70"),
+         boost::lexical_cast<T>("0.3553932059473516064068322757331575565718e69"),
+         boost::lexical_cast<T>("0.2561198565218704414618802902533972354203e68"),
+         boost::lexical_cast<T>("0.1699519313292900324098102065697454295572e67"),
+         boost::lexical_cast<T>("0.1039830160862334505389615281373574959236e66"),
+         boost::lexical_cast<T>("0.5873082967977428281000961954715372504986e64"),
+         boost::lexical_cast<T>("0.3065255179030575882202133042549783442446e63"),
+         boost::lexical_cast<T>("0.1479494813481364701208655943688307245459e62"),
+         boost::lexical_cast<T>("0.6608150467921598615495180659808895663164e60"),
+         boost::lexical_cast<T>("0.2732535313770902021791888953487787496976e59"),
+         boost::lexical_cast<T>("0.1046402297662493314531194338414508049069e58"),
+         boost::lexical_cast<T>("0.3711375077192882936085049147920021549622e56"),
+         boost::lexical_cast<T>("0.1219154482883895482637944309702972234576e55"),
+         boost::lexical_cast<T>("0.3708359374149458741391374452286837880162e53"),
+         boost::lexical_cast<T>("0.1044095509971707189716913168889769471468e52"),
+         boost::lexical_cast<T>("0.271951506225063286130946773813524945052e50"),
+         boost::lexical_cast<T>("0.6548016291215163843464133978454065823866e48"),
+         boost::lexical_cast<T>("0.1456062447610542135403751730809295219344e47"),
+         boost::lexical_cast<T>("0.2986690175077969760978388356833006028929e45"),
+         boost::lexical_cast<T>("5643149706574013350061247429006443326844000"),
+         boost::lexical_cast<T>("98047545414467090421964387960743688053480"),
+         boost::lexical_cast<T>("1563378767746846395507385099301468978550"),
+         boost::lexical_cast<T>("22823360528584500077862274918382796495"),
+         boost::lexical_cast<T>("304215527004115213046601295970388750"),
+         boost::lexical_cast<T>("3690289075895685793844344966820325"),
+         boost::lexical_cast<T>("40584512015702371433911456606050"),
+         boost::lexical_cast<T>("402834190897282802772754873905"),
+         boost::lexical_cast<T>("3589522158493606918146495750"),
+         boost::lexical_cast<T>("28530557707503483723634725"),
+         boost::lexical_cast<T>("200714561335055753000730"),
+         boost::lexical_cast<T>("1237953783437761888641"),
+         boost::lexical_cast<T>("6614698701445762950"),
+         boost::lexical_cast<T>("30155495647727505"),
+         boost::lexical_cast<T>("114953256021450"),
+         boost::lexical_cast<T>("356398020013"),
+         boost::lexical_cast<T>("863113950"),
+         boost::lexical_cast<T>("1531345"),
+         boost::lexical_cast<T>("1770"),
+         boost::lexical_cast<T>("1")
+      };
+      static const T PD[60] = {
+         boost::lexical_cast<T>("0.6365271516829242456324234577164675383137e81"),
+         2*boost::lexical_cast<T>("0.2991038873096202943405966144203628966976e81"),
+         3*boost::lexical_cast<T>("0.9211116495503170498076013367421231351115e80"),
+         4*boost::lexical_cast<T>("0.2090792764676090716286400360584443891749e80"),
+         5*boost::lexical_cast<T>("0.3730037777359591428226035156377978092809e79"),
+         6*boost::lexical_cast<T>("0.5446396536956682043376492370432031543834e78"),
+         7*boost::lexical_cast<T>("0.6692523966335177847425047827449069256345e77"),
+         8*boost::lexical_cast<T>("0.7062543624100864681625612653756619116848e76"),
+         9*boost::lexical_cast<T>("0.6499914905966283735005256964443226879158e75"),
+         10*boost::lexical_cast<T>("0.5280364564853225211197557708655426736091e74"),
+         11*boost::lexical_cast<T>("0.3823205608981176913075543599005095206953e73"),
+         12*boost::lexical_cast<T>("0.2486733714214237704739129972671154532415e72"),
+         13*boost::lexical_cast<T>("0.1462562139602039577983434547171318011675e71"),
+         14*boost::lexical_cast<T>("0.7821169065036815012381267259559910324285e69"),
+         15*boost::lexical_cast<T>("0.3820552182348155468636157988764435365078e68"),
+         16*boost::lexical_cast<T>("0.1711618296983598244658239925535632505062e67"),
+         17*boost::lexical_cast<T>("0.7056661618357643731419080738521475204245e65"),
+         18*boost::lexical_cast<T>("0.2685246896473614017356264531791459936036e64"),
+         19*boost::lexical_cast<T>("0.9455168125599643085283071944864977592391e62"),
+         20*boost::lexical_cast<T>("0.3087541626972538362237309145177486236219e61"),
+         21*boost::lexical_cast<T>("0.9367928873352980208052601301625005737407e59"),
+         22*boost::lexical_cast<T>("0.2645306130689794942883818547314327466007e58"),
+         23*boost::lexical_cast<T>("0.6961815141171454309161007351079576190079e56"),
+         24*boost::lexical_cast<T>("0.1709637824471794552313802669803885946843e55"),
+         25*boost::lexical_cast<T>("0.3921553258481531526663112728778759311158e53"),
+         26*boost::lexical_cast<T>("0.8409006354449988687714450897575728228696e51"),
+         27*boost::lexical_cast<T>("0.1686755204461325935742097669030363344927e50"),
+         28*boost::lexical_cast<T>("0.3166653542877070999007425197729038754254e48"),
+         29*boost::lexical_cast<T>("0.5566029092358215049069560272835654229637e46"),
+         30*boost::lexical_cast<T>("0.9161766287916328133080586672953875116242e44"),
+         31*boost::lexical_cast<T>("1412317772330871298317974693514430627922000"),
+         32*boost::lexical_cast<T>("20387991986727877473732570146112459874790"),
+         33*boost::lexical_cast<T>("275557928713904105182512535678580359839.3"),
+         34*boost::lexical_cast<T>("3485719851040516559072031256589598330.723"),
+         35*boost::lexical_cast<T>("41247046743564028399938106707656877.40859"),
+         36*boost::lexical_cast<T>("456274078125709314602601667471879.0147312"),
+         37*boost::lexical_cast<T>("4714450683242899367025707077155.310613012"),
+         38*boost::lexical_cast<T>("45453933537925041680009544258.75073849996"),
+         39*boost::lexical_cast<T>("408437900487067278846361972.302331241052"),
+         40*boost::lexical_cast<T>("3415719344386166273085838.705771571751035"),
+         41*boost::lexical_cast<T>("26541502879185876562320.93134691487351145"),
+         42*boost::lexical_cast<T>("191261415065918713661.1571433274648417668"),
+         43*boost::lexical_cast<T>("1275349770108718421.645275944284937551702"),
+         44*boost::lexical_cast<T>("7849171120971773.318910987434906905704272"),
+         45*boost::lexical_cast<T>("44455946386549.80866460312682983576538056"),
+         46*boost::lexical_cast<T>("230920362395.3198137186361608905136598046"),
+         47*boost::lexical_cast<T>("1095700096.240863858624279930600654130254"),
+         48*boost::lexical_cast<T>("4727085.467506050153744334085516289728134"),
+         49*boost::lexical_cast<T>("18440.75118859447173303252421991479005424"),
+         50*boost::lexical_cast<T>("64.62515887799460295677071749181651317052"),
+         51*boost::lexical_cast<T>("0.201851568864688406206528472883512147547"),
+         52*boost::lexical_cast<T>("0.0005565091674187978029138500039504078098143"),
+         53*boost::lexical_cast<T>("0.1338097668312907986354698683493366559613e-5"),
+         54*boost::lexical_cast<T>("0.276308225077464312820179030238305271638e-8"),
+         55*boost::lexical_cast<T>("0.4801582970473168520375942100071070575043e-11"),
+         56*boost::lexical_cast<T>("0.6829184144212920949740376186058541800175e-14"),
+         57*boost::lexical_cast<T>("0.7634080076358511276617829524639455399182e-17"),
+         58*boost::lexical_cast<T>("0.6290035083727140966418512608156646142409e-20"),
+         59*boost::lexical_cast<T>("0.339652245667538733044036638506893821352e-23"),
+         60*boost::lexical_cast<T>("0.9017518064256388530773585529891677854909e-27")
+      };
+      static const T QD[60] = {
+         boost::lexical_cast<T>("0.1386831185456898357379390197203894063459e81"),
+         2*boost::lexical_cast<T>("0.6467076379487574703291056110838151259438e81"),
+         3*boost::lexical_cast<T>("0.1394967823848615838336194279565285465161e82"),
+         4*boost::lexical_cast<T>("0.1872927317344192945218570366455046340458e82"),
+         5*boost::lexical_cast<T>("0.1772461045338946243584650759986310355937e82"),
+         6*boost::lexical_cast<T>("0.1267294892200258648315971144069595555118e82"),
+         7*boost::lexical_cast<T>("0.7157764838362416821508872117623058626589e81"),
+         8*boost::lexical_cast<T>("0.329447266909948668265277828268378274513e81"),
+         9*boost::lexical_cast<T>("0.1264376077317689779509250183194342571207e81"),
+         10*boost::lexical_cast<T>("0.4118230304191980787640446056583623228873e80"),
+         11*boost::lexical_cast<T>("0.1154393529762694616405952270558316515261e80"),
+         12*boost::lexical_cast<T>("0.281655612889423906125295485693696744275e79"),
+         13*boost::lexical_cast<T>("0.6037483524928743102724159846414025482077e78"),
+         14*boost::lexical_cast<T>("0.1145927995397835468123576831800276999614e78"),
+         15*boost::lexical_cast<T>("0.1938624296151985600348534009382865995154e77"),
+         16*boost::lexical_cast<T>("0.293980925856227626211879961219188406675e76"),
+         17*boost::lexical_cast<T>("0.4015574518216966910319562902099567437832e75"),
+         18*boost::lexical_cast<T>("0.4961475457509727343545565970423431880907e74"),
+         19*boost::lexical_cast<T>("0.5565482348278933960215521991000378896338e73"),
+         20*boost::lexical_cast<T>("0.5686112924615820754631098622770303094938e72"),
+         21*boost::lexical_cast<T>("0.5305988545844796293285410303747469932856e71"),
+         22*boost::lexical_cast<T>("0.4533363413802585060568537458067343491358e70"),
+         23*boost::lexical_cast<T>("0.3553932059473516064068322757331575565718e69"),
+         24*boost::lexical_cast<T>("0.2561198565218704414618802902533972354203e68"),
+         25*boost::lexical_cast<T>("0.1699519313292900324098102065697454295572e67"),
+         26*boost::lexical_cast<T>("0.1039830160862334505389615281373574959236e66"),
+         27*boost::lexical_cast<T>("0.5873082967977428281000961954715372504986e64"),
+         28*boost::lexical_cast<T>("0.3065255179030575882202133042549783442446e63"),
+         29*boost::lexical_cast<T>("0.1479494813481364701208655943688307245459e62"),
+         30*boost::lexical_cast<T>("0.6608150467921598615495180659808895663164e60"),
+         31*boost::lexical_cast<T>("0.2732535313770902021791888953487787496976e59"),
+         32*boost::lexical_cast<T>("0.1046402297662493314531194338414508049069e58"),
+         33*boost::lexical_cast<T>("0.3711375077192882936085049147920021549622e56"),
+         34*boost::lexical_cast<T>("0.1219154482883895482637944309702972234576e55"),
+         35*boost::lexical_cast<T>("0.3708359374149458741391374452286837880162e53"),
+         36*boost::lexical_cast<T>("0.1044095509971707189716913168889769471468e52"),
+         37*boost::lexical_cast<T>("0.271951506225063286130946773813524945052e50"),
+         38*boost::lexical_cast<T>("0.6548016291215163843464133978454065823866e48"),
+         39*boost::lexical_cast<T>("0.1456062447610542135403751730809295219344e47"),
+         40*boost::lexical_cast<T>("0.2986690175077969760978388356833006028929e45"),
+         41*boost::lexical_cast<T>("5643149706574013350061247429006443326844000"),
+         42*boost::lexical_cast<T>("98047545414467090421964387960743688053480"),
+         43*boost::lexical_cast<T>("1563378767746846395507385099301468978550"),
+         44*boost::lexical_cast<T>("22823360528584500077862274918382796495"),
+         45*boost::lexical_cast<T>("304215527004115213046601295970388750"),
+         46*boost::lexical_cast<T>("3690289075895685793844344966820325"),
+         47*boost::lexical_cast<T>("40584512015702371433911456606050"),
+         48*boost::lexical_cast<T>("402834190897282802772754873905"),
+         49*boost::lexical_cast<T>("3589522158493606918146495750"),
+         50*boost::lexical_cast<T>("28530557707503483723634725"),
+         51*boost::lexical_cast<T>("200714561335055753000730"),
+         52*boost::lexical_cast<T>("1237953783437761888641"),
+         53*boost::lexical_cast<T>("6614698701445762950"),
+         54*boost::lexical_cast<T>("30155495647727505"),
+         55*boost::lexical_cast<T>("114953256021450"),
+         56*boost::lexical_cast<T>("356398020013"),
+         57*boost::lexical_cast<T>("863113950"),
+         58*boost::lexical_cast<T>("1531345"),
+         59*boost::lexical_cast<T>("1770"),
+         60*boost::lexical_cast<T>("1")
+      };
+   static const double g = 63.192152;
+
+   T zgh = x + g - 0.5;
+
+   T result = (x - 0.5) / zgh;
+   result += log(zgh);
+   result += tools::evaluate_polynomial(PD, x) / tools::evaluate_polynomial(P, x);
+   result -= tools::evaluate_polynomial(QD, x) / tools::evaluate_polynomial(Q, x);
+   result -= 1;
+
+   return result;
+}
+
+template <class T>
+T big_digamma(T x)
+{
+   BOOST_MATH_STD_USING
+   if(x < 0)
+   {
+      return big_digamma_helper(static_cast<T>(1-x)) + constants::pi<T>() / tan(constants::pi<T>() * (1-x));
+   }
+   return big_digamma_helper(x);
+}
+
+}}}
+
+#endif // include guard
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_lanczos.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/detail/big_lanczos.hpp
new file mode 100644 (file)
index 0000000..ddd98a6
--- /dev/null
@@ -0,0 +1,887 @@
+//  (C) Copyright John Maddock 2006-8.
+//  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)
+
+#ifndef BOOST_BIG_LANCZOS_HPP
+#define BOOST_BIG_LANCZOS_HPP
+
+#include <boost/math/special_functions/lanczos.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace boost{ namespace math{ namespace lanczos{
+
+struct lanczos13UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      static const T num[13] = {
+         boost::lexical_cast<T>("44012138428004.60895436261759919070125699"),
+         boost::lexical_cast<T>("41590453358593.20051581730723108131357995"),
+         boost::lexical_cast<T>("18013842787117.99677796276038389462742949"),
+         boost::lexical_cast<T>("4728736263475.388896889723995205703970787"),
+         boost::lexical_cast<T>("837910083628.4046470415724300225777912264"),
+         boost::lexical_cast<T>("105583707273.4299344907359855510105321192"),
+         boost::lexical_cast<T>("9701363618.494999493386608345339104922694"),
+         boost::lexical_cast<T>("654914397.5482052641016767125048538245644"),
+         boost::lexical_cast<T>("32238322.94213356530668889463945849409184"),
+         boost::lexical_cast<T>("1128514.219497091438040721811544858643121"),
+         boost::lexical_cast<T>("26665.79378459858944762533958798805525125"),
+         boost::lexical_cast<T>("381.8801248632926870394389468349331394196"),
+         boost::lexical_cast<T>("2.506628274631000502415763426076722427007"),
+      };
+      static const boost::uint32_t denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 13);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      static const T num[13] = {
+         boost::lexical_cast<T>("86091529.53418537217994842267760536134841"),
+         boost::lexical_cast<T>("81354505.17858011242874285785316135398567"),
+         boost::lexical_cast<T>("35236626.38815461910817650960734605416521"),
+         boost::lexical_cast<T>("9249814.988024471294683815872977672237195"),
+         boost::lexical_cast<T>("1639024.216687146960253839656643518985826"),
+         boost::lexical_cast<T>("206530.8157641225032631778026076868855623"),
+         boost::lexical_cast<T>("18976.70193530288915698282139308582105936"),
+         boost::lexical_cast<T>("1281.068909912559479885759622791374106059"),
+         boost::lexical_cast<T>("63.06093343420234536146194868906771599354"),
+         boost::lexical_cast<T>("2.207470909792527638222674678171050209691"),
+         boost::lexical_cast<T>("0.05216058694613505427476207805814960742102"),
+         boost::lexical_cast<T>("0.0007469903808915448316510079585999893674101"),
+         boost::lexical_cast<T>("0.4903180573459871862552197089738373164184e-5"),
+      };
+      static const boost::uint32_t denom[13] = {
+         static_cast<boost::uint32_t>(0u),
+         static_cast<boost::uint32_t>(39916800u),
+         static_cast<boost::uint32_t>(120543840u),
+         static_cast<boost::uint32_t>(150917976u),
+         static_cast<boost::uint32_t>(105258076u),
+         static_cast<boost::uint32_t>(45995730u),
+         static_cast<boost::uint32_t>(13339535u),
+         static_cast<boost::uint32_t>(2637558u),
+         static_cast<boost::uint32_t>(357423u),
+         static_cast<boost::uint32_t>(32670u),
+         static_cast<boost::uint32_t>(1925u),
+         static_cast<boost::uint32_t>(66u),
+         static_cast<boost::uint32_t>(1u),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 13);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      static const T d[12] = {
+         boost::lexical_cast<T>("4.832115561461656947793029596285626840312"),
+         boost::lexical_cast<T>("-19.86441536140337740383120735104359034688"),
+         boost::lexical_cast<T>("33.9927422807443239927197864963170585331"),
+         boost::lexical_cast<T>("-31.41520692249765980987427413991250886138"),
+         boost::lexical_cast<T>("17.0270866009599345679868972409543597821"),
+         boost::lexical_cast<T>("-5.5077216950865501362506920516723682167"),
+         boost::lexical_cast<T>("1.037811741948214855286817963800439373362"),
+         boost::lexical_cast<T>("-0.106640468537356182313660880481398642811"),
+         boost::lexical_cast<T>("0.005276450526660653288757565778182586742831"),
+         boost::lexical_cast<T>("-0.0001000935625597121545867453746252064770029"),
+         boost::lexical_cast<T>("0.462590910138598083940803704521211569234e-6"),
+         boost::lexical_cast<T>("-0.1735307814426389420248044907765671743012e-9"),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[12] = {
+         boost::lexical_cast<T>("26.96979819614830698367887026728396466395"),
+         boost::lexical_cast<T>("-110.8705424709385114023884328797900204863"),
+         boost::lexical_cast<T>("189.7258846119231466417015694690434770085"),
+         boost::lexical_cast<T>("-175.3397202971107486383321670769397356553"),
+         boost::lexical_cast<T>("95.03437648691551457087250340903980824948"),
+         boost::lexical_cast<T>("-30.7406022781665264273675797983497141978"),
+         boost::lexical_cast<T>("5.792405601630517993355102578874590410552"),
+         boost::lexical_cast<T>("-0.5951993240669148697377539518639997795831"),
+         boost::lexical_cast<T>("0.02944979359164017509944724739946255067671"),
+         boost::lexical_cast<T>("-0.0005586586555377030921194246330399163602684"),
+         boost::lexical_cast<T>("0.2581888478270733025288922038673392636029e-5"),
+         boost::lexical_cast<T>("-0.9685385411006641478305219367315965391289e-9"),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 13.1445650000000000545696821063756942749; }
+};
+
+
+//
+// Lanczos Coefficients for N=22 G=22.61891
+// Max experimental error (with arbitary precision arithmetic) 2.9524e-38
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 23 2006
+//
+struct lanczos22UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      static const T num[22] = {
+         boost::lexical_cast<T>("46198410803245094237463011094.12173081986"),
+         boost::lexical_cast<T>("43735859291852324413622037436.321513777"),
+         boost::lexical_cast<T>("19716607234435171720534556386.97481377748"),
+         boost::lexical_cast<T>("5629401471315018442177955161.245623932129"),
+         boost::lexical_cast<T>("1142024910634417138386281569.245580222392"),
+         boost::lexical_cast<T>("175048529315951173131586747.695329230778"),
+         boost::lexical_cast<T>("21044290245653709191654675.41581372963167"),
+         boost::lexical_cast<T>("2033001410561031998451380.335553678782601"),
+         boost::lexical_cast<T>("160394318862140953773928.8736211601848891"),
+         boost::lexical_cast<T>("10444944438396359705707.48957290388740896"),
+         boost::lexical_cast<T>("565075825801617290121.1466393747967538948"),
+         boost::lexical_cast<T>("25475874292116227538.99448534450411942597"),
+         boost::lexical_cast<T>("957135055846602154.6720835535232270205725"),
+         boost::lexical_cast<T>("29874506304047462.23662392445173880821515"),
+         boost::lexical_cast<T>("769651310384737.2749087590725764959689181"),
+         boost::lexical_cast<T>("16193289100889.15989633624378404096011797"),
+         boost::lexical_cast<T>("273781151680.6807433264462376754578933261"),
+         boost::lexical_cast<T>("3630485900.32917021712188739762161583295"),
+         boost::lexical_cast<T>("36374352.05577334277856865691538582936484"),
+         boost::lexical_cast<T>("258945.7742115532455441786924971194951043"),
+         boost::lexical_cast<T>("1167.501919472435718934219997431551246996"),
+         boost::lexical_cast<T>("2.50662827463100050241576528481104525333"),
+      };
+      static const T denom[22] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("2432902008176640000"),
+         boost::lexical_cast<T>("8752948036761600000"),
+         boost::lexical_cast<T>("13803759753640704000"),
+         boost::lexical_cast<T>("12870931245150988800"),
+         boost::lexical_cast<T>("8037811822645051776"),
+         boost::lexical_cast<T>("3599979517947607200"),
+         boost::lexical_cast<T>("1206647803780373360"),
+         boost::lexical_cast<T>("311333643161390640"),
+         boost::lexical_cast<T>("63030812099294896"),
+         boost::lexical_cast<T>("10142299865511450"),
+         boost::lexical_cast<T>("1307535010540395"),
+         boost::lexical_cast<T>("135585182899530"),
+         boost::lexical_cast<T>("11310276995381"),
+         boost::lexical_cast<T>("756111184500"),
+         boost::lexical_cast<T>("40171771630"),
+         boost::lexical_cast<T>("1672280820"),
+         boost::lexical_cast<T>("53327946"),
+         boost::lexical_cast<T>("1256850"),
+         boost::lexical_cast<T>("20615"),
+         boost::lexical_cast<T>("210"),
+         boost::lexical_cast<T>("1"),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 22);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      static const T num[22] = {
+         boost::lexical_cast<T>("6939996264376682180.277485395074954356211"),
+         boost::lexical_cast<T>("6570067992110214451.87201438870245659384"),
+         boost::lexical_cast<T>("2961859037444440551.986724631496417064121"),
+         boost::lexical_cast<T>("845657339772791245.3541226499766163431651"),
+         boost::lexical_cast<T>("171556737035449095.2475716923888737881837"),
+         boost::lexical_cast<T>("26296059072490867.7822441885603400926007"),
+         boost::lexical_cast<T>("3161305619652108.433798300149816829198706"),
+         boost::lexical_cast<T>("305400596026022.4774396904484542582526472"),
+         boost::lexical_cast<T>("24094681058862.55120507202622377623528108"),
+         boost::lexical_cast<T>("1569055604375.919477574824168939428328839"),
+         boost::lexical_cast<T>("84886558909.02047889339710230696942513159"),
+         boost::lexical_cast<T>("3827024985.166751989686050643579753162298"),
+         boost::lexical_cast<T>("143782298.9273215199098728674282885500522"),
+         boost::lexical_cast<T>("4487794.24541641841336786238909171265944"),
+         boost::lexical_cast<T>("115618.2025760830513505888216285273541959"),
+         boost::lexical_cast<T>("2432.580773108508276957461757328744780439"),
+         boost::lexical_cast<T>("41.12782532742893597168530008461874360191"),
+         boost::lexical_cast<T>("0.5453771709477689805460179187388702295792"),
+         boost::lexical_cast<T>("0.005464211062612080347167337964166505282809"),
+         boost::lexical_cast<T>("0.388992321263586767037090706042788910953e-4"),
+         boost::lexical_cast<T>("0.1753839324538447655939518484052327068859e-6"),
+         boost::lexical_cast<T>("0.3765495513732730583386223384116545391759e-9"),
+      };
+      static const T denom[22] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("2432902008176640000"),
+         boost::lexical_cast<T>("8752948036761600000"),
+         boost::lexical_cast<T>("13803759753640704000"),
+         boost::lexical_cast<T>("12870931245150988800"),
+         boost::lexical_cast<T>("8037811822645051776"),
+         boost::lexical_cast<T>("3599979517947607200"),
+         boost::lexical_cast<T>("1206647803780373360"),
+         boost::lexical_cast<T>("311333643161390640"),
+         boost::lexical_cast<T>("63030812099294896"),
+         boost::lexical_cast<T>("10142299865511450"),
+         boost::lexical_cast<T>("1307535010540395"),
+         boost::lexical_cast<T>("135585182899530"),
+         boost::lexical_cast<T>("11310276995381"),
+         boost::lexical_cast<T>("756111184500"),
+         boost::lexical_cast<T>("40171771630"),
+         boost::lexical_cast<T>("1672280820"),
+         boost::lexical_cast<T>("53327946"),
+         boost::lexical_cast<T>("1256850"),
+         boost::lexical_cast<T>("20615"),
+         boost::lexical_cast<T>("210"),
+         boost::lexical_cast<T>("1"),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 22);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      static const T d[21] = {
+         boost::lexical_cast<T>("8.318998691953337183034781139546384476554"),
+         boost::lexical_cast<T>("-63.15415991415959158214140353299240638675"),
+         boost::lexical_cast<T>("217.3108224383632868591462242669081540163"),
+         boost::lexical_cast<T>("-448.5134281386108366899784093610397354889"),
+         boost::lexical_cast<T>("619.2903759363285456927248474593012711346"),
+         boost::lexical_cast<T>("-604.1630177420625418522025080080444177046"),
+         boost::lexical_cast<T>("428.8166750424646119935047118287362193314"),
+         boost::lexical_cast<T>("-224.6988753721310913866347429589434550302"),
+         boost::lexical_cast<T>("87.32181627555510833499451817622786940961"),
+         boost::lexical_cast<T>("-25.07866854821128965662498003029199058098"),
+         boost::lexical_cast<T>("5.264398125689025351448861011657789005392"),
+         boost::lexical_cast<T>("-0.792518936256495243383586076579921559914"),
+         boost::lexical_cast<T>("0.08317448364744713773350272460937904691566"),
+         boost::lexical_cast<T>("-0.005845345166274053157781068150827567998882"),
+         boost::lexical_cast<T>("0.0002599412126352082483326238522490030412391"),
+         boost::lexical_cast<T>("-0.6748102079670763884917431338234783496303e-5"),
+         boost::lexical_cast<T>("0.908824383434109002762325095643458603605e-7"),
+         boost::lexical_cast<T>("-0.5299325929309389890892469299969669579725e-9"),
+         boost::lexical_cast<T>("0.994306085859549890267983602248532869362e-12"),
+         boost::lexical_cast<T>("-0.3499893692975262747371544905820891835298e-15"),
+         boost::lexical_cast<T>("0.7260746353663365145454867069182884694961e-20"),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[21] = {
+         boost::lexical_cast<T>("75.39272007105208086018421070699575462226"),
+         boost::lexical_cast<T>("-572.3481967049935412452681346759966390319"),
+         boost::lexical_cast<T>("1969.426202741555335078065370698955484358"),
+         boost::lexical_cast<T>("-4064.74968778032030891520063865996757519"),
+         boost::lexical_cast<T>("5612.452614138013929794736248384309574814"),
+         boost::lexical_cast<T>("-5475.357667500026172903620177988213902339"),
+         boost::lexical_cast<T>("3886.243614216111328329547926490398103492"),
+         boost::lexical_cast<T>("-2036.382026072125407192448069428134470564"),
+         boost::lexical_cast<T>("791.3727954936062108045551843636692287652"),
+         boost::lexical_cast<T>("-227.2808432388436552794021219198885223122"),
+         boost::lexical_cast<T>("47.70974355562144229897637024320739257284"),
+         boost::lexical_cast<T>("-7.182373807798293545187073539819697141572"),
+         boost::lexical_cast<T>("0.7537866989631514559601547530490976100468"),
+         boost::lexical_cast<T>("-0.05297470142240154822658739758236594717787"),
+         boost::lexical_cast<T>("0.00235577330936380542539812701472320434133"),
+         boost::lexical_cast<T>("-0.6115613067659273118098229498679502138802e-4"),
+         boost::lexical_cast<T>("0.8236417010170941915758315020695551724181e-6"),
+         boost::lexical_cast<T>("-0.4802628430993048190311242611330072198089e-8"),
+         boost::lexical_cast<T>("0.9011113376981524418952720279739624707342e-11"),
+         boost::lexical_cast<T>("-0.3171854152689711198382455703658589996796e-14"),
+         boost::lexical_cast<T>("0.6580207998808093935798753964580596673177e-19"),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 22.61890999999999962710717227309942245483; }
+};
+
+//
+// Lanczos Coefficients for N=31 G=32.08067
+// Max experimental error (with arbitary precision arithmetic) 0.162e-52
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at May 9 2006
+//
+struct lanczos31UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      static const T num[31] = {
+         boost::lexical_cast<T>("0.2579646553333513328235723061836959833277e46"),
+         boost::lexical_cast<T>("0.2444796504337453845497419271639377138264e46"),
+         boost::lexical_cast<T>("0.1119885499016017172212179730662673475329e46"),
+         boost::lexical_cast<T>("0.3301983829072723658949204487793889113715e45"),
+         boost::lexical_cast<T>("0.7041171040503851585152895336505379417066e44"),
+         boost::lexical_cast<T>("0.1156687509001223855125097826246939403504e44"),
+         boost::lexical_cast<T>("1522559363393940883866575697565974893306000"),
+         boost::lexical_cast<T>("164914363507650839510801418717701057005700"),
+         boost::lexical_cast<T>("14978522943127593263654178827041568394060"),
+         boost::lexical_cast<T>("1156707153701375383907746879648168666774"),
+         boost::lexical_cast<T>("76739431129980851159755403434593664173.2"),
+         boost::lexical_cast<T>("4407916278928188620282281495575981079.306"),
+         boost::lexical_cast<T>("220487883931812802092792125175269667.3004"),
+         boost::lexical_cast<T>("9644828280794966468052381443992828.433924"),
+         boost::lexical_cast<T>("369996467042247229310044531282837.6549068"),
+         boost::lexical_cast<T>("12468380890717344610932904378961.13494291"),
+         boost::lexical_cast<T>("369289245210898235894444657859.0529720075"),
+         boost::lexical_cast<T>("9607992460262594951559461829.34885209022"),
+         boost::lexical_cast<T>("219225935074853412540086410.981421315799"),
+         boost::lexical_cast<T>("4374309943598658046326340.720767382079549"),
+         boost::lexical_cast<T>("76008779092264509404014.10530947173485581"),
+         boost::lexical_cast<T>("1143503533822162444712.335663112617754987"),
+         boost::lexical_cast<T>("14779233719977576920.37884890049671578409"),
+         boost::lexical_cast<T>("162409028440678302.9992838032166348069916"),
+         boost::lexical_cast<T>("1496561553388385.733407609544964535634135"),
+         boost::lexical_cast<T>("11347624460661.81008311053190661436107043"),
+         boost::lexical_cast<T>("68944915931.32004991941950530448472223832"),
+         boost::lexical_cast<T>("322701221.6391432296123937035480931903651"),
+         boost::lexical_cast<T>("1092364.213992634267819050120261755371294"),
+         boost::lexical_cast<T>("2380.151399852411512711176940867823024864"),
+         boost::lexical_cast<T>("2.506628274631000502415765284811045253007"),
+      };
+      static const T denom[31] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("0.8841761993739701954543616e31"),
+         boost::lexical_cast<T>("0.3502799997985980526649278464e32"),
+         boost::lexical_cast<T>("0.622621928420356134910574592e32"),
+         boost::lexical_cast<T>("66951000306085302338993639424000"),
+         boost::lexical_cast<T>("49361465831621147825759587123200"),
+         boost::lexical_cast<T>("26751280755793398822580822142976"),
+         boost::lexical_cast<T>("11139316913434780466101123891200"),
+         boost::lexical_cast<T>("3674201658710345201899117607040"),
+         boost::lexical_cast<T>("981347603630155088295475765440"),
+         boost::lexical_cast<T>("215760462268683520394805979744"),
+         boost::lexical_cast<T>("39539238727270799376544542000"),
+         boost::lexical_cast<T>("6097272817323042122728617800"),
+         boost::lexical_cast<T>("796974693974455191377937300"),
+         boost::lexical_cast<T>("88776380550648116217781890"),
+         boost::lexical_cast<T>("8459574446076318147830625"),
+         boost::lexical_cast<T>("691254538651580660999025"),
+         boost::lexical_cast<T>("48487623689430693038025"),
+         boost::lexical_cast<T>("2918939500751087661105"),
+         boost::lexical_cast<T>("150566737512021319125"),
+         boost::lexical_cast<T>("6634460278534540725"),
+         boost::lexical_cast<T>("248526574856284725"),
+         boost::lexical_cast<T>("7860403394108265"),
+         boost::lexical_cast<T>("207912996295875"),
+         boost::lexical_cast<T>("4539323721075"),
+         boost::lexical_cast<T>("80328850875"),
+         boost::lexical_cast<T>("1122686019"),
+         boost::lexical_cast<T>("11921175"),
+         boost::lexical_cast<T>("90335"),
+         boost::lexical_cast<T>("435"),
+         boost::lexical_cast<T>("1"),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 31);
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      static const T num[31] = {
+         boost::lexical_cast<T>("30137154810677525966583148469478.52374216"),
+         boost::lexical_cast<T>("28561746428637727032849890123131.36314653"),
+         boost::lexical_cast<T>("13083250730789213354063781611435.74046294"),
+         boost::lexical_cast<T>("3857598154697777600846539129354.783647"),
+         boost::lexical_cast<T>("822596651552555685068015316144.0952185852"),
+         boost::lexical_cast<T>("135131964033213842052904200372.039133532"),
+         boost::lexical_cast<T>("17787555889683709693655685146.19771358863"),
+         boost::lexical_cast<T>("1926639793777927562221423874.149673297196"),
+         boost::lexical_cast<T>("174989113988888477076973808.6991839697774"),
+         boost::lexical_cast<T>("13513425905835560387095425.01158383184045"),
+         boost::lexical_cast<T>("896521313378762433091075.1446749283094845"),
+         boost::lexical_cast<T>("51496223433749515758124.71524415105430686"),
+         boost::lexical_cast<T>("2575886794780078381228.37205955912263407"),
+         boost::lexical_cast<T>("112677328855422964200.4155776009524490958"),
+         boost::lexical_cast<T>("4322545967487943330.625233358130724324796"),
+         boost::lexical_cast<T>("145663957202380774.0362027607207590519723"),
+         boost::lexical_cast<T>("4314283729473470.686566233465428332496534"),
+         boost::lexical_cast<T>("112246988185485.8877916434026906290603878"),
+         boost::lexical_cast<T>("2561143864972.040563435178307062626388193"),
+         boost::lexical_cast<T>("51103611767.9626550674442537989885239605"),
+         boost::lexical_cast<T>("887985348.0369447209508500133077232094491"),
+         boost::lexical_cast<T>("13359172.3954672607019822025834072685839"),
+         boost::lexical_cast<T>("172660.8841147568768783928167105965064459"),
+         boost::lexical_cast<T>("1897.370795407433013556725714874693719617"),
+         boost::lexical_cast<T>("17.48383210090980598861217644749573257178"),
+         boost::lexical_cast<T>("0.1325705316732132940835251054350153028901"),
+         boost::lexical_cast<T>("0.0008054605783673449641889260501816356090452"),
+         boost::lexical_cast<T>("0.377001130700104515644336869896819162464e-5"),
+         boost::lexical_cast<T>("0.1276172868883867038813825443204454996531e-7"),
+         boost::lexical_cast<T>("0.2780651912081116274907381023821492811093e-10"),
+         boost::lexical_cast<T>("0.2928410648650955854121639682890739211234e-13"),
+      };
+      static const T denom[31] = {
+         boost::lexical_cast<T>("0"),
+         boost::lexical_cast<T>("0.8841761993739701954543616e31"),
+         boost::lexical_cast<T>("0.3502799997985980526649278464e32"),
+         boost::lexical_cast<T>("0.622621928420356134910574592e32"),
+         boost::lexical_cast<T>("66951000306085302338993639424000"),
+         boost::lexical_cast<T>("49361465831621147825759587123200"),
+         boost::lexical_cast<T>("26751280755793398822580822142976"),
+         boost::lexical_cast<T>("11139316913434780466101123891200"),
+         boost::lexical_cast<T>("3674201658710345201899117607040"),
+         boost::lexical_cast<T>("981347603630155088295475765440"),
+         boost::lexical_cast<T>("215760462268683520394805979744"),
+         boost::lexical_cast<T>("39539238727270799376544542000"),
+         boost::lexical_cast<T>("6097272817323042122728617800"),
+         boost::lexical_cast<T>("796974693974455191377937300"),
+         boost::lexical_cast<T>("88776380550648116217781890"),
+         boost::lexical_cast<T>("8459574446076318147830625"),
+         boost::lexical_cast<T>("691254538651580660999025"),
+         boost::lexical_cast<T>("48487623689430693038025"),
+         boost::lexical_cast<T>("2918939500751087661105"),
+         boost::lexical_cast<T>("150566737512021319125"),
+         boost::lexical_cast<T>("6634460278534540725"),
+         boost::lexical_cast<T>("248526574856284725"),
+         boost::lexical_cast<T>("7860403394108265"),
+         boost::lexical_cast<T>("207912996295875"),
+         boost::lexical_cast<T>("4539323721075"),
+         boost::lexical_cast<T>("80328850875"),
+         boost::lexical_cast<T>("1122686019"),
+         boost::lexical_cast<T>("11921175"),
+         boost::lexical_cast<T>("90335"),
+         boost::lexical_cast<T>("435"),
+         boost::lexical_cast<T>("1"),
+      };
+      return boost::math::tools::evaluate_rational(num, denom, z, 31);
+   }
+
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      static const T d[30] = {
+         boost::lexical_cast<T>("11.80038544942943603508206880307972596807"),
+         boost::lexical_cast<T>("-130.6355975335626214564236363322099481079"),
+         boost::lexical_cast<T>("676.2177719145993049893392276809256538927"),
+         boost::lexical_cast<T>("-2174.724497783850503069990936574060452057"),
+         boost::lexical_cast<T>("4869.877180638131076410069103742986502022"),
+         boost::lexical_cast<T>("-8065.744271864238179992762265472478229172"),
+         boost::lexical_cast<T>("10245.03825618572106228191509520638651539"),
+         boost::lexical_cast<T>("-10212.83902362683215459850403668669647192"),
+         boost::lexical_cast<T>("8110.289185383288952562767679576754140336"),
+         boost::lexical_cast<T>("-5179.310892558291062401828964000776095156"),
+         boost::lexical_cast<T>("2673.987492589052370230989109591011091273"),
+         boost::lexical_cast<T>("-1118.342574651205183051884250033505609141"),
+         boost::lexical_cast<T>("378.5812742511620662650096436471920295596"),
+         boost::lexical_cast<T>("-103.3725999812126067084828735543906768961"),
+         boost::lexical_cast<T>("22.62913974335996321848099677797888917792"),
+         boost::lexical_cast<T>("-3.936414819950859548507275533569588041446"),
+         boost::lexical_cast<T>("0.5376818198843817355682124535902641644854"),
+         boost::lexical_cast<T>("-0.0567827903603478957483409124122554243201"),
+         boost::lexical_cast<T>("0.004545544993648879420352693271088478106482"),
+         boost::lexical_cast<T>("-0.0002689795568951033950042375135970897959935"),
+         boost::lexical_cast<T>("0.1139493459006846530734617710847103572122e-4"),
+         boost::lexical_cast<T>("-0.3316581197839213921885210451302820192794e-6"),
+         boost::lexical_cast<T>("0.6285613334898374028443777562554713906213e-8"),
+         boost::lexical_cast<T>("-0.7222145115734409070310317999856424167091e-10"),
+         boost::lexical_cast<T>("0.4562976983547274766890241815002584238219e-12"),
+         boost::lexical_cast<T>("-0.1380593023819058919640038942493212141072e-14"),
+         boost::lexical_cast<T>("0.1629663871586410129307496385264268190679e-17"),
+         boost::lexical_cast<T>("-0.5429994291916548849493889660077076739993e-21"),
+         boost::lexical_cast<T>("0.2922682842441892106795386303084661338957e-25"),
+         boost::lexical_cast<T>("-0.8456967065309046044689041041336866118459e-31"),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      static const T d[30] = {
+         boost::lexical_cast<T>("147.9979641587472136175636384176549713358"),
+         boost::lexical_cast<T>("-1638.404318611773924210055619836375434296"),
+         boost::lexical_cast<T>("8480.981744216135641122944743711911653273"),
+         boost::lexical_cast<T>("-27274.93942104458448200467097634494071176"),
+         boost::lexical_cast<T>("61076.98019918759324489193232276937262854"),
+         boost::lexical_cast<T>("-101158.8762737154296509560513952101409264"),
+         boost::lexical_cast<T>("128491.1252383947174824913796141607174379"),
+         boost::lexical_cast<T>("-128087.2892038336581928787480535905496026"),
+         boost::lexical_cast<T>("101717.5492545853663296795562084430123258"),
+         boost::lexical_cast<T>("-64957.8330410311808907869707511362206858"),
+         boost::lexical_cast<T>("33536.59139229792478811870738772305570317"),
+         boost::lexical_cast<T>("-14026.01847115365926835980820243003785821"),
+         boost::lexical_cast<T>("4748.087094096186515212209389240715050212"),
+         boost::lexical_cast<T>("-1296.477510211815971152205100242259733245"),
+         boost::lexical_cast<T>("283.8099337545793198947620951499958085157"),
+         boost::lexical_cast<T>("-49.36969067101255103452092297769364837753"),
+         boost::lexical_cast<T>("6.743492833270653628580811118017061581404"),
+         boost::lexical_cast<T>("-0.7121578704864048548351804794951487823626"),
+         boost::lexical_cast<T>("0.0570092738016915476694118877057948681298"),
+         boost::lexical_cast<T>("-0.003373485297696102660302960722607722438643"),
+         boost::lexical_cast<T>("0.0001429128843527532859999752593761934089751"),
+         boost::lexical_cast<T>("-0.41595867130858508233493767243236888636e-5"),
+         boost::lexical_cast<T>("0.7883284669307241040059778207492255409785e-7"),
+         boost::lexical_cast<T>("-0.905786322462384670803148223703187214379e-9"),
+         boost::lexical_cast<T>("0.5722790216999820323272452464661250331451e-11"),
+         boost::lexical_cast<T>("-0.1731510870832349779315841757234562309727e-13"),
+         boost::lexical_cast<T>("0.2043890314358438601429048378015983874378e-16"),
+         boost::lexical_cast<T>("-0.6810185176079344204740000170500311171065e-20"),
+         boost::lexical_cast<T>("0.3665567641131713928114853776588342403919e-24"),
+         boost::lexical_cast<T>("-0.1060655106553177007425710511436497259484e-29"),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 32.08066999999999779902282170951366424561; }
+};
+
+//
+// Lanczos Coefficients for N=61 G=63.192152
+// Max experimental error (with 1000-bit precision arithmetic) 3.740e-113
+// Generated with compiler: Microsoft Visual C++ version 8.0 on Win32 at Mar 12 2006
+//
+struct lanczos61UDT
+{
+   template <class T>
+   static T lanczos_sum(const T& z)
+   {
+      using namespace boost;
+      static const T d[61] = {
+         boost::lexical_cast<T>("2.50662827463100050241576528481104525300698674060993831662992357634229365460784197494659584"),
+         boost::lexical_cast<T>("13349415823254323512107320481.3495396037261649201426994438803767191136434970492309775123879"),
+         boost::lexical_cast<T>("-300542621510568204264185787475.230003734889859348050696493467253861933279360152095861484548"),
+         boost::lexical_cast<T>("3273919938390136737194044982676.40271056035622723775417608127544182097346526115858803376474"),
+         boost::lexical_cast<T>("-22989594065095806099337396006399.5874206181563663855129141706748733174902067950115092492439"),
+         boost::lexical_cast<T>("116970582893952893160414263796102.542775878583510989850142808618916073286745084692189044738"),
+         boost::lexical_cast<T>("-459561969036479455224850813196807.283291532483532558959779434457349912822256480548436066098"),
+         boost::lexical_cast<T>("1450959909778264914956547227964788.89797179379520834974601372820249784303794436366366810477"),
+         boost::lexical_cast<T>("-3782846865486775046285288437885921.41537699732805465141128848354901016102326190612528503251"),
+         boost::lexical_cast<T>("8305043213936355459145388670886540.09976337905520168067329932809302445437208115570138102767"),
+         boost::lexical_cast<T>("-15580988484396722546934484726970745.4927787160273626078250810989811865283255762028143642311"),
+         boost::lexical_cast<T>("25262722284076250779006793435537600.0822901485517345545978818780090308947301031347345640449"),
+         boost::lexical_cast<T>("-35714428027687018805443603728757116.5304655170478705341887572982734901197345415291580897698"),
+         boost::lexical_cast<T>("44334726194692443174715432419157343.2294160783772787096321009453791271387235388689346602833"),
+         boost::lexical_cast<T>("-48599573547617297831555162417695106.187829304963846482633791012658974681648157963911491985"),
+         boost::lexical_cast<T>("47258466493366798944386359199482189.0753349196625125615316002614813737880755896979754845101"),
+         boost::lexical_cast<T>("-40913448215392412059728312039233342.142914753896559359297977982314043378636755884088383226"),
+         boost::lexical_cast<T>("31626312914486892948769164616982902.7262756989418188077611392594232674722318027323102462687"),
+         boost::lexical_cast<T>("-21878079174441332123064991795834438.4699982361692990285700077902601657354101259411789722708"),
+         boost::lexical_cast<T>("13567268503974326527361474986354265.3136632133935430378937191911532112778452274286122946396"),
+         boost::lexical_cast<T>("-7551494211746723529747611556474669.62996644923557605747803028485900789337467673523741066527"),
+         boost::lexical_cast<T>("3775516572689476384052312341432597.70584966904950490541958869730702790312581801585742038997"),
+         boost::lexical_cast<T>("-1696271471453637244930364711513292.79902955514107737992185368006225264329876265486853482449"),
+         boost::lexical_cast<T>("684857608019352767999083000986166.20765273693720041519286231015176745354062413008561259139"),
+         boost::lexical_cast<T>("-248397566275708464679881624417990.410438107634139924805871051723444048539177890346227250473"),
+         boost::lexical_cast<T>("80880368999557992138783568858556.1512378233079327986518410244522800950609595592170022878937"),
+         boost::lexical_cast<T>("-23618197945394013802495450485616.9025005749893350650829964098117490779655546610665927669729"),
+         boost::lexical_cast<T>("6176884636893816103087134481332.06708966653493024119556843727320635285468825056891248447124"),
+         boost::lexical_cast<T>("-1444348683723439589948246285262.64080678953468490544615312565485170860503207005915261691108"),
+         boost::lexical_cast<T>("301342031656979076702313946827.961658905182634508217626783081241074250132289461989777865387"),
+         boost::lexical_cast<T>("-55959656587719766738301589651.3940625826610668990368881615587469329021742236397809951765678"),
+         boost::lexical_cast<T>("9223339169004064297247180402.36227016155682738556103138196079389248843082157924368301293963"),
+         boost::lexical_cast<T>("-1344882881571942601385730283.42710150182526891377514071881534880944872423492272147871101373"),
+         boost::lexical_cast<T>("172841913316760599352601139.54409257740173055624405575900164401527761357324625574736896079"),
+         boost::lexical_cast<T>("-19496120443876233531343952.3802212016691702737346568192063937387825469602063310488794471653"),
+         boost::lexical_cast<T>("1920907372583710284097959.44121420322495784420169085871802458519363819782779653621724219067"),
+         boost::lexical_cast<T>("-164429314798240461613359.399597503536657962383155875723527581699785846599051112719962464604"),
+         boost::lexical_cast<T>("12154026644351189572525.1452249886865981747374191977801688548318519692423556934568426042152"),
+         boost::lexical_cast<T>("-770443988366210815096.519382051977221101156336663806705367929328924137169970381042234329058"),
+         boost::lexical_cast<T>("41558909851418707920.4696085656889424895313728719601503526476333404973280596225722152966128"),
+         boost::lexical_cast<T>("-1890879946549708819.24562220042687554209318172044783707920086716716717574156283898330017796"),
+         boost::lexical_cast<T>("71844996557297623.9583461685535340440524052492427928388171299145330229958643439878608673403"),
+         boost::lexical_cast<T>("-2253785109518255.55600197759875781765803818232939130127735487613049577235879610065545755637"),
+         boost::lexical_cast<T>("57616883849355.997562563968344493719962252675875692642406455612671495250543228005045106721"),
+         boost::lexical_cast<T>("-1182495730353.08218118278997948852215670614084013289033222774171548915344541249351599628436"),
+         boost::lexical_cast<T>("19148649358.6196967288062261380599423925174178776792840639099120170800869284300966978300613"),
+         boost::lexical_cast<T>("-239779605.891370259668403359614360511661030470269478602533200704639655585967442891496784613"),
+         boost::lexical_cast<T>("2267583.00284368310957842936892685032434505866445291643236133553754152047677944820353796872"),
+         boost::lexical_cast<T>("-15749.490806784673108773558070497383604733010677027764233749920147549999361110299643477893"),
+         boost::lexical_cast<T>("77.7059495149052727171505425584459982871343274332635726864135949842508025564999785370162956"),
+         boost::lexical_cast<T>("-0.261619987273930331397625130282851629108569607193781378836014468617185550622160348688297247"),
+         boost::lexical_cast<T>("0.000572252321659691600529444769356185993188551770817110673186068921175991328434642504616377475"),
+         boost::lexical_cast<T>("-0.765167220661540041663007112207436426423746402583423562585653954743978584117929356523307954e-6"),
+         boost::lexical_cast<T>("0.579179571056209077507916813937971472839851499147582627425979879366849876944438724610663401e-9"),
+         boost::lexical_cast<T>("-0.224804733043915149719206760378355636826808754704148660354494460792713189958510735070096991e-12"),
+         boost::lexical_cast<T>("0.392711975389579343321746945135488409914483448652884894759297584020979857734289645857714768e-16"),
+         boost::lexical_cast<T>("-0.258603588346412049542768766878162221817684639789901440429511261589010049357907537684380983e-20"),
+         boost::lexical_cast<T>("0.499992460848751668441190360024540741752242879565548017176883304716370989218399797418478685e-25"),
+         boost::lexical_cast<T>("-0.196211614533318174187346267877390498735734213905206562766348625767919122511096089367364025e-30"),
+         boost::lexical_cast<T>("0.874722648949676363732094858062907290148733370978226751462386623191111439121706262759209573e-37"),
+         boost::lexical_cast<T>("-0.163907874717737848669759890242660846846105433791283903651924563157080252845636658802930428e-44"),
+      };
+      T result = d[0];
+      for(unsigned k = 1; k < sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += d[k]/(z+(k-1));
+      }
+      return result;
+   }
+
+   template <class T>
+   static T lanczos_sum_expG_scaled(const T& z)
+   {
+      using namespace boost;
+      static const T d[61] = {
+         boost::lexical_cast<T>("0.901751806425638853077358552989167785490911341809902155556127108480303870921448984935411583e-27"),
+         boost::lexical_cast<T>("4.80241125306810017699523302110401965428995345115391817406006361151407344955277298373661032"),
+         boost::lexical_cast<T>("-108.119283021710869401330097315436214587270846871451487282117128515476478251641970487922552"),
+         boost::lexical_cast<T>("1177.78262074811362219818923738088833932279000985161077740440010901595132448469513438139561"),
+         boost::lexical_cast<T>("-8270.43570321334374279057432173814835581983913167617217749736484999327758232081395983082867"),
+         boost::lexical_cast<T>("42079.807161997077661752306902088979258826568702655699995911391774839958572703348502730394"),
+         boost::lexical_cast<T>("-165326.003834443330215001219988296482004968548294447320869281647211603153902436231468280089"),
+         boost::lexical_cast<T>("521978.361504895300685499370463597042533432134369277742485307843747923127933979566742421213"),
+         boost::lexical_cast<T>("-1360867.51629992863544553419296636395576666570468519805449755596254912681418267100657262281"),
+         boost::lexical_cast<T>("2987713.73338656161102517003716335104823650191612448011720936412226357385029800040631754755"),
+         boost::lexical_cast<T>("-5605212.64915921452169919008770165304171481697939254152852673009005154549681704553438450709"),
+         boost::lexical_cast<T>("9088186.58332916818449459635132673652700922052988327069535513580836143146727832380184335474"),
+         boost::lexical_cast<T>("-12848155.5543636394746355365819800465364996596310467415907815393346205151090486190421959769"),
+         boost::lexical_cast<T>("15949281.2867656960575878805158849857756293807220033618942867694361569866468996967761600898"),
+         boost::lexical_cast<T>("-17483546.9948295433308250581770557182576171673272450149400973735206019559576269174369907171"),
+         boost::lexical_cast<T>("17001087.8599749419660906448951424280111036786456594738278573653160553115681287326064596964"),
+         boost::lexical_cast<T>("-14718487.0643665950346574802384331125115747311674609017568623694516187494204567579595827859"),
+         boost::lexical_cast<T>("11377468.7255609717716845971105161298889777425898291183866813269222281486121330837791392732"),
+         boost::lexical_cast<T>("-7870571.64253038587947746661946939286858490057774448573157856145556080330153403858747655263"),
+         boost::lexical_cast<T>("4880783.08440908743641723492059912671377140680710345996273343885045364205895751515063844239"),
+         boost::lexical_cast<T>("-2716626.7992639625103140035635916455652302249897918893040695025407382316653674141983775542"),
+         boost::lexical_cast<T>("1358230.46602865696544327299659410214201327791319846880787515156343361311278133805428800255"),
+         boost::lexical_cast<T>("-610228.440751458395860905749312275043435828322076830117123636938979942213530882048883969802"),
+         boost::lexical_cast<T>("246375.416501158654327780901087115642493055617468601787093268312234390446439555559050129729"),
+         boost::lexical_cast<T>("-89360.2599028475206119333931211015869139511677735549267100272095432140508089207221096740632"),
+         boost::lexical_cast<T>("29096.4637987498328341260960356772198979319790332957125131055960448759586930781530063775634"),
+         boost::lexical_cast<T>("-8496.57401431514433694413130585404918350686834939156759654375188338156288564260152505382438"),
+         boost::lexical_cast<T>("2222.11523574301594407443285016240908726891841242444092960094015874546135316534057865883047"),
+         boost::lexical_cast<T>("-519.599993280949289705514822058693289933461756514489674453254304308040888101533569480646682"),
+         boost::lexical_cast<T>("108.406868361306987817730701109400305482972790224573776407166683184990131682003417239181112"),
+         boost::lexical_cast<T>("-20.1313142142558596796857948064047373605439974799116521459977609253211918146595346493447238"),
+         boost::lexical_cast<T>("3.31806787671783168020012913552384112429614503798293169239082032849759155847394955909684383"),
+         boost::lexical_cast<T>("-0.483817477111537877685595212919784447924875428848331771524426361483392903320495411973587861"),
+         boost::lexical_cast<T>("0.0621793463102927384924303843912913542297042029136293808338022462765755471002366206711862637"),
+         boost::lexical_cast<T>("-0.00701366932085103924241526535768453911099671087892444015581511551813219720807206445462785293"),
+         boost::lexical_cast<T>("0.000691040514756294308758606917671220770856269030526647010461217455799229645004351524024364997"),
+         boost::lexical_cast<T>("-0.591529398871361458428147660822525365922497109038495896497692806150033516658042357799869656e-4"),
+         boost::lexical_cast<T>("0.437237367535177689875119370170434437030440227275583289093139147244747901678407875809020739e-5"),
+         boost::lexical_cast<T>("-0.277164853397051135996651958345647824709602266382721185838782221179129726200661453504250697e-6"),
+         boost::lexical_cast<T>("0.149506899012035980148891401548317536032574502641368034781671941165064546410613201579653674e-7"),
+         boost::lexical_cast<T>("-0.68023824066463262779882895193964639544061678698791279217407325790147925675797085217462974e-9"),
+         boost::lexical_cast<T>("0.258460163734186329938721529982859244969655253624066115559707985878606277800329299821882688e-10"),
+         boost::lexical_cast<T>("-0.810792256024669306744649981276512583535251727474303382740940985102669076169168931092026491e-12"),
+         boost::lexical_cast<T>("0.207274966207031327521921078048021807442500113231320959236850963529304158700096495799022922e-13"),
+         boost::lexical_cast<T>("-0.425399199286327802950259994834798737777721414442095221716122926637623478450472871269742436e-15"),
+         boost::lexical_cast<T>("0.688866766744198529064607574117697940084548375790020728788313274612845280173338912495478431e-17"),
+         boost::lexical_cast<T>("-0.862599751805643281578607291655858333628582704771553874199104377131082877406179933909898885e-19"),
+         boost::lexical_cast<T>("0.815756005678735657200275584442908437977926312650210429668619446123450972547018343768177988e-21"),
+         boost::lexical_cast<T>("-0.566583084099007858124915716926967268295318152203932871370429534546567151650626184750291695e-23"),
+         boost::lexical_cast<T>("0.279544761599725082805446124351997692260093135930731230328454667675190245860598623539891708e-25"),
+         boost::lexical_cast<T>("-0.941169851584987983984201821679114408126982142904386301937192011680047611188837432096199601e-28"),
+         boost::lexical_cast<T>("0.205866011331040736302780507155525142187875191518455173304638008169488993406425201915370746e-30"),
+         boost::lexical_cast<T>("-0.27526655245712584371295491216289353976964567057707464008951584303679019796521332324352501e-33"),
+         boost::lexical_cast<T>("0.208358067979444305082929004102609366169534624348056112144990933897581971394396210379638792e-36"),
+         boost::lexical_cast<T>("-0.808728107661779323263133007119729988596844663194254976820030366188579170595441991680169012e-40"),
+         boost::lexical_cast<T>("0.141276924383478964519776436955079978012672985961918248012931336621229652792338950573694356e-43"),
+         boost::lexical_cast<T>("-0.930318449287651389310440021745842417218125582685428432576258687100661462527604238849332053e-48"),
+         boost::lexical_cast<T>("0.179870748819321661641184169834635133045197146966203370650788171790610563029431722308057539e-52"),
+         boost::lexical_cast<T>("-0.705865243912790337263229413370018392321238639017433365017168104310561824133229343750737083e-58"),
+         boost::lexical_cast<T>("0.3146787805734405996448268100558028857930560442377698646099945108125281507396722995748398e-64"),
+         boost::lexical_cast<T>("-0.589653534231618730406843260601322236697428143603814281282790370329151249078338470962782338e-72"),
+      };
+      T result = d[0];
+      for(unsigned k = 1; k < sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += d[k]/(z+(k-1));
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_1(const T& dz)
+   {
+      using namespace boost;
+      static const T d[60] = {
+         boost::lexical_cast<T>("23.2463658527729692390378860713647146932236940604550445351214987229819352880524561852919518"),
+         boost::lexical_cast<T>("-523.358012551815715084547614110229469295755088686612838322817729744722233637819564673967396"),
+         boost::lexical_cast<T>("5701.12892340421080714956066268650092612647620400476183901625272640935853188559347587495571"),
+         boost::lexical_cast<T>("-40033.5506451901904954336453419007623117537868026994808919201793803506999271787018654246699"),
+         boost::lexical_cast<T>("203689.884259074923009439144410340256983393397995558814367995938668111650624499963153485034"),
+         boost::lexical_cast<T>("-800270.648969745331278757692597096167418585957703057412758177038340791380011708874081291202"),
+         boost::lexical_cast<T>("2526668.23380061659863999395867315313385499515711742092815402701950519696944982260718031476"),
+         boost::lexical_cast<T>("-6587362.57559198722630391278043503867973853468105110382293763174847657538179665571836023631"),
+         boost::lexical_cast<T>("14462211.3454541602975917764900442754186801975533106565506542322063393991552960595701762805"),
+         boost::lexical_cast<T>("-27132375.1879227404375395522940895789625516798992585980380939378508607160857820002128106898"),
+         boost::lexical_cast<T>("43991923.8735251977856804364757478459275087361742168436524951824945035673768875988985478116"),
+         boost::lexical_cast<T>("-62192284.0030124679010201921841372967696262036115679150017649233887633598058364494608060812"),
+         boost::lexical_cast<T>("77203473.0770033513405070667417251568915937590689150831268228886281254637715669678358204991"),
+         boost::lexical_cast<T>("-84630180.2217173903516348977915150565994784278120192219937728967986198118628659866582594874"),
+         boost::lexical_cast<T>("82294807.2253549409847505891112074804416229757832871133388349982640444405470371147991706317"),
+         boost::lexical_cast<T>("-71245738.2484649177928765605893043553453557808557887270209768163561363857395639001251515788"),
+         boost::lexical_cast<T>("55073334.3180266913441333534260714059077572215147571872597651029894142803987981342430068594"),
+         boost::lexical_cast<T>("-38097984.1648990787690036742690550656061009857688125101191167768314179751258568264424911474"),
+         boost::lexical_cast<T>("23625729.5032184580395130592017474282828236643586203914515183078852982915252442161768527976"),
+         boost::lexical_cast<T>("-13149998.4348054726172055622442157883429575511528431835657668083088902165366619827169829685"),
+         boost::lexical_cast<T>("6574597.77221556423683199818131482663205682902023554728024972161230111356285973623550338976"),
+         boost::lexical_cast<T>("-2953848.1483469149918109110050192571921018042012905892107136410603990336401921230407043408"),
+         boost::lexical_cast<T>("1192595.29584357246380113611351829515963605337523874715861849584306265512819543347806085356"),
+         boost::lexical_cast<T>("-432553.812019608638388918135375154289816441900572658692369491476137741687213006403648722272"),
+         boost::lexical_cast<T>("140843.215385933866391177743292449477205328233960902455943995092958295858485718885800427129"),
+         boost::lexical_cast<T>("-41128.186992679630058614841985110676526199977321524879849001760603476646382839182691529968"),
+         boost::lexical_cast<T>("10756.2849191854701631989789887757784944313743544315113894758328432005767448056040879337769"),
+         boost::lexical_cast<T>("-2515.15559672041299884426826962296210458052543246529646213159169885444118227871246315458787"),
+         boost::lexical_cast<T>("524.750087004805200600237632074908875763734578390662349666321453103782638818305404274166951"),
+         boost::lexical_cast<T>("-97.4468596421732493988298219295878130651986131393383646674144877163795143930682205035917965"),
+         boost::lexical_cast<T>("16.0613108128210806736384551896802799172445298357754547684100294231532127326987175444453058"),
+         boost::lexical_cast<T>("-2.34194813526540240672426202485306862230641838409943369059203455578340880900483887447559874"),
+         boost::lexical_cast<T>("0.300982934748016059399829007219431333744032924923669397318820178988611410275964499475465815"),
+         boost::lexical_cast<T>("-0.033950095985367909789000959795708551814461844488183964432565731809399824963680858993718525"),
+         boost::lexical_cast<T>("0.00334502394288921146242772614150438404658527112198421937945605441697314216921393987758378122"),
+         boost::lexical_cast<T>("-0.000286333429067523984607730553301991502191011265745476190940771685897687956262049750683013485"),
+         boost::lexical_cast<T>("0.211647426149364947402896718485536530479491688838087899435991994237067890628274492042231115e-4"),
+         boost::lexical_cast<T>("-0.134163345121302758109675190598169832775248626443483098532368562186356128620805552609175683e-5"),
+         boost::lexical_cast<T>("0.723697303042715085329782938306424498336642078597508935450663080894255773653328980495047891e-7"),
+         boost::lexical_cast<T>("-0.329273487343139063533251321553223583999676337945788660475231347828772272134656322947906888e-8"),
+         boost::lexical_cast<T>("0.12510922551028971731767784013117088894558604838820475961392154031378891971216135267744134e-9"),
+         boost::lexical_cast<T>("-0.392468958215589939603666430583400537413757786057185505426804034745840192914621891690369903e-11"),
+         boost::lexical_cast<T>("0.100332717101049934370760667782927946803279422001380028508200697081188326364078428184546051e-12"),
+         boost::lexical_cast<T>("-0.205917088291197705194762747639836655808855850989058813560983717575008725393428497910009756e-14"),
+         boost::lexical_cast<T>("0.333450178247893143608439314203175490705783992567107481617660357577257627854979230819461489e-16"),
+         boost::lexical_cast<T>("-0.417546693906616047110563550428133589051498362676394888715581845170969319500638944065594319e-18"),
+         boost::lexical_cast<T>("0.394871691642184410859178529844325390739857256666676534513661579365702353214518478078730801e-20"),
+         boost::lexical_cast<T>("-0.274258012587811199757875927548699264063511843669070634471054184977334027224611843434000922e-22"),
+         boost::lexical_cast<T>("0.135315354265459854889496635967343027244391821142592599244505313738163473730636430399785048e-24"),
+         boost::lexical_cast<T>("-0.455579032003288910408487905303223613382276173706542364543918076752861628464036586507967767e-27"),
+         boost::lexical_cast<T>("0.99650703862462739161520123768147312466695159780582506041370833824093136783202694548427718e-30"),
+         boost::lexical_cast<T>("-0.1332444609228706921659395801935919548447859029572115502899861345555006827214220195650058e-32"),
+         boost::lexical_cast<T>("0.100856999148765307000182397631280249632761913433008379786888200467467364474581430670889392e-35"),
+         boost::lexical_cast<T>("-0.39146979455613683472384690509165395074425354524713697428673406058157887065953366609738731e-39"),
+         boost::lexical_cast<T>("0.683859606707931248105140296850112494069265272540298100341919970496564103098283709868586478e-43"),
+         boost::lexical_cast<T>("-0.450326344248604222735147147805963966503893913752040066400766411031387063854141246972061792e-47"),
+         boost::lexical_cast<T>("0.870675378039492904184581895322153006461319724931909799151743284769901586333730037761678891e-52"),
+         boost::lexical_cast<T>("-0.341678395249272265744518787745356400350877656459401143889000625280131819505857966769964401e-57"),
+         boost::lexical_cast<T>("0.152322191370871666358069530949353871960316638394428595988162174042653299702098929238880862e-63"),
+         boost::lexical_cast<T>("-0.285425405297633795767452984791738825078111150078605004958179057245980222485147999495352632e-71"),
+      };
+      T result = 0;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(k*dz + k*k);
+      }
+      return result;
+   }
+
+   template<class T>
+   static T lanczos_sum_near_2(const T& dz)
+   {
+      using namespace boost;
+      static const T d[60] = {
+         boost::lexical_cast<T>("557.56438192770795764344217888434355281097193198928944200046501607026919782564033547346298"),
+         boost::lexical_cast<T>("-12552.748616427645475141433405567201788681683808077269330800392600825597799119572762385222"),
+         boost::lexical_cast<T>("136741.650054039199076788077149441364242294724343897779563222338447737802381279007988884806"),
+         boost::lexical_cast<T>("-960205.223613240309942047656967301131022760634321049075674684679438471862998829007639437133"),
+         boost::lexical_cast<T>("4885504.47588736223774859617054275229642041717942140469884121916073195308537421162982679289"),
+         boost::lexical_cast<T>("-19194501.738192166918904824982935279260356575935661514109550613809352009246483412530545583"),
+         boost::lexical_cast<T>("60602169.8633537742937457094837494059849674261357199218329545854990149896822944801504450843"),
+         boost::lexical_cast<T>("-157997975.522506767297528502540724511908584668874487506510120462561270100749019845014382885"),
+         boost::lexical_cast<T>("346876323.86092543685419723290495817330608574729543216092477261152247521712190505658568876"),
+         boost::lexical_cast<T>("-650770365.471136883718747607976242475416651908858429752332176373467422603953536408709972919"),
+         boost::lexical_cast<T>("1055146856.05909309330903130910708372830487315684258450293308627289334336871273080305128138"),
+         boost::lexical_cast<T>("-1491682726.25614447429071368736790697283307005456720192465860871846879804207692411263924608"),
+         boost::lexical_cast<T>("1851726287.94866167094858600116562210167031458934987154557042242638980748286188183300900268"),
+         boost::lexical_cast<T>("-2029855953.68334371445800569238095379629407314338521720558391277508374519526853827142679839"),
+         boost::lexical_cast<T>("1973842002.53354868177824629525448788555435194808657489238517523691040148611221295436287925"),
+         boost::lexical_cast<T>("-1708829941.98209573247426625323314413060108441455314880934710595647408841619484540679859098"),
+         boost::lexical_cast<T>("1320934627.12433688699625456833930317624783222321555050330381730035733198249283009357314954"),
+         boost::lexical_cast<T>("-913780636.858542526294419197161614811332299249415125108737474024007693329922089123296358727"),
+         boost::lexical_cast<T>("566663423.929632170286007468016419798879660054391183200464733820209439185545886930103546787"),
+         boost::lexical_cast<T>("-315402880.436816230388857961460509181823167373029384218959199936902955049832392362044305869"),
+         boost::lexical_cast<T>("157691811.550465734461741500275930418786875005567018699867961482249002625886064187146134966"),
+         boost::lexical_cast<T>("-70848085.5705405970640618473551954585013808128304384354476488268600720054598122945113512731"),
+         boost::lexical_cast<T>("28604413.4050137708444142264980840059788755325900041515286382001704951527733220637586013815"),
+         boost::lexical_cast<T>("-10374808.7067303054787164054055989420809074792801592763124972441820101840292558840131568633"),
+         boost::lexical_cast<T>("3378126.32016207486657791623723515804931231041318964254116390764473281291389374196880720069"),
+         boost::lexical_cast<T>("-986460.090390653140964189383080344920103075349535669020623874668558777188889544398718979744"),
+         boost::lexical_cast<T>("257989.631187387317948158483575125380011593209850756066176921901006833159795100137743395985"),
+         boost::lexical_cast<T>("-60326.0391159227288325790327830741260824763549807922845004854215660451399733578621565837087"),
+         boost::lexical_cast<T>("12586.1375399649496159880821645216260841794563919652590583420570326276086323953958907053394"),
+         boost::lexical_cast<T>("-2337.26417330316922535871922886167444795452055677161063205953141105726549966801856628447293"),
+         boost::lexical_cast<T>("385.230745012608736644117458716226876976056390433401632749144285378123105481506733917763829"),
+         boost::lexical_cast<T>("-56.1716559403731491675970177460841997333796694857076749852739159067307309470690838101179615"),
+         boost::lexical_cast<T>("7.21907953468550196348585224042498727840087634483369357697580053424523903859773769748599575"),
+         boost::lexical_cast<T>("-0.814293485887386870805786409956942772883474224091975496298369877683530509729332902182019049"),
+         boost::lexical_cast<T>("0.0802304419995150047616460464220884371214157889148846405799324851793571580868840034085001373"),
+         boost::lexical_cast<T>("-0.00686771095380619535195996193943858680694970000948742557733102777115482017857981277171196115"),
+         boost::lexical_cast<T>("0.000507636621977556438232617777542864427109623356049335590894564220687567763620803789858345916"),
+         boost::lexical_cast<T>("-0.32179095465362720747836116655088181481893063531138957363431280817392443948706754917605911e-4"),
+         boost::lexical_cast<T>("0.173578890579848508947329833426585354230744194615295570820295052665075101971588563893718407e-5"),
+         boost::lexical_cast<T>("-0.789762880006288893888161070734302768702358633525134582027140158619195373770299678322596835e-7"),
+         boost::lexical_cast<T>("0.300074637200885066788470310738617992259402710843493097610337134266720909870967550606601658e-8"),
+         boost::lexical_cast<T>("-0.941337297619721713151110244242536308266701344868601679868536153775533330272973088246835359e-10"),
+         boost::lexical_cast<T>("0.24064815013182536657310186836079333949814111498828401548170442715552017773994482539471456e-11"),
+         boost::lexical_cast<T>("-0.493892399304811910466345686492277504628763169549384435563232052965821874553923373100791477e-13"),
+         boost::lexical_cast<T>("0.799780678476644196901221989475355609743387528732994566453160178199295104357319723742820593e-15"),
+         boost::lexical_cast<T>("-0.100148627870893347527249092785257443532967736956154251497569191947184705954310833302770086e-16"),
+         boost::lexical_cast<T>("0.947100256812658897084619699699028861352615460106539259289295071616221848196411749449858071e-19"),
+         boost::lexical_cast<T>("-0.657808193528898116367845405906343884364280888644748907819280236995018351085371701094007759e-21"),
+         boost::lexical_cast<T>("0.324554050057463845012469010247790763753999056976705084126950591088538742509983426730851614e-23"),
+         boost::lexical_cast<T>("-0.10927068902162908990029309141242256163212535730975970310918370355165185052827948996110107e-25"),
+         boost::lexical_cast<T>("0.239012340507870646690121104637467232366271566488184795459093215303237974655782634371712486e-28"),
+         boost::lexical_cast<T>("-0.31958700972990573259359660326375143524864710953063781494908314884519046349402409667329667e-31"),
+         boost::lexical_cast<T>("0.241905641292988284384362036555782113275737930713192053073501265726048089991747342247551645e-34"),
+         boost::lexical_cast<T>("-0.93894080230619233745797029179332447129464915420290457418429337322820997038069119047864035e-38"),
+         boost::lexical_cast<T>("0.164023814025085488413251990798690797467351995518990067783355251949198292596815470576539877e-41"),
+         boost::lexical_cast<T>("-0.108010831192689925518484618970761942019888832176355541674171850211917230280206410356465451e-45"),
+         boost::lexical_cast<T>("0.208831600642796805563854019033577205240227465154130766898180386564934443551840379116390645e-50"),
+         boost::lexical_cast<T>("-0.819516067465171848863933747691434138146789031214932473898084756489529673230665363014007306e-56"),
+         boost::lexical_cast<T>("0.365344970579318347488211604761724311582675708113250505307342682118101409913523622073678179e-62"),
+         boost::lexical_cast<T>("-0.684593199208628857931267904308244537968349564351534581234005234847904343404822808648361291e-70"),
+      };
+      T result = 0;
+      T z = dz + 2;
+      for(unsigned k = 1; k <= sizeof(d)/sizeof(d[0]); ++k)
+      {
+         result += (-d[k-1]*dz)/(z + k*z + k*k - 1);
+      }
+      return result;
+   }
+
+   static double g(){ return 63.19215200000000010049916454590857028961181640625; }
+};
+
+}}} // namespaces
+
+#endif
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/mpfr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/bindings/mpfr.hpp
new file mode 100644 (file)
index 0000000..25336ca
--- /dev/null
@@ -0,0 +1,850 @@
+//  Copyright John Maddock 2008.
+//  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)
+//
+// Wrapper that works with mpfr_class defined in gmpfrxx.h
+// See http://math.berkeley.edu/~wilken/code/gmpfrxx/
+// Also requires the gmp and mpfr libraries.
+//
+
+#ifndef BOOST_MATH_MPLFR_BINDINGS_HPP
+#define BOOST_MATH_MPLFR_BINDINGS_HPP
+
+#include <gmpfrxx.h>
+#include <boost/math/tools/precision.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/math/policies/policy.hpp>
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
+
+inline mpfr_class fabs(const mpfr_class& v)
+{
+   return abs(v);
+}
+
+inline mpfr_class pow(const mpfr_class& b, const mpfr_class e)
+{
+   mpfr_class result;
+   mpfr_pow(result.__get_mp(), b.__get_mp(), e.__get_mp(), GMP_RNDN);
+   return result;
+}
+
+inline mpfr_class ldexp(const mpfr_class& v, int e)
+{
+   //int e = mpfr_get_exp(*v.__get_mp());
+   mpfr_class result(v);
+   mpfr_set_exp(result.__get_mp(), e);
+   return result;
+}
+
+inline mpfr_class frexp(const mpfr_class& v, int* expon)
+{
+   int e = mpfr_get_exp(v.__get_mp());
+   mpfr_class result(v);
+   mpfr_set_exp(result.__get_mp(), 0);
+   *expon = e;
+   return result;
+}
+
+mpfr_class fmod(const mpfr_class& v1, const mpfr_class& v2)
+{
+   mpfr_class n;
+   if(v1 < 0)
+      n = ceil(v1 / v2);
+   else
+      n = floor(v1 / v2);
+   return v1 - n * v2;
+}
+
+template <class Policy>
+inline mpfr_class modf(const mpfr_class& v, long long* ipart, const Policy& pol)
+{
+   *ipart = lltrunc(v, pol);
+   return v - boost::math::tools::real_cast<mpfr_class>(*ipart);
+}
+template <class Policy>
+inline int iround(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<int>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline long lround(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline long long llround(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::round(x, pol));
+}
+
+template <class Policy>
+inline int itrunc(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<int>(boost::math::trunc(x, pol));
+}
+
+template <class Policy>
+inline long ltrunc(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long>(boost::math::trunc(x, pol));
+}
+
+template <class Policy>
+inline long long lltrunc(mpfr_class const& x, const Policy& pol)
+{
+   return boost::math::tools::real_cast<long long>(boost::math::trunc(x, pol));
+}
+
+namespace boost{ namespace math{
+
+#if defined(__GNUC__) && (__GNUC__ < 4)
+   using ::iround;
+   using ::lround;
+   using ::llround;
+   using ::itrunc;
+   using ::ltrunc;
+   using ::lltrunc;
+   using ::modf;
+#endif
+
+namespace lanczos{
+
+struct mpfr_lanczos
+{
+   static mpfr_class lanczos_sum(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum(z);
+   }
+   static mpfr_class lanczos_sum_expG_scaled(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_expG_scaled(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_expG_scaled(z);
+   }
+   static mpfr_class lanczos_sum_near_1(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_1(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_1(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_1(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_1(z);
+   }
+   static mpfr_class lanczos_sum_near_2(const mpfr_class& z)
+   {
+      unsigned long p = z.get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_2(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_2(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_2(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_2(z);
+   }
+   static mpfr_class g()
+   { 
+      unsigned long p = mpfr_class::get_dprec();
+      if(p <= 72)
+         return lanczos13UDT::g();
+      else if(p <= 120)
+         return lanczos22UDT::g();
+      else if(p <= 170)
+         return lanczos31UDT::g();
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::g();
+   }
+};
+
+template<class Policy>
+struct lanczos<mpfr_class, Policy>
+{
+   typedef mpfr_lanczos type;
+};
+
+} // namespace lanczos
+
+namespace tools
+{
+
+template <class T, class U>
+struct promote_arg<__gmp_expr<T,U> >
+{ // If T is integral type, then promote to double.
+  typedef mpfr_class type;
+};
+
+template<>
+inline int digits<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   return mpfr_class::get_dprec();
+}
+
+namespace detail{
+
+template<class I>
+void convert_to_long_result(mpfr_class const& r, I& result)
+{
+   result = 0;
+   I last_result(0);
+   mpfr_class t(r);
+   double term;
+   do
+   {
+      term = real_cast<double>(t);
+      last_result = result;
+      result += static_cast<I>(term);
+      t -= term;
+   }while(result != last_result);
+}
+
+}
+
+template <>
+inline mpfr_class real_cast<mpfr_class, long long>(long long t)
+{
+   mpfr_class result;
+   int expon = 0;
+   int sign = 1;
+   if(t < 0)
+   {
+      sign = -1;
+      t = -t;
+   }
+   while(t)
+   {
+      result += ldexp((double)(t & 0xffffL), expon);
+      expon += 32;
+      t >>= 32;
+   }
+   return result * sign;
+}
+template <>
+inline unsigned real_cast<unsigned, mpfr_class>(mpfr_class t)
+{
+   return t.get_ui();
+}
+template <>
+inline int real_cast<int, mpfr_class>(mpfr_class t)
+{
+   return t.get_si();
+}
+template <>
+inline double real_cast<double, mpfr_class>(mpfr_class t)
+{
+   return t.get_d();
+}
+template <>
+inline float real_cast<float, mpfr_class>(mpfr_class t)
+{
+   return static_cast<float>(t.get_d());
+}
+template <>
+inline long real_cast<long, mpfr_class>(mpfr_class t)
+{
+   long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+template <>
+inline long long real_cast<long long, mpfr_class>(mpfr_class t)
+{
+   long long result;
+   detail::convert_to_long_result(t, result);
+   return result;
+}
+
+template <>
+inline mpfr_class max_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val;
+   if(!has_init)
+   {
+      val = 0.5;
+      mpfr_set_exp(val.__get_mp(), mpfr_get_emax());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class min_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val;
+   if(!has_init)
+   {
+      val = 0.5;
+      mpfr_set_exp(val.__get_mp(), mpfr_get_emin());
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class log_max_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val = max_value<mpfr_class>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class log_min_value<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   static bool has_init = false;
+   static mpfr_class val = max_value<mpfr_class>();
+   if(!has_init)
+   {
+      val = log(val);
+      has_init = true;
+   }
+   return val;
+}
+
+template <>
+inline mpfr_class epsilon<mpfr_class>(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(mpfr_class))
+{
+   return ldexp(mpfr_class(1), 1-boost::math::policies::digits<mpfr_class, boost::math::policies::policy<> >());
+}
+
+} // namespace tools
+
+namespace policies{
+
+template <class T, class U, class Policy>
+struct evaluation<__gmp_expr<T, U>, Policy>
+{
+   typedef mpfr_class type;
+};
+
+}
+
+template <class Policy>
+inline mpfr_class skewness(const extreme_value_distribution<mpfr_class, Policy>& /*dist*/)
+{
+   //
+   // This is 12 * sqrt(6) * zeta(3) / pi^3:
+   // See http://mathworld.wolfram.com/ExtremeValueDistribution.html
+   //
+   return boost::lexical_cast<mpfr_class>("1.1395470994046486574927930193898461120875997958366");
+}
+
+template <class Policy>
+inline mpfr_class skewness(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr_class>("0.63111065781893713819189935154422777984404221106391");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 2 * root_pi<RealType>() * pi_minus_three<RealType>() / pow23_four_minus_pi<RealType>();
+}
+
+template <class Policy>
+inline mpfr_class kurtosis(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  // using namespace boost::math::constants;
+  return boost::lexical_cast<mpfr_class>("3.2450893006876380628486604106197544154170667057995");
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  // return 3 - (6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  // (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+}
+
+template <class Policy>
+inline mpfr_class kurtosis_excess(const rayleigh_distribution<mpfr_class, Policy>& /*dist*/)
+{
+  //using namespace boost::math::constants;
+  // Computed using NTL at 150 bit, about 50 decimal digits.
+  return boost::lexical_cast<mpfr_class>("0.2450893006876380628486604106197544154170667057995");
+  // return -(6 * pi<RealType>() * pi<RealType>() - 24 * pi<RealType>() + 16) /
+  //   (four_minus_pi<RealType>() * four_minus_pi<RealType>());
+} // kurtosis
+
+namespace detail{
+
+//
+// Version of Digamma accurate to ~100 decimal digits.
+//
+template <class Policy>
+mpfr_class digamma_imp(mpfr_class x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // empfr_classor handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   mpfr_class result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      mpfr_class remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<mpfr_class>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<mpfr_class>() / tan(constants::pi<mpfr_class>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+//
+// Specialisations of this function provides the initial
+// starting guess for Halley iteration:
+//
+template <class Policy>
+mpfr_class erf_inv_imp(const mpfr_class& p, const mpfr_class& q, const Policy&, const boost::mpl::int_<64>*)
+{
+   BOOST_MATH_STD_USING // for ADL of std names.
+
+   mpfr_class result = 0;
+   
+   if(p <= 0.5)
+   {
+      //
+      // Evaluate inverse erf using the rational approximation:
+      //
+      // x = p(p+10)(Y+R(p))
+      //
+      // Where Y is a constant, and R(p) is optimised for a low
+      // absolute empfr_classor compared to |Y|.
+      //
+      // double: Max empfr_classor found: 2.001849e-18
+      // long double: Max empfr_classor found: 1.017064e-20
+      // Maximum Deviation Found (actual empfr_classor term at infinite precision) 8.030e-21
+      //
+      static const float Y = 0.0891314744949340820313f;
+      static const mpfr_class P[] = {    
+         -0.000508781949658280665617,
+         -0.00836874819741736770379,
+         0.0334806625409744615033,
+         -0.0126926147662974029034,
+         -0.0365637971411762664006,
+         0.0219878681111168899165,
+         0.00822687874676915743155,
+         -0.00538772965071242932965
+      };
+      static const mpfr_class Q[] = {    
+         1,
+         -0.970005043303290640362,
+         -1.56574558234175846809,
+         1.56221558398423026363,
+         0.662328840472002992063,
+         -0.71228902341542847553,
+         -0.0527396382340099713954,
+         0.0795283687341571680018,
+         -0.00233393759374190016776,
+         0.000886216390456424707504
+      };
+      mpfr_class g = p * (p + 10);
+      mpfr_class r = tools::evaluate_polynomial(P, p) / tools::evaluate_polynomial(Q, p);
+      result = g * Y + g * r;
+   }
+   else if(q >= 0.25)
+   {
+      //
+      // Rational approximation for 0.5 > q >= 0.25
+      //
+      // x = sqrt(-2*log(q)) / (Y + R(q))
+      //
+      // Where Y is a constant, and R(q) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // double : Max empfr_classor found: 7.403372e-17
+      // long double : Max empfr_classor found: 6.084616e-20
+      // Maximum Deviation Found (empfr_classor term) 4.811e-20
+      //
+      static const float Y = 2.249481201171875f;
+      static const mpfr_class P[] = {    
+         -0.202433508355938759655,
+         0.105264680699391713268,
+         8.37050328343119927838,
+         17.6447298408374015486,
+         -18.8510648058714251895,
+         -44.6382324441786960818,
+         17.445385985570866523,
+         21.1294655448340526258,
+         -3.67192254707729348546
+      };
+      static const mpfr_class Q[] = {    
+         1,
+         6.24264124854247537712,
+         3.9713437953343869095,
+         -28.6608180499800029974,
+         -20.1432634680485188801,
+         48.5609213108739935468,
+         10.8268667355460159008,
+         -22.6436933413139721736,
+         1.72114765761200282724
+      };
+      mpfr_class g = sqrt(-2 * log(q));
+      mpfr_class xs = q - 0.25;
+      mpfr_class r = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+      result = g / (Y + r);
+   }
+   else
+   {
+      //
+      // For q < 0.25 we have a series of rational approximations all
+      // of the general form:
+      //
+      // let: x = sqrt(-log(q))
+      //
+      // Then the result is given by:
+      //
+      // x(Y+R(x-B))
+      //
+      // where Y is a constant, B is the lowest value of x for which 
+      // the approximation is valid, and R(x-B) is optimised for a low
+      // absolute empfr_classor compared to Y.
+      //
+      // Note that almost all code will really go through the first
+      // or maybe second approximation.  After than we're dealing with very
+      // small input values indeed: 80 and 128 bit long double's go all the
+      // way down to ~ 1e-5000 so the "tail" is rather long...
+      //
+      mpfr_class x = sqrt(-log(q));
+      if(x < 3)
+      {
+         // Max empfr_classor found: 1.089051e-20
+         static const float Y = 0.807220458984375f;
+         static const mpfr_class P[] = {    
+            -0.131102781679951906451,
+            -0.163794047193317060787,
+            0.117030156341995252019,
+            0.387079738972604337464,
+            0.337785538912035898924,
+            0.142869534408157156766,
+            0.0290157910005329060432,
+            0.00214558995388805277169,
+            -0.679465575181126350155e-6,
+            0.285225331782217055858e-7,
+            -0.681149956853776992068e-9
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            3.46625407242567245975,
+            5.38168345707006855425,
+            4.77846592945843778382,
+            2.59301921623620271374,
+            0.848854343457902036425,
+            0.152264338295331783612,
+            0.01105924229346489121
+         };
+         mpfr_class xs = x - 1.125;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 6)
+      {
+         // Max empfr_classor found: 8.389174e-21
+         static const float Y = 0.93995571136474609375f;
+         static const mpfr_class P[] = {    
+            -0.0350353787183177984712,
+            -0.00222426529213447927281,
+            0.0185573306514231072324,
+            0.00950804701325919603619,
+            0.00187123492819559223345,
+            0.000157544617424960554631,
+            0.460469890584317994083e-5,
+            -0.230404776911882601748e-9,
+            0.266339227425782031962e-11
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            1.3653349817554063097,
+            0.762059164553623404043,
+            0.220091105764131249824,
+            0.0341589143670947727934,
+            0.00263861676657015992959,
+            0.764675292302794483503e-4
+         };
+         mpfr_class xs = x - 3;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 18)
+      {
+         // Max empfr_classor found: 1.481312e-19
+         static const float Y = 0.98362827301025390625f;
+         static const mpfr_class P[] = {    
+            -0.0167431005076633737133,
+            -0.00112951438745580278863,
+            0.00105628862152492910091,
+            0.000209386317487588078668,
+            0.149624783758342370182e-4,
+            0.449696789927706453732e-6,
+            0.462596163522878599135e-8,
+            -0.281128735628831791805e-13,
+            0.99055709973310326855e-16
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.591429344886417493481,
+            0.138151865749083321638,
+            0.0160746087093676504695,
+            0.000964011807005165528527,
+            0.275335474764726041141e-4,
+            0.282243172016108031869e-6
+         };
+         mpfr_class xs = x - 6;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else if(x < 44)
+      {
+         // Max empfr_classor found: 5.697761e-20
+         static const float Y = 0.99714565277099609375f;
+         static const mpfr_class P[] = {    
+            -0.0024978212791898131227,
+            -0.779190719229053954292e-5,
+            0.254723037413027451751e-4,
+            0.162397777342510920873e-5,
+            0.396341011304801168516e-7,
+            0.411632831190944208473e-9,
+            0.145596286718675035587e-11,
+            -0.116765012397184275695e-17
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.207123112214422517181,
+            0.0169410838120975906478,
+            0.000690538265622684595676,
+            0.145007359818232637924e-4,
+            0.144437756628144157666e-6,
+            0.509761276599778486139e-9
+         };
+         mpfr_class xs = x - 18;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+      else
+      {
+         // Max empfr_classor found: 1.279746e-20
+         static const float Y = 0.99941349029541015625f;
+         static const mpfr_class P[] = {    
+            -0.000539042911019078575891,
+            -0.28398759004727721098e-6,
+            0.899465114892291446442e-6,
+            0.229345859265920864296e-7,
+            0.225561444863500149219e-9,
+            0.947846627503022684216e-12,
+            0.135880130108924861008e-14,
+            -0.348890393399948882918e-21
+         };
+         static const mpfr_class Q[] = {    
+            1,
+            0.0845746234001899436914,
+            0.00282092984726264681981,
+            0.468292921940894236786e-4,
+            0.399968812193862100054e-6,
+            0.161809290887904476097e-8,
+            0.231558608310259605225e-11
+         };
+         mpfr_class xs = x - 44;
+         mpfr_class R = tools::evaluate_polynomial(P, xs) / tools::evaluate_polynomial(Q, xs);
+         result = Y * x + R * x;
+      }
+   }
+   return result;
+}
+
+mpfr_class bessel_i0(mpfr_class x)
+{
+    static const mpfr_class P1[] = {
+        boost::lexical_cast<mpfr_class>("-2.2335582639474375249e+15"),
+        boost::lexical_cast<mpfr_class>("-5.5050369673018427753e+14"),
+        boost::lexical_cast<mpfr_class>("-3.2940087627407749166e+13"),
+        boost::lexical_cast<mpfr_class>("-8.4925101247114157499e+11"),
+        boost::lexical_cast<mpfr_class>("-1.1912746104985237192e+10"),
+        boost::lexical_cast<mpfr_class>("-1.0313066708737980747e+08"),
+        boost::lexical_cast<mpfr_class>("-5.9545626019847898221e+05"),
+        boost::lexical_cast<mpfr_class>("-2.4125195876041896775e+03"),
+        boost::lexical_cast<mpfr_class>("-7.0935347449210549190e+00"),
+        boost::lexical_cast<mpfr_class>("-1.5453977791786851041e-02"),
+        boost::lexical_cast<mpfr_class>("-2.5172644670688975051e-05"),
+        boost::lexical_cast<mpfr_class>("-3.0517226450451067446e-08"),
+        boost::lexical_cast<mpfr_class>("-2.6843448573468483278e-11"),
+        boost::lexical_cast<mpfr_class>("-1.5982226675653184646e-14"),
+        boost::lexical_cast<mpfr_class>("-5.2487866627945699800e-18"),
+    };
+    static const mpfr_class Q1[] = {
+        boost::lexical_cast<mpfr_class>("-2.2335582639474375245e+15"),
+        boost::lexical_cast<mpfr_class>("7.8858692566751002988e+12"),
+        boost::lexical_cast<mpfr_class>("-1.2207067397808979846e+10"),
+        boost::lexical_cast<mpfr_class>("1.0377081058062166144e+07"),
+        boost::lexical_cast<mpfr_class>("-4.8527560179962773045e+03"),
+        boost::lexical_cast<mpfr_class>("1.0"),
+    };
+    static const mpfr_class P2[] = {
+        boost::lexical_cast<mpfr_class>("-2.2210262233306573296e-04"),
+        boost::lexical_cast<mpfr_class>("1.3067392038106924055e-02"),
+        boost::lexical_cast<mpfr_class>("-4.4700805721174453923e-01"),
+        boost::lexical_cast<mpfr_class>("5.5674518371240761397e+00"),
+        boost::lexical_cast<mpfr_class>("-2.3517945679239481621e+01"),
+        boost::lexical_cast<mpfr_class>("3.1611322818701131207e+01"),
+        boost::lexical_cast<mpfr_class>("-9.6090021968656180000e+00"),
+    };
+    static const mpfr_class Q2[] = {
+        boost::lexical_cast<mpfr_class>("-5.5194330231005480228e-04"),
+        boost::lexical_cast<mpfr_class>("3.2547697594819615062e-02"),
+        boost::lexical_cast<mpfr_class>("-1.1151759188741312645e+00"),
+        boost::lexical_cast<mpfr_class>("1.3982595353892851542e+01"),
+        boost::lexical_cast<mpfr_class>("-6.0228002066743340583e+01"),
+        boost::lexical_cast<mpfr_class>("8.5539563258012929600e+01"),
+        boost::lexical_cast<mpfr_class>("-3.1446690275135491500e+01"),
+        boost::lexical_cast<mpfr_class>("1.0"),
+    };
+    mpfr_class value, factor, r;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    if (x < 0)
+    {
+        x = -x;                         // even function
+    }
+    if (x == 0)
+    {
+        return static_cast<mpfr_class>(1);
+    }
+    if (x <= 15)                        // x in (0, 15]
+    {
+        mpfr_class y = x * x;
+        value = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+    }
+    else                                // x in (15, \infty)
+    {
+        mpfr_class y = 1 / x - 1 / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(x) / sqrt(x);
+        value = factor * r;
+    }
+
+    return value;
+}
+
+mpfr_class bessel_i1(mpfr_class x)
+{
+    static const mpfr_class P1[] = {
+        static_cast<mpfr_class>("-1.4577180278143463643e+15"),
+        static_cast<mpfr_class>("-1.7732037840791591320e+14"),
+        static_cast<mpfr_class>("-6.9876779648010090070e+12"),
+        static_cast<mpfr_class>("-1.3357437682275493024e+11"),
+        static_cast<mpfr_class>("-1.4828267606612366099e+09"),
+        static_cast<mpfr_class>("-1.0588550724769347106e+07"),
+        static_cast<mpfr_class>("-5.1894091982308017540e+04"),
+        static_cast<mpfr_class>("-1.8225946631657315931e+02"),
+        static_cast<mpfr_class>("-4.7207090827310162436e-01"),
+        static_cast<mpfr_class>("-9.1746443287817501309e-04"),
+        static_cast<mpfr_class>("-1.3466829827635152875e-06"),
+        static_cast<mpfr_class>("-1.4831904935994647675e-09"),
+        static_cast<mpfr_class>("-1.1928788903603238754e-12"),
+        static_cast<mpfr_class>("-6.5245515583151902910e-16"),
+        static_cast<mpfr_class>("-1.9705291802535139930e-19"),
+    };
+    static const mpfr_class Q1[] = {
+        static_cast<mpfr_class>("-2.9154360556286927285e+15"),
+        static_cast<mpfr_class>("9.7887501377547640438e+12"),
+        static_cast<mpfr_class>("-1.4386907088588283434e+10"),
+        static_cast<mpfr_class>("1.1594225856856884006e+07"),
+        static_cast<mpfr_class>("-5.1326864679904189920e+03"),
+        static_cast<mpfr_class>("1.0"),
+    };
+    static const mpfr_class P2[] = {
+        static_cast<mpfr_class>("1.4582087408985668208e-05"),
+        static_cast<mpfr_class>("-8.9359825138577646443e-04"),
+        static_cast<mpfr_class>("2.9204895411257790122e-02"),
+        static_cast<mpfr_class>("-3.4198728018058047439e-01"),
+        static_cast<mpfr_class>("1.3960118277609544334e+00"),
+        static_cast<mpfr_class>("-1.9746376087200685843e+00"),
+        static_cast<mpfr_class>("8.5591872901933459000e-01"),
+        static_cast<mpfr_class>("-6.0437159056137599999e-02"),
+    };
+    static const mpfr_class Q2[] = {
+        static_cast<mpfr_class>("3.7510433111922824643e-05"),
+        static_cast<mpfr_class>("-2.2835624489492512649e-03"),
+        static_cast<mpfr_class>("7.4212010813186530069e-02"),
+        static_cast<mpfr_class>("-8.5017476463217924408e-01"),
+        static_cast<mpfr_class>("3.2593714889036996297e+00"),
+        static_cast<mpfr_class>("-3.8806586721556593450e+00"),
+        static_cast<mpfr_class>("1.0"),
+    };
+    mpfr_class value, factor, r, w;
+
+    BOOST_MATH_STD_USING
+    using namespace boost::math::tools;
+
+    w = abs(x);
+    if (x == 0)
+    {
+        return static_cast<mpfr_class>(0);
+    }
+    if (w <= 15)                        // w in (0, 15]
+    {
+        mpfr_class y = x * x;
+        r = evaluate_polynomial(P1, y) / evaluate_polynomial(Q1, y);
+        factor = w;
+        value = factor * r;
+    }
+    else                                // w in (15, \infty)
+    {
+        mpfr_class y = 1 / w - mpfr_class(1) / 15;
+        r = evaluate_polynomial(P2, y) / evaluate_polynomial(Q2, y);
+        factor = exp(w) / sqrt(w);
+        value = factor * r;
+    }
+
+    if (x < 0)
+    {
+        value *= -value;                 // odd function
+    }
+    return value;
+}
+
+} // namespace detail
+
+}}
+
+#endif // BOOST_MATH_MPLFR_BINDINGS_HPP
+
similarity index 78%
rename from deal.II/contrib/boost/include/boost/math/bindings/rr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/bindings/rr.hpp
index eeeb522dc80693ebcafe4261081341c5e478d86b..7b72f81f8ef20b7476c8dc156fb9870a1a9f87b9 100644 (file)
@@ -3,6 +3,8 @@
 //  Boost Software License, Version 1.0. (See accompanying file
 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 
+#ifndef BOOST_MATH_NTL_RR_HPP
+#define BOOST_MATH_NTL_RR_HPP
 
 #include <boost/config.hpp>
 #include <boost/limits.hpp>
 #include <boost/math/constants/constants.hpp>
 #include <boost/math/tools/roots.hpp>
 #include <boost/math/special_functions/fpclassify.hpp>
+#include <boost/math/bindings/detail/big_digamma.hpp>
+#include <boost/math/bindings/detail/big_lanczos.hpp>
 
 #include <ostream>
 #include <istream>
 #include <boost/config/no_tr1/cmath.hpp>
 #include <NTL/RR.h>
 
-#ifndef BOOST_MATH_NTL_RR_HPP
-#define BOOST_MATH_NTL_RR_HPP
-
 namespace boost{ namespace math{
 
 namespace ntl
@@ -421,6 +422,80 @@ inline std::basic_istream<charT, traits>& operator>>(std::basic_istream<charT, t
 
 } // namespace ntl
 
+namespace lanczos{
+
+struct ntl_lanczos
+{
+   static ntl::RR lanczos_sum(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum(z);
+   }
+   static ntl::RR lanczos_sum_expG_scaled(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_expG_scaled(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_expG_scaled(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_expG_scaled(z);
+   }
+   static ntl::RR lanczos_sum_near_1(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_1(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_1(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_1(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_1(z);
+   }
+   static ntl::RR lanczos_sum_near_2(const ntl::RR& z)
+   {
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::lanczos_sum_near_2(z);
+      else if(p <= 120)
+         return lanczos22UDT::lanczos_sum_near_2(z);
+      else if(p <= 170)
+         return lanczos31UDT::lanczos_sum_near_2(z);
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::lanczos_sum_near_2(z);
+   }
+   static ntl::RR g()
+   { 
+      unsigned long p = ntl::RR::precision();
+      if(p <= 72)
+         return lanczos13UDT::g();
+      else if(p <= 120)
+         return lanczos22UDT::g();
+      else if(p <= 170)
+         return lanczos31UDT::g();
+      else //if(p <= 370) approx 100 digit precision:
+         return lanczos61UDT::g();
+   }
+};
+
+template<class Policy>
+struct lanczos<ntl::RR, Policy>
+{
+   typedef ntl_lanczos type;
+};
+
+} // namespace lanczos
+
 namespace tools
 {
 
@@ -487,7 +562,21 @@ inline unsigned real_cast<unsigned, boost::math::ntl::RR>(boost::math::ntl::RR t
 template <>
 inline int real_cast<int, boost::math::ntl::RR>(boost::math::ntl::RR t)
 {
-   unsigned result;
+   int result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline long real_cast<long, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   long result;
+   detail::convert_to_long_result(t.value(), result);
+   return result;
+}
+template <>
+inline long long real_cast<long long, boost::math::ntl::RR>(boost::math::ntl::RR t)
+{
+   long long result;
    detail::convert_to_long_result(t.value(), result);
    return result;
 }
@@ -703,14 +792,79 @@ namespace ntl{
       return tools::real_cast<int>(round(x, pol));
    }
 
+   template <class Policy>
+   inline long lround(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long>(round(x, pol));
+   }
+
+   template <class Policy>
+   inline long long llround(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long long>(round(x, pol));
+   }
+
    template <class Policy>
    inline int itrunc(RR const& x, const Policy& pol)
    {
       return tools::real_cast<int>(trunc(x, pol));
    }
 
+   template <class Policy>
+   inline long ltrunc(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long>(trunc(x, pol));
+   }
+
+   template <class Policy>
+   inline long long lltrunc(RR const& x, const Policy& pol)
+   {
+      return tools::real_cast<long long>(trunc(x, pol));
+   }
+
 } // namespace ntl
 
+namespace detail{
+
+template <class Policy>
+ntl::RR digamma_imp(ntl::RR x, const mpl::int_<0>* , const Policy& pol)
+{
+   //
+   // This handles reflection of negative arguments, and all our
+   // error handling, then forwards to the T-specific approximation.
+   //
+   BOOST_MATH_STD_USING // ADL of std functions.
+
+   ntl::RR result = 0;
+   //
+   // Check for negative arguments and use reflection:
+   //
+   if(x < 0)
+   {
+      // Reflect:
+      x = 1 - x;
+      // Argument reduction for tan:
+      ntl::RR remainder = x - floor(x);
+      // Shift to negative if > 0.5:
+      if(remainder > 0.5)
+      {
+         remainder -= 1;
+      }
+      //
+      // check for evaluation at a negative pole:
+      //
+      if(remainder == 0)
+      {
+         return policies::raise_pole_error<ntl::RR>("boost::math::digamma<%1%>(%1%)", 0, (1-x), pol);
+      }
+      result = constants::pi<ntl::RR>() / tan(constants::pi<ntl::RR>() * remainder);
+   }
+   result += big_digamma(x);
+   return result;
+}
+
+} // namespace detail
+
 } // namespace math
 } // namespace boost
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/concepts/distributions.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/concepts/distributions.hpp
index 3773cf0504727b21825c98e42929611fd2736fc2..7e656990cb5f9e08b0867845058a30d1a36aca80 100644 (file)
@@ -162,6 +162,7 @@ struct DistributionConcept
       v = quantile(complement(dist, d));
       v = hazard(dist, d);
       v = chf(dist, d);
+#ifndef TEST_MPFR
       long double ld = 1;
       v = cdf(dist, ld);
       v = cdf(complement(dist, ld));
@@ -170,6 +171,7 @@ struct DistributionConcept
       v = quantile(complement(dist, ld));
       v = hazard(dist, ld);
       v = chf(dist, ld);
+#endif
       int i = 1;
       v = cdf(dist, i);
       v = cdf(complement(dist, i));
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/concepts/real_type_concept.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/concepts/real_type_concept.hpp
new file mode 100644 (file)
index 0000000..481c827
--- /dev/null
@@ -0,0 +1,109 @@
+//  Copyright John Maddock 2007-8.
+//  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)
+
+#ifndef BOOST_MATH_REAL_TYPE_CONCEPT_HPP
+#define BOOST_MATH_REAL_TYPE_CONCEPT_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4100)
+#pragma warning(disable: 4510)
+#pragma warning(disable: 4610)
+#endif
+#include <boost/concept_check.hpp>
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/math/tools/config.hpp>
+#include <boost/math/tools/precision.hpp>
+
+
+namespace boost{ namespace math{ namespace concepts{
+
+template <class RealType>
+struct RealTypeConcept
+{
+   template <class Other>
+   void check_binary_ops(Other o)
+   {
+      RealType r(o);
+      r = o;
+      r -= o;
+      r += o;
+      r *= o;
+      r /= o;
+      r = r - o;
+      r = o - r;
+      r = r + o;
+      r = o + r;
+      r = o * r;
+      r = r * o;
+      r = r / o;
+      r = o / r;
+      bool b;
+      b = r == o;
+      b = o == r;
+      b = r != o;
+      b = o != r;
+      b = r <= o;
+      b = o <= r;
+      b = r >= o;
+      b = o >= r;
+      b = r < o;
+      b = o < r;
+      b = r > o;
+      b = o > r;
+   }
+
+   void constraints()
+   {
+      BOOST_MATH_STD_USING
+
+      RealType r;
+      check_binary_ops(r);
+      check_binary_ops(0.5f);
+      check_binary_ops(0.5);
+      //check_binary_ops(0.5L);
+      check_binary_ops(1);
+      //check_binary_ops(1u);
+      check_binary_ops(1L);
+      //check_binary_ops(1uL);
+#ifndef BOOST_HAS_LONG_LONG
+      check_binary_ops(1LL);
+#endif
+      RealType r2 = +r;
+      r2 = -r;
+
+      r2 = fabs(r);
+      r2 = abs(r);
+      r2 = ceil(r);
+      r2 = floor(r);
+      r2 = exp(r);
+      r2 = pow(r, r2);
+      r2 = sqrt(r);
+      r2 = log(r);
+      r2 = cos(r);
+      r2 = sin(r);
+      r2 = tan(r);
+      r2 = asin(r);
+      r2 = acos(r);
+      r2 = atan(r);
+      int i;
+      r2 = ldexp(r, i);
+      r2 = frexp(r, &i);
+      i = boost::math::tools::digits<RealType>();
+      r2 = boost::math::tools::max_value<RealType>();
+      r2 = boost::math::tools::min_value<RealType>();
+      r2 = boost::math::tools::log_max_value<RealType>();
+      r2 = boost::math::tools::log_min_value<RealType>();
+      r2 = boost::math::tools::epsilon<RealType>();
+   }
+}; // struct DistributionConcept
+
+
+}}} // namespaces
+
+#endif
+
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/concepts/std_real_concept.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/concepts/std_real_concept.hpp
index ac1efa78eaf03d6be838c1bb5bcdb06f3d392721..645579573bbb2525aedd1278771df0aac216644f 100644 (file)
@@ -226,6 +226,11 @@ inline boost::math::concepts::std_real_concept tanh(boost::math::concepts::std_r
 
 } // namespace std
 
+#include <boost/math/special_functions/round.hpp>
+#include <boost/math/special_functions/trunc.hpp>
+#include <boost/math/special_functions/modf.hpp>
+#include <boost/math/tools/precision.hpp>
+
 namespace boost{ namespace math{ namespace concepts{
 
 //
@@ -378,3 +383,4 @@ using concepts::llround;
 
 
 
+
similarity index 90%
rename from deal.II/contrib/boost/include/boost/math/distributions.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions.hpp
index dd6c02b75ad832bf550935004e25e3ea96c40a06..ecbc616a0e714a2140cfb4e8aa5b22f2d3e7c339 100644 (file)
@@ -1,5 +1,5 @@
 //  Copyright John Maddock 2006, 2007.
-//  Copyright Paul A. Bristow 2006, 2007.
+//  Copyright Paul A. Bristow 2006, 2007, 2009.
 
 //  Use, modification and distribution are subject to the
 //  Boost Software License, Version 1.0. (See accompanying file
@@ -22,6 +22,9 @@
 #include <boost/math/distributions/extreme_value.hpp>
 #include <boost/math/distributions/fisher_f.hpp>
 #include <boost/math/distributions/gamma.hpp>
+#include <boost/math/distributions/hypergeometric.hpp>
+#include <boost/math/distributions/laplace.hpp>
+#include <boost/math/distributions/logistic.hpp>
 #include <boost/math/distributions/lognormal.hpp>
 #include <boost/math/distributions/negative_binomial.hpp>
 #include <boost/math/distributions/non_central_chi_squared.hpp>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/binomial.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/binomial.hpp
index 5dd476262ef5556656106fa4747b9959bdba8f71..e6c451a12e8705c20c6c2c9a0a34982056ab6002 100644 (file)
@@ -649,13 +649,13 @@ namespace boost
       template <class RealType, class Policy>
       inline RealType quantile(const binomial_distribution<RealType, Policy>& dist, const RealType& p)
       {
-         return binomial_detail::quantile_imp(dist, p, 1-p);
+         return binomial_detail::quantile_imp(dist, p, RealType(1-p));
       } // quantile
 
       template <class RealType, class Policy>
       RealType quantile(const complemented2_type<binomial_distribution<RealType, Policy>, RealType>& c)
       {
-         return binomial_detail::quantile_imp(c.dist, 1-c.param, c.param);
+         return binomial_detail::quantile_imp(c.dist, RealType(1-c.param), c.param);
       } // quantile
 
       template <class RealType, class Policy>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/cauchy.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/cauchy.hpp
index de6f6b643f8b4ea1a4672fa4ed76aa5f7b91d86b..0a818568c3d47cb01c46afb4c0e6a857fca69f55 100644 (file)
@@ -140,7 +140,7 @@ RealType quantile_imp(
       return location;
    }
    result = -scale / tan(constants::pi<RealType>() * P);
-   return complement ? location - result : location + result;
+   return complement ? RealType(location - result) : RealType(location + result);
 } // quantile
 
 } // namespace detail
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_cdf.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_cdf.hpp
new file mode 100644 (file)
index 0000000..638cab6
--- /dev/null
@@ -0,0 +1,100 @@
+// Copyright 2008 John Maddock
+//
+// 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)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_CDF_HPP
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+   template <class T, class Policy>
+   T hypergeometric_cdf_imp(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy& pol)
+   {
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+      BOOST_MATH_STD_USING
+      T result = 0;
+      T mode = floor(T(r + 1) * T(n + 1) / (N + 2));
+      if(x < mode)
+      {
+         result = hypergeometric_pdf<T>(x, r, n, N, pol);
+         T diff = result;
+         unsigned lower_limit = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+         while(diff > (invert ? T(1) : result) * tools::epsilon<T>())
+         {
+            diff = T(x) * T((N + x) - n - r) * diff / (T(1 + n - x) * T(1 + r - x));
+            result += diff;
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            if(x == lower_limit)
+               break;
+            --x;
+         }
+      }
+      else
+      {
+         invert = !invert;
+         unsigned upper_limit = (std::min)(r, n);
+         if(x != upper_limit)
+         {
+            ++x;
+            result = hypergeometric_pdf<T>(x, r, n, N, pol);
+            T diff = result;
+            while((x <= upper_limit) && (diff > (invert ? T(1) : result) * tools::epsilon<T>()))
+            {
+               diff = T(n - x) * T(r - x) * diff / (T(x + 1) * T((N + x + 1) - n - r));
+               result += diff;
+               ++x;
+               BOOST_MATH_INSTRUMENT_VARIABLE(x);
+               BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
+            }
+         }
+      }
+      if(invert)
+         result = 1 - result;
+      return result;
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+   }
+
+   template <class T, class Policy>
+   inline T hypergeometric_cdf(unsigned x, unsigned r, unsigned n, unsigned N, bool invert, const Policy&)
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      typedef typename tools::promote_args<T>::type result_type;
+      typedef typename policies::evaluation<result_type, Policy>::type value_type;
+      typedef typename policies::normalise<
+         Policy, 
+         policies::promote_float<false>, 
+         policies::promote_double<false>, 
+         policies::discrete_quantile<>,
+         policies::assert_undefined<> >::type forwarding_policy;
+
+      value_type result;
+      result = detail::hypergeometric_cdf_imp<value_type>(x, r, n, N, invert, forwarding_policy());
+      if(result > 1)
+      {
+         result  = 1;
+      }
+      if(result < 0)
+      {
+         result = 0;
+      }
+      return policies::checked_narrowing_cast<result_type, forwarding_policy>(result, "boost::math::hypergeometric_cdf<%1%>(%1%,%1%,%1%,%1%)");
+   }
+
+}}} // namespaces
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_pdf.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_pdf.hpp
new file mode 100644 (file)
index 0000000..2bfa4fb
--- /dev/null
@@ -0,0 +1,432 @@
+// Copyright 2008 Gautam Sewani
+// Copyright 2008 John Maddock
+//
+// 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)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_PDF_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_PDF_HPP
+
+#include <boost/math/constants/constants.hpp>
+#include <boost/math/special_functions/lanczos.hpp>
+#include <boost/math/special_functions/gamma.hpp>
+#include <boost/math/special_functions/pow.hpp>
+#include <boost/math/special_functions/prime.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T, class Func>
+void bubble_down_one(T* first, T* last, Func f)
+{
+   using std::swap;
+   T* next = first;
+   ++next;
+   while((next != last) && (!f(*first, *next)))
+   {
+      swap(*first, *next);
+      ++first;
+      ++next;
+   }
+}
+
+template <class T>
+struct sort_functor
+{
+   sort_functor(const T* exponents) : m_exponents(exponents){}
+   bool operator()(int i, int j)
+   {
+      return m_exponents[i] > m_exponents[j];
+   }
+private:
+   const T* m_exponents;
+};
+
+template <class T, class Lanczos, class Policy>
+T hypergeometric_pdf_lanczos_imp(T /*dummy*/, unsigned x, unsigned r, unsigned n, unsigned N, const Lanczos&, const Policy&)
+{
+   BOOST_MATH_STD_USING
+
+   T bases[9] = {
+      T(n) + Lanczos::g() + 0.5f,
+      T(r) + Lanczos::g() + 0.5f,
+      T(N - n) + Lanczos::g() + 0.5f,
+      T(N - r) + Lanczos::g() + 0.5f,
+      1 / (T(N) + Lanczos::g() + 0.5f),
+      1 / (T(x) + Lanczos::g() + 0.5f),
+      1 / (T(n - x) + Lanczos::g() + 0.5f),
+      1 / (T(r - x) + Lanczos::g() + 0.5f),
+      1 / (T(N - n - r + x) + Lanczos::g() + 0.5f)
+   };
+   T exponents[9] = {
+      n + 0.5f,
+      r + 0.5f,
+      N - n + 0.5f,
+      N - r + 0.5f,
+      N + 0.5f,
+      x + 0.5f,
+      n - x + 0.5f,
+      r - x + 0.5f,
+      N - n - r + x + 0.5f
+   };
+   int base_e_factors[9] = {
+      -1, -1, -1, -1, 1, 1, 1, 1, 1
+   };
+   int sorted_indexes[9] = {
+      0, 1, 2, 3, 4, 5, 6, 7, 8
+   };
+   std::sort(sorted_indexes, sorted_indexes + 9, sort_functor<T>(exponents));
+
+   do{
+      exponents[sorted_indexes[0]] -= exponents[sorted_indexes[1]];
+      bases[sorted_indexes[1]] *= bases[sorted_indexes[0]];
+      if((bases[sorted_indexes[1]] < tools::min_value<T>()) && (exponents[sorted_indexes[1]] != 0))
+      {
+         return 0;
+      }
+      base_e_factors[sorted_indexes[1]] += base_e_factors[sorted_indexes[0]];
+      bubble_down_one(sorted_indexes, sorted_indexes + 9, sort_functor<T>(exponents));
+   }while(exponents[sorted_indexes[1]] > 1);
+
+   //
+   // Combine equal powers:
+   //
+   int j = 8;
+   while(exponents[sorted_indexes[j]] == 0) --j;
+   while(j)
+   {
+      while(j && (exponents[sorted_indexes[j-1]] == exponents[sorted_indexes[j]]))
+      {
+         bases[sorted_indexes[j-1]] *= bases[sorted_indexes[j]];
+         exponents[sorted_indexes[j]] = 0;
+         base_e_factors[sorted_indexes[j-1]] += base_e_factors[sorted_indexes[j]];
+         bubble_down_one(sorted_indexes + j, sorted_indexes + 9, sort_functor<T>(exponents));
+         --j;
+      }
+      --j;
+   }
+
+#ifdef BOOST_MATH_INSTRUMENT
+   BOOST_MATH_INSTRUMENT_FPU
+   for(unsigned i = 0; i < 9; ++i)
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(i);
+      BOOST_MATH_INSTRUMENT_VARIABLE(bases[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(exponents[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(base_e_factors[i]);
+      BOOST_MATH_INSTRUMENT_VARIABLE(sorted_indexes[i]);
+   }
+#endif
+
+   T result;
+   BOOST_MATH_INSTRUMENT_VARIABLE(bases[sorted_indexes[0]] * exp(static_cast<T>(base_e_factors[sorted_indexes[0]])));
+   BOOST_MATH_INSTRUMENT_VARIABLE(exponents[sorted_indexes[0]]);
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      result = pow(bases[sorted_indexes[0]] * exp(static_cast<T>(base_e_factors[sorted_indexes[0]])), exponents[sorted_indexes[0]]);
+   }
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   for(unsigned i = 1; (i < 9) && (exponents[sorted_indexes[i]] > 0); ++i)
+   {
+      BOOST_FPU_EXCEPTION_GUARD
+      if(result < tools::min_value<T>())
+         return 0; // short circuit further evaluation
+      if(exponents[sorted_indexes[i]] == 1)
+         result *= bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]]));
+      else if(exponents[sorted_indexes[i]] == 0.5f)
+         result *= sqrt(bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]])));
+      else
+         result *= pow(bases[sorted_indexes[i]] * exp(static_cast<T>(base_e_factors[sorted_indexes[i]])), exponents[sorted_indexes[i]]);
+   
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   }
+
+   result *= Lanczos::lanczos_sum_expG_scaled(static_cast<T>(n + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(r + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - n + 1))
+      * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - r + 1))
+      / 
+      ( Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(n - x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(r - x + 1))
+         * Lanczos::lanczos_sum_expG_scaled(static_cast<T>(N - n - r + x + 1)));
+   
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   return result;
+}
+
+template <class T, class Policy>
+T hypergeometric_pdf_lanczos_imp(T /*dummy*/, unsigned x, unsigned r, unsigned n, unsigned N, const boost::math::lanczos::undefined_lanczos&, const Policy& pol)
+{
+   BOOST_MATH_STD_USING
+   return exp(
+      boost::math::lgamma(T(n + 1), pol)
+      + boost::math::lgamma(T(r + 1), pol)
+      + boost::math::lgamma(T(N - n + 1), pol)
+      + boost::math::lgamma(T(N - r + 1), pol)
+      - boost::math::lgamma(T(N + 1), pol)
+      - boost::math::lgamma(T(x + 1), pol)
+      - boost::math::lgamma(T(n - x + 1), pol)
+      - boost::math::lgamma(T(r - x + 1), pol)
+      - boost::math::lgamma(T(N - n - r + x + 1), pol));
+}
+
+template <class T>
+inline T integer_power(const T& x, int ex)
+{
+   if(ex < 0)
+      return 1 / integer_power(x, -ex);
+   switch(ex)
+   {
+   case 0:
+      return 1;
+   case 1:
+      return x;
+   case 2:
+      return x * x;
+   case 3:
+      return x * x * x;
+   case 4:
+      return boost::math::pow<4>(x);
+   case 5:
+      return boost::math::pow<5>(x);
+   case 6:
+      return boost::math::pow<6>(x);
+   case 7:
+      return boost::math::pow<7>(x);
+   case 8:
+      return boost::math::pow<8>(x);
+   }
+   BOOST_MATH_STD_USING
+#ifdef __SUNPRO_CC
+   return pow(x, T(ex));
+#else
+   return pow(x, ex);
+#endif
+}
+template <class T>
+struct hypergeometric_pdf_prime_loop_result_entry
+{
+   T value;
+   const hypergeometric_pdf_prime_loop_result_entry* next;
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4510 4512 4610)
+#endif
+
+struct hypergeometric_pdf_prime_loop_data
+{
+   const unsigned x;
+   const unsigned r;
+   const unsigned n;
+   const unsigned N;
+   unsigned prime_index;
+   unsigned current_prime;
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class T>
+T hypergeometric_pdf_prime_loop_imp(hypergeometric_pdf_prime_loop_data& data, hypergeometric_pdf_prime_loop_result_entry<T>& result)
+{
+   while(data.current_prime <= data.N)
+   {
+      unsigned base = data.current_prime;
+      int prime_powers = 0;
+      while(base <= data.N)
+      {
+         prime_powers += data.n / base;
+         prime_powers += data.r / base;
+         prime_powers += (data.N - data.n) / base;
+         prime_powers += (data.N - data.r) / base;
+         prime_powers -= data.N / base;
+         prime_powers -= data.x / base;
+         prime_powers -= (data.n - data.x) / base;
+         prime_powers -= (data.r - data.x) / base;
+         prime_powers -= (data.N - data.n - data.r + data.x) / base;
+         base *= data.current_prime;
+      }
+      if(prime_powers)
+      {
+         T p = integer_power<T>(data.current_prime, prime_powers);
+         if((p > 1) && (tools::max_value<T>() / p < result.value))
+         {
+            //
+            // The next calculation would overflow, use recursion
+            // to sidestep the issue:
+            //
+            hypergeometric_pdf_prime_loop_result_entry<T> t = { p, &result };
+            data.current_prime = prime(++data.prime_index);
+            return hypergeometric_pdf_prime_loop_imp<T>(data, t);
+         }
+         if((p < 1) && (tools::min_value<T>() / p > result.value))
+         {
+            //
+            // The next calculation would underflow, use recursion
+            // to sidestep the issue:
+            //
+            hypergeometric_pdf_prime_loop_result_entry<T> t = { p, &result };
+            data.current_prime = prime(++data.prime_index);
+            return hypergeometric_pdf_prime_loop_imp<T>(data, t);
+         }
+         result.value *= p;
+      }
+      data.current_prime = prime(++data.prime_index);
+   }
+   //
+   // When we get to here we have run out of prime factors,
+   // the overall result is the product of all the partial
+   // results we have accumulated on the stack so far, these
+   // are in a linked list starting with "data.head" and ending
+   // with "result".
+   //
+   // All that remains is to multiply them together, taking
+   // care not to overflow or underflow.
+   //
+   // Enumerate partial results >= 1 in variable i
+   // and partial results < 1 in variable j:
+   //
+   hypergeometric_pdf_prime_loop_result_entry<T> const *i, *j;
+   i = &result;
+   while(i && i->value < 1)
+      i = i->next;
+   j = &result;
+   while(j && j->value >= 1)
+      j = j->next;
+
+   T prod = 1;
+
+   while(i || j)
+   {
+      while(i && ((prod <= 1) || (j == 0)))
+      {
+         prod *= i->value;
+         i = i->next;
+         while(i && i->value < 1)
+            i = i->next;
+      }
+      while(j && ((prod >= 1) || (i == 0)))
+      {
+         prod *= j->value;
+         j = j->next;
+         while(j && j->value >= 1)
+            j = j->next;
+      }
+   }
+
+   return prod;
+}
+
+template <class T, class Policy>
+inline T hypergeometric_pdf_prime_imp(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   hypergeometric_pdf_prime_loop_result_entry<T> result = { 1 };
+   hypergeometric_pdf_prime_loop_data data = { x, r, n, N, 0, prime(0) };
+   return hypergeometric_pdf_prime_loop_imp<T>(data, result);
+}
+
+template <class T, class Policy>
+T hypergeometric_pdf_factorial_imp(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_MATH_STD_USING
+   BOOST_ASSERT(N < boost::math::max_factorial<T>::value);
+   T result = boost::math::unchecked_factorial<T>(n);
+   T num[3] = {
+      boost::math::unchecked_factorial<T>(r),
+      boost::math::unchecked_factorial<T>(N - n),
+      boost::math::unchecked_factorial<T>(N - r)
+   };
+   T denom[5] = {
+      boost::math::unchecked_factorial<T>(N),
+      boost::math::unchecked_factorial<T>(x),
+      boost::math::unchecked_factorial<T>(n - x),
+      boost::math::unchecked_factorial<T>(r - x),
+      boost::math::unchecked_factorial<T>(N - n - r + x)
+   };
+   int i = 0;
+   int j = 0;
+   while((i < 3) || (j < 5))
+   {
+      while((j < 5) && ((result >= 1) || (i >= 3)))
+      {
+         result /= denom[j];
+         ++j;
+      }
+      while((i < 3) && ((result <= 1) || (j >= 5)))
+      {
+         result *= num[i];
+         ++i;
+      }
+   }
+   return result;
+}
+
+
+template <class T, class Policy>
+inline typename tools::promote_args<T>::type 
+   hypergeometric_pdf(unsigned x, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename lanczos::lanczos<value_type, Policy>::type evaluation_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::discrete_quantile<>,
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   value_type result;
+   if(N <= boost::math::max_factorial<value_type>::value)
+   {
+      //
+      // If N is small enough then we can evaluate the PDF via the factorials
+      // directly: table lookup of the factorials gives the best performance
+      // of the methods available:
+      //
+      result = detail::hypergeometric_pdf_factorial_imp<value_type>(x, r, n, N, forwarding_policy());
+   }
+   else if(N <= boost::math::prime(boost::math::max_prime - 1))
+   {
+      //
+      // If N is no larger than the largest prime number in our lookup table
+      // (104729) then we can use prime factorisation to evaluate the PDF,
+      // this is slow but accurate:
+      //
+      result = detail::hypergeometric_pdf_prime_imp<value_type>(x, r, n, N, forwarding_policy());
+   }
+   else
+   {
+      //
+      // Catch all case - use the lanczos approximation - where available - 
+      // to evaluate the ratio of factorials.  This is reasonably fast
+      // (almost as quick as using logarithmic evaluation in terms of lgamma)
+      // but only a few digits better in accuracy than using lgamma:
+      //
+      result = detail::hypergeometric_pdf_lanczos_imp(value_type(), x, r, n, N, evaluation_type(), forwarding_policy());
+   }
+
+   if(result > 1)
+   {
+      result = 1;
+   }
+   if(result < 0)
+   {
+      result = 0;
+   }
+
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(result, "boost::math::hypergeometric_pdf<%1%>(%1%,%1%,%1%,%1%)");
+}
+
+}}} // namespaces
+
+#endif
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_quantile.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/hypergeometric_quantile.hpp
new file mode 100644 (file)
index 0000000..a855a4a
--- /dev/null
@@ -0,0 +1,199 @@
+// Copyright 2008 John Maddock
+//
+// 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)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_QUANTILE_HPP
+#define BOOST_MATH_DISTRIBUTIONS_DETAIL_HG_QUANTILE_HPP
+
+#include <boost/math/policies/error_handling.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+
+namespace boost{ namespace math{ namespace detail{
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_down>&)
+{
+   if((p < cum * fudge_factor) && (x != lbound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x-1);
+      return --x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned /*lbound*/, unsigned ubound, const policies::discrete_quantile<policies::integer_round_up>&)
+{
+   if((cum < p * fudge_factor) && (x != ubound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x+1);
+      return ++x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_inwards>&)
+{
+   if(p >= 0.5)
+      return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T p, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_outwards>&)
+{
+   if(p >= 0.5)
+      return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+   return round_x_from_p(x, p, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+}
+
+template <class T>
+inline unsigned round_x_from_p(unsigned x, T /*p*/, T /*cum*/, T /*fudge_factor*/, unsigned /*lbound*/, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_nearest>&)
+{
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_down>&)
+{
+   if((q * fudge_factor > cum) && (x != lbound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x-1);
+      return --x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned /*lbound*/, unsigned ubound, const policies::discrete_quantile<policies::integer_round_up>&)
+{
+   if((q < cum * fudge_factor) && (x != ubound))
+   {
+      BOOST_MATH_INSTRUMENT_VARIABLE(x+1);
+      return ++x;
+   }
+   return x;
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_inwards>&)
+{
+   if(q < 0.5)
+      return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T q, T cum, T fudge_factor, unsigned lbound, unsigned ubound, const policies::discrete_quantile<policies::integer_round_outwards>&)
+{
+   if(q >= 0.5)
+      return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_down>());
+   return round_x_from_q(x, q, cum, fudge_factor, lbound, ubound, policies::discrete_quantile<policies::integer_round_up>());
+}
+
+template <class T>
+inline unsigned round_x_from_q(unsigned x, T /*q*/, T /*cum*/, T /*fudge_factor*/, unsigned /*lbound*/, unsigned /*ubound*/, const policies::discrete_quantile<policies::integer_round_nearest>&)
+{
+   return x;
+}
+
+template <class T, class Policy>
+unsigned hypergeometric_quantile_imp(T p, T q, unsigned r, unsigned n, unsigned N, const Policy& pol)
+{
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+   typedef typename Policy::discrete_quantile_type discrete_quantile_type;
+   BOOST_MATH_STD_USING
+   BOOST_FPU_EXCEPTION_GUARD
+   T result;
+   T fudge_factor = 1 + tools::epsilon<T>() * ((N <= boost::math::prime(boost::math::max_prime - 1)) ? 50 : 2 * N);
+   unsigned base = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+   unsigned lim = (std::min)(r, n);
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(p);
+   BOOST_MATH_INSTRUMENT_VARIABLE(q);
+   BOOST_MATH_INSTRUMENT_VARIABLE(r);
+   BOOST_MATH_INSTRUMENT_VARIABLE(n);
+   BOOST_MATH_INSTRUMENT_VARIABLE(N);
+   BOOST_MATH_INSTRUMENT_VARIABLE(fudge_factor);
+   BOOST_MATH_INSTRUMENT_VARIABLE(base);
+   BOOST_MATH_INSTRUMENT_VARIABLE(lim);
+
+   if(p <= 0.5)
+   {
+      unsigned x = base;
+      result = hypergeometric_pdf<T>(x, r, n, N, pol);
+      T diff = result;
+      while(result < p)
+      {
+         diff = (diff > tools::min_value<T>() * 8) 
+            ? T(n - x) * T(r - x) * diff / (T(x + 1) * T(N + x + 1 - n - r))
+            : hypergeometric_pdf<T>(x + 1, r, n, N, pol);
+         if(result + diff / 2 > p)
+            break;
+         ++x;
+         result += diff;
+#ifdef BOOST_MATH_INSTRUMENT
+         if(diff != 0)
+         {
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+#endif
+      }
+      return round_x_from_p(x, p, result, fudge_factor, base, lim, discrete_quantile_type());
+   }
+   else
+   {
+      unsigned x = lim;
+      result = 0;
+      T diff = hypergeometric_pdf<T>(x, r, n, N, pol);
+      while(result + diff / 2 < q)
+      {
+         result += diff;
+         diff = (diff > tools::min_value<T>() * 8)
+            ? x * T(N + x - n - r) * diff / (T(1 + n - x) * T(1 + r - x))
+            : hypergeometric_pdf<T>(x - 1, r, n, N, pol);
+         --x;
+#ifdef BOOST_MATH_INSTRUMENT
+         if(diff != 0)
+         {
+            BOOST_MATH_INSTRUMENT_VARIABLE(x);
+            BOOST_MATH_INSTRUMENT_VARIABLE(diff);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
+#endif
+      }
+      return round_x_from_q(x, q, result, fudge_factor, base, lim, discrete_quantile_type());
+   }
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+}
+
+template <class T, class Policy>
+inline unsigned hypergeometric_quantile(T p, T q, unsigned r, unsigned n, unsigned N, const Policy&)
+{
+   BOOST_FPU_EXCEPTION_GUARD
+   typedef typename tools::promote_args<T>::type result_type;
+   typedef typename policies::evaluation<result_type, Policy>::type value_type;
+   typedef typename policies::normalise<
+      Policy, 
+      policies::promote_float<false>, 
+      policies::promote_double<false>, 
+      policies::assert_undefined<> >::type forwarding_policy;
+
+   return detail::hypergeometric_quantile_imp<value_type>(p, q, r, n, N, forwarding_policy());
+}
+
+}}} // namespaces
+
+#endif
+
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/distributions/detail/inv_discrete_quantile.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/detail/inv_discrete_quantile.hpp
index 20260279197228210d3e35a25ff6485823fe4b38..d4f424c8e21d58dac4ca3c668b46d9eda6cec176 100644 (file)
@@ -128,7 +128,7 @@ typename Dist::value_type
          else
          {
             b = a;
-            a = (std::max)(b - 1, value_type(0));
+            a = (std::max)(value_type(b - 1), value_type(0));
             if(a < min_bound)
                a = min_bound;
             fa = f(a);
@@ -158,7 +158,7 @@ typename Dist::value_type
       }
       else
       {
-         b = (std::max)(a - adder, value_type(0));
+         b = (std::max)(value_type(a - adder), value_type(0));
          if(b < min_bound)
             b = min_bound;
       }
@@ -182,7 +182,7 @@ typename Dist::value_type
          }
          else
          {
-            b = (std::max)(a - adder, value_type(0));
+            b = (std::max)(value_type(a - adder), value_type(0));
             if(b < min_bound)
                b = min_bound;
          }
@@ -330,7 +330,7 @@ inline typename Dist::value_type
          dist, 
          p, 
          q,
-         (guess < 1 ? value_type(1) : floor(guess)), 
+         (guess < 1 ? value_type(1) : (value_type)floor(guess)), 
          multiplier, 
          adder, 
          tools::equal_floor(),
@@ -340,7 +340,7 @@ inline typename Dist::value_type
       dist, 
       p, 
       q,
-      ceil(guess), 
+      (value_type)ceil(guess), 
       multiplier, 
       adder, 
       tools::equal_ceil(),
similarity index 89%
rename from deal.II/contrib/boost/include/boost/math/distributions/fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/fwd.hpp
index 657ef61fa971b927f730095bc113c420cddb4bf2..7ddb9e6bed0067a048699c03e3994deeddf8f284 100644 (file)
@@ -38,6 +38,15 @@ class fisher_f_distribution;
 template <class RealType, class Policy>
 class gamma_distribution;
 
+template <class RealType, class Policy>
+class hypergeometric_distribution;
+
+template <class RealType, class Policy>
+class laplace_distribution;
+
+template <class RealType, class Policy>
+class logistic_distribution;
+
 template <class RealType, class Policy>
 class lognormal_distribution;
 
@@ -92,6 +101,8 @@ class weibull_distribution;
    typedef boost::math::extreme_value_distribution<Type, Policy> extreme_value;\
    typedef boost::math::fisher_f_distribution<Type, Policy> fisher_f;\
    typedef boost::math::gamma_distribution<Type, Policy> gamma;\
+   typedef boost::math::laplace_distribution<Type, Policy> laplace;\
+   typedef boost::math::logistic_distribution<Type, Policy> logistic;\
    typedef boost::math::lognormal_distribution<Type, Policy> lognormal;\
    typedef boost::math::negative_binomial_distribution<Type, Policy> negative_binomial;\
    typedef boost::math::normal_distribution<Type, Policy> normal;\
@@ -106,5 +117,6 @@ class weibull_distribution;
    typedef boost::math::non_central_beta_distribution<Type, Policy> non_central_beta;\
    typedef boost::math::non_central_f_distribution<Type, Policy> non_central_f;\
    typedef boost::math::non_central_t_distribution<Type, Policy> non_central_t;\
+   typedef boost::math::hypergeometric_distribution<Type, Policy> hypergeometric;\
 
 #endif // BOOST_MATH_DISTRIBUTIONS_FWD_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/hypergeometric.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/hypergeometric.hpp
new file mode 100644 (file)
index 0000000..afbb521
--- /dev/null
@@ -0,0 +1,290 @@
+// Copyright 2008 Gautam Sewani
+// Copyright 2008 John Maddock
+//
+// 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)
+
+#ifndef BOOST_MATH_DISTRIBUTIONS_HYPERGEOMETRIC_HPP
+#define BOOST_MATH_DISTRIBUTIONS_HYPERGEOMETRIC_HPP
+
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/distributions/detail/hypergeometric_pdf.hpp>
+#include <boost/math/distributions/detail/hypergeometric_cdf.hpp>
+#include <boost/math/distributions/detail/hypergeometric_quantile.hpp>
+#include <boost/math/special_functions/fpclassify.hpp>
+
+
+namespace boost { namespace math {
+
+   template <class RealType = double, class Policy = policies::policy<> >
+   class hypergeometric_distribution
+   {
+   public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+
+      hypergeometric_distribution(unsigned r, unsigned n, unsigned N) // Constructor.
+         : m_n(n), m_N(N), m_r(r)
+      {
+         static const char* function = "boost::math::hypergeometric_distribution<%1%>::hypergeometric_distribution";
+         RealType ret;
+         check_params(function, &ret);
+      }
+      // Accessor functions.
+      unsigned total()const
+      {
+         return m_N;
+      }
+
+      unsigned defective()const
+      {
+         return m_n;
+      }
+
+      unsigned sample_count()const
+      {
+         return m_r;
+      }
+
+      bool check_params(const char* function, RealType* result)const
+      {
+         if(m_r > m_N)
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Parameter r out of range: must be <= N but got %1%", static_cast<RealType>(m_r), Policy());
+            return false;
+         }
+         if(m_n > m_N)
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Parameter n out of range: must be <= N but got %1%", static_cast<RealType>(m_n), Policy());
+            return false;
+         }
+         return true;
+      }
+      bool check_x(unsigned x, const char* function, RealType* result)const
+      {
+         if(x < static_cast<unsigned>((std::max)(0, (int)(m_n + m_r) - (int)(m_N))))
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Random variable out of range: must be > 0 and > m + r - N but got %1%", static_cast<RealType>(x), Policy());
+            return false;
+         }
+         if(x > (std::min)(m_r, m_n))
+         {
+            *result = boost::math::policies::raise_domain_error<RealType>(
+               function, "Random variable out of range: must be less than both n and r but got %1%", static_cast<RealType>(x), Policy());
+            return false;
+         }
+         return true;
+      }
+
+   private:
+      // Data members:
+      unsigned m_n;  // number of "defective" items
+      unsigned m_N; // number of "total" items
+      unsigned m_r; // number of items picked
+
+   }; // class hypergeometric_distribution
+
+   typedef hypergeometric_distribution<double> hypergeometric;
+
+   template <class RealType, class Policy>
+   inline const std::pair<unsigned, unsigned> range(const hypergeometric_distribution<RealType, Policy>& dist)
+   { // Range of permissible values for random variable x.
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable:4267)
+#endif
+      unsigned r = dist.sample_count();
+      unsigned n = dist.defective();
+      unsigned N = dist.total();
+      unsigned l = static_cast<unsigned>((std::max)(0, (int)(n + r) - (int)(N)));
+      unsigned u = (std::min)(r, n);
+      return std::pair<unsigned, unsigned>(l, u);
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+   }
+
+   template <class RealType, class Policy>
+   inline const std::pair<unsigned, unsigned> support(const hypergeometric_distribution<RealType, Policy>& d)
+   { 
+      return range(d);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType pdf(const hypergeometric_distribution<RealType, Policy>& dist, const unsigned& x)
+   {
+      static const char* function = "boost::math::pdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result;
+      if(!dist.check_params(function, &result))
+         return result;
+      if(!dist.check_x(x, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_pdf<RealType>(
+         x, dist.sample_count(), dist.defective(), dist.total(), Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType pdf(const hypergeometric_distribution<RealType, Policy>& dist, const U& x)
+   {
+      static const char* function = "boost::math::pdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(x);
+      unsigned u = boost::math::itrunc(r);
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return pdf(dist, u);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType cdf(const hypergeometric_distribution<RealType, Policy>& dist, const unsigned& x)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result;
+      if(!dist.check_params(function, &result))
+         return result;
+      if(!dist.check_x(x, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_cdf<RealType>(
+         x, dist.sample_count(), dist.defective(), dist.total(), false, Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType cdf(const hypergeometric_distribution<RealType, Policy>& dist, const U& x)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(x);
+      unsigned u = boost::math::itrunc(r);
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return cdf(dist, u);
+   }
+
+   template <class RealType, class Policy>
+   inline RealType cdf(const complemented2_type<hypergeometric_distribution<RealType, Policy>, unsigned>& c)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType result;
+      if(!c.dist.check_params(function, &result))
+         return result;
+      if(!c.dist.check_x(c.param, function, &result))
+         return result;
+
+      return boost::math::detail::hypergeometric_cdf<RealType>(
+         c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), true, Policy());
+   }
+
+   template <class RealType, class Policy, class U>
+   inline RealType cdf(const complemented2_type<hypergeometric_distribution<RealType, Policy>, U>& c)
+   {
+      static const char* function = "boost::math::cdf(const hypergeometric_distribution<%1%>&, const %1%&)";
+      RealType r = static_cast<RealType>(c.param);
+      unsigned u = boost::math::itrunc(r);
+      if(u != r)
+      {
+         return boost::math::policies::raise_domain_error<RealType>(
+            function, "Random variable out of range: must be an integer but got %1%", r, Policy());
+      }
+      return cdf(complement(c.dist, u));
+   }
+
+   template <class RealType, class Policy>
+   inline RealType quantile(const hypergeometric_distribution<RealType, Policy>& dist, const RealType& p)
+   {
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+         // Checking function argument
+         RealType result;
+      const char* function = "boost::math::quantile(const hypergeometric_distribution<%1%>&, %1%)";
+      if (false == dist.check_params(function, &result)) return result;
+      if(false == detail::check_probability(function, p, &result, Policy())) return result;
+
+      return static_cast<RealType>(detail::hypergeometric_quantile(p, RealType(1 - p), dist.sample_count(), dist.defective(), dist.total(), Policy()));
+   } // quantile
+
+   template <class RealType, class Policy>
+   inline RealType quantile(const complemented2_type<hypergeometric_distribution<RealType, Policy>, RealType>& c)
+   {
+      BOOST_MATH_STD_USING // for ADL of std functions
+
+      // Checking function argument
+      RealType result;
+      const char* function = "quantile(const complemented2_type<hypergeometric_distribution<%1%>, %1%>&)";
+      if (false == c.dist.check_params(function, &result)) return result;
+      if(false == detail::check_probability(function, c.param, &result, Policy())) return result;
+
+      return static_cast<RealType>(detail::hypergeometric_quantile(RealType(1 - c.param), c.param, c.dist.sample_count(), c.dist.defective(), c.dist.total(), Policy()));
+   } // quantile
+
+   template <class RealType, class Policy>
+   inline RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      return static_cast<RealType>(dist.sample_count() * dist.defective()) / dist.total();
+   } // RealType mean(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return r * (n / N) * (1 - n / N) * (N - r) / (N - 1);
+   } // RealType variance(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType mode(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      BOOST_MATH_STD_USING
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return floor((r + 1) * (n + 1) / (N + 2));
+   }
+
+   template <class RealType, class Policy>
+   inline RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      BOOST_MATH_STD_USING
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      return (N - 2 * n) * sqrt(N - 1) * (N - 2 * r) / (sqrt(n * r * (N - n) * (N - r)) * (N - 2));
+   } // RealType skewness(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      RealType r = static_cast<RealType>(dist.sample_count());
+      RealType n = static_cast<RealType>(dist.defective());
+      RealType N = static_cast<RealType>(dist.total());
+      RealType t1 = N * N * (N - 1) / (r * (N - 2) * (N - 3) * (N - r));
+      RealType t2 = (N * (N + 1) - 6 * N * (N - r)) / (n * (N - n))
+         + 3 * r * (N - r) * (N + 6) / (N * N) - 6;
+      return t1 * t2;
+   } // RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+
+   template <class RealType, class Policy>
+   inline RealType kurtosis(const hypergeometric_distribution<RealType, Policy>& dist)
+   {
+      return kurtosis_excess(dist) + 3;
+   } // RealType kurtosis_excess(const hypergeometric_distribution<RealType, Policy>& dist)
+}} // namespaces
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // include guard
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/laplace.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/laplace.hpp
new file mode 100644 (file)
index 0000000..87e0a8d
--- /dev/null
@@ -0,0 +1,302 @@
+//  Copyright Thijs van den Berg, 2008.
+//  Copyright John Maddock 2008.
+//  Copyright Paul A. Bristow 2008.
+
+//  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)
+
+// This module implements the Laplace distribution.
+// Weisstein, Eric W. "Laplace Distribution." From MathWorld--A Wolfram Web Resource.
+// http://mathworld.wolfram.com/LaplaceDistribution.html
+// http://en.wikipedia.org/wiki/Laplace_distribution
+//
+// Abramowitz and Stegun 1972, p 930
+// http://www.math.sfu.ca/~cbm/aands/page_930.htm
+
+#ifndef BOOST_STATS_LAPLACE_HPP
+#define BOOST_STATS_LAPLACE_HPP
+
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <limits>
+
+namespace boost{ namespace math{
+
+template <class RealType = double, class Policy = policies::policy<> >
+class laplace_distribution
+{
+public:
+   // ----------------------------------
+   // public Types
+   // ----------------------------------
+   typedef RealType value_type;
+   typedef Policy policy_type;
+
+   // ----------------------------------
+   // Constructor(s)
+   // ----------------------------------
+   laplace_distribution(RealType location = 0, RealType scale = 1)
+      : m_location(location), m_scale(scale)
+   {
+      RealType result;
+      check_parameters("boost::math::laplace_distribution<%1%>::laplace_distribution()", &result);
+   }
+
+
+   // ----------------------------------
+   // Public functions
+   // ----------------------------------
+
+   RealType location() const
+   {
+      return m_location;
+   }
+
+   RealType scale() const
+   {
+      return m_scale;
+   }
+
+   bool check_parameters(const char* function, RealType* result) const
+   {
+         if(false == detail::check_scale(function, m_scale, result, Policy())) return false;
+         if(false == detail::check_location(function, m_location, result, Policy())) return false;
+         return true;
+   }
+
+
+private:
+   RealType m_location;
+   RealType m_scale;
+
+}; // class laplace_distribution
+
+
+
+//
+// Convenient type synonym
+//
+typedef laplace_distribution<double> laplace;
+
+//
+// Non member functions
+//
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> range(const laplace_distribution<RealType, Policy>&)
+{
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline const std::pair<RealType, RealType> support(const laplace_distribution<RealType, Policy>&)
+{
+   using boost::math::tools::max_value;
+   return std::pair<RealType, RealType>(-max_value<RealType>(),  max_value<RealType>());
+}
+
+template <class RealType, class Policy>
+inline RealType pdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   // Checking function argument
+   RealType result;
+   const char* function = "boost::math::pdf(const laplace_distribution<%1%>&, %1%))";
+   if (false == dist.check_parameters(function, &result)) return result;
+   if (false == detail::check_x(function, x, &result, Policy())) return result;
+
+   // Special pdf values
+   if((boost::math::isinf)(x))
+      return 0; // pdf + and - infinity is zero.
+
+   // General case
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   RealType exponent = x - location;
+   if (exponent>0) exponent = -exponent;
+   exponent /= scale;
+
+   result = exp(exponent);
+   result /= 2 * scale;
+
+   return result;
+} // pdf
+
+template <class RealType, class Policy>
+inline RealType cdf(const laplace_distribution<RealType, Policy>& dist, const RealType& x)
+{
+   BOOST_MATH_STD_USING  // for ADL of std functions
+
+   // Checking function argument
+   RealType result;
+   const char* function = "boost::math::cdf(const laplace_distribution<%1%>&, %1%)";
+   if (false == dist.check_parameters(function, &result)) return result;
+   if (false == detail::check_x(function, x, &result, Policy())) return result;
+
+   // Special cdf values
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 0; // -infinity
+     return 1; // + infinity
+   }
+
+   // General cdf  values
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   if (x < location)
+      result = exp( (x-location)/scale )/2;
+   else
+      result = 1 - exp( (location-x)/scale )/2;
+
+   return result;
+} // cdf
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const laplace_distribution<RealType, Policy>& dist, const RealType& p)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   // Checking function argument
+   RealType result;
+   const char* function = "boost::math::quantile(const laplace_distribution<%1%>&, %1%)";
+   if (false == dist.check_parameters(function, &result)) return result;
+   if(false == detail::check_probability(function, p, &result, Policy())) return result;
+
+   // extreme values
+   if(p == 0) return -std::numeric_limits<RealType>::infinity();
+   if(p == 1) return std::numeric_limits<RealType>::infinity();
+
+   // Calculate Quantile
+   RealType scale( dist.scale() );
+   RealType location( dist.location() );
+
+   if (p - 0.5 < 0.0)
+      result = location + scale*log( static_cast<RealType>(p*2) );
+   else
+      result = location - scale*log( static_cast<RealType>(-p*2 + 2) );
+
+   return result;
+} // quantile
+
+
+template <class RealType, class Policy>
+inline RealType cdf(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   RealType scale = c.dist.scale();
+   RealType location = c.dist.location();
+   RealType x = c.param;
+
+   // Checking function argument
+   RealType result;
+   const char* function = "boost::math::cdf(const complemented2_type<laplace_distribution<%1%>, %1%>&)";
+   if(false == detail::check_x(function, x, &result, Policy()))return result;
+
+   // Calculate cdf
+
+   // Special cdf value
+   if((boost::math::isinf)(x))
+   {
+     if(x < 0) return 1; // cdf complement -infinity is unity.
+     return 0; // cdf complement +infinity is zero
+   }
+
+   // Cdf interval value
+   if (-x < location)
+      result = exp( (-x-location)/scale )/2;
+   else
+      result = 1 - exp( (location+x)/scale )/2;
+
+   return result;
+} // cdf complement
+
+
+template <class RealType, class Policy>
+inline RealType quantile(const complemented2_type<laplace_distribution<RealType, Policy>, RealType>& c)
+{
+   BOOST_MATH_STD_USING // for ADL of std functions
+
+   // Calculate quantile
+   RealType scale = c.dist.scale();
+   RealType location = c.dist.location();
+   RealType q = c.param;
+
+   // Checking function argument
+   RealType result;
+   const char* function = "quantile(const complemented2_type<laplace_distribution<%1%>, %1%>&)";
+   if(false == detail::check_probability(function, q, &result, Policy())) return result;
+
+
+   // extreme values
+   if(q == 0) return std::numeric_limits<RealType>::infinity();
+   if(q == 1) return -std::numeric_limits<RealType>::infinity();
+
+   if (0.5 - q < 0.0)
+      result = location + scale*log( static_cast<RealType>(-q*2 + 2) );
+   else
+      result = location - scale*log( static_cast<RealType>(q*2) );
+
+
+   return result;
+} // quantile
+
+template <class RealType, class Policy>
+inline RealType mean(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType standard_deviation(const laplace_distribution<RealType, Policy>& dist)
+{
+   return constants::root_two<RealType>() * dist.scale();
+}
+
+template <class RealType, class Policy>
+inline RealType mode(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType median(const laplace_distribution<RealType, Policy>& dist)
+{
+   return dist.location();
+}
+
+template <class RealType, class Policy>
+inline RealType skewness(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 0;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 6;
+}
+
+template <class RealType, class Policy>
+inline RealType kurtosis_excess(const laplace_distribution<RealType, Policy>& /*dist*/)
+{
+   return 3;
+}
+
+} // namespace math
+} // namespace boost
+
+// This include must be at the end, *after* the accessors
+// for this distribution have been defined, in order to
+// keep compilers that support two-phase lookup happy.
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
+#endif // BOOST_STATS_LAPLACE_HPP
+
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/logistic.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/distributions/logistic.hpp
new file mode 100644 (file)
index 0000000..76c6d84
--- /dev/null
@@ -0,0 +1,287 @@
+// Copyright 2008 Gautam Sewani
+//
+// 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)
+
+#include <boost/math/distributions/fwd.hpp>
+#include <boost/math/distributions/detail/common_error_handling.hpp>
+#include <boost/math/distributions/complement.hpp>
+#include <boost/math/special_functions/log1p.hpp>
+#include <boost/math/constants/constants.hpp>
+#include <utility>
+
+namespace boost { namespace math { 
+
+    template <class RealType = double, class Policy = policies::policy<> >
+    class logistic_distribution
+    {
+    public:
+      typedef RealType value_type;
+      typedef Policy policy_type;
+      
+      logistic_distribution(RealType location=0, RealType scale=1) // Constructor.
+        : m_location(location), m_scale(scale) 
+      {
+        static const char* function = "boost::math::logistic_distribution<%1%>::logistic_distribution";
+        
+        RealType result;
+        detail::check_scale(function, scale, &result, Policy());
+        detail::check_location(function, location, &result, Policy());
+      }
+      // Accessor functions.
+      RealType scale()const
+      {
+        return m_scale;
+      }
+      
+      RealType location()const
+      {
+        return m_location;
+      }
+    private:
+      // Data members:
+      RealType m_location;  // distribution location aka mu.
+      RealType m_scale;  // distribution scale aka s.
+    }; // class logistic_distribution
+    
+    
+    typedef logistic_distribution<double> logistic;
+    
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> range(const logistic_distribution<RealType, Policy>& /* dist */)
+    { // Range of permissible values for random variable x.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + infinity
+    }
+    
+    template <class RealType, class Policy>
+    inline const std::pair<RealType, RealType> support(const logistic_distribution<RealType, Policy>& /* dist */)
+    { // Range of supported values for random variable x.
+      // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
+      using boost::math::tools::max_value;
+      return std::pair<RealType, RealType>(-max_value<RealType>(), max_value<RealType>()); // - to + infinity
+    }
+    
+    
+    template <class RealType, class Policy>
+    inline RealType pdf(const logistic_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+       RealType scale = dist.scale();
+       RealType location = dist.location();
+
+       static const char* function = "boost::math::pdf(const logistic_distribution<%1%>&, %1%)";
+       if((boost::math::isinf)(x))
+       {
+          return 0; // pdf + and - infinity is zero.
+       }
+
+       RealType result;
+       if(false == detail::check_scale(function, scale , &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_location(function, location, &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_x(function, x, &result, Policy()))
+       {
+          return result;
+       }
+
+       BOOST_MATH_STD_USING
+       RealType exp_term = (location - x) / scale;
+       if(fabs(exp_term) > tools::log_max_value<RealType>())
+          return 0;
+       exp_term = exp(exp_term);
+       if((exp_term * scale > 1) && (exp_term > tools::max_value<RealType>() / (scale * exp_term)))
+          return 1 / (scale * exp_term);
+       return (exp_term) / (scale * (1 + exp_term) * (1 + exp_term));
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType cdf(const logistic_distribution<RealType, Policy>& dist, const RealType& x)
+    {
+       RealType scale = dist.scale();
+       RealType location = dist.location();
+       RealType result; // of checks.
+       static const char* function = "boost::math::cdf(const logistic_distribution<%1%>&, %1%)";
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+       {
+          return result;
+       }
+       if(false == detail::check_location(function, location, &result, Policy()))
+       {
+          return result;
+       }
+
+       if((boost::math::isinf)(x))
+       {
+          if(x < 0) return 0; // -infinity
+          return 1; // + infinity
+       }
+
+       if(false == detail::check_x(function, x, &result, Policy()))
+       {
+          return result;
+       }
+       BOOST_MATH_STD_USING
+       RealType power = (location - x) / scale;
+       if(power > tools::log_max_value<RealType>())
+          return 0;
+       if(power < -tools::log_max_value<RealType>())
+          return 1;
+       return 1 / (1 + exp(power)); 
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType quantile(const logistic_distribution<RealType, Policy>& dist, const RealType& p)
+    {
+       BOOST_MATH_STD_USING
+       RealType location = dist.location();
+       RealType scale = dist.scale();
+
+       static const char* function = "boost::math::quantile(const logistic_distribution<%1%>&, %1%)";
+
+       RealType result;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+          return result;
+       if(false == detail::check_location(function, location, &result, Policy()))
+          return result;
+       if(false == detail::check_probability(function, p, &result, Policy()))
+          return result;
+
+       if(p == 0)
+       {
+          return -policies::raise_overflow_error<RealType>(function,"probability argument is 0, must be >0 and <1",Policy());
+       }
+       if(p == 1)
+       {
+          return policies::raise_overflow_error<RealType>(function,"probability argument is 1, must be >0 and <1",Policy());
+       }
+       //Expressions to try
+       //return location+scale*log(p/(1-p));
+       //return location+scale*log1p((2*p-1)/(1-p));
+
+       //return location - scale*log( (1-p)/p);
+       //return location - scale*log1p((1-2*p)/p);
+
+       //return -scale*log(1/p-1) + location;
+       return location - scale * log((1 - p) / p);
+     } // RealType quantile(const logistic_distribution<RealType, Policy>& dist, const RealType& p)
+    
+    template <class RealType, class Policy>
+    inline RealType cdf(const complemented2_type<logistic_distribution<RealType, Policy>, RealType>& c)
+    {
+       BOOST_MATH_STD_USING
+       RealType location = c.dist.location();
+       RealType scale = c.dist.scale();
+       RealType x = c.param;
+       static const char* function = "boost::math::cdf(const complement(logistic_distribution<%1%>&), %1%)";
+
+       if((boost::math::isinf)(x))
+       {
+          if(x < 0) return 1; // cdf complement -infinity is unity.
+          return 0; // cdf complement +infinity is zero
+       }
+       RealType result;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+          return result;
+       if(false == detail::check_location(function, location, &result, Policy()))
+          return result;
+       if(false == detail::check_x(function, x, &result, Policy()))
+          return result;
+       RealType power = (x - location) / scale;
+       if(power > tools::log_max_value<RealType>())
+          return 0;
+       if(power < -tools::log_max_value<RealType>())
+          return 1;
+       return 1 / (1 + exp(power)); 
+    } 
+
+    template <class RealType, class Policy>
+    inline RealType quantile(const complemented2_type<logistic_distribution<RealType, Policy>, RealType>& c)
+    {
+       BOOST_MATH_STD_USING
+       RealType scale = c.dist.scale();
+       RealType location = c.dist.location();
+       static const char* function = "boost::math::quantile(const complement(logistic_distribution<%1%>&), %1%)";
+       RealType result;
+       if(false == detail::check_scale(function, scale, &result, Policy()))
+          return result;
+       if(false == detail::check_location(function, location, &result, Policy()))
+          return result;
+       RealType q = c.param;
+       if(false == detail::check_probability(function, q, &result, Policy()))
+          return result;
+       using boost::math::tools::max_value;
+
+       if(q == 1)
+       {
+          return -policies::raise_overflow_error<RealType>(function,"probability argument is 1, but must be >0 and <1",Policy());
+       }
+       if(q == 0)
+       {
+          return policies::raise_overflow_error<RealType>(function,"probability argument is 0, but must be >0 and <1",Policy());
+       }
+       //Expressions to try 
+       //return location+scale*log((1-q)/q);
+       return location + scale * log((1 - q) / q);
+
+       //return location-scale*log(q/(1-q));
+       //return location-scale*log1p((2*q-1)/(1-q));
+
+       //return location+scale*log(1/q-1);
+       //return location+scale*log1p(1/q-2);
+    } 
+    
+    template <class RealType, class Policy>
+    inline RealType mean(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    } // RealType mean(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType variance(const logistic_distribution<RealType, Policy>& dist)
+    {
+      BOOST_MATH_STD_USING
+      RealType scale = dist.scale();
+      return boost::math::constants::pi<RealType>()*boost::math::constants::pi<RealType>()*scale*scale/3;
+    } // RealType variance(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType mode(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    }
+    
+    template <class RealType, class Policy>
+    inline RealType median(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return dist.location();
+    }
+    template <class RealType, class Policy>
+    inline RealType skewness(const logistic_distribution<RealType, Policy>& /*dist*/)
+    {
+      return 0;
+    } // RealType skewness(const logistic_distribution<RealType, Policy>& dist)
+    
+    template <class RealType, class Policy>
+    inline RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& /*dist*/)
+    {
+      return static_cast<RealType>(6)/5; 
+    } // RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& dist)
+
+    template <class RealType, class Policy>
+    inline RealType kurtosis(const logistic_distribution<RealType, Policy>& dist)
+    {
+      return kurtosis_excess(dist) + 3;
+    } // RealType kurtosis_excess(const logistic_distribution<RealType, Policy>& dist)
+  }}
+
+
+// Must come at the end:
+#include <boost/math/distributions/detail/derived_accessors.hpp>
+
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/negative_binomial.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/negative_binomial.hpp
index ccc8127b17d03932ae72b5fd646499763f9bdfe7..f9a24e82433a9fb88f49a690aaea419b1de5d13f 100644 (file)
@@ -468,14 +468,14 @@ namespace boost
       RealType guess = 0;
       RealType factor = 5;
       if(r * r * r * P * p > 0.005)
-         guess = detail::inverse_negative_binomial_cornish_fisher(r, p, 1-p, P, 1-P, Policy());
+         guess = detail::inverse_negative_binomial_cornish_fisher(r, p, RealType(1-p), P, RealType(1-P), Policy());
 
       if(guess < 10)
       {
          //
          // Cornish-Fisher Negative binomial approximation not accurate in this area:
          //
-         guess = (std::min)(r * 2, RealType(10));
+         guess = (std::min)(RealType(r * 2), RealType(10));
       }
       else
          factor = (1-P < sqrt(tools::epsilon<RealType>())) ? 2 : (guess < 20 ? 1.2f : 1.1f);
@@ -545,14 +545,14 @@ namespace boost
        RealType guess = 0;
        RealType factor = 5;
        if(r * r * r * (1-Q) * p > 0.005)
-          guess = detail::inverse_negative_binomial_cornish_fisher(r, p, 1-p, 1-Q, Q, Policy());
+          guess = detail::inverse_negative_binomial_cornish_fisher(r, p, RealType(1-p), RealType(1-Q), Q, Policy());
 
        if(guess < 10)
        {
           //
           // Cornish-Fisher Negative binomial approximation not accurate in this area:
           //
-          guess = (std::min)(r * 2, RealType(10));
+          guess = (std::min)(RealType(r * 2), RealType(10));
        }
        else
           factor = (Q < sqrt(tools::epsilon<RealType>())) ? 2 : (guess < 20 ? 1.2f : 1.1f);
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/distributions/non_central_beta.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_beta.hpp
index 5e9eef2fe1ae713ca996bf12b6b1d255c8e97f02..bf2cf9098093fdfe6312593a40892bf62260a1f3 100644 (file)
@@ -38,7 +38,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T l2 = lam / 2;
             //
             // k is the starting point for iteration, and is the
@@ -51,14 +51,13 @@ namespace boost
             T pois = gamma_p_derivative(T(k+1), l2, pol);
             if(pois == 0)
                return init_val;
+            // recurance term:
+            T xterm;
             // Starting beta term:
             T beta = x < y 
-               ? ibeta(a + k, b, x, pol)
-               : ibetac(b, a + k, y, pol);
-            // recurance term:
-            T xterm = x < y
-               ? ibeta_derivative(a + k, b, x, pol)
-               : ibeta_derivative(b, a + k, y, pol);
+               ? detail::ibeta_imp(T(a + k), b, x, pol, false, true, &xterm)
+               : detail::ibeta_imp(b, T(a + k), y, pol, true, true, &xterm);
+
             xterm *= y / (a + b + k - 1);
             T poisf(pois), betaf(beta), xtermf(xterm);
             T sum = init_val;
@@ -117,7 +116,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T l2 = lam / 2;
             //
             // k is the starting point for iteration, and is the
@@ -130,14 +129,13 @@ namespace boost
             T pois = gamma_p_derivative(T(k+1), l2, pol);
             if(pois == 0)
                return init_val;
+            // recurance term:
+            T xterm;
             // Starting beta term:
             T beta = x < y
-               ? ibetac(a + k, b, x, pol)
-               : ibeta(b, a + k, y, pol);
-            // recurance term:
-            T xterm = x < y 
-               ? ibeta_derivative(a + k, b, x, pol)
-               : ibeta_derivative(b, a + k, y, pol);
+               ? detail::ibeta_imp(T(a + k), b, x, pol, true, true, &xterm)
+               : detail::ibeta_imp(b, T(a + k), y, pol, false, true, &xterm);
+
             xterm *= y / (a + b + k - 1);
             T poisf(pois), betaf(beta), xtermf(xterm);
             T sum = init_val;
@@ -501,7 +499,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T l2 = lam / 2;
             //
             // k is the starting point for iteration, and is the
@@ -597,7 +595,7 @@ namespace boost
             if(l == 0)
                return pdf(boost::math::beta_distribution<RealType, Policy>(dist.alpha(), dist.beta()), x);
             return policies::checked_narrowing_cast<RealType, forwarding_policy>(
-               non_central_beta_pdf(a, b, l, static_cast<value_type>(x), 1 - static_cast<value_type>(x), forwarding_policy()),
+               non_central_beta_pdf(a, b, l, static_cast<value_type>(x), value_type(1 - static_cast<value_type>(x)), forwarding_policy()),
                "function");
          }
 
@@ -781,7 +779,7 @@ namespace boost
          if(l == 0)
             return cdf(beta_distribution<RealType, Policy>(a, b), x);
 
-         return detail::non_central_beta_cdf(x, 1 - x, a, b, l, false, Policy());
+         return detail::non_central_beta_cdf(x, RealType(1 - x), a, b, l, false, Policy());
       } // cdf
 
       template <class RealType, class Policy>
@@ -818,7 +816,7 @@ namespace boost
          if(l == 0)
             return cdf(complement(beta_distribution<RealType, Policy>(a, b), x));
 
-         return detail::non_central_beta_cdf(x, 1 - x, a, b, l, true, Policy());
+         return detail::non_central_beta_cdf(x, RealType(1 - x), a, b, l, true, Policy());
       } // ccdf
 
       template <class RealType, class Policy>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/non_central_chi_squared.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_chi_squared.hpp
index 154e82ce5e75a0f567c99728a36863c988ca2fa6..1de4a8034b7b19379ca20eb836369e511677ddfa 100644 (file)
@@ -63,7 +63,7 @@ namespace boost
             T del = f / 2;
             T y = x / 2;
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T sum = init_sum;
             //
             // k is the starting location for iteration, we'll
@@ -158,7 +158,7 @@ namespace boost
                return sum;
 
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
 
             int i;
             T lterm(0), term(0);
@@ -203,7 +203,7 @@ namespace boost
             if(y == 0)
                return 0;
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T errorf(0), errorb(0);
 
             T x = y / 2;
@@ -289,7 +289,7 @@ namespace boost
             //
             BOOST_MATH_STD_USING
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T x2 = x / 2;
             T n2 = n / 2;
             T l2 = lambda / 2;
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/distributions/non_central_t.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/non_central_t.hpp
index f68efe6ce76142b35503e90f10d58bdf42227231..ba44e09dc832fcc5f6009add3be2470dbf538536 100644 (file)
@@ -34,7 +34,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = policies::get_epsilon<T, Policy>();
             T d2 = delta * delta / 2;
             //
             // k is the starting point for iteration, and is the
@@ -47,14 +47,13 @@ namespace boost
                * delta / constants::root_two<T>();
             if(pois == 0)
                return init_val;
+            // Recurance term:
+            T xterm;
             // Starting beta term:
             T beta = x < y
-               ? ibeta(T(k + 1), n / 2, x, pol)
-               : ibetac(n / 2, T(k + 1), y, pol);
-            // Recurance term:
-            T xterm = x < y
-               ? ibeta_derivative(T(k + 1), n / 2, x, pol)
-               : ibeta_derivative(n / 2, T(k + 1), y, pol);
+               ? detail::ibeta_imp(T(k + 1), T(n / 2), x, pol, false, true, &xterm)
+               : detail::ibeta_imp(T(n / 2), T(k + 1), y, pol, true, true, &xterm);
+
             xterm *= y / (n / 2 + k);
             T poisf(pois), betaf(beta), xtermf(xterm);
             T sum = init_val;
@@ -105,7 +104,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T d2 = delta * delta / 2;
             //
             // k is the starting point for iteration, and is the
@@ -118,14 +117,13 @@ namespace boost
                * delta / constants::root_two<T>();
             if(pois == 0)
                return init_val;
+            // Recurance term:
+            T xterm;
             // Starting beta term:
             T beta = x < y 
-               ? ibetac(T(k + 1), n / 2, x, pol)
-               : ibeta(n / 2, T(k + 1), y, pol);
-            // Recurance term:
-            T xterm = x < y
-               ? ibeta_derivative(T(k + 1), n / 2, x, pol)
-               : ibeta_derivative(n / 2, T(k + 1), y, pol);
+               ? detail::ibeta_imp(T(k + 1), T(n / 2), x, pol, true, true, &xterm) 
+               : detail::ibeta_imp(T(n / 2), T(k + 1), y, pol, false, true, &xterm);
+
             xterm *= y / (n / 2 + k);
             T poisf(pois), betaf(beta), xtermf(xterm);
             T sum = init_val;
@@ -321,7 +319,7 @@ namespace boost
             // Variables come first:
             //
             boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-            T errtol = ldexp(1.0f, -boost::math::policies::digits<T, Policy>());
+            T errtol = boost::math::policies::get_epsilon<T, Policy>();
             T d2 = delta * delta / 2;
             //
             // k is the starting point for iteration, and is the
@@ -1042,7 +1040,7 @@ namespace boost
       { // Quantile (or Percent Point) function.
          RealType v = dist.degrees_of_freedom();
          RealType l = dist.non_centrality();
-         return detail::non_central_t_quantile(v, l, p, 1-p, Policy());
+         return detail::non_central_t_quantile(v, l, p, RealType(1-p), Policy());
       } // quantile
 
       template <class RealType, class Policy>
@@ -1052,7 +1050,7 @@ namespace boost
          RealType q = c.param;
          RealType v = dist.degrees_of_freedom();
          RealType l = dist.non_centrality();
-         return detail::non_central_t_quantile(v, l, 1-q, q, Policy());
+         return detail::non_central_t_quantile(v, l, RealType(1-q), q, Policy());
       } // quantile complement.
 
    } // namespace math
similarity index 78%
rename from deal.II/contrib/boost/include/boost/math/distributions/pareto.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/pareto.hpp
index d568a5af94b28a2bb303fd50124c81c6206caa5e..7673b96cf2f60d72b8a4c039e4775e1b2644f8e6 100644 (file)
@@ -1,5 +1,5 @@
 //  Copyright John Maddock 2007.
-//  Copyright Paul A. Bristow 2007
+//  Copyright Paul A. Bristow 2007, 2009
 //  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)
@@ -13,6 +13,8 @@
 // Weisstein, Eric W. "Pareto Distribution."
 // From MathWorld--A Wolfram Web Resource.
 // http://mathworld.wolfram.com/ParetoDistribution.html
+// Handbook of Statistical Distributions with Applications, K Krishnamoorthy, ISBN 1-58488-635-8, Chapter 23, pp 257 - 267.
+// Caution KK's a and b are the reverse of Mathworld!
 
 #include <boost/math/distributions/fwd.hpp>
 #include <boost/math/distributions/complement.hpp>
@@ -28,14 +30,14 @@ namespace boost
     namespace detail
     { // Parameter checking.
       template <class RealType, class Policy>
-      inline bool check_pareto_location(
+      inline bool check_pareto_scale(
         const char* function,
-        RealType location,
+        RealType scale,
         RealType* result, const Policy& pol)
       {
-        if((boost::math::isfinite)(location))
+        if((boost::math::isfinite)(scale))
         { // any > 0 finite value is OK.
-          if (location > 0)
+          if (scale > 0)
           {
             return true;
           }
@@ -43,7 +45,7 @@ namespace boost
           {
             *result = policies::raise_domain_error<RealType>(
               function,
-              "Location parameter is %1%, but must be > 0!", location, pol);
+              "Scale parameter is %1%, but must be > 0!", scale, pol);
             return false;
           }
         }
@@ -51,10 +53,10 @@ namespace boost
         { // Not finite.
           *result = policies::raise_domain_error<RealType>(
             function,
-            "Location parameter is %1%, but must be finite!", location, pol);
+            "Scale parameter is %1%, but must be finite!", scale, pol);
           return false;
         }
-      } // bool check_pareto_location
+      } // bool check_pareto_scale
 
       template <class RealType, class Policy>
       inline bool check_pareto_shape(
@@ -92,7 +94,7 @@ namespace boost
         RealType* result, const Policy& pol)
       {
         if((boost::math::isfinite)(x))
-        { // 
+        { //
           if (x > 0)
           {
             return true;
@@ -117,11 +119,11 @@ namespace boost
       template <class RealType, class Policy>
       inline bool check_pareto( // distribution parameters.
         const char* function,
-        RealType location,
+        RealType scale,
         RealType shape,
         RealType* result, const Policy& pol)
       {
-        return check_pareto_location(function, location, result, pol) 
+        return check_pareto_scale(function, scale, result, pol)
            && check_pareto_shape(function, shape, result, pol);
       } // bool check_pareto(
 
@@ -134,26 +136,26 @@ namespace boost
       typedef RealType value_type;
       typedef Policy policy_type;
 
-      pareto_distribution(RealType location = 1, RealType shape = 1)
-        : m_location(location), m_shape(shape)
+      pareto_distribution(RealType scale = 1, RealType shape = 1)
+        : m_scale(scale), m_shape(shape)
       { // Constructor.
         RealType result;
-        detail::check_pareto("boost::math::pareto_distribution<%1%>::pareto_distribution", location, shape, &result, Policy());
+        detail::check_pareto("boost::math::pareto_distribution<%1%>::pareto_distribution", scale, shape, &result, Policy());
       }
 
-      RealType location()const
-      { // AKA Xm and b
-        return m_location;
+      RealType scale()const
+      { // AKA Xm and Wolfram b and beta
+        return m_scale;
       }
 
       RealType shape()const
-      { // AKA k and a
+      { // AKA k and Wolfram a and alpha
         return m_shape;
       }
     private:
       // Data members:
-      RealType m_location;  // distribution location (xm)
-      RealType m_shape;  // distribution shape (k)
+      RealType m_scale;  // distribution scale (xm) or beta
+      RealType m_shape;  // distribution shape (k) or alpha
     };
 
     typedef pareto_distribution<double> pareto; // Convenience to allow pareto(2., 3.);
@@ -162,7 +164,7 @@ namespace boost
     inline const std::pair<RealType, RealType> range(const pareto_distribution<RealType, Policy>& /*dist*/)
     { // Range of permissible values for random variable x.
       using boost::math::tools::max_value;
-      return std::pair<RealType, RealType>(0, max_value<RealType>()); // location zero to + infinity.
+      return std::pair<RealType, RealType>(0, max_value<RealType>()); // scale zero to + infinity.
     } // range
 
     template <class RealType, class Policy>
@@ -170,7 +172,7 @@ namespace boost
     { // Range of supported values for random variable x.
       // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
       using boost::math::tools::max_value;
-      return std::pair<RealType, RealType>(dist.location(), max_value<RealType>() ); // location to + infinity.
+      return std::pair<RealType, RealType>(dist.scale(), max_value<RealType>() ); // scale to + infinity.
     } // support
 
     template <class RealType, class Policy>
@@ -178,18 +180,17 @@ namespace boost
     {
       BOOST_MATH_STD_USING  // for ADL of std function pow.
       static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
-      RealType location = dist.location();
+      RealType scale = dist.scale();
       RealType shape = dist.shape();
       RealType result;
       if(false == (detail::check_pareto_x(function, x, &result, Policy())
-         && detail::check_pareto(function, location, shape, &result, Policy())))
+         && detail::check_pareto(function, scale, shape, &result, Policy())))
          return result;
-      if (x < location)
-      { // regardless of shape, pdf is zero.
-        return 0; 
+      if (x < scale)
+      { // regardless of shape, pdf is zero (or should be disallow x < scale and throw an exception?).
+        return 0;
       }
-
-      result = shape * pow(location, shape) / pow(x, shape+1);
+      result = shape * pow(scale, shape) / pow(x, shape+1);
       return result;
     } // pdf
 
@@ -198,21 +199,21 @@ namespace boost
     {
       BOOST_MATH_STD_USING  // for ADL of std function pow.
       static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
-      RealType location = dist.location();
+      RealType scale = dist.scale();
       RealType shape = dist.shape();
       RealType result;
 
       if(false == (detail::check_pareto_x(function, x, &result, Policy())
-         && detail::check_pareto(function, location, shape, &result, Policy())))
+         && detail::check_pareto(function, scale, shape, &result, Policy())))
          return result;
 
-      if (x <= location)
+      if (x <= scale)
       { // regardless of shape, cdf is zero.
-        return 0; 
+        return 0;
       }
 
-      // result = RealType(1) - pow((location / x), shape);
-      result = -boost::math::powm1(location/x, shape, Policy()); // should be more accurate.
+      // result = RealType(1) - pow((scale / x), shape);
+      result = -boost::math::powm1(scale/x, shape, Policy()); // should be more accurate.
       return result;
     } // cdf
 
@@ -222,22 +223,22 @@ namespace boost
       BOOST_MATH_STD_USING  // for ADL of std function pow.
       static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
       RealType result;
-      RealType location = dist.location();
+      RealType scale = dist.scale();
       RealType shape = dist.shape();
       if(false == (detail::check_probability(function, p, &result, Policy())
-           && detail::check_pareto(function, location, shape, &result, Policy())))
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
       {
         return result;
       }
       if (p == 0)
       {
-        return location; // x must be location (or less).
+        return scale; // x must be scale (or less).
       }
       if (p == 1)
       {
         return tools::max_value<RealType>(); // x = + infinity.
       }
-      result = location /
+      result = scale /
         (pow((1 - p), 1 / shape));
       // K. Krishnamoorthy,  ISBN 1-58488-635-8 eq 23.1.3
       return result;
@@ -250,21 +251,21 @@ namespace boost
        static const char* function = "boost::math::cdf(const pareto_distribution<%1%>&, %1%)";
        RealType result;
        RealType x = c.param;
-       RealType location = c.dist.location();
+       RealType scale = c.dist.scale();
        RealType shape = c.dist.shape();
        if(false == (detail::check_pareto_x(function, x, &result, Policy())
-           && detail::check_pareto(function, location, shape, &result, Policy())))
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
          return result;
 
-       if (x <= location)
+       if (x <= scale)
        { // regardless of shape, cdf is zero, and complement is unity.
-         return 1; 
+         return 1;
        }
-       result = pow((location/x), shape);
-   
+       result = pow((scale/x), shape);
+
        return result;
     } // cdf complement
-    
+
     template <class RealType, class Policy>
     inline RealType quantile(const complemented2_type<pareto_distribution<RealType, Policy>, RealType>& c)
     {
@@ -272,22 +273,22 @@ namespace boost
       static const char* function = "boost::math::quantile(const pareto_distribution<%1%>&, %1%)";
       RealType result;
       RealType q = c.param;
-      RealType location = c.dist.location();
+      RealType scale = c.dist.scale();
       RealType shape = c.dist.shape();
       if(false == (detail::check_probability(function, q, &result, Policy())
-           && detail::check_pareto(function, location, shape, &result, Policy())))
+           && detail::check_pareto(function, scale, shape, &result, Policy())))
       {
         return result;
       }
       if (q == 1)
       {
-        return location; // x must be location (or less).
+        return scale; // x must be scale (or less).
       }
       if (q == 0)
       {
         return tools::max_value<RealType>(); // x = + infinity.
       }
-      result = location / (pow(q, 1 / shape));
+      result = scale / (pow(q, 1 / shape));
       // K. Krishnamoorthy,  ISBN 1-58488-635-8 eq 23.1.3
       return result;
     } // quantile complement
@@ -297,13 +298,13 @@ namespace boost
     {
       RealType result;
       static const char* function = "boost::math::mean(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, dist.location(), dist.shape(), &result, Policy()))
+      if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
       {
         return result;
       }
       if (dist.shape() > RealType(1))
       {
-        return dist.shape() * dist.location() / (dist.shape() - 1);
+        return dist.shape() * dist.scale() / (dist.shape() - 1);
       }
       else
       {
@@ -315,7 +316,7 @@ namespace boost
     template <class RealType, class Policy>
     inline RealType mode(const pareto_distribution<RealType, Policy>& dist)
     {
-      return dist.location();
+      return dist.scale();
     } // mode
 
     template <class RealType, class Policy>
@@ -323,28 +324,28 @@ namespace boost
     {
       RealType result;
       static const char* function = "boost::math::median(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, dist.location(), dist.shape(), &result, Policy()))
+      if(false == detail::check_pareto(function, dist.scale(), dist.shape(), &result, Policy()))
       {
         return result;
       }
       BOOST_MATH_STD_USING
-      return dist.location() * pow(RealType(2), (1/dist.shape()));
+      return dist.scale() * pow(RealType(2), (1/dist.shape()));
     } // median
 
     template <class RealType, class Policy>
     inline RealType variance(const pareto_distribution<RealType, Policy>& dist)
     {
       RealType result;
-      RealType location = dist.location();
+      RealType scale = dist.scale();
       RealType shape = dist.shape();
       static const char* function = "boost::math::variance(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, location, shape, &result, Policy()))
+      if(false == detail::check_pareto(function, scale, shape, &result, Policy()))
       {
         return result;
       }
       if (shape > 2)
       {
-        result = (location * location * shape) /
+        result = (scale * scale * shape) /
          ((shape - 1) *  (shape - 1) * (shape - 2));
       }
       else
@@ -358,12 +359,12 @@ namespace boost
 
     template <class RealType, class Policy>
     inline RealType skewness(const pareto_distribution<RealType, Policy>& dist)
-    {  
+    {
       BOOST_MATH_STD_USING
       RealType result;
       RealType shape = dist.shape();
       static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, dist.location(), shape, &result, Policy()))
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
       {
         return result;
       }
@@ -388,7 +389,7 @@ namespace boost
       RealType result;
       RealType shape = dist.shape();
       static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, dist.location(), shape, &result, Policy()))
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
       {
         return result;
       }
@@ -412,7 +413,7 @@ namespace boost
       RealType result;
       RealType shape = dist.shape();
       static const char* function = "boost::math::pdf(const pareto_distribution<%1%>&, %1%)";
-      if(false == detail::check_pareto(function, dist.location(), shape, &result, Policy()))
+      if(false == detail::check_pareto(function, dist.scale(), shape, &result, Policy()))
       {
         return result;
       }
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/poisson.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/poisson.hpp
index b57ba6fbcfcff96a5d625f9d78b593a9c708994b..3b215d0e27abfbb4eef6fd927aa732928730e4bd 100644 (file)
@@ -479,7 +479,7 @@ namespace boost
       if(z < 1)
          guess = z;
       else
-         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, p, 1-p, Policy());
+         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, p, RealType(1-p), Policy());
       if(z > 5)
       {
          if(z > 1000)
@@ -547,7 +547,7 @@ namespace boost
       if(z < 1)
          guess = z;
       else
-         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, 1-q, q, Policy());
+         guess = boost::math::detail::inverse_poisson_cornish_fisher(z, RealType(1-q), q, Policy());
       if(z > 5)
       {
          if(z > 1000)
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/distributions/triangular.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/distributions/triangular.hpp
index 520a350a9eaeac0a3963d257305f75c45fd57dd0..5030081db754cffe90d8d894b79f333e7c5bc006 100644 (file)
@@ -214,11 +214,11 @@ namespace boost{ namespace math
     }
     if (x == lower)
     { // (mode - lower) == 0 which would lead to divide by zero!
-      return (mode == lower) ? 2 / (upper - lower) : 0;
+      return (mode == lower) ? 2 / (upper - lower) : RealType(0);
     }
     else if (x == upper)
     {
-      return (mode == upper) ? 2 / (upper - lower) : 0;
+      return (mode == upper) ? 2 / (upper - lower) : RealType(0);
     }
     else if (x <= mode)
     {
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/policies/error_handling.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/policies/error_handling.hpp
index 101d2cfd659618cdc539bfb4f87c43c8f2723dfa..6285e1e9f2b8c64d90d6f2df1d6b46de8b9ed241 100644 (file)
@@ -632,6 +632,15 @@ inline void check_series_iterations(const char* function, boost::uintmax_t max_i
          "Series evaluation exceeded %1% iterations, giving up now.", max_iter, pol);
 }
 
+template <class Policy>
+inline void check_root_iterations(const char* function, boost::uintmax_t max_iter, const Policy& pol)
+{
+   if(max_iter >= policies::get_max_root_iterations<Policy>())
+      raise_evaluation_error<boost::uintmax_t>(
+         function,
+         "Root finding evaluation exceeded %1% iterations, giving up now.", max_iter, pol);
+}
+
 } //namespace policies
 
 #ifdef BOOST_MSVC
similarity index 90%
rename from deal.II/contrib/boost/include/boost/math/policies/policy.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/policies/policy.hpp
index 590c0520b428eb36a0cd962345045fe45b8500d2..b66cd7f9239b05097b5552627ad29fb2d4660641 100644 (file)
@@ -34,6 +34,8 @@ namespace tools{
 
 template <class T>
 int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
+template <class T>
+T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T));
 
 }
 
@@ -92,7 +94,8 @@ namespace policies{
 #define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 200
 #endif
 
-#if !defined(__BORLANDC__)
+#if !defined(__BORLANDC__) \
+   && !(defined(__GNUC__) && (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2))
 #define BOOST_MATH_META_INT(type, name, Default)\
    template <type N = Default> struct name : public boost::mpl::int_<N>{};\
    namespace detail{\
@@ -106,7 +109,7 @@ namespace policies{
       BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\
    };\
    }\
-   template <class T> struct is_##name : public boost::mpl::bool_<detail::is_##name##_imp<T>::value>{};
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{};
 
 #define BOOST_MATH_META_BOOL(name, Default)\
    template <bool N = Default> struct name : public boost::mpl::bool_<N>{};\
@@ -121,7 +124,7 @@ namespace policies{
       BOOST_STATIC_CONSTANT(bool, value = sizeof(test(static_cast<T*>(0))) == 1);\
    };\
    }\
-   template <class T> struct is_##name : public boost::mpl::bool_<detail::is_##name##_imp<T>::value>{};
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>{};
 #else
 #define BOOST_MATH_META_INT(Type, name, Default)\
    template <Type N = Default> struct name : public boost::mpl::int_<N>{};\
@@ -137,10 +140,10 @@ namespace policies{
    template <class T> struct is_##name##_imp\
    {\
       static T inst;\
-      BOOST_STATIC_CONSTANT(bool, value = sizeof(detail::is_##name##_tester<T>::test(inst)) == 1);\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\
    };\
    }\
-   template <class T> struct is_##name : public boost::mpl::bool_<detail::is_##name##_imp<T>::value>\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\
    {\
       template <class U> struct apply{ typedef is_##name<U> type; };\
    };
@@ -159,10 +162,10 @@ namespace policies{
    template <class T> struct is_##name##_imp\
    {\
       static T inst;\
-      BOOST_STATIC_CONSTANT(bool, value = sizeof(detail::is_##name##_tester<T>::test(inst)) == 1);\
+      BOOST_STATIC_CONSTANT(bool, value = sizeof( ::boost::math::policies::detail::is_##name##_tester<T>::test(inst)) == 1);\
    };\
    }\
-   template <class T> struct is_##name : public boost::mpl::bool_<detail::is_##name##_imp<T>::value>\
+   template <class T> struct is_##name : public boost::mpl::bool_< ::boost::math::policies::detail::is_##name##_imp<T>::value>\
    {\
       template <class U> struct apply{ typedef is_##name<U> type;  };\
    };
@@ -284,13 +287,13 @@ char test_is_default_arg(const default_policy*);
 template <class T>
 struct is_valid_policy_imp 
 {
-   BOOST_STATIC_CONSTANT(bool, value = sizeof(test_is_valid_arg(static_cast<T*>(0))) == 1);
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_valid_arg(static_cast<T*>(0))) == 1);
 };
 
 template <class T>
 struct is_default_policy_imp
 {
-   BOOST_STATIC_CONSTANT(bool, value = sizeof(test_is_default_arg(static_cast<T*>(0))) == 1);
+   BOOST_STATIC_CONSTANT(bool, value = sizeof(::boost::math::policies::detail::test_is_default_arg(static_cast<T*>(0))) == 1);
 };
 
 template <class T> struct is_valid_policy 
@@ -603,6 +606,23 @@ struct normalise<policy<>,
    typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
 };
 
+template <>
+struct normalise<policy<detail::forwarding_arg1, detail::forwarding_arg2>,
+          promote_float<false>,
+          promote_double<false>,
+          discrete_quantile<>,
+          assert_undefined<>,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy,
+          default_policy>
+{
+   typedef policy<detail::forwarding_arg1, detail::forwarding_arg2> type;
+};
+
 inline policy<> make_policy()
 { return policy<>(); }
 
@@ -814,7 +834,7 @@ inline int digits_imp(mpl::false_ const&)
 } // namespace detail
 
 template <class T, class Policy>
-inline int digits()
+inline int digits(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
 {
    typedef mpl::bool_< std::numeric_limits<T>::is_specialized > tag_type;
    return detail::digits_imp<T, Policy>(tag_type());
@@ -836,6 +856,72 @@ inline unsigned long get_max_root_iterations()
 
 namespace detail{
 
+template <class T, class Digits, class Small, class Default>
+struct series_factor_calc
+{
+   static T get()
+   {
+      return ldexp(T(1.0), 1 - Digits::value);
+   }
+};
+
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::true_, mpl::true_>
+{
+   static T get()
+   {
+      return boost::math::tools::epsilon<T>();
+   }
+};
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::true_, mpl::false_>
+{
+   static T get()
+   {
+      static const boost::uintmax_t v = static_cast<boost::uintmax_t>(1u) << (Digits::value - 1);
+      return 1 / static_cast<T>(v);
+   }
+};
+template <class T, class Digits>
+struct series_factor_calc<T, Digits, mpl::false_, mpl::true_>
+{
+   static T get()
+   {
+      return boost::math::tools::epsilon<T>();
+   }
+};
+
+template <class T, class Policy>
+inline T get_epsilon_imp(mpl::true_ const&)
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   BOOST_STATIC_ASSERT( ::std::numeric_limits<T>::is_specialized);
+#else
+   BOOST_ASSERT(::std::numeric_limits<T>::is_specialized);
+#endif
+   typedef typename boost::math::policies::precision<T, Policy>::type p_t;
+   typedef mpl::bool_<p_t::value <= std::numeric_limits<boost::uintmax_t>::digits> is_small_int;
+   typedef mpl::bool_<p_t::value >= std::numeric_limits<T>::digits> is_default_value;
+   return series_factor_calc<T, p_t, is_small_int, is_default_value>::get();
+}
+
+template <class T, class Policy>
+inline T get_epsilon_imp(mpl::false_ const&)
+{
+   return tools::epsilon<T>();
+}
+
+} // namespace detail
+
+template <class T, class Policy>
+inline T get_epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+{
+   typedef mpl::bool_< std::numeric_limits<T>::is_specialized > tag_type;
+   return detail::get_epsilon_imp<T, Policy>(tag_type());
+}
+
+namespace detail{
+
 template <class A1, 
           class A2, 
           class A3,
@@ -853,7 +939,7 @@ double test_is_policy(...);
 template <class P>
 struct is_policy_imp
 {
-   BOOST_STATIC_CONSTANT(bool, value = (sizeof(test_is_policy(static_cast<P*>(0))) == 1));
+   BOOST_STATIC_CONSTANT(bool, value = (sizeof(::boost::math::policies::detail::test_is_policy(static_cast<P*>(0))) == 1));
 };
 
 }
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions.hpp
index 20babc65b7997a849f9b33b51dd16c87ef311f0d..f31a0694c91bfac23bf8d608b5bece51116a424a 100644 (file)
@@ -41,6 +41,7 @@
 #include <boost/math/special_functions/legendre.hpp>
 #include <boost/math/special_functions/log1p.hpp>
 #include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/next.hpp>
 #include <boost/math/special_functions/powm1.hpp>
 #include <boost/math/special_functions/sign.hpp>
 #include <boost/math/special_functions/sin_pi.hpp>
similarity index 93%
rename from deal.II/contrib/boost/include/boost/math/special_functions/bessel.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/bessel.hpp
index 043b7a38abf3b4fc9267d423ced75dbf2a8a7f50..d9310638e586f960b84f120b733392168637eca9 100644 (file)
@@ -94,9 +94,9 @@ inline T bessel_j_small_z_series(T v, T x, const Policy& pol)
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
    T zero = 0;
-   T result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter, zero);
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
 #else
-   T result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter);
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
 #endif
    policies::check_series_iterations("boost::math::bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
    return result;
@@ -110,9 +110,9 @@ inline T sph_bessel_j_small_z_series(unsigned v, T x, const Policy& pol)
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
    T zero = 0;
-   T result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter, zero);
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, zero);
 #else
-   T result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter);
+   T result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter);
 #endif
    policies::check_series_iterations("boost::math::sph_bessel_j_small_z_series<%1%>(%1%,%1%)", max_iter, pol);
    return result * sqrt(constants::pi<T>() / 4);
@@ -128,7 +128,7 @@ T cyl_bessel_j_imp(T v, T x, const bessel_no_int_tag& t, const Policy& pol)
       // better have integer v:
       if(floor(v) == v)
       {
-         T r = cyl_bessel_j_imp(v, -x, t, pol);
+         T r = cyl_bessel_j_imp(v, T(-x), t, pol);
          if(iround(v, pol) & 1)
             r = -r;
          return r;
@@ -209,7 +209,7 @@ inline T sph_bessel_j_imp(unsigned n, T x, const Policy& pol)
    // Default case is just a naive evaluation of the definition:
    //
    return sqrt(constants::pi<T>() / (2 * x)) 
-      * cyl_bessel_j_imp(T(n)+T(0.5f), x, bessel_no_int_tag(), pol);
+      * cyl_bessel_j_imp(T(T(n)+T(0.5f)), x, bessel_no_int_tag(), pol);
 }
 
 template <class T, class Policy>
@@ -227,7 +227,7 @@ T cyl_bessel_i_imp(T v, T x, const Policy& pol)
       // better have integer v:
       if(floor(v) == v)
       {
-         T r = cyl_bessel_i_imp(v, -x, pol);
+         T r = cyl_bessel_i_imp(v, T(-x), pol);
          if(iround(v, pol) & 1)
             r = -r;
          return r;
@@ -244,8 +244,12 @@ T cyl_bessel_i_imp(T v, T x, const Policy& pol)
    if(v == 0.5f)
    {
       // common special case, note try and avoid overflow in exp(x):
-      T e = exp(x / 2);
-      return e * (e / sqrt(2 * x * constants::pi<T>()));
+      if(x >= tools::log_max_value<T>())
+      {
+         T e = exp(x / 2);
+         return e * (e / sqrt(2 * x * constants::pi<T>()));
+      }
+      return sqrt(2 / (x * constants::pi<T>())) * sinh(x);
    }
    if(policies::digits<T, Policy>() <= 64)
    {
@@ -307,6 +311,10 @@ template <class T, class Policy>
 inline T cyl_neumann_imp(T v, T x, const bessel_no_int_tag&, const Policy& pol)
 {
    static const char* function = "boost::math::cyl_neumann<%1%>(%1%,%1%)";
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
    if(x <= 0)
    {
       return (v == 0) && (x == 0) ?
@@ -332,6 +340,10 @@ inline T cyl_neumann_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& po
 {
    BOOST_MATH_STD_USING
    typedef typename bessel_asymptotic_tag<T, Policy>::type tag_type;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
    if(floor(v) == v)
    {
       if((fabs(x) > asymptotic_bessel_y_limit<T>(tag_type())) && (fabs(x) > 5 * abs(v)))
@@ -339,12 +351,19 @@ inline T cyl_neumann_imp(T v, T x, const bessel_maybe_int_tag&, const Policy& po
          T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
          if((v < 0) && (itrunc(v, pol) & 1))
             r = -r;
+         BOOST_MATH_INSTRUMENT_VARIABLE(r);
          return r;
       }
       else
-         return bessel_yn(itrunc(v, pol), x, pol);
+      {
+         T r = bessel_yn(itrunc(v, pol), x, pol);
+         BOOST_MATH_INSTRUMENT_VARIABLE(r);
+         return r;
+      }
    }
-   return cyl_neumann_imp<T>(v, x, bessel_no_int_tag(), pol);
+   T r = cyl_neumann_imp<T>(v, x, bessel_no_int_tag(), pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(r);
+   return r;
 }
 
 template <class T, class Policy>
@@ -352,6 +371,10 @@ inline T cyl_neumann_imp(int v, T x, const bessel_int_tag&, const Policy& pol)
 {
    BOOST_MATH_STD_USING
    typedef typename bessel_asymptotic_tag<T, Policy>::type tag_type;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(v);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
    if((fabs(x) > asymptotic_bessel_y_limit<T>(tag_type())) && (fabs(x) > 5 * abs(v)))
    {
       T r = asymptotic_bessel_y_large_x_2(static_cast<T>(abs(v)), x);
@@ -380,7 +403,7 @@ inline T sph_neumann_imp(unsigned v, T x, const Policy& pol)
    if(x < 2 * tools::min_value<T>())
       return -policies::raise_overflow_error<T>(function, 0, pol);
 
-   T result = cyl_neumann_imp(T(v)+0.5f, x, bessel_no_int_tag(), pol);
+   T result = cyl_neumann_imp(T(T(v)+0.5f), x, bessel_no_int_tag(), pol);
    T tx = sqrt(constants::pi<T>() / (2 * x));
 
    if((tx > 1) && (tools::max_value<T>() / tx < result))
similarity index 90%
rename from deal.II/contrib/boost/include/boost/math/special_functions/beta.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/beta.hpp
index 63552a0b1f77739f73b7ea1ae1e5c42f8899aa17..6e66bcf95c0884c145b2add2b270a62917b68c64 100644 (file)
@@ -161,11 +161,11 @@ T beta_imp(T a, T b, const lanczos::undefined_lanczos& /* l */, const Policy& po
 
    // calculate the fraction parts:
    T sa = detail::lower_gamma_series(a, la, pol) / a;
-   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::digits<T, Policy>());
+   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
    T sb = detail::lower_gamma_series(b, lb, pol) / b;
-   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::digits<T, Policy>());
+   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
    T sc = detail::lower_gamma_series(c, lc, pol) / c;
-   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::digits<T, Policy>());
+   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
 
    // and the exponent part:
    result = exp(lc - la - lb) * pow(la/lc, a) * pow(lb/lc, b);
@@ -242,13 +242,25 @@ T ibeta_power_terms(T a,
          // since one of the power terms will evaluate to a number close to 1.
          //
          if(fabs(l1) < 0.1)
+         {
             result *= exp(a * boost::math::log1p(l1, pol));
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
          else
+         {
             result *= pow((x * cgh) / agh, a);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
          if(fabs(l2) < 0.1)
+         {
             result *= exp(b * boost::math::log1p(l2, pol));
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
          else
+         {
             result *= pow((y * cgh) / bgh, b);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         }
       }
       else if((std::max)(fabs(l1), fabs(l2)) < 0.5)
       {
@@ -279,6 +291,7 @@ T ibeta_power_terms(T a,
             l3 = l1 + l3 + l3 * l1;
             l3 = a * boost::math::log1p(l3, pol);
             result *= exp(l3);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
          }
          else
          {
@@ -286,6 +299,7 @@ T ibeta_power_terms(T a,
             l3 = l2 + l3 + l3 * l2;
             l3 = b * boost::math::log1p(l3, pol);
             result *= exp(l3);
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
          }
       }
       else if(fabs(l1) < fabs(l2))
@@ -294,6 +308,7 @@ T ibeta_power_terms(T a,
          T l = a * boost::math::log1p(l1, pol)
             + b * log((y * cgh) / bgh);
          result *= exp(l);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else
       {
@@ -301,6 +316,7 @@ T ibeta_power_terms(T a,
          T l = b * boost::math::log1p(l2, pol)
             + a * log((x * cgh) / agh);
          result *= exp(l);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
    }
    else
@@ -321,11 +337,13 @@ T ibeta_power_terms(T a,
             result *= pow(pow(b2, b/a) * b1, a);
          else
             result *= pow(pow(b1, a/b) * b2, b);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else
       {
          // finally the normal case:
          result *= pow(b1, a) * pow(b2, b);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
    }
    // combine with the leftover terms from the Lanczos approximation:
@@ -333,6 +351,8 @@ T ibeta_power_terms(T a,
    result *= sqrt(agh / cgh);
    result *= prefix;
 
+   BOOST_MATH_INSTRUMENT_VARIABLE(result);
+
    return result;
 }
 //
@@ -378,11 +398,11 @@ T ibeta_power_terms(T a,
    T lc = a + b + 5;
    // gamma function partials:
    T sa = detail::lower_gamma_series(a, la, pol) / a;
-   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::digits<T, Policy>());
+   sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
    T sb = detail::lower_gamma_series(b, lb, pol) / b;
-   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::digits<T, Policy>());
+   sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
    T sc = detail::lower_gamma_series(c, lc, pol) / c;
-   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::digits<T, Policy>());
+   sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
    // gamma function powers combined with incomplete beta powers:
 
    T b1 = (x * lc) / la;
@@ -482,7 +502,7 @@ T ibeta_series(T a, T b, T x, T s0, const L&, bool normalised, T* p_derivative,
       return s0; // Safeguard: series can't cope with denorms.
    ibeta_series_t<T> s(a, b, x, result);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-   result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter, s0);
+   result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, s0);
    policies::check_series_iterations("boost::math::ibeta<%1%>(%1%, %1%, %1%) in ibeta_series (with lanczos)", max_iter, pol);
    return result;
 }
@@ -512,11 +532,11 @@ T ibeta_series(T a, T b, T x, T s0, const boost::math::lanczos::undefined_lanczo
 
       // calculate the gamma parts:
       T sa = detail::lower_gamma_series(a, la, pol) / a;
-      sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::digits<T, Policy>());
+      sa += detail::upper_gamma_fraction(a, la, ::boost::math::policies::get_epsilon<T, Policy>());
       T sb = detail::lower_gamma_series(b, lb, pol) / b;
-      sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::digits<T, Policy>());
+      sb += detail::upper_gamma_fraction(b, lb, ::boost::math::policies::get_epsilon<T, Policy>());
       T sc = detail::lower_gamma_series(c, lc, pol) / c;
-      sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::digits<T, Policy>());
+      sc += detail::upper_gamma_fraction(c, lc, ::boost::math::policies::get_epsilon<T, Policy>());
 
       // and their combined power-terms:
       T b1 = (x * lc) / la;
@@ -562,7 +582,7 @@ T ibeta_series(T a, T b, T x, T s0, const boost::math::lanczos::undefined_lanczo
       return s0; // Safeguard: series can't cope with denorms.
    ibeta_series_t<T> s(a, b, x, result);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-   result = boost::math::tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter, s0);
+   result = boost::math::tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, s0);
    policies::check_series_iterations("boost::math::ibeta<%1%>(%1%, %1%, %1%) in ibeta_series (without lanczos)", max_iter, pol);
    return result;
 }
@@ -614,7 +634,7 @@ inline T ibeta_fraction2(T a, T b, T x, T y, const Policy& pol, bool normalised,
       return result;
 
    ibeta_fraction2_t<T> f(a, b, x);
-   T fract = boost::math::tools::continued_fraction_b(f, boost::math::policies::digits<T, Policy>());
+   T fract = boost::math::tools::continued_fraction_b(f, boost::math::policies::get_epsilon<T, Policy>());
    return result / fract;
 }
 //
@@ -624,6 +644,9 @@ template <class T, class Policy>
 T ibeta_a_step(T a, T b, T x, T y, int k, const Policy& pol, bool normalised, T* p_derivative)
 {
    typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(k);
+
    T prefix = ibeta_power_terms(a, b, x, y, lanczos_type(), normalised, pol);
    if(p_derivative)
    {
@@ -662,6 +685,7 @@ inline T rising_factorial_ratio(T a, T b, int k)
    // This is only called with small k, for large k
    // it is grossly inefficient, do not use outside it's
    // intended purpose!!!
+   BOOST_MATH_INSTRUMENT_VARIABLE(k);
    if(k == 0)
       return 1;
    T result = 1;
@@ -822,7 +846,7 @@ inline T binomial_ccdf(T n, T k, T x, T y)
    BOOST_MATH_STD_USING // ADL of std names
    T result = pow(x, n);
    T term = result;
-   for(unsigned i = itrunc(n - 1); i > k; --i)
+   for(unsigned i = itrunc(T(n - 1)); i > k; --i)
    {
       term *= ((i + 1) * y) / ((n - i) * x) ;
       result += term;
@@ -845,6 +869,12 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
    typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
    BOOST_MATH_STD_USING // for ADL of std math functions.
 
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(b);
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+   BOOST_MATH_INSTRUMENT_VARIABLE(inv);
+   BOOST_MATH_INSTRUMENT_VARIABLE(normalised);
+
    bool invert = inv;
    T fract;
    T y = 1 - x;
@@ -874,15 +904,15 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
    {
       if(p_derivative)
       {
-         *p_derivative = (a == 1) ? 1 : (a < 1) ? tools::max_value<T>() / 2 : tools::min_value<T>() * 2;
+         *p_derivative = (a == 1) ? (T)1 : (a < 1) ? T(tools::max_value<T>() / 2) : T(tools::min_value<T>() * 2);
       }
-      return (invert ? (normalised ? 1 : boost::math::beta(a, b, pol)) : 0);
+      return (invert ? (normalised ? T(1) : boost::math::beta(a, b, pol)) : T(0));
    }
    if(x == 1)
    {
       if(p_derivative)
       {
-         *p_derivative = (b == 1) ? 1 : (b < 1) ? tools::max_value<T>() / 2 : tools::min_value<T>() * 2;
+         *p_derivative = (b == 1) ? T(1) : (b < 1) ? T(tools::max_value<T>() / 2) : T(tools::min_value<T>() * 2);
       }
       return (invert == 0 ? (normalised ? 1 : boost::math::beta(a, b, pol)) : 0);
    }
@@ -894,6 +924,7 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
          std::swap(a, b);
          std::swap(x, y);
          invert = !invert;
+         BOOST_MATH_INSTRUMENT_VARIABLE(invert);
       }
       if((std::max)(a, b) <= 1)
       {
@@ -901,12 +932,16 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
          if((a >= (std::min)(T(0.2), b)) || (pow(x, a) <= 0.9))
          {
             if(!invert)
+            {
                fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
             else
             {
                fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                invert = false;
                fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
             }
          }
          else
@@ -917,12 +952,16 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
             if(y >= 0.3)
             {
                if(!invert)
+               {
                   fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
                else
                {
                   fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                   invert = false;
                   fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                }
             }
             else
@@ -931,7 +970,7 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
                T prefix;
                if(!normalised)
                {
-                  prefix = rising_factorial_ratio(a+b, a, 20);
+                  prefix = rising_factorial_ratio(T(a+b), a, 20);
                }
                else
                {
@@ -939,12 +978,16 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
                }
                fract = ibeta_a_step(a, b, x, y, 20, pol, normalised, p_derivative);
                if(!invert)
-                  fract = beta_small_b_large_a_series(a + 20, b, x, y, fract, prefix, pol, normalised);
+               {
+                  fract = beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
                else
                {
                   fract -= (normalised ? 1 : boost::math::beta(a, b, pol));
                   invert = false;
-                  fract = -beta_small_b_large_a_series(a + 20, b, x, y, fract, prefix, pol, normalised);
+                  fract = -beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                }
             }
          }
@@ -955,12 +998,16 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
          if((b <= 1) || ((x < 0.1) && (pow(b * x, a) <= 0.7)))
          {
             if(!invert)
+            {
                fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
             else
             {
                fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                invert = false;
                fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
             }
          }
          else
@@ -972,23 +1019,31 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
             if(y >= 0.3)
             {
                if(!invert)
+               {
                   fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
                else
                {
                   fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                   invert = false;
                   fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                }
             }
             else if(a >= 15)
             {
                if(!invert)
+               {
                   fract = beta_small_b_large_a_series(a, b, x, y, T(0), T(1), pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
                else
                {
                   fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                   invert = false;
                   fract = -beta_small_b_large_a_series(a, b, x, y, fract, T(1), pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                }
             }
             else
@@ -997,20 +1052,25 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
                T prefix;
                if(!normalised)
                {
-                  prefix = rising_factorial_ratio(a+b, a, 20);
+                  prefix = rising_factorial_ratio(T(a+b), a, 20);
                }
                else
                {
                   prefix = 1;
                }
                fract = ibeta_a_step(a, b, x, y, 20, pol, normalised, p_derivative);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                if(!invert)
-                  fract = beta_small_b_large_a_series(a + 20, b, x, y, fract, prefix, pol, normalised);
+               {
+                  fract = beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+               }
                else
                {
                   fract -= (normalised ? 1 : boost::math::beta(a, b, pol));
                   invert = false;
-                  fract = -beta_small_b_large_a_series(a + 20, b, x, y, fract, prefix, pol, normalised);
+                  fract = -beta_small_b_large_a_series(T(a + 20), b, x, y, fract, prefix, pol, normalised);
+                  BOOST_MATH_INSTRUMENT_VARIABLE(fract);
                }
             }
          }
@@ -1033,6 +1093,7 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
          std::swap(a, b);
          std::swap(x, y);
          invert = !invert;
+         BOOST_MATH_INSTRUMENT_VARIABLE(invert);
       }
       
       if(b < 40)
@@ -1045,29 +1106,34 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
             fract = binomial_ccdf(n, k, x, y);
             if(!normalised)
                fract *= boost::math::beta(a, b, pol);
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
          }
          else if(b * x <= 0.7)
          {
             if(!invert)
+            {
                fract = ibeta_series(a, b, x, T(0), lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+            }
             else
             {
                fract = -(normalised ? 1 : boost::math::beta(a, b, pol));
                invert = false;
                fract = -ibeta_series(a, b, x, fract, lanczos_type(), normalised, p_derivative, y, pol);
+               BOOST_MATH_INSTRUMENT_VARIABLE(fract);
             }
          }
          else if(a > 15)
          {
             // sidestep so we can use the series representation:
-            int n = itrunc(floor(b), pol);
+            int n = itrunc(T(floor(b)), pol);
             if(n == b)
                --n;
             T bbar = b - n;
             T prefix;
             if(!normalised)
             {
-               prefix = rising_factorial_ratio(a+bbar, bbar, n);
+               prefix = rising_factorial_ratio(T(a+bbar), bbar, n);
             }
             else
             {
@@ -1076,13 +1142,14 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
             fract = ibeta_a_step(bbar, a, y, x, n, pol, normalised, static_cast<T*>(0));
             fract = beta_small_b_large_a_series(a,  bbar, x, y, fract, T(1), pol, normalised);
             fract /= prefix;
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
          }
          else if(normalised)
          {
             // the formula here for the non-normalised case is tricky to figure
             // out (for me!!), and requires two pochhammer calculations rather
             // than one, so leave it for now....
-            int n = itrunc(floor(b), pol);
+            int n = itrunc(T(floor(b)), pol);
             T bbar = b - n;
             if(bbar <= 0)
             {
@@ -1094,18 +1161,25 @@ T ibeta_imp(T a, T b, T x, const Policy& pol, bool inv, bool normalised, T* p_de
             if(invert)
                fract -= (normalised ? 1 : boost::math::beta(a, b, pol));
             //fract = ibeta_series(a+20, bbar, x, fract, l, normalised, p_derivative, y);
-            fract = beta_small_b_large_a_series(a+20,  bbar, x, y, fract, T(1), pol, normalised);
+            fract = beta_small_b_large_a_series(T(a+20),  bbar, x, y, fract, T(1), pol, normalised);
             if(invert)
             {
                fract = -fract;
                invert = false;
             }
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
          }
          else
+         {
             fract = ibeta_fraction2(a, b, x, y, pol, normalised, p_derivative);
+            BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+         }
       }
       else
+      {
          fract = ibeta_fraction2(a, b, x, y, pol, normalised, p_derivative);
+         BOOST_MATH_INSTRUMENT_VARIABLE(fract);
+      }
    }
    if(p_derivative)
    {
@@ -1167,7 +1241,7 @@ T ibeta_derivative_imp(T a, T b, T x, const Policy& pol)
    // Now the regular cases:
    //
    typedef typename lanczos::lanczos<T, Policy>::type lanczos_type;
-   T f1 = ibeta_power_terms(a, b, x, 1 - x, lanczos_type(), true, pol);
+   T f1 = ibeta_power_terms<T>(a, b, x, 1 - x, lanczos_type(), true, pol);
    T y = (1 - x) * x;
 
    if(f1 == 0)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/special_functions/binomial.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/binomial.hpp
index d394b0488be318230c593a425aa1ab140b4ceded..16b4f3305d1cb8ccd0e1176c90fb0c72dc20f2a7 100644 (file)
@@ -19,6 +19,7 @@ namespace boost{ namespace math{
 template <class T, class Policy>
 T binomial_coefficient(unsigned n, unsigned k, const Policy& pol)
 {
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
    BOOST_MATH_STD_USING
    static const char* function = "boost::math::binomial_coefficient<%1%>(unsigned, unsigned)";
    if(k > n)
similarity index 83%
rename from deal.II/contrib/boost/include/boost/math/special_functions/cbrt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/cbrt.hpp
index c43f9b625e4b7620aea76e3510847b673302239f..acbc75039c130615e87c7ed02b60ec887ffb6919 100644 (file)
@@ -32,7 +32,7 @@ namespace detail
    };
 
 template <class T, class Policy>
-T cbrt_imp(T z, const Policy&)
+T cbrt_imp(T z, const Policy& pol)
 {
    BOOST_MATH_STD_USING
    int i_exp, sign(1);
@@ -49,7 +49,10 @@ T cbrt_imp(T z, const Policy&)
    T max = static_cast<T>(ldexp(2.0, i_exp/3));
    T guess = static_cast<T>(ldexp(1.0, i_exp/3));
    int digits = (policies::digits<T, Policy>()) / 2;
-   return sign * tools::halley_iterate(detail::cbrt_functor<T>(z), guess, min, max, digits);
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
+   guess = sign * tools::halley_iterate(detail::cbrt_functor<T>(z), guess, min, max, digits, max_iter);
+   policies::check_root_iterations("boost::math::cbrt<%1%>", max_iter, pol);
+   return guess;
 }
 
 } // namespace detail
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/special_functions/cos_pi.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/cos_pi.hpp
index 3a83ed525e47f40140f62f8488ee20685b881527..489c2b81a0fc37cd269ac38c1f004803786236e6 100644 (file)
@@ -44,7 +44,7 @@ T cos_pi_imp(T x, const Policy& pol)
       return 0;
    
    rem = cos(constants::pi<T>() * rem);
-   return invert ? -rem : rem;
+   return invert ? T(-rem) : rem;
 }
 
 } // namespace detail
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_ik.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_ik.hpp
index 5d771d88ee5a2cc879e0c3efba4b7aeb9890dd99..94b5314d361cbdb5fc226984752725a897b14cce 100644 (file)
@@ -49,11 +49,11 @@ int temme_ik(T v, T x, T* K, T* K1, const Policy& pol)
     b = exp(v * a);
     sigma = -a * v;
     c = abs(v) < tools::epsilon<T>() ?
-       1 : boost::math::sin_pi(v) / (v * pi<T>());
+       T(1) : T(boost::math::sin_pi(v) / (v * pi<T>()));
     d = abs(sigma) < tools::epsilon<T>() ?
-        1 : sinh(sigma) / sigma;
+        T(1) : T(sinh(sigma) / sigma);
     gamma1 = abs(v) < tools::epsilon<T>() ?
-        -euler<T>() : (0.5f / v) * (gp - gm) * c;
+        T(-euler<T>()) : T((0.5f / v) * (gp - gm) * c);
     gamma2 = (2 + gp + gm) * c / 2;
 
     // initial values
similarity index 92%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jn.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jn.hpp
index b1f1a02461d56568481ea954b5bf78f8d26125a9..d6ba8d81b5d04e0f9f88da159bbb5641c454b9ee 100644 (file)
@@ -28,14 +28,9 @@ T bessel_jn(int n, T x, const Policy& pol)
 
     BOOST_MATH_STD_USING
 
-    if (n == 0)
-    {
-        return bessel_j0(x);
-    }
-    if (n == 1)
-    {
-        return bessel_j1(x);
-    }
+    //
+    // Reflection has to come first:
+    //
     if (n < 0)
     {
         factor = (n & 0x1) ? -1 : 1;  // J_{-n}(z) = (-1)^n J_n(z)
@@ -45,12 +40,24 @@ T bessel_jn(int n, T x, const Policy& pol)
     {
         factor = 1;
     }
+    //
+    // Special cases:
+    //
+    if (n == 0)
+    {
+        return factor * bessel_j0(x);
+    }
+    if (n == 1)
+    {
+        return factor * bessel_j1(x);
+    }
 
     if (x == 0)                             // n >= 2
     {
         return static_cast<T>(0);
     }
 
+    BOOST_ASSERT(n > 1);
     if (n < abs(x))                         // forward recurrence
     {
         prev = bessel_j0(x);
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jy.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jy.hpp
index 4ef0deeea4ea78419b53c727e62b20adcff73d8f..a13b99852fed01d97c546441e67a588a6d7b7d5d 100644 (file)
@@ -55,12 +55,12 @@ int temme_jy(T v, T x, T* Y, T* Y1, const Policy& pol)
     sigma = -a * v;
     d = abs(sigma) < tools::epsilon<T>() ?
         T(1) : sinh(sigma) / sigma;
-    e = abs(v) < tools::epsilon<T>() ? v*pi<T>()*pi<T>() / 2
-        : 2 * spv2 * spv2 / v;
+    e = abs(v) < tools::epsilon<T>() ? T(v*pi<T>()*pi<T>() / 2)
+        : T(2 * spv2 * spv2 / v);
 
-    T g1 = (v == 0) ? -euler<T>() : (gp - gm) / ((1 + gp) * (1 + gm) * 2 * v);
+    T g1 = (v == 0) ? T(-euler<T>()) : T((gp - gm) / ((1 + gp) * (1 + gm) * 2 * v));
     T g2 = (2 + gp + gm) / ((1 + gp) * (1 + gm) * 2);
-    T vspv = (fabs(v) < tools::epsilon<T>()) ? 1/constants::pi<T>() : v / spv;
+    T vspv = (fabs(v) < tools::epsilon<T>()) ? T(1/constants::pi<T>()) : T(v / spv);
     f = (g1 * cosh(sigma) - g2 * a * d) * 2 * vspv;
 
     p = vspv / (xp * (1 + gm));
@@ -118,7 +118,7 @@ int CF1_jy(T v, T x, T* fv, int* sign, const Policy& pol)
     tolerance = 2 * tools::epsilon<T>();
     tiny = sqrt(tools::min_value<T>());
     C = f = tiny;                           // b0 = 0, replace with tiny
-    D = 0.0L;
+    D = 0;
     for (k = 1; k < policies::get_max_series_iterations<Policy>() * 100; k++)
     {
         a = -1;
@@ -131,7 +131,7 @@ int CF1_jy(T v, T x, T* fv, int* sign, const Policy& pol)
         delta = C * D;
         f *= delta;
         if (D < 0) { s = -s; }
-        if (abs(delta - 1.0L) < tolerance) 
+        if (abs(delta - 1) < tolerance) 
         { break; }
     }
     policies::check_series_iterations("boost::math::bessel_jy<%1%>(%1%,%1%) in CF1_jy", k / 100, pol);
@@ -158,7 +158,7 @@ int CF2_jy(T v, T x, T* p, T* q, const Policy& pol)
     typedef typename complex_trait<T>::type complex_type;
 
     complex_type C, D, f, a, b, delta, one(1);
-    T tiny, zero(0.0L);
+    T tiny, zero(0);
     unsigned long k;
 
     // |x| >= |v|, CF2_jy converges rapidly
@@ -169,7 +169,7 @@ int CF2_jy(T v, T x, T* p, T* q, const Policy& pol)
     // Lentz, Applied Optics, vol 15, 668 (1976)
     T tolerance = 2 * tools::epsilon<T>();
     tiny = sqrt(tools::min_value<T>());
-    C = f = complex_type(-0.5f/x, 1.0L);
+    C = f = complex_type(-0.5f/x, 1);
     D = 0;
     for (k = 1; k < policies::get_max_series_iterations<Policy>(); k++)
     {
@@ -289,7 +289,7 @@ int bessel_jy(T v, T x, T* J, T* Y, int kind, const Policy& pol)
            if(kind&need_y)
            {
               Yu = asymptotic_bessel_y_large_x_2(u, x);
-              Yu1 = asymptotic_bessel_y_large_x_2(u + 1, x);
+              Yu1 = asymptotic_bessel_y_large_x_2(T(u + 1), x);
            }
            else
               Yu = std::numeric_limits<T>::quiet_NaN(); // any value will do, we're not using it.
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/bessel_jy_asym.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/bessel_jy_asym.hpp
index 098cb8b145b3288100831cff3cbc9677d7823362..be4cfcc4434fe352abb3f0af6984cc1c5bf60eb3 100644 (file)
@@ -208,7 +208,7 @@ inline T asymptotic_bessel_j_limit(const T& v, const mpl::int_<0>&)
 {
    // default case:
    BOOST_MATH_STD_USING
-   T v2 = (std::max)(T(3), v * v);
+   T v2 = (std::max)(T(3), T(v * v));
    return v2 / pow(100 * tools::epsilon<T>() / T(2e-5f), T(0.17f));
 }
 template <class T>
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/erf_inv.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/erf_inv.hpp
index 3b0a175aa41292079b9e79984cebdcfae31199bf..33f84651eeb2f1885b1030546f524b006775a59f 100644 (file)
@@ -304,14 +304,16 @@ T erf_inv_imp(const T& p, const T& q, const Policy& pol, const boost::mpl::int_<
    //
    if(policies::digits<T, Policy>() > 64)
    {
+      boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
       if(p <= 0.5)
       {
-         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(p, 1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3);
+         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(p, 1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3, max_iter);
       }
       else
       {
-         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(q, -1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3);
+         result = tools::halley_iterate(detail::erf_roots<typename remove_cv<T>::type, Policy>(q, -1), guess, static_cast<T>(0), tools::max_value<T>(), (policies::digits<T, Policy>() * 2) / 3, max_iter);
       }
+      policies::check_root_iterations("boost::math::erf_inv<%1%>", max_iter, pol);
    }
    else
    {
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/fp_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/fp_traits.hpp
new file mode 100644 (file)
index 0000000..162193d
--- /dev/null
@@ -0,0 +1,568 @@
+// fp_traits.hpp
+
+#ifndef BOOST_MATH_FP_TRAITS_HPP
+#define BOOST_MATH_FP_TRAITS_HPP
+
+// Copyright (c) 2006 Johan Rade
+
+// 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)
+
+/*
+To support old compilers, care has been taken to avoid partial template
+specialization and meta function forwarding.
+With these techniques, the code could be simplified.
+*/
+
+#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
+// The VAX floating point formats are used (for float and double)
+#   define BOOST_FPCLASSIFY_VAX_FORMAT
+#endif
+
+#include <cstring>
+
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/detail/endian.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+  namespace std{ using ::memcpy; }
+#endif
+
+#ifndef FP_NORMAL
+
+#define FP_ZERO        0
+#define FP_NORMAL      1
+#define FP_INFINITE    2
+#define FP_NAN         3
+#define FP_SUBNORMAL   4
+
+#else
+
+#define BOOST_HAS_FPCLASSIFY
+
+#ifndef fpclassify
+#  if (defined(__GLIBCPP__) || defined(__GLIBCXX__)) \
+         && defined(_GLIBCXX_USE_C99_MATH) \
+         && !(defined(_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) \
+         && (_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC != 0))
+#     ifdef _STLP_VENDOR_CSTD
+#        if _STLPORT_VERSION >= 0x520
+#           define BOOST_FPCLASSIFY_PREFIX ::__std_alias:: 
+#        else
+#           define BOOST_FPCLASSIFY_PREFIX ::_STLP_VENDOR_CSTD:: 
+#        endif
+#     else
+#        define BOOST_FPCLASSIFY_PREFIX ::std::
+#     endif
+#  else
+#     undef BOOST_HAS_FPCLASSIFY
+#     define BOOST_FPCLASSIFY_PREFIX
+#  endif
+#elif (defined(__HP_aCC) && !defined(__hppa))
+// aCC 6 appears to do "#define fpclassify fpclassify" which messes us up a bit!
+#  define BOOST_FPCLASSIFY_PREFIX ::
+#else
+#  define BOOST_FPCLASSIFY_PREFIX
+#endif
+
+#ifdef __MINGW32__
+#  undef BOOST_HAS_FPCLASSIFY
+#endif
+
+#endif
+
+
+//------------------------------------------------------------------------------
+
+namespace boost {
+namespace math {
+namespace detail {
+
+//------------------------------------------------------------------------------
+
+/* 
+The following classes are used to tag the different methods that are used
+for floating point classification
+*/
+
+struct native_tag {};
+template <bool has_limits>
+struct generic_tag {};
+struct ieee_tag {};
+struct ieee_copy_all_bits_tag : public ieee_tag {};
+struct ieee_copy_leading_bits_tag : public ieee_tag {};
+
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+//
+// These helper functions are used only when numeric_limits<>
+// members are not compile time constants:
+//
+inline bool is_generic_tag_false(const generic_tag<false>&)
+{
+   return true;
+}
+inline bool is_generic_tag_false(...)
+{
+   return false;
+}
+#endif
+
+//------------------------------------------------------------------------------
+
+/*
+Most processors support three different floating point precisions:
+single precision (32 bits), double precision (64 bits)
+and extended double precision (80 - 128 bits, depending on the processor)
+
+Note that the C++ type long double can be implemented
+both as double precision and extended double precision.
+*/
+
+struct unknown_precision{};
+struct single_precision {};
+struct double_precision {};
+struct extended_double_precision {};
+
+// native_tag version --------------------------------------------------------------
+
+template<class T> struct fp_traits_native
+{
+    typedef native_tag method;
+};
+
+// generic_tag version -------------------------------------------------------------
+
+template<class T, class U> struct fp_traits_non_native
+{
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   typedef generic_tag<std::numeric_limits<T>::is_specialized> method;
+#else
+   typedef generic_tag<false> method;
+#endif
+};
+
+// ieee_tag versions ---------------------------------------------------------------
+
+/*
+These specializations of fp_traits_non_native contain information needed
+to "parse" the binary representation of a floating point number.
+
+Typedef members:
+
+  bits -- the target type when copying the leading bytes of a floating
+      point number. It is a typedef for uint32_t or uint64_t.
+
+  method -- tells us whether all bytes are copied or not.
+      It is a typedef for ieee_copy_all_bits_tag or ieee_copy_leading_bits_tag.
+
+Static data members:
+
+  sign, exponent, flag, significand -- bit masks that give the meaning of the
+  bits in the leading bytes.
+
+Static function members:
+
+  get_bits(), set_bits() -- provide access to the leading bytes.
+
+*/
+
+// ieee_tag version, float (32 bits) -----------------------------------------------
+
+#ifndef BOOST_FPCLASSIFY_VAX_FORMAT
+
+template<> struct fp_traits_non_native<float, single_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7f800000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x007fffff);
+
+    typedef uint32_t bits;
+    static void get_bits(float x, uint32_t& a) { std::memcpy(&a, &x, 4); }
+    static void set_bits(float& x, uint32_t a) { std::memcpy(&x, &a, 4); }
+};
+
+// ieee_tag version, double (64 bits) ----------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION) \
+   || defined(__BORLANDC__) || defined(__CODEGEAR__)
+
+template<> struct fp_traits_non_native<double, double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 4);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+//..............................................................................
+
+#else
+
+template<> struct fp_traits_non_native<double, double_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    static const uint64_t sign     = ((uint64_t)0x80000000u) << 32;
+    static const uint64_t exponent = ((uint64_t)0x7ff00000) << 32;
+    static const uint64_t flag     = 0;
+    static const uint64_t significand
+        = (((uint64_t)0x000fffff) << 32) + ((uint64_t)0xffffffffu);
+
+    typedef uint64_t bits;
+    static void get_bits(double x, uint64_t& a) { std::memcpy(&a, &x, 8); }
+    static void set_bits(double& x, uint64_t a) { std::memcpy(&x, &a, 8); }
+};
+
+#endif
+
+#endif  // #ifndef BOOST_FPCLASSIFY_VAX_FORMAT
+
+// long double (64 bits) -------------------------------------------------------
+
+#if defined(BOOST_NO_INT64_T) || defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\
+   || defined(__BORLANDC__) || defined(__CODEGEAR__)
+
+template<> struct fp_traits_non_native<long double, double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 4);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+//..............................................................................
+
+#else
+
+template<> struct fp_traits_non_native<long double, double_precision>
+{
+    typedef ieee_copy_all_bits_tag method;
+
+    static const uint64_t sign     = (uint64_t)0x80000000u << 32;
+    static const uint64_t exponent = (uint64_t)0x7ff00000 << 32;
+    static const uint64_t flag     = 0;
+    static const uint64_t significand
+        = ((uint64_t)0x000fffff << 32) + (uint64_t)0xffffffffu;
+
+    typedef uint64_t bits;
+    static void get_bits(long double x, uint64_t& a) { std::memcpy(&a, &x, 8); }
+    static void set_bits(long double& x, uint64_t a) { std::memcpy(&x, &a, 8); }
+};
+
+#endif
+
+
+// long double (>64 bits), x86 and x64 -----------------------------------------
+
+#if defined(__i386) || defined(__i386__) || defined(_M_IX86) \
+    || defined(__amd64) || defined(__amd64__)  || defined(_M_AMD64) \
+    || defined(__x86_64) || defined(__x86_64__) || defined(_M_X64)
+
+// Intel extended double precision format (80 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00008000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x00007fff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + 6, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + 6, &a, 4);
+    }
+};
+
+
+// long double (>64 bits), Itanium ---------------------------------------------
+
+#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
+
+// The floating point format is unknown at compile time
+// No template specialization is provided.
+// The generic_tag definition is used.
+
+// The Itanium supports both
+// the Intel extended double precision format (80 bits) and
+// the IEEE extended double precision format with 15 exponent bits (128 bits).
+
+
+// long double (>64 bits), PowerPC ---------------------------------------------
+
+#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) \
+    || defined(__ppc) || defined(__ppc__) || defined(__PPC__)
+
+// PowerPC extended double precision format (128 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7ff00000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x000fffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 12);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+
+// long double (>64 bits), Motorola 68K ----------------------------------------
+
+#elif defined(__m68k) || defined(__m68k__) \
+    || defined(__mc68000) || defined(__mc68000__) \
+
+// Motorola extended double precision format (96 bits)
+
+// It is the same format as the Intel extended double precision format,
+// except that 1) it is big-endian, 2) the 3rd and 4th byte are padding, and
+// 3) the flag bit is not set for infinity
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00008000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x00007fff);
+
+    // copy 1st, 2nd, 5th and 6th byte. 3rd and 4th byte are padding.
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, &x, 2);
+        std::memcpy(reinterpret_cast<unsigned char*>(&a) + 2,
+               reinterpret_cast<const unsigned char*>(&x) + 4, 2);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(&x, &a, 2);
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + 4,
+               reinterpret_cast<const unsigned char*>(&a) + 2, 2);
+    }
+};
+
+
+// long double (>64 bits), All other processors --------------------------------
+
+#else
+
+// IEEE extended double precision format with 15 exponent bits (128 bits)
+
+template<>
+struct fp_traits_non_native<long double, extended_double_precision>
+{
+    typedef ieee_copy_leading_bits_tag method;
+
+    BOOST_STATIC_CONSTANT(uint32_t, sign        = 0x80000000u);
+    BOOST_STATIC_CONSTANT(uint32_t, exponent    = 0x7fff0000);
+    BOOST_STATIC_CONSTANT(uint32_t, flag        = 0x00000000);
+    BOOST_STATIC_CONSTANT(uint32_t, significand = 0x0000ffff);
+
+    typedef uint32_t bits;
+
+    static void get_bits(long double x, uint32_t& a)
+    {
+        std::memcpy(&a, reinterpret_cast<const unsigned char*>(&x) + offset_, 4);
+    }
+
+    static void set_bits(long double& x, uint32_t a)
+    {
+        std::memcpy(reinterpret_cast<unsigned char*>(&x) + offset_, &a, 4);
+    }
+
+private:
+
+#if defined(BOOST_BIG_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 0);
+#elif defined(BOOST_LITTLE_ENDIAN)
+    BOOST_STATIC_CONSTANT(int, offset_ = 12);
+#else
+    BOOST_STATIC_ASSERT(false);
+#endif
+};
+
+#endif
+
+//------------------------------------------------------------------------------
+
+// size_to_precision is a type switch for converting a C++ floating point type
+// to the corresponding precision type.
+
+template<int n, bool fp> struct size_to_precision
+{
+   typedef unknown_precision type;
+};
+
+template<> struct size_to_precision<4, true>
+{
+    typedef single_precision type;
+};
+
+template<> struct size_to_precision<8, true>
+{
+    typedef double_precision type;
+};
+
+template<> struct size_to_precision<10, true>
+{
+    typedef extended_double_precision type;
+};
+
+template<> struct size_to_precision<12, true>
+{
+    typedef extended_double_precision type;
+};
+
+template<> struct size_to_precision<16, true>
+{
+    typedef extended_double_precision type;
+};
+
+//------------------------------------------------------------------------------
+//
+// Figure out whether to use native classification functions based on
+// whether T is a built in floating point type or not:
+//
+template <class T>
+struct select_native
+{
+    typedef BOOST_DEDUCED_TYPENAME size_to_precision<sizeof(T), ::boost::is_floating_point<T>::value>::type precision;
+    typedef fp_traits_non_native<T, precision> type;
+};
+template<>
+struct select_native<float>
+{
+    typedef fp_traits_native<float> type;
+};
+template<>
+struct select_native<double>
+{
+    typedef fp_traits_native<double> type;
+};
+template<>
+struct select_native<long double>
+{
+    typedef fp_traits_native<long double> type;
+};
+
+//------------------------------------------------------------------------------
+
+// fp_traits is a type switch that selects the right fp_traits_non_native
+
+#if (defined(BOOST_MATH_USE_C99) && !(defined(__GNUC__) && (__GNUC__ < 4))) \
+   && !defined(__hpux) \
+   && !defined(__DECCXX)\
+   && !defined(__osf__) \
+   && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)
+#  define BOOST_MATH_USE_STD_FPCLASSIFY
+#endif
+
+template<class T> struct fp_traits
+{
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && !defined(BOOST_MATH_DISABLE_STD_FPCLASSIFY)
+    typedef typename select_native<T>::type type;
+#else
+    typedef BOOST_DEDUCED_TYPENAME size_to_precision<sizeof(T), ::boost::is_floating_point<T>::value>::type precision;
+    typedef fp_traits_non_native<T, precision> type;
+#endif
+};
+
+//------------------------------------------------------------------------------
+
+}   // namespace detail
+}   // namespace math
+}   // namespace boost
+
+#endif
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/gamma_inva.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/gamma_inva.hpp
index 62adac86e0a24a3c3bc0aeac5c9dd8dcc4055399..549bc3d55235f03dd3db033c21dd129354d15d72 100644 (file)
@@ -176,7 +176,7 @@ inline typename tools::promote_args<T1, T2>::type
       detail::gamma_inva_imp(
          static_cast<value_type>(x), 
          static_cast<value_type>(p), 
-         1 - static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
          pol), "boost::math::gamma_p_inva<%1%>(%1%, %1%)");
 }
 
@@ -205,7 +205,7 @@ inline typename tools::promote_args<T1, T2>::type
    return policies::checked_narrowing_cast<result_type, forwarding_policy>(
       detail::gamma_inva_imp(
          static_cast<value_type>(x), 
-         1 - static_cast<value_type>(q), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
          static_cast<value_type>(q), 
          pol), "boost::math::gamma_q_inva<%1%>(%1%, %1%)");
 }
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/ibeta_inv_ab.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/ibeta_inv_ab.hpp
index 55e2c65b6a0ee93004e40e602b359c000a06c68e..8318a28454285cb53f57e1f4a623dd5bd1d77363 100644 (file)
@@ -120,11 +120,11 @@ T ibeta_inv_ab_imp(const T& b, const T& z, const T& p, const T& q, bool swap_ab,
       //
       if((p < q) != swap_ab)
       {
-         guess = (std::min)(b * 2, T(1));
+         guess = (std::min)(T(b * 2), T(1));
       }
       else
       {
-         guess = (std::min)(b / 2, T(1));
+         guess = (std::min)(T(b / 2), T(1));
       }
    }
    if(n * n * n * u * sf > 0.005)
@@ -137,11 +137,11 @@ T ibeta_inv_ab_imp(const T& b, const T& z, const T& p, const T& q, bool swap_ab,
       //
       if((p < q) != swap_ab)
       {
-         guess = (std::min)(b * 2, T(10));
+         guess = (std::min)(T(b * 2), T(10));
       }
       else
       {
-         guess = (std::min)(b / 2, T(10));
+         guess = (std::min)(T(b / 2), T(10));
       }
    }
    else
@@ -186,7 +186,7 @@ typename tools::promote_args<RT1, RT2, RT3>::type
          static_cast<value_type>(b), 
          static_cast<value_type>(x), 
          static_cast<value_type>(p), 
-         1 - static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
          false, pol), 
       "boost::math::ibeta_inva<%1%>(%1%,%1%,%1%)");
 }
@@ -217,7 +217,7 @@ typename tools::promote_args<RT1, RT2, RT3>::type
       detail::ibeta_inv_ab_imp(
          static_cast<value_type>(b), 
          static_cast<value_type>(x), 
-         1 - static_cast<value_type>(q), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
          static_cast<value_type>(q), 
          false, pol),
       "boost::math::ibetac_inva<%1%>(%1%,%1%,%1%)");
@@ -250,7 +250,7 @@ typename tools::promote_args<RT1, RT2, RT3>::type
          static_cast<value_type>(a), 
          static_cast<value_type>(x), 
          static_cast<value_type>(p), 
-         1 - static_cast<value_type>(p), 
+         static_cast<value_type>(1 - static_cast<value_type>(p)), 
          true, pol),
       "boost::math::ibeta_invb<%1%>(%1%,%1%,%1%)");
 }
@@ -281,7 +281,7 @@ typename tools::promote_args<RT1, RT2, RT3>::type
       detail::ibeta_inv_ab_imp(
          static_cast<value_type>(a), 
          static_cast<value_type>(x), 
-         1 - static_cast<value_type>(q), 
+         static_cast<value_type>(1 - static_cast<value_type>(q)), 
          static_cast<value_type>(q), 
          true, pol),
          "boost::math::ibetac_invb<%1%>(%1%,%1%,%1%)");
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/ibeta_inverse.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/ibeta_inverse.hpp
index 0c1ae76f20f15eea0980042a3f77f97544b87d45..8ed1e3046b6527ea2af3072f9c91cd253cd2dd6f 100644 (file)
@@ -106,7 +106,7 @@ T temme_method_1_ibeta_inverse(T a, T b, T z, const Policy& pol)
    //
    // Bring them together to get a final estimate for eta:
    //
-   T eta = tools::evaluate_polynomial(terms, 1/a, 4);
+   T eta = tools::evaluate_polynomial(terms, T(1/a), 4);
    //
    // now we need to convert eta to x, by solving the appropriate
    // quadratic equation:
@@ -207,7 +207,7 @@ T temme_method_2_ibeta_inverse(T /*a*/, T /*b*/, T z, T r, T theta, const Policy
    // Bring the correction terms together to evaluate eta,
    // this is the last equation on page 151:
    //
-   T eta = tools::evaluate_polynomial(terms, 1/r, 4);
+   T eta = tools::evaluate_polynomial(terms, T(1/r), 4);
    //
    // Now that we have eta we need to back solve for x,
    // we seek the value of x that gives eta in Eq 3.2.
@@ -660,7 +660,7 @@ T ibeta_inv_imp(T a, T b, T p, T q, const Policy& pol, T* py)
       //
       T lx = log(p * a * boost::math::beta(a, b, pol)) / a;
       x = exp(lx);
-      y = x < 0.9 ? 1 - x : -boost::math::expm1(lx, pol);
+      y = x < 0.9 ? T(1 - x) : (T)(-boost::math::expm1(lx, pol));
 
       if((b < a) && (x < 0.2))
       {
@@ -795,8 +795,10 @@ T ibeta_inv_imp(T a, T b, T p, T q, const Policy& pol, T* py)
    // Now iterate, we can use either p or q as the target here
    // depending on which is smaller:
    //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
    x = boost::math::tools::halley_iterate(
-      boost::math::detail::ibeta_roots<T, Policy>(a, b, (p < q ? p : q), (p < q ? false : true)), x, lower, upper, digits);
+      boost::math::detail::ibeta_roots<T, Policy>(a, b, (p < q ? p : q), (p < q ? false : true)), x, lower, upper, digits, max_iter);
+   policies::check_root_iterations("boost::math::ibeta<%1%>(%1%, %1%, %1%)", max_iter, pol);
    //
    // We don't really want these asserts here, but they are useful for sanity
    // checking that we have the limits right, uncomment if you suspect bugs *only*.
similarity index 81%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/igamma_inverse.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/igamma_inverse.hpp
index ff182bb2dd21ecf5e282cd51145d91b8b49ab2c8..a62568647a22fb93287aecc67ee332ff70051bbe 100644 (file)
@@ -93,7 +93,7 @@ inline T didonato_FN(T p, T a, T x, unsigned N, T tolerance, const Policy& pol)
 }
 
 template <class T, class Policy>
-T find_inverse_gamma(T a, T p, T q, const Policy& pol)
+T find_inverse_gamma(T a, T p, T q, const Policy& pol, bool* p_has_10_digits)
 {
    //
    // In order to understand what's going on here, you will
@@ -107,13 +107,19 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
    BOOST_MATH_STD_USING
 
    T result;
+   *p_has_10_digits = false;
 
    if(a == 1)
+   {
       result = -log(q);
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
+   }
    else if(a < 1)
    {
       T g = boost::math::tgamma(a, pol);
       T b = q * g;
+      BOOST_MATH_INSTRUMENT_VARIABLE(g);
+      BOOST_MATH_INSTRUMENT_VARIABLE(b);
       if((b > 0.6) || ((b >= 0.45) && (a >= 0.3)))
       {
          // DiDonato & Morris Eq 21:
@@ -127,12 +133,15 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
          if((b * q > 1e-8) && (q > 1e-5))
          {
             u = pow(p * g * a, 1 / a);
+            BOOST_MATH_INSTRUMENT_VARIABLE(u);
          }
          else
          {
             u = exp((-q / a) - constants::euler<T>());
+            BOOST_MATH_INSTRUMENT_VARIABLE(u);
          }
          result = u / (1 - (u / (a + 1)));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else if((a < 0.3) && (b >= 0.35))
       {
@@ -140,6 +149,7 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
          T t = exp(-constants::euler<T>() - b);
          T u = t * exp(t);
          result = t * exp(u);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else if((b > 0.15) || (a >= 0.3))
       {
@@ -147,6 +157,7 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
          T y = -log(b);
          T u = y - (1 - a) * log(y);
          result = y - (1 - a) * log(u) - log(1 + (1 - a) / (1 + u));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else if (b > 0.1)
       {
@@ -154,6 +165,7 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
          T y = -log(b);
          T u = y - (1 - a) * log(y);
          result = y - (1 - a) * log(u) - log((u * u + 2 * (3 - a) * u + (2 - a) * (3 - a)) / (u * u + (5 - a) * u + 2));
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else
       {
@@ -179,6 +191,9 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
          T y_3 = y_2 * y;
          T y_4 = y_2 * y_2;
          result = y + c1 + (c2 / y) + (c3 / y_2) + (c4 / y_3) + (c5 / y_4);
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
+         if(b < 1e-28f)
+            *p_has_10_digits = true;
       }
    }
    else
@@ -186,30 +201,39 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
       // DiDonato and Morris Eq 31:
       T s = find_inverse_s(p, q);
 
+      BOOST_MATH_INSTRUMENT_VARIABLE(s);
+
       T s_2 = s * s;
       T s_3 = s_2 * s;
       T s_4 = s_2 * s_2;
       T s_5 = s_4 * s;
       T ra = sqrt(a);
 
+      BOOST_MATH_INSTRUMENT_VARIABLE(ra);
+
       T w = a + s * ra + (s * s -1) / 3;
       w += (s_3 - 7 * s) / (36 * ra);
       w -= (3 * s_4 + 7 * s_2 - 16) / (810 * a);
       w += (9 * s_5 + 256 * s_3 - 433 * s) / (38880 * a * ra);
 
+      BOOST_MATH_INSTRUMENT_VARIABLE(w);
+
       if((a >= 500) && (fabs(1 - w / a) < 1e-6))
       {
          result = w;
+         *p_has_10_digits = true;
+         BOOST_MATH_INSTRUMENT_VARIABLE(result);
       }
       else if (p > 0.5)
       {
          if(w < 3 * a)
          {
             result = w;
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
          }
          else
          {
-            T D = (std::max)(T(2), a * (a - 1));
+            T D = (std::max)(T(2), T(a * (a - 1)));
             T lg = boost::math::lgamma(a, pol);
             T lb = log(q) + lg;
             if(lb < -D * 2.3)
@@ -236,33 +260,51 @@ T find_inverse_gamma(T a, T p, T q, const Policy& pol)
                T y_3 = y_2 * y;
                T y_4 = y_2 * y_2;
                result = y + c1 + (c2 / y) + (c3 / y_2) + (c4 / y_3) + (c5 / y_4);
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
             }
             else
             {
                // DiDonato and Morris Eq 33:
                T u = -lb + (a - 1) * log(w) - log(1 + (1 - a) / (1 + w));
                result = -lb + (a - 1) * log(u) - log(1 + (1 - a) / (1 + u));
+               BOOST_MATH_INSTRUMENT_VARIABLE(result);
             }
          }
       }
       else
       {
+         T z = w;
+         T ap1 = a + 1;
+         if(w < 0.15f * ap1)
+         {
          // DiDonato and Morris Eq 35:
-         T z = didonato_FN(p, a, w, 0, T(0), pol);
-         z = didonato_FN(p, a, z, 2, T(0), pol);
-         z = didonato_FN(p, a, z, 2, T(0), pol);
-         z = didonato_FN(p, a, z, 3, T(0), pol);
+            T v = log(p) + boost::math::lgamma(ap1, pol);
+            T s = 1;
+            z = exp((v + w) / a);
+            s = boost::math::log1p(z / ap1 * (1 + z / (a + 2)));
+            z = exp((v + z - s) / a);
+            z = exp((v + z - s) / a);
+            s = boost::math::log1p(z / ap1 * (1 + z / (a + 2) * (1 + z / (a + 3))));
+            z = exp((v + z - s) / a);
+         BOOST_MATH_INSTRUMENT_VARIABLE(z);
+         }
 
-         if((z <= 0.01 * (a + 1)) || (z > 0.7 * (a + 1)))
+         if((z <= 0.01 * ap1) || (z > 0.7 * ap1))
          {
             result = z;
+            if(z <= 0.002 * ap1)
+               *p_has_10_digits = true;
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
          }
          else
          {
             // DiDonato and Morris Eq 36:
-            T zb = didonato_FN(p, a, z, 100, T(1e-4), pol);
-            T u = log(p) + boost::math::lgamma(a + 1, pol);
-            result = zb * (1 - (a * log(zb) - zb - u + log(didonato_SN(a, z, 100, T(1e-4)))) / (a - zb));
+            T ls = log(didonato_SN(a, z, 100, T(1e-4)));
+            T v = log(p) + boost::math::lgamma(ap1, pol);
+            z = exp((v + z - ls) / a);
+            result = z * (1 - (a * log(z) - z - v + ls) / (a - z));
+
+            BOOST_MATH_INSTRUMENT_VARIABLE(result);
          }
       }
    }
@@ -349,6 +391,9 @@ T gamma_p_inv_imp(T a, T p, const Policy& pol)
 
    static const char* function = "boost::math::gamma_p_inv<%1%>(%1%, %1%)";
 
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(p);
+
    if(a <= 0)
       policies::raise_domain_error<T>(function, "Argument a in the incomplete gamma function inverse must be >= 0 (got a=%1%).", a, pol);
    if((p < 0) || (p > 1))
@@ -357,28 +402,46 @@ T gamma_p_inv_imp(T a, T p, const Policy& pol)
       return tools::max_value<T>();
    if(p == 0)
       return 0;
-   T guess = detail::find_inverse_gamma(a, p, 1 - p, pol);
+   bool has_10_digits;
+   T guess = detail::find_inverse_gamma<T>(a, p, 1 - p, pol, &has_10_digits);
+   if((policies::digits<T, Policy>() <= 36) && has_10_digits)
+      return guess;
    T lower = tools::min_value<T>();
    if(guess <= lower)
       guess = tools::min_value<T>();
+   BOOST_MATH_INSTRUMENT_VARIABLE(guess);
    //
    // Work out how many digits to converge to, normally this is
    // 2/3 of the digits in T, but if the first derivative is very
    // large convergence is slow, so we'll bump it up to full 
    // precision to prevent premature termination of the root-finding routine.
    //
-   unsigned digits = (policies::digits<T, Policy>() * 2) / 3;
+   unsigned digits = policies::digits<T, Policy>();
+   if(digits < 30)
+   {
+      digits *= 2;
+      digits /= 3;
+   }
+   else
+   {
+      digits /= 2;
+      digits -= 1;
+   }
    if((a < 0.125) && (fabs(gamma_p_derivative(a, guess, pol)) > 1 / sqrt(tools::epsilon<T>())))
       digits = policies::digits<T, Policy>() - 2;
    //
    // Go ahead and iterate:
    //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
    guess = tools::halley_iterate(
       detail::gamma_p_inverse_func<T, Policy>(a, p, false),
       guess,
       lower,
       tools::max_value<T>(),
-      digits);
+      digits,
+      max_iter);
+   policies::check_root_iterations(function, max_iter, pol);
+   BOOST_MATH_INSTRUMENT_VARIABLE(guess);
    if(guess == lower)
       guess = policies::raise_underflow_error<T>(function, "Expected result known to be non-zero, but is smaller than the smallest available number.", pol);
    return guess;
@@ -399,7 +462,10 @@ T gamma_q_inv_imp(T a, T q, const Policy& pol)
       return tools::max_value<T>();
    if(q == 1)
       return 0;
-   T guess = detail::find_inverse_gamma(a, 1 - q, q, pol);
+   bool has_10_digits;
+   T guess = detail::find_inverse_gamma<T>(a, 1 - q, q, pol, &has_10_digits);
+   if((policies::digits<T, Policy>() <= 36) && has_10_digits)
+      return guess;
    T lower = tools::min_value<T>();
    if(guess <= lower)
       guess = tools::min_value<T>();
@@ -409,18 +475,31 @@ T gamma_q_inv_imp(T a, T q, const Policy& pol)
    // large convergence is slow, so we'll bump it up to full 
    // precision to prevent premature termination of the root-finding routine.
    //
-   unsigned digits = (policies::digits<T, Policy>() * 2) / 3;
+   unsigned digits = policies::digits<T, Policy>();
+   if(digits < 30)
+   {
+      digits *= 2;
+      digits /= 3;
+   }
+   else
+   {
+      digits /= 2;
+      digits -= 1;
+   }
    if((a < 0.125) && (fabs(gamma_p_derivative(a, guess, pol)) > 1 / sqrt(tools::epsilon<T>())))
       digits = policies::digits<T, Policy>();
    //
    // Go ahead and iterate:
    //
+   boost::uintmax_t max_iter = policies::get_max_root_iterations<Policy>();
    guess = tools::halley_iterate(
       detail::gamma_p_inverse_func<T, Policy>(a, q, true),
       guess,
       lower,
       tools::max_value<T>(),
-      digits);
+      digits,
+      max_iter);
+   policies::check_root_iterations(function, max_iter, pol);
    if(guess == lower)
       guess = policies::raise_underflow_error<T>(function, "Expected result known to be non-zero, but is smaller than the smallest available number.", pol);
    return guess;
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/lanczos_sse2.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/lanczos_sse2.hpp
index a8e9f1909eaa4521eecb6487dd37597e95863575..6a3f3e5347e49570b3acfbf360a9e11a50085107 100644 (file)
@@ -12,7 +12,7 @@
 
 #include <emmintrin.h>
 
-#ifdef __GNUC__
+#if defined(__GNUC__) || defined(__PGI)
 #define ALIGN16 __attribute__((aligned(16)))
 #else
 #define ALIGN16 __declspec(align(16))
similarity index 86%
rename from deal.II/contrib/boost/include/boost/math/special_functions/detail/t_distribution_inv.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/detail/t_distribution_inv.hpp
index ca5b0a357a9516686ad157d0296ac0f26af6d7f3..bd2e91f98e509ea2e4886d61dc94b281c2b3081e 100644 (file)
@@ -143,35 +143,60 @@ T inverse_students_t_body_series(T df, T u, const Policy& pol)
    // Figure out what the coefficients are, note these depend
    // only on the degrees of freedom (Eq 57 of Shaw):
    //
-   c[2] = T(1) / 6 + T(1) / (6 * df);
+   c[2] = 0.16666666666666666667 + 0.16666666666666666667 / df;
    T in = 1 / df;
-   c[3] = (((T(1) / 120) * in) + (T(1) / 15)) * in + (T(7) / 120);
-   c[4] = ((((T(1) / 5040) * in + (T(1) / 560)) * in + (T(3) / 112)) * in + T(127) / 5040);
-   c[5] = ((((T(1) / 362880) * in + (T(17) / 45360)) * in + (T(67) / 60480)) * in + (T(479) / 45360)) * in + (T(4369) / 362880);
-   c[6] = ((((((T(1) / 39916800) * in + (T(2503) / 39916800)) * in + (T(11867) / 19958400)) * in + (T(1285) / 798336)) * in + (T(153161) / 39916800)) * in + (T(34807) / 5702400));
-   c[7] = (((((((T(1) / 6227020800LL) * in + (T(37) / 2402400)) * in +
-      (T(339929) / 2075673600LL)) * in + (T(67217) / 97297200)) * in +
-      (T(870341) / 691891200LL)) * in + (T(70691) / 64864800LL)) * in +
-      (T(20036983LL) / 6227020800LL));
-   c[8] = (((((((T(1) / 1307674368000LL) * in + (T(1042243LL) / 261534873600LL)) * in +
-            (T(21470159) / 435891456000LL)) * in + (T(326228899LL) / 1307674368000LL)) * in +
-            (T(843620579) / 1307674368000LL)) * in + (T(332346031LL) / 435891456000LL)) * in +
-            (T(43847599) / 1307674368000LL)) * in + (T(2280356863LL) / 1307674368000LL);
-   c[9] = (((((((((T(1) / 355687428096000LL)) * in + (T(24262727LL) / 22230464256000LL)) * in +
-            (T(123706507LL) / 8083805184000LL)) * in + (T(404003599LL) / 4446092851200LL)) * in +
-            (T(51811946317LL) / 177843714048000LL)) * in + (T(91423417LL) / 177843714048LL)) * in +
-            (T(32285445833LL) / 88921857024000LL)) * in + (T(531839683LL) / 1710035712000LL)) * in +
-            (T(49020204823LL) / 50812489728000LL);
-   c[10] = (((((((((T(1) / 121645100408832000LL) * in +
-            (T(4222378423LL) / 13516122267648000LL)) * in +
-            (T(49573465457LL) / 10137091700736000LL)) * in +
-            (T(176126809LL) / 5304600576000LL)) * in +
-            (T(44978231873LL) / 355687428096000LL)) * in +
-            (T(5816850595639LL) / 20274183401472000LL)) * in +
-            (T(73989712601LL) / 206879422464000LL)) * in +
-            (T(26591354017LL) / 259925428224000LL)) * in +
-            (T(14979648446341LL) / 40548366802944000LL)) * in +
-            (T(65967241200001LL) / 121645100408832000LL);
+   c[3] = (0.0083333333333333333333 * in 
+      + 0.066666666666666666667) * in 
+      + 0.058333333333333333333;
+   c[4] = ((0.00019841269841269841270 * in 
+      + 0.0017857142857142857143) * in 
+      + 0.026785714285714285714) * in 
+      + 0.025198412698412698413;
+   c[5] = (((2.7557319223985890653e10-6 * in 
+      + 0.00037477954144620811287) * in 
+      - 0.0011078042328042328042) * in 
+      + 0.010559964726631393298) * in 
+      + 0.012039792768959435626;
+   c[6] = ((((2.5052108385441718775e-8 * in 
+      - 0.000062705427288760622094) * in 
+      + 0.00059458674042007375341) * in 
+      - 0.0016095979637646304313) * in 
+      + 0.0061039211560044893378) * in 
+      + 0.0038370059724226390893;
+   c[7] = (((((1.6059043836821614599e-10 * in 
+      + 0.000015401265401265401265) * in 
+      - 0.00016376804137220803887) * in
+      + 0.00069084207973096861986) * in 
+      - 0.0012579159844784844785) * in 
+      + 0.0010898206731540064873) * in 
+      + 0.0032177478835464946576;
+   c[8] = ((((((7.6471637318198164759e-13 * in
+      - 3.9851014346715404916e-6) * in
+      + 0.000049255746366361445727) * in
+      - 0.00024947258047043099953) * in 
+      + 0.00064513046951456342991) * in
+      - 0.00076245135440323932387) * in
+      + 0.000033530976880017885309) * in 
+      + 0.0017438262298340009980;
+   c[9] = (((((((2.8114572543455207632e-15 * in
+      + 1.0914179173496789432e-6) * in
+      - 0.000015303004486655377567) * in
+      + 0.000090867107935219902229) * in
+      - 0.00029133414466938067350) * in
+      + 0.00051406605788341121363) * in
+      - 0.00036307660358786885787) * in
+      - 0.00031101086326318780412) * in 
+      + 0.00096472747321388644237;
+   c[10] = ((((((((8.2206352466243297170e-18 * in
+      - 3.1239569599829868045e-7) * in
+      + 4.8903045291975346210e-6) * in
+      - 0.000033202652391372058698) * in
+      + 0.00012645437628698076975) * in
+      - 0.00028690924218514613987) * in
+      + 0.00035764655430568632777) * in
+      - 0.00010230378073700412687) * in
+      - 0.00036942667800009661203) * in
+      + 0.00054229262813129686486;
    //
    // The result is then a polynomial in v (see Eq 56 of Shaw):
    //
@@ -241,7 +266,7 @@ T inverse_students_t(T df, T u, T v, const Policy& pol, bool* pexact = 0)
             T root_alpha = sqrt(alpha);
             T r = 4 * cos(acos(root_alpha) / 3) / root_alpha;
             T x = sqrt(r - 4);
-            result = u - 0.5f < 0 ? -x : x;
+            result = u - 0.5f < 0 ? (T)-x : x;
             if(pexact)
                *pexact = true;
             break;
@@ -260,7 +285,7 @@ T inverse_students_t(T df, T u, T v, const Policy& pol, bool* pexact = 0)
             //
             T a = 4 * (u - u * u);//1 - 4 * (u - 0.5f) * (u - 0.5f);
             T b = boost::math::cbrt(a);
-            static const T c = 0.85498797333834849467655443627193L;
+            static const T c = 0.85498797333834849467655443627193;
             T p = 6 * (1 + c * (1 / b - 1));
             T p0;
             do{
@@ -275,7 +300,7 @@ T inverse_students_t(T df, T u, T v, const Policy& pol, bool* pexact = 0)
             // Use Eq 45 to extract the result:
             //
             p = sqrt(p - df);
-            result = (u - 0.5f) < 0 ? -p : p;
+            result = (u - 0.5f) < 0 ? (T)-p : p;
             break;
          }
 #if 0
@@ -370,7 +395,7 @@ calculate_real:
          // where we use Shaw's tail series.
          // The crossover point is roughly exponential in -df:
          //
-         T crossover = ldexp(1.0f, iround(df / -0.654f, pol));
+         T crossover = ldexp(1.0f, iround(T(df / -0.654f), pol));
          if(u > crossover)
          {
             result = boost::math::detail::inverse_students_t_hill(df, u, pol);
@@ -381,13 +406,13 @@ calculate_real:
          }
       }
    }
-   return invert ? -result : result;
+   return invert ? (T)-result : result;
 }
 
 template <class T, class Policy>
 inline T find_ibeta_inv_from_t_dist(T a, T p, T q, T* py, const Policy& pol)
 {
-   T u = (p > q) ? 0.5f - q / 2 : p / 2;
+   T u = (p > q) ? T(0.5f - q) / T(2) : T(p / 2);
    T v = 1 - u; // u < 0.5 so no cancellation error
    T df = a * 2;
    T t = boost::math::detail::inverse_students_t(df, u, v, pol);
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/special_functions/ellint_1.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_1.hpp
index 9de2f66f62ec9d9bf7d095a8356d4d0b145daaa8..469f4bd01a0df293b5164deb59c881328f743eeb 100644 (file)
@@ -88,9 +88,9 @@ T ellint_f_imp(T phi, T k, const Policy& pol)
        // so rewritten to use fmod instead:
        //
        BOOST_MATH_INSTRUMENT_CODE("pi/2 = " << constants::pi<T>() / 2);
-       T rphi = boost::math::tools::fmod_workaround(phi, constants::pi<T>() / 2);
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::pi<T>() / 2));
        BOOST_MATH_INSTRUMENT_VARIABLE(rphi);
-       T m = 2 * (phi - rphi) / constants::pi<T>();
+       T m = floor((2 * phi) / constants::pi<T>());
        BOOST_MATH_INSTRUMENT_VARIABLE(m);
        int s = 1;
        if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
@@ -104,7 +104,7 @@ T ellint_f_imp(T phi, T k, const Policy& pol)
        T cosp = cos(rphi);
        BOOST_MATH_INSTRUMENT_VARIABLE(sinp);
        BOOST_MATH_INSTRUMENT_VARIABLE(cosp);
-       result = s * sinp * ellint_rf_imp(cosp * cosp, 1 - k * k * sinp * sinp, T(1), pol);
+       result = s * sinp * ellint_rf_imp(T(cosp * cosp), T(1 - k * k * sinp * sinp), T(1), pol);
        BOOST_MATH_INSTRUMENT_VARIABLE(result);
        if(m != 0)
        {
@@ -112,7 +112,7 @@ T ellint_f_imp(T phi, T k, const Policy& pol)
           BOOST_MATH_INSTRUMENT_VARIABLE(result);
        }
     }
-    return invert ? -result : result;
+    return invert ? T(-result) : result;
 }
 
 // Complete elliptic integral (Legendre form) of the first kind
similarity index 96%
rename from deal.II/contrib/boost/include/boost/math/special_functions/ellint_2.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_2.hpp
index 1821578339174164005ac0a2b8a6762e961cb07a..85eca6cde7ea3153627c51488a84e0b9f18da148 100644 (file)
@@ -74,8 +74,8 @@ T ellint_e_imp(T phi, T k, const Policy& pol)
        // but that fails if T has more digits than a long long,
        // so rewritten to use fmod instead:
        //
-       T rphi = boost::math::tools::fmod_workaround(phi, constants::pi<T>() / 2);
-       T m = 2 * (phi - rphi) / constants::pi<T>();
+       T rphi = boost::math::tools::fmod_workaround(phi, T(constants::pi<T>() / 2));
+       T m = floor((2 * phi) / constants::pi<T>());
        int s = 1;
        if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
        {
@@ -93,7 +93,7 @@ T ellint_e_imp(T phi, T k, const Policy& pol)
        if(m != 0)
           result += m * ellint_e_imp(k, pol);
     }
-    return invert ? -result : result;
+    return invert ? T(-result) : result;
 }
 
 // Complete elliptic integral (Legendre form) of the second kind
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/special_functions/ellint_3.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_3.hpp
index b3b8e7df07427cd3f2aec6b34a968397c58a513c..d4af1a7fc7f1b900f4e2e7b36d4986881ab99807 100644 (file)
@@ -182,8 +182,8 @@ T ellint_pi_imp(T v, T phi, T k, T vc, const Policy& pol)
     }
     else
     {
-       T rphi = boost::math::tools::fmod_workaround(fabs(phi), constants::pi<T>() / 2);
-       T m = 2 * (fabs(phi) - rphi) / constants::pi<T>();
+       T rphi = boost::math::tools::fmod_workaround(fabs(phi), T(constants::pi<T>() / 2));
+       T m = floor((2 * fabs(phi)) / constants::pi<T>());
        int sign = 1;
        if(boost::math::tools::fmod_workaround(m, T(2)) > 0.5)
        {
@@ -191,7 +191,10 @@ T ellint_pi_imp(T v, T phi, T k, T vc, const Policy& pol)
           sign = -1;
           rphi = constants::pi<T>() / 2 - rphi;
        }
-
+#if 0
+       //
+       // This wasn't supported but is now... probably!
+       //
        if((m > 0) && (v > 1))
        {
           //
@@ -202,6 +205,7 @@ T ellint_pi_imp(T v, T phi, T k, T vc, const Policy& pol)
             function,
             "Got v = %1%, but this is only supported for 0 <= phi <= pi/2", v, pol);
        }  
+#endif
        T sinp = sin(rphi);
        T cosp = cos(rphi);
        x = cosp * cosp;
@@ -213,7 +217,7 @@ T ellint_pi_imp(T v, T phi, T k, T vc, const Policy& pol)
        else
            p = x + vc * t;
        value = sign * sinp * (ellint_rf_imp(x, y, z, pol) + v * t * ellint_rj_imp(x, y, z, p, pol) / 3);
-       if(m > 0)
+       if((m > 0) && (vc > 0))
          value += m * ellint_pi_imp(v, k, vc, pol);
     }
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/special_functions/ellint_rj.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/ellint_rj.hpp
index 48a0fc61ae80f98e51bb9915a513e0ea2ddcc242..f0e08fb6b2cd702f5cb5c498d1158bfe81874214 100644 (file)
@@ -21,6 +21,7 @@
 #include <boost/math/tools/config.hpp>
 #include <boost/math/policies/error_handling.hpp>
 #include <boost/math/special_functions/ellint_rc.hpp>
+#include <boost/math/special_functions/ellint_rf.hpp>
 
 // Carlson's elliptic integral of the third kind
 // R_J(x, y, z, p) = 1.5 * \int_{0}^{\infty} (t+p)^{-1} [(t+x)(t+y)(t+z)]^{-1/2} dt
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/erf.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/erf.hpp
index 2f3455b1c526886216a796b4947e2dd6d4e4cdca..23579cee58372488b97fdcd07f5c99a02785b725 100644 (file)
@@ -122,9 +122,9 @@ T erf_imp(T z, bool invert, const Policy& pol, const Tag& t)
    if(z < 0)
    {
       if(!invert)
-         return -erf_imp(-z, invert, pol, t);
+         return -erf_imp(T(-z), invert, pol, t);
       else
-         return 1 + erf_imp(-z, false, pol, t);
+         return 1 + erf_imp(T(-z), false, pol, t);
    }
 
    T result;
@@ -133,7 +133,7 @@ T erf_imp(T z, bool invert, const Policy& pol, const Tag& t)
    {
       detail::erf_asympt_series_t<T> s(z);
       boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-      result = boost::math::tools::sum_series(s, policies::digits<T, Policy>(), max_iter, 1);
+      result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, 1);
       policies::check_series_iterations("boost::math::erf<%1%>(%1%, %1%)", max_iter, pol);
    }
    else
@@ -160,7 +160,7 @@ T erf_imp(T z, bool invert, const Policy& pol, const Tag& t)
          invert = !invert;
          result = z * exp(-x);
          result /= sqrt(boost::math::constants::pi<T>());
-         result *= upper_gamma_fraction(T(0.5f), x, policies::digits<T, Policy>());
+         result *= upper_gamma_fraction(T(0.5f), x, policies::get_epsilon<T, Policy>());
       }
    }
    if(invert)
@@ -197,14 +197,17 @@ T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<53>& t)
       //
       // We're going to calculate erf:
       //
+      if(z < 1e-10)
+      {
       if(z == 0)
       {
          result = T(0);
       }
-      else if(z < 1e-10)
+         else
       {
          result = static_cast<T>(z * 1.125f + z * 0.003379167095512573896158903121545171688L);
       }
+      }
       else
       {
          // Maximum Deviation Found:                     1.561e-17
@@ -227,10 +230,11 @@ T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<53>& t)
             0.00858571925074406212772L,
             0.000370900071787748000569L,
          };
-         result = z * (Y + tools::evaluate_polynomial(P, z * z) / tools::evaluate_polynomial(Q, z * z));
+         T zz = z * z;
+         result = z * (Y + tools::evaluate_polynomial(P, zz) / tools::evaluate_polynomial(Q, zz));
       }
    }
-   else if((z < 14) || ((z < 28) && invert))
+   else if(invert ? (z < 28) : (z < 5.8f))
    {
       //
       // We'll be calculating erfc:
@@ -425,7 +429,7 @@ T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<64>& t)
          result = z * (Y + tools::evaluate_polynomial(P, z * z) / tools::evaluate_polynomial(Q, z * z));
       }
    }
-   else if((z < 110) || ((z < 110) && invert))  // TODO FIXME!!!
+   else if(invert ? (z < 110) : (z < 6.4f))
    {
       //
       // We'll be calculating erfc:
@@ -634,7 +638,7 @@ T erf_imp(T z, bool invert, const Policy& pol, const mpl::int_<113>& t)
          result = z * (Y + tools::evaluate_polynomial(P, z * z) / tools::evaluate_polynomial(Q, z * z));
       }
    }
-   else if((z < 9) || ((z < 110) && invert))
+   else if(invert ? (z < 110) : (z < 8.65f))
    {
       //
       // We'll be calculating erfc:
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/expint.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/expint.hpp
index c5b2addbf3a34000e2975adc7fdd77c45c544ffc..ac33d903660acb91d1d9e97af95b39d07b4e4be2 100644 (file)
@@ -365,7 +365,7 @@ inline T expint_as_fraction(unsigned n, T z, const Policy& pol)
    expint_fraction<T> f(n, z);
    T result = tools::continued_fraction_b(
       f, 
-      tools::digits<T>(),
+      boost::math::policies::get_epsilon<T, Policy>(),
       max_iter);
    policies::check_series_iterations("boost::math::expint_continued_fraction<%1%>(unsigned,%1%)", max_iter, pol);
    BOOST_MATH_INSTRUMENT_VARIABLE(result)
@@ -422,7 +422,7 @@ inline T expint_as_series(unsigned n, T z, const Policy& pol)
    BOOST_MATH_INSTRUMENT_VARIABLE(result)
 
    expint_series<T> s(k, z, x_k, denom, fact);
-   result = tools::sum_series(s, policies::digits<T, Policy>(), max_iter, result);
+   result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, result);
    policies::check_series_iterations("boost::math::expint_series<%1%>(unsigned,%1%)", max_iter, pol);
    BOOST_MATH_INSTRUMENT_VARIABLE(result)
    BOOST_MATH_INSTRUMENT_VARIABLE(max_iter)
@@ -437,7 +437,7 @@ T expint_imp(unsigned n, T z, const Policy& pol, const Tag& tag)
    if(z < 0)
       return policies::raise_domain_error<T>(function, "Function requires z >= 0 but got %1%.", z, pol);
    if(z == 0)
-      return n == 1 ? policies::raise_overflow_error<T>(function, 0, pol) : 1 / (static_cast<T>(n - 1));
+      return n == 1 ? policies::raise_overflow_error<T>(function, 0, pol) : T(1 / (static_cast<T>(n - 1)));
 
    T result;
 
@@ -495,7 +495,7 @@ T expint_i_as_series(T z, const Policy& pol)
    result += constants::euler<T>();
    expint_i_series<T> s(z);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-   result = tools::sum_series(s, policies::digits<T, Policy>(), max_iter, result);
+   result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, result);
    policies::check_series_iterations("boost::math::expint_i_series<%1%>(%1%)", max_iter, pol);
    return result;
 }
@@ -505,7 +505,7 @@ T expint_i_imp(T z, const Policy& pol, const Tag& tag)
 {
    static const char* function = "boost::math::expint<%1%>(%1%)";
    if(z < 0)
-      return -expint_imp(1, -z, pol, tag);
+      return -expint_imp(1, T(-z), pol, tag);
    if(z == 0)
       return -policies::raise_overflow_error<T>(function, 0, pol);
    return expint_i_as_series(z, pol);
@@ -551,7 +551,7 @@ T expint_i_imp(T z, const Policy& pol, const mpl::int_<53>& tag)
          -0.138972589601781706598e-4L
       };
 
-      static const T r1 = static_cast<T>(1677624236387711.0L) / 4503599627370496uLL;
+      static const T r1 = static_cast<T>(1677624236387711.0L / 4503599627370496.0L);
       static const T r2 = 0.131401834143860282009280387409357165515556574352422001206362e-16L;
       static const T r = static_cast<T>(0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392L);
       T t = (z / 3) - 1;
@@ -766,7 +766,7 @@ T expint_i_imp(T z, const Policy& pol, const mpl::int_<64>& tag)
          0.131515429329812837701e-5L
       };
 
-      static const T r1 = static_cast<T>(1677624236387711.0L) / 4503599627370496uLL;
+      static const T r1 = static_cast<T>(1677624236387711.0L / 4503599627370496.0L);
       static const T r2 = 0.131401834143860282009280387409357165515556574352422001206362e-16L;
       static const T r = static_cast<T>(0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392L);
       T t = (z / 3) - 1;
@@ -1012,8 +1012,8 @@ T expint_i_imp(T z, const Policy& pol, const mpl::int_<113>& tag)
          0.382742953753485333207877784720070523e-12L
       };
 
-      static const T r1 = static_cast<T>(1677624236387711.0L) / 4503599627370496uLL;
-      static const T r2 = (static_cast<T>(266514582277687.0L) / 4503599627370496uLL) / 4503599627370496uLL;
+      static const T r1 = static_cast<T>(1677624236387711.0L / 4503599627370496.0L);
+      static const T r2 = static_cast<T>(266514582277687.0L / 4503599627370496.0L / 4503599627370496.0L);
       static const T r3 = static_cast<T>(0.283806480836357377069325311780969887585024578164571984232357e-31L);
       static const T r = static_cast<T>(0.372507410781366634461991866580119133535689497771654051555657435242200120636201854384926049951548942392L);
       T t = (z / 3) - 1;
similarity index 86%
rename from deal.II/contrib/boost/include/boost/math/special_functions/expm1.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/expm1.hpp
index e6068e6d226648c6a61c7b8ab3bcf88f7fb073dd..04094a0bd878c814126f8e8ba5135bd268857439 100644 (file)
@@ -75,30 +75,46 @@ T expm1_imp(T x, const mpl::int_<0>&, const Policy& pol)
    BOOST_MATH_STD_USING
 
    T a = fabs(x);
-   if(a > T(0.5L))
+   if(a > T(0.5f))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
       return exp(x) - T(1);
+   }
    if(a < tools::epsilon<T>())
       return x;
    detail::expm1_series<T> s(x);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) && !BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
-   T result = tools::sum_series(s, policies::digits<T, Policy>(), max_iter);
+   T result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter);
 #else
    T zero = 0;
-   T result = tools::sum_series(s, policies::digits<T, Policy>(), max_iter, zero);
+   T result = tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, zero);
 #endif
    policies::check_series_iterations("boost::math::expm1<%1%>(%1%)", max_iter, pol);
    return result;
 }
 
 template <class T, class P>
-T expm1_imp(T x, const mpl::int_<53>&, const P&)
+T expm1_imp(T x, const mpl::int_<53>&, const P& pol)
 {
    BOOST_MATH_STD_USING
 
    T a = fabs(x);
    if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
       return exp(x) - T(1);
+   }
    if(a < tools::epsilon<T>())
       return x;
 
@@ -111,13 +127,21 @@ T expm1_imp(T x, const mpl::int_<53>&, const P&)
 }
 
 template <class T, class P>
-T expm1_imp(T x, const mpl::int_<64>&, const P&)
+T expm1_imp(T x, const mpl::int_<64>&, const P& pol)
 {
    BOOST_MATH_STD_USING
 
    T a = fabs(x);
    if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
       return exp(x) - T(1);
+   }
    if(a < tools::epsilon<T>())
       return x;
 
@@ -146,13 +170,21 @@ T expm1_imp(T x, const mpl::int_<64>&, const P&)
 }
 
 template <class T, class P>
-T expm1_imp(T x, const mpl::int_<113>&, const P&)
+T expm1_imp(T x, const mpl::int_<113>&, const P& pol)
 {
    BOOST_MATH_STD_USING
 
    T a = fabs(x);
    if(a > T(0.5L))
+   {
+      if(a >= tools::log_max_value<T>())
+      {
+         if(x > 0)
+            return policies::raise_overflow_error<T>("boost::math::expm1<%1%>(%1%)", 0, pol);
+         return -1;
+      }
       return exp(x) - T(1);
+   }
    if(a < tools::epsilon<T>())
       return x;
 
@@ -233,12 +265,14 @@ inline typename tools::promote_args<T>::type expm1(T x, const Policy& /* pol */)
 #endif
 
 #if defined(BOOST_HAS_EXPM1) && !(defined(__osf__) && defined(__DECCXX_VER))
-#  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
+#  ifdef BOOST_MATH_USE_C99
 inline float expm1(float x, const policies::policy<>&){ return ::expm1f(x); }
+#     ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
 inline long double expm1(long double x, const policies::policy<>&){ return ::expm1l(x); }
-#else
+#     endif
+#  else
 inline float expm1(float x, const policies::policy<>&){ return ::expm1(x); }
-#endif
+#  endif
 inline double expm1(double x, const policies::policy<>&){ return ::expm1(x); }
 #endif
 
@@ -272,3 +306,4 @@ inline long double expm1(long double z)
 
 
 
+
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/special_functions/factorials.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/factorials.hpp
index 4b484a7cb2ec57dd7ab1642c8ba7f44e3d7c6ec4..0d0a98a5d48bd7bfa2e9d63fb09f4e58604a1b48 100644 (file)
@@ -30,6 +30,7 @@ namespace boost { namespace math
 template <class T, class Policy>
 inline T factorial(unsigned i, const Policy& pol)
 {
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
    BOOST_MATH_STD_USING // Aid ADL for floor.
 
    if(i <= max_factorial<T>::value)
@@ -66,6 +67,7 @@ inline double factorial<double>(unsigned i)
 template <class T, class Policy>
 T double_factorial(unsigned i, const Policy& pol)
 {
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
    BOOST_MATH_STD_USING  // ADL lookup of std names
    if(i & 1)
    {
@@ -108,6 +110,7 @@ namespace detail{
 template <class T, class Policy>
 T rising_factorial_imp(T x, int n, const Policy& pol)
 {
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
    if(x < 0)
    {
       //
@@ -143,6 +146,7 @@ T rising_factorial_imp(T x, int n, const Policy& pol)
 template <class T, class Policy>
 inline T falling_factorial_imp(T x, unsigned n, const Policy& pol)
 {
+   BOOST_STATIC_ASSERT(!boost::is_integral<T>::value);
    BOOST_MATH_STD_USING // ADL of std names
    if(x == 0)
       return 0;
@@ -163,7 +167,7 @@ inline T falling_factorial_imp(T x, unsigned n, const Policy& pol)
       // handle it, split the product up into three parts:
       //
       T xp1 = x + 1;
-      unsigned n2 = itrunc(floor(xp1), pol);
+      unsigned n2 = itrunc((T)floor(xp1), pol);
       if(n2 == xp1)
          return 0;
       T result = boost::math::tgamma_delta_ratio(xp1, -static_cast<T>(n2), pol);
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/fpclassify.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/fpclassify.hpp
new file mode 100644 (file)
index 0000000..0ecc576
--- /dev/null
@@ -0,0 +1,533 @@
+//  Copyright John Maddock 2005-2008.
+//  Copyright (c) 2006-2008 Johan Rade
+//  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)
+
+#ifndef BOOST_MATH_FPCLASSIFY_HPP
+#define BOOST_MATH_FPCLASSIFY_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <math.h>
+#include <boost/config/no_tr1/cmath.hpp>
+#include <boost/limits.hpp>
+#include <boost/math/tools/real_cast.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/fp_traits.hpp>
+/*!
+  \file fpclassify.hpp
+  \brief Classify floating-point value as normal, subnormal, zero, infinite, or NaN.
+  \version 1.0
+  \author John Maddock
+ */
+
+/*
+
+1. If the platform is C99 compliant, then the native floating point
+classification functions are used.  However, note that we must only
+define the functions which call std::fpclassify etc if that function
+really does exist: otherwise a compiler may reject the code even though
+the template is never instantiated.
+
+2. If the platform is not C99 compliant, and the binary format for
+a floating point type (float, double or long double) can be determined
+at compile time, then the following algorithm is used:
+
+        If all exponent bits, the flag bit (if there is one), 
+        and all significand bits are 0, then the number is zero.
+
+        If all exponent bits and the flag bit (if there is one) are 0, 
+        and at least one significand bit is 1, then the number is subnormal.
+
+        If all exponent bits are 1 and all significand bits are 0, 
+        then the number is infinity.
+
+        If all exponent bits are 1 and at least one significand bit is 1,
+        then the number is a not-a-number.
+
+        Otherwise the number is normal.
+
+        This algorithm works for the IEEE 754 representation,
+        and also for several non IEEE 754 formats.
+
+    Most formats have the structure
+        sign bit + exponent bits + significand bits.
+    
+    A few have the structure
+        sign bit + exponent bits + flag bit + significand bits.
+    The flag bit is 0 for zero and subnormal numbers,
+        and 1 for normal numbers and NaN.
+        It is 0 (Motorola 68K) or 1 (Intel) for infinity.
+
+    To get the bits, the four or eight most significant bytes are copied
+    into an uint32_t or uint64_t and bit masks are applied.
+    This covers all the exponent bits and the flag bit (if there is one),
+    but not always all the significand bits.
+    Some of the functions below have two implementations,
+    depending on whether all the significand bits are copied or not.
+
+3. If the platform is not C99 compliant, and the binary format for
+a floating point type (float, double or long double) can not be determined
+at compile time, then comparison with std::numeric_limits values
+is used.
+
+*/
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+#include <float.h>
+#endif
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+  namespace std{ using ::abs; using ::fabs; }
+#endif
+
+namespace boost{ 
+
+#if defined(BOOST_HAS_FPCLASSIFY) || defined(isnan)
+//
+// This must not be located in any namespace under boost::math
+// otherwise we can get into an infinite loop if isnan is
+// a #define for "isnan" !
+//
+namespace math_detail{
+
+template <class T>
+inline bool is_nan_helper(T t, const boost::true_type&)
+{
+#ifdef isnan
+   return isnan(t);
+#else // BOOST_HAS_FPCLASSIFY
+   return (BOOST_FPCLASSIFY_PREFIX fpclassify(t) == (int)FP_NAN);
+#endif
+}
+
+template <class T>
+inline bool is_nan_helper(T t, const boost::false_type&)
+{
+   return false;
+}
+
+}
+
+#endif // defined(BOOST_HAS_FPCLASSIFY) || defined(isnan)
+
+namespace math{
+
+namespace detail{
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const native_tag&)
+{
+   return (std::fpclassify)(t);
+}
+#endif
+
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const generic_tag<true>&)
+{
+   BOOST_MATH_INSTRUMENT_VARIABLE(t);
+
+   // whenever possible check for Nan's first:
+#ifdef BOOST_HAS_FPCLASSIFY
+   if(::boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
+      return FP_NAN;
+#elif defined(isnan)
+   if(boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
+      return FP_NAN;
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
+   if(::_isnan(boost::math::tools::real_cast<double>(t)))
+      return FP_NAN;
+#endif
+   // std::fabs broken on a few systems especially for long long!!!!
+   T at = (t < T(0)) ? -t : t;
+
+   // Use a process of exclusion to figure out
+   // what kind of type we have, this relies on
+   // IEEE conforming reals that will treat
+   // Nan's as unordered.  Some compilers
+   // don't do this once optimisations are
+   // turned on, hence the check for nan's above.
+   if(at <= (std::numeric_limits<T>::max)())
+   {
+      if(at >= (std::numeric_limits<T>::min)())
+         return FP_NORMAL;
+      return (at != 0) ? FP_SUBNORMAL : FP_ZERO;
+   }
+   else if(at > (std::numeric_limits<T>::max)())
+      return FP_INFINITE;
+   return FP_NAN;
+}
+
+template <class T>
+inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const generic_tag<false>&)
+{
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   if(std::numeric_limits<T>::is_specialized)
+      return fp_classify_imp(t, mpl::true_());
+#endif
+   // 
+   // An unknown type with no numeric_limits support,
+   // so what are we supposed to do we do here?
+   //
+   BOOST_MATH_INSTRUMENT_VARIABLE(t);
+
+   return t == 0 ? FP_ZERO : FP_NORMAL;
+}
+
+template<class T> 
+int fpclassify_imp BOOST_NO_MACRO_EXPAND(T x, ieee_copy_all_bits_tag)
+{
+   typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   BOOST_DEDUCED_TYPENAME traits::bits a;
+   traits::get_bits(x,a);
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+   a &= traits::exponent | traits::flag | traits::significand;
+   BOOST_MATH_INSTRUMENT_VARIABLE((traits::exponent | traits::flag | traits::significand));
+   BOOST_MATH_INSTRUMENT_VARIABLE(a);
+
+   if(a <= traits::significand) {
+      if(a == 0)
+         return FP_ZERO;
+      else
+         return FP_SUBNORMAL;
+   }
+
+   if(a < traits::exponent) return FP_NORMAL;
+
+   a &= traits::significand;
+   if(a == 0) return FP_INFINITE;
+
+   return FP_NAN;
+}
+
+template<class T> 
+int fpclassify_imp BOOST_NO_MACRO_EXPAND(T x, ieee_copy_leading_bits_tag)
+{
+   typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+   BOOST_MATH_INSTRUMENT_VARIABLE(x);
+
+   BOOST_DEDUCED_TYPENAME traits::bits a;
+   traits::get_bits(x,a); 
+   a &= traits::exponent | traits::flag | traits::significand;
+
+   if(a <= traits::significand) {
+      if(x == 0)
+         return FP_ZERO;
+      else
+         return FP_SUBNORMAL;
+   }
+
+   if(a < traits::exponent) return FP_NORMAL;
+
+   a &= traits::significand;
+   traits::set_bits(x,a);
+   if(x == 0) return FP_INFINITE;
+
+   return FP_NAN;
+}
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+template <>
+inline int fpclassify_imp<long double> BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::fpclassify_imp(t, generic_tag<true>());
+}
+#endif
+
+}  // namespace detail
+
+template <class T>
+inline int fpclassify BOOST_NO_MACRO_EXPAND(T t)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+   if(std::numeric_limits<T>::is_specialized && detail::is_generic_tag_false(method()))
+      return detail::fpclassify_imp(t, detail::generic_tag<true>());
+   return detail::fpclassify_imp(t, method());
+#else
+   return detail::fpclassify_imp(t, method());
+#endif
+}
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline bool isfinite_impl(T x, native_tag const&)
+    {
+        return (std::isfinite)(x);
+    }
+#endif
+
+    template<class T> 
+    inline bool isfinite_impl(T x, generic_tag<true> const&)
+    {
+        return x >= -(std::numeric_limits<T>::max)()
+            && x <= (std::numeric_limits<T>::max)();
+    }
+
+    template<class T> 
+    inline bool isfinite_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isfinite_impl(x, mpl::true_());
+#endif
+       (void)x; // warning supression.
+       return true;
+    }
+
+    template<class T> 
+    inline bool isfinite_impl(T x, ieee_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent;
+        return a != traits::exponent;
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+template <>
+inline bool isfinite_impl<long double> BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isfinite_impl(t, generic_tag<true>());
+}
+#endif
+
+}
+
+template<class T> 
+inline bool (isfinite)(T x)
+{ //!< \brief return true if floating-point type t is finite.
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::isfinite_impl(x, method());
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline bool isnormal_impl(T x, native_tag const&)
+    {
+        return (std::isnormal)(x);
+    }
+#endif
+
+    template<class T> 
+    inline bool isnormal_impl(T x, generic_tag<true> const&)
+    {
+        if(x < 0) x = -x;
+        return x >= (std::numeric_limits<T>::min)()
+            && x <= (std::numeric_limits<T>::max)();
+    }
+
+    template<class T> 
+    inline bool isnormal_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isnormal_impl(x, mpl::true_());
+#endif
+       return !(x == 0);
+    }
+
+    template<class T> 
+    inline bool isnormal_impl(T x, ieee_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME detail::fp_traits<T>::type traits;
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::flag;
+        return (a != 0) && (a < traits::exponent);
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+template <>
+inline bool isnormal_impl<long double> BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isnormal_impl(t, generic_tag<true>());
+}
+#endif
+
+}
+
+template<class T> 
+inline bool (isnormal)(T x)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::isnormal_impl(x, method());
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline bool isinf_impl(T x, native_tag const&)
+    {
+        return (std::isinf)(x);
+    }
+#endif
+
+    template<class T> 
+    inline bool isinf_impl(T x, generic_tag<true> const&)
+    {
+        return std::numeric_limits<T>::has_infinity 
+            && ( x == std::numeric_limits<T>::infinity()
+                 || x == -std::numeric_limits<T>::infinity());
+    }
+
+    template<class T> 
+    inline bool isinf_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isinf_impl(x, mpl::true_());
+#endif
+        (void)x; // warning supression.
+        return false;
+    }
+
+    template<class T> 
+    inline bool isinf_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        return a == traits::exponent;
+    }
+
+    template<class T> 
+    inline bool isinf_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        if(a != traits::exponent)
+            return false;
+
+        traits::set_bits(x,0);
+        return x == 0;
+    }
+
+#if defined(BOOST_MATH_USE_STD_FPCLASSIFY) && defined(BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
+template <>
+inline bool isinf_impl<long double> BOOST_NO_MACRO_EXPAND(long double t, const native_tag&)
+{
+   return boost::math::detail::isinf_impl(t, generic_tag<true>());
+}
+#endif
+
+}   // namespace detail
+
+template<class T> 
+inline bool (isinf)(T x)
+{
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::isinf_impl(x, method());
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline bool isnan_impl(T x, native_tag const&)
+    {
+        return (std::isnan)(x);
+    }
+#endif
+
+    template<class T> 
+    inline bool isnan_impl(T x, generic_tag<true> const&)
+    {
+        return std::numeric_limits<T>::has_infinity
+            ? !(x <= std::numeric_limits<T>::infinity())
+            : x != x;
+    }
+
+    template<class T> 
+    inline bool isnan_impl(T x, generic_tag<false> const&)
+    {
+#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+      if(std::numeric_limits<T>::is_specialized)
+         return isnan_impl(x, mpl::true_());
+#endif
+        (void)x; // warning supression
+        return false;
+    }
+
+    template<class T> 
+    inline bool isnan_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        a &= traits::exponent | traits::significand;
+        return a > traits::exponent;
+    }
+
+    template<class T> 
+    inline bool isnan_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+
+        a &= traits::exponent | traits::significand;
+        if(a < traits::exponent)
+            return false;
+
+        a &= traits::significand;
+        traits::set_bits(x,a);
+        return x != 0;
+    }
+
+}   // namespace detail
+
+template<class T> bool (isnan)(T x)
+{ //!< \brief return true if floating-point type t is NaN (Not A Number).
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::isnan_impl(x, method());
+}
+
+#ifdef isnan
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<float>(float t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<double>(double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+template <> inline bool isnan BOOST_NO_MACRO_EXPAND<long double>(long double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
+#endif
+
+} // namespace math
+} // namespace boost
+
+#endif // BOOST_MATH_FPCLASSIFY_HPP
+
similarity index 90%
rename from deal.II/contrib/boost/include/boost/math/special_functions/gamma.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/gamma.hpp
index 04126bb626c61cfa9e3f8bc1052430a3716f8c75..abf8bbc110b0fb902d094ba8c9db13b86b64674a 100644 (file)
@@ -44,6 +44,7 @@
 #include <boost/assert.hpp>
 #include <boost/mpl/greater.hpp>
 #include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/greater.hpp>
 
 #include <boost/config/no_tr1/cmath.hpp>
 #include <algorithm>
@@ -148,7 +149,7 @@ T gamma_imp(T z, const Policy& pol, const L& l)
          return policies::raise_pole_error<T>(function, "Evaluation of tgamma at a negative integer %1%.", z, pol);
       if(z <= -20)
       {
-         result = gamma_imp(-z, pol, l) * sinpx(z);
+         result = gamma_imp(T(-z), pol, l) * sinpx(z);
          if((fabs(result) < 1) && (tools::max_value<T>() * fabs(result) < boost::math::constants::pi<T>()))
             return policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
          result = -boost::math::constants::pi<T>() / result;
@@ -236,13 +237,19 @@ T lgamma_imp(T z, const Policy& pol, const L& l, int* sign = 0)
    {
       typedef typename policies::precision<T, Policy>::type precision_type;
       typedef typename mpl::if_<
-         mpl::less_equal<precision_type, mpl::int_<64> >,
+         mpl::and_<
+            mpl::less_equal<precision_type, mpl::int_<64> >, 
+            mpl::greater<precision_type, mpl::int_<0> > 
+         >,
          mpl::int_<64>,
          typename mpl::if_<
-            mpl::less_equal<precision_type, mpl::int_<113> >,
+            mpl::and_<
+               mpl::less_equal<precision_type, mpl::int_<113> >,
+               mpl::greater<precision_type, mpl::int_<0> > 
+            >,
             mpl::int_<113>, mpl::int_<0> >::type
           >::type tag_type;
-      result = lgamma_small_imp(z, z - 1, z - 2, tag_type(), pol, l);
+      result = lgamma_small_imp<T>(z, z - 1, z - 2, tag_type(), pol, l);
    }
    else if((z >= 3) && (z < 100))
    {
@@ -289,13 +296,13 @@ public:
 };
 
 template <class T>
-inline T upper_gamma_fraction(T a, T z, int bits)
+inline T upper_gamma_fraction(T a, T z, T eps)
 {
    // Multiply result by z^a * e^-z to get the full
    // upper incomplete integral.  Divide by tgamma(z)
    // to normalise.
    upper_incomplete_gamma_fract<T> f(a, z);
-   return 1 / (z - a + 1 + boost::math::tools::continued_fraction_a(f, bits));
+   return 1 / (z - a + 1 + boost::math::tools::continued_fraction_a(f, eps));
 }
 
 template <class T>
@@ -317,20 +324,15 @@ public:
 };
 
 template <class T, class Policy>
-inline T lower_gamma_series(T a, T z, const Policy& pol)
+inline T lower_gamma_series(T a, T z, const Policy& pol, T init_value = 0)
 {
    // Multiply result by ((z^a) * (e^-z) / a) to get the full
    // lower incomplete integral. Then divide by tgamma(a)
    // to get the normalised value.
    lower_incomplete_gamma_series<T> s(a, z);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-   int bits = policies::digits<T, Policy>();
-#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
-   T zero = 0;
-   T result = boost::math::tools::sum_series(s, bits, max_iter, zero);
-#else
-   T result = boost::math::tools::sum_series(s, bits, max_iter);
-#endif
+   T factor = policies::get_epsilon<T, Policy>();
+   T result = boost::math::tools::sum_series(s, factor, max_iter, init_value);
    policies::check_series_iterations("boost::math::detail::lower_gamma_series<%1%>(%1%)", max_iter, pol);
    return result;
 }
@@ -380,7 +382,7 @@ T gamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos& l)
       BOOST_MATH_INSTRUMENT_CODE(prefix);
       T sum = detail::lower_gamma_series(z, z, pol) / z;
       BOOST_MATH_INSTRUMENT_CODE(sum);
-      sum += detail::upper_gamma_fraction(z, z, ::boost::math::policies::digits<T, Policy>());
+      sum += detail::upper_gamma_fraction(z, z, ::boost::math::policies::get_epsilon<T, Policy>());
       BOOST_MATH_INSTRUMENT_CODE(sum);
       if(fabs(tools::max_value<T>() / prefix) < fabs(sum))
          return policies::raise_overflow_error<T>(function, "Result of tgamma is too large to represent.", pol);
@@ -419,7 +421,7 @@ T lgamma_imp(T z, const Policy& pol, const lanczos::undefined_lanczos& l, int*si
       T limit = (std::max)(z+1, T(10));
       T prefix = z * log(limit) - limit;
       T sum = detail::lower_gamma_series(z, limit, pol) / z;
-      sum += detail::upper_gamma_fraction(z, limit, ::boost::math::policies::digits<T, Policy>());
+      sum += detail::upper_gamma_fraction(z, limit, ::boost::math::policies::get_epsilon<T, Policy>());
       result = log(sum) + prefix;
    }
    if(sign)
@@ -465,7 +467,7 @@ T tgammap1m1_imp(T dz, Policy const& pol, const L& l)
       {
          // Use expm1 on lgamma:
          result = boost::math::expm1(-boost::math::log1p(dz, pol) 
-            + lgamma_small_imp(dz+2, dz + 1, dz, tag_type(), pol, l));
+            + lgamma_small_imp<T>(dz+2, dz + 1, dz, tag_type(), pol, l));
          BOOST_MATH_INSTRUMENT_CODE(result);
       }
    }
@@ -474,7 +476,7 @@ T tgammap1m1_imp(T dz, Policy const& pol, const L& l)
       if(dz < 2)
       {
          // Use expm1 on lgamma:
-         result = boost::math::expm1(lgamma_small_imp(dz+1, dz, dz-1, tag_type(), pol, l), pol);
+         result = boost::math::expm1(lgamma_small_imp<T>(dz+1, dz, dz-1, tag_type(), pol, l), pol);
          BOOST_MATH_INSTRUMENT_CODE(result);
       }
       else
@@ -684,7 +686,7 @@ T regularised_gamma_prefix(T a, T z, const Policy& pol, const lanczos::undefined
 
    T limit = (std::max)(T(10), a);
    T sum = detail::lower_gamma_series(a, limit, pol) / a;
-   sum += detail::upper_gamma_fraction(a, limit, ::boost::math::policies::digits<T, Policy>());
+   sum += detail::upper_gamma_fraction(a, limit, ::boost::math::policies::get_epsilon<T, Policy>());
 
    if(a < 10)
    {
@@ -726,37 +728,43 @@ T regularised_gamma_prefix(T a, T z, const Policy& pol, const lanczos::undefined
 // Upper gamma fraction for very small a:
 //
 template <class T, class Policy>
-inline T tgamma_small_upper_part(T a, T x, const Policy& pol)
+inline T tgamma_small_upper_part(T a, T x, const Policy& pol, T* pgam = 0, bool invert = false, T* pderivative = 0)
 {
    BOOST_MATH_STD_USING  // ADL of std functions.
    //
    // Compute the full upper fraction (Q) when a is very small:
    //
    T result;
-   result = boost::math::tgamma1pm1(a, pol) - boost::math::powm1(x, a, pol);
+   result = boost::math::tgamma1pm1(a, pol);
+   if(pgam)
+      *pgam = (result + 1) / a;
+   T p = boost::math::powm1(x, a, pol);
+   result -= p;
    result /= a;
    detail::small_gamma2_series<T> s(a, x);
-   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
-#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
-   T zero = 0;
-   result -= pow(x, a) * tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter, zero);
-#else
-   result -= pow(x, a) * tools::sum_series(s, boost::math::policies::digits<T, Policy>(), max_iter);
-#endif
+   boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>() - 10;
+   p += 1;
+   if(pderivative)
+      *pderivative = p / (*pgam * exp(x));
+   T init_value = invert ? *pgam : 0;
+   result = -p * tools::sum_series(s, boost::math::policies::get_epsilon<T, Policy>(), max_iter, (init_value - result) / p);
    policies::check_series_iterations("boost::math::tgamma_small_upper_part<%1%>(%1%, %1%)", max_iter, pol);
+   if(invert)
+      result = -result;
    return result;
 }
 //
 // Upper gamma fraction for integer a:
 //
-template <class T>
-inline T finite_gamma_q(T a, T x)
+template <class T, class Policy>
+inline T finite_gamma_q(T a, T x, Policy const& pol, T* pderivative = 0)
 {
    //
    // Calculates normalised Q when a is an integer:
    //
    BOOST_MATH_STD_USING
-   T sum = exp(-x);
+   T e = exp(-x);
+   T sum = e;
    if(sum != 0)
    {
       T term = sum;
@@ -767,6 +775,10 @@ inline T finite_gamma_q(T a, T x)
          sum += term;
       }
    }
+   if(pderivative)
+   {
+      *pderivative = e * pow(x, a) / boost::math::unchecked_factorial<T>(itrunc(T(a - 1), pol));
+   }
    return sum;
 }
 //
@@ -827,30 +839,32 @@ T gamma_incomplete_imp(T a, T x, bool normalised, bool invert,
 
    BOOST_ASSERT((p_derivative == 0) || (normalised == true));
 
-   bool is_int = floor(a) == a;
-   bool is_half_int = (floor(2 * a) == 2 * a) && !is_int;
+   bool is_int, is_half_int;
    bool is_small_a = (a < 30) && (a <= x + 1);
+   if(is_small_a)
+   {
+      T fa = floor(a);
+      is_int = (fa == a);
+      is_half_int = is_int ? false : (fabs(fa - a) == 0.5f);
+   }
+   else
+   {
+      is_int = is_half_int = false;
+   }
+
+   int eval_method;
    
-   if(is_int && is_small_a && (x > 0.6))
+   if(is_int && (x > 0.6))
    {
       // calculate Q via finite sum:
       invert = !invert;
-      result = finite_gamma_q(a, x);
-      if(normalised == false)
-         result *= boost::math::tgamma(a, pol);
-      // TODO: calculate derivative inside sum:
-      if(p_derivative)
-         *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+      eval_method = 0;
    }
-   else if(is_half_int && is_small_a && (x > 0.2))
+   else if(is_half_int && (x > 0.2))
    {
       // calculate Q via finite sum for half integer a:
       invert = !invert;
-      result = finite_half_gamma_q(a, x, p_derivative, pol);
-      if(normalised == false)
-         result *= boost::math::tgamma(a, pol);
-      if(p_derivative && (*p_derivative == 0))
-         *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+      eval_method = 1;
    }
    else if(x < 0.5)
    {
@@ -859,47 +873,25 @@ T gamma_incomplete_imp(T a, T x, bool normalised, bool invert,
       //
       if(-0.4 / log(x) < a)
       {
-         // Compute P:
-         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
-         if(p_derivative)
-            *p_derivative = result;
-         if(result != 0)
-            result *= detail::lower_gamma_series(a, x, pol) / a;
+         eval_method = 2;
       }
       else
       {
-         // Compute Q:
-         invert = !invert;
-         result = tgamma_small_upper_part(a, x, pol);
-         if(normalised)
-            result /= boost::math::tgamma(a, pol);
-         if(p_derivative)
-            *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         eval_method = 3;
       }
    }
    else if(x < 1.1)
    {
       //
-      // Changover here occurs when P ~ 0.6 or Q ~ 0.4:
+      // Changover here occurs when P ~ 0.75 or Q ~ 0.25:
       //
-      if(x * 1.1f < a)
+      if(x * 0.75f < a)
       {
-         // Compute P:
-         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
-         if(p_derivative)
-            *p_derivative = result;
-         if(result != 0)
-            result *= detail::lower_gamma_series(a, x, pol) / a;
+         eval_method = 2;
       }
       else
       {
-         // Compute Q:
-         invert = !invert;
-         result = tgamma_small_upper_part(a, x, pol);
-         if(normalised)
-            result /= boost::math::tgamma(a, pol);
-         if(p_derivative)
-            *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         eval_method = 3;
       }
    }
    else
@@ -936,6 +928,93 @@ T gamma_incomplete_imp(T a, T x, bool normalised, bool invert,
          }
       }
       if(use_temme)
+      {
+         eval_method = 5;
+      }
+      else
+      {
+         //
+         // Regular case where the result will not be too close to 0.5.
+         //
+         // Changeover here occurs at P ~ Q ~ 0.5
+         // Note that series computation of P is about x2 faster than continued fraction
+         // calculation of Q, so try and use the CF only when really necessary, especially
+         // for small x.
+         //
+         if(x - (1 / (3 * x)) < a)
+         {
+            eval_method = 2;
+         }
+         else
+         {
+            eval_method = 4;
+            invert = !invert;
+         }
+      }
+   }
+
+   switch(eval_method)
+   {
+   case 0:
+      {
+         result = finite_gamma_q(a, x, pol, p_derivative);
+         if(normalised == false)
+            result *= boost::math::tgamma(a, pol);
+         break;
+      }
+   case 1:
+      {
+         result = finite_half_gamma_q(a, x, p_derivative, pol);
+         if(normalised == false)
+            result *= boost::math::tgamma(a, pol);
+         if(p_derivative && (*p_derivative == 0))
+            *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         break;
+      }
+   case 2:
+      {
+         // Compute P:
+         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
+         if(p_derivative)
+            *p_derivative = result;
+         if(result != 0)
+         {
+            T init_value = 0;
+            if(invert)
+            {
+               init_value = -a * (normalised ? 1 : boost::math::tgamma(a, pol)) / result;
+            }
+            result *= detail::lower_gamma_series(a, x, pol, init_value) / a;
+            if(invert)
+            {
+               invert = false;
+               result = -result;
+            }
+         }
+         break;
+      }
+   case 3:
+      {
+         // Compute Q:
+         invert = !invert;
+         T g;
+         result = tgamma_small_upper_part(a, x, pol, &g, invert, p_derivative);
+         invert = false;
+         if(normalised)
+            result /= g;
+         break;
+      }
+   case 4:
+      {
+         // Compute Q:
+         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
+         if(p_derivative)
+            *p_derivative = result;
+         if(result != 0)
+            result *= upper_gamma_fraction(a, x, policies::get_epsilon<T, Policy>());
+         break;
+      }
+   case 5:
       {
          //
          // Use compile time dispatch to the appropriate
@@ -967,33 +1046,12 @@ T gamma_incomplete_imp(T a, T x, bool normalised, bool invert,
             invert = !invert;
          if(p_derivative)
             *p_derivative = regularised_gamma_prefix(a, x, pol, lanczos_type());
+         break;
       }
-      else
-      {
-         //
-         // Regular case where the result will not be too close to 0.5.
-         //
-         // Changeover here occurs at P ~ Q ~ 0.5
-         //
-         result = normalised ? regularised_gamma_prefix(a, x, pol, lanczos_type()) : full_igamma_prefix(a, x, pol);
-         if(p_derivative)
-            *p_derivative = result;
-         if(x < a)
-         {
-            // Compute P:
-            if(result != 0)
-               result *= detail::lower_gamma_series(a, x, pol) / a;
          }
-         else
-         {
-            // Compute Q:
-            invert = !invert;
-            if(result != 0)
-               result *= upper_gamma_fraction(a, x, policies::digits<T, Policy>());
-         }
-      }
-   }
 
+   if(normalised && (result > 1))
+      result = 1;
    if(invert)
    {
       T gam = normalised ? 1 : boost::math::tgamma(a, pol);
@@ -1068,9 +1126,9 @@ T tgamma_delta_ratio_imp_lanczos(T z, T delta, const Policy& pol, const lanczos:
    }
    prefix *= pow(constants::e<T>() / zd, delta);
    T sum = detail::lower_gamma_series(z, z, pol) / z;
-   sum += detail::upper_gamma_fraction(z, z, ::boost::math::policies::digits<T, Policy>());
+   sum += detail::upper_gamma_fraction(z, z, ::boost::math::policies::get_epsilon<T, Policy>());
    T sumd = detail::lower_gamma_series(zd, zd, pol) / zd;
-   sumd += detail::upper_gamma_fraction(zd, zd, ::boost::math::policies::digits<T, Policy>());
+   sumd += detail::upper_gamma_fraction(zd, zd, ::boost::math::policies::get_epsilon<T, Policy>());
    sum /= sumd;
    if(fabs(tools::max_value<T>() / prefix) < fabs(sum))
       return policies::raise_overflow_error<T>("boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)", "Result of tgamma is too large to represent.", pol);
@@ -1097,7 +1155,7 @@ T tgamma_delta_ratio_imp(T z, T delta, const Policy& pol)
          //
          if((z <= max_factorial<T>::value) && (z + delta <= max_factorial<T>::value))
          {
-            return unchecked_factorial<T>((unsigned)itrunc(z, pol) - 1) / unchecked_factorial<T>((unsigned)itrunc(z + delta) - 1);
+            return unchecked_factorial<T>((unsigned)itrunc(z, pol) - 1) / unchecked_factorial<T>((unsigned)itrunc(T(z + delta), pol) - 1);
          }
       }
       if(fabs(delta) < 20)
@@ -1187,7 +1245,7 @@ inline typename tools::promote_args<T>::type
 
 template <class T1, class T2, class Policy>
 inline typename tools::promote_args<T1, T2>::type
-   tgamma(T1 a, T2 z, const Policy& pol, const mpl::false_)
+   tgamma(T1 a, T2 z, const Policy&, const mpl::false_)
 {
    BOOST_FPU_EXCEPTION_GUARD
    typedef typename tools::promote_args<T1, T2>::type result_type;
@@ -1223,7 +1281,7 @@ inline typename tools::promote_args<T>::type
 
 template <class T, class Policy>
 inline typename tools::promote_args<T>::type 
-   lgamma(T z, int* sign, const Policy& pol)
+   lgamma(T z, int* sign, const Policy&)
 {
    BOOST_FPU_EXCEPTION_GUARD
    typedef typename tools::promote_args<T>::type result_type;
@@ -1309,7 +1367,7 @@ inline typename tools::promote_args<T1, T2>::type
 //
 template <class T1, class T2, class Policy>
 inline typename tools::promote_args<T1, T2>::type
-   tgamma_lower(T1 a, T2 z, const Policy& pol)
+   tgamma_lower(T1 a, T2 z, const Policy&)
 {
    BOOST_FPU_EXCEPTION_GUARD
    typedef typename tools::promote_args<T1, T2>::type result_type;
@@ -1367,7 +1425,7 @@ inline typename tools::promote_args<T1, T2>::type
 //
 template <class T1, class T2, class Policy>
 inline typename tools::promote_args<T1, T2>::type
-   gamma_p(T1 a, T2 z, const Policy& pol)
+   gamma_p(T1 a, T2 z, const Policy&)
 {
    BOOST_FPU_EXCEPTION_GUARD
    typedef typename tools::promote_args<T1, T2>::type result_type;
@@ -1417,7 +1475,7 @@ inline typename tools::promote_args<T1, T2>::type
 }
 template <class T1, class T2, class Policy>
 inline typename tools::promote_args<T1, T2>::type 
-   tgamma_ratio(T1 a, T2 b, const Policy& pol)
+   tgamma_ratio(T1 a, T2 b, const Policy&)
 {
    typedef typename tools::promote_args<T1, T2>::type result_type;
    typedef typename policies::evaluation<result_type, Policy>::type value_type;
@@ -1428,7 +1486,7 @@ inline typename tools::promote_args<T1, T2>::type
       policies::discrete_quantile<>,
       policies::assert_undefined<> >::type forwarding_policy;
 
-   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::tgamma_delta_ratio_imp(static_cast<value_type>(a), static_cast<value_type>(b) - static_cast<value_type>(a), forwarding_policy()), "boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)");
+   return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::tgamma_delta_ratio_imp(static_cast<value_type>(a), static_cast<value_type>(static_cast<value_type>(b) - static_cast<value_type>(a)), forwarding_policy()), "boost::math::tgamma_delta_ratio<%1%>(%1%, %1%)");
 }
 template <class T1, class T2>
 inline typename tools::promote_args<T1, T2>::type 
@@ -1439,7 +1497,7 @@ inline typename tools::promote_args<T1, T2>::type
 
 template <class T1, class T2, class Policy>
 inline typename tools::promote_args<T1, T2>::type 
-   gamma_p_derivative(T1 a, T2 x, const Policy& pol)
+   gamma_p_derivative(T1 a, T2 x, const Policy&)
 {
    BOOST_FPU_EXCEPTION_GUARD
    typedef typename tools::promote_args<T1, T2>::type result_type;
similarity index 92%
rename from deal.II/contrib/boost/include/boost/math/special_functions/lanczos.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/lanczos.hpp
index d852ee3903b10b365251b848cff29947d806f3b7..3a10838db33920a55ad6d4595a532132c13ed614 100644 (file)
@@ -431,28 +431,28 @@ struct lanczos22 : public mpl::int_<120>
          static_cast<T>(2.50662827463100050241576528481104525333L)
       };
       static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[22] = {
-         (0uLL),
-         (2432902008176640000uLL),
-         (8752948036761600000uLL),
-         (13803759753640704000uLL),
-         (12870931245150988800uLL),
-         (8037811822645051776uLL),
-         (3599979517947607200uLL),
-         (1206647803780373360uLL),
-         (311333643161390640uLL),
-         (63030812099294896uLL),
-         (10142299865511450uLL),
-         (1307535010540395uLL),
-         (135585182899530uLL),
-         (11310276995381uLL),
-         (756111184500uLL),
-         (40171771630uLL),
-         (1672280820uLL),
-         (53327946uLL),
-         (1256850uLL),
-         (20615uLL),
-         (210uLL),
-         (1uLL)
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2432902008176640000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8752948036761600000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(13803759753640704000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(12870931245150988800, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8037811822645051776, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(3599979517947607200, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1206647803780373360, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(311333643161390640, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(63030812099294896, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(10142299865511450, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307535010540395, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(135585182899530, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(11310276995381, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(756111184500, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(40171771630, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1672280820, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(53327946, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1256850, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(20615, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(210, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
       };
       return boost::math::tools::evaluate_rational(num, denom, z);
    }
@@ -485,28 +485,28 @@ struct lanczos22 : public mpl::int_<120>
          static_cast<T>(0.3765495513732730583386223384116545391759e-9L)
       };
       static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[22] = {
-         (0uLL),
-         (2432902008176640000uLL),
-         (8752948036761600000uLL),
-         (13803759753640704000uLL),
-         (12870931245150988800uLL),
-         (8037811822645051776uLL),
-         (3599979517947607200uLL),
-         (1206647803780373360uLL),
-         (311333643161390640uLL),
-         (63030812099294896uLL),
-         (10142299865511450uLL),
-         (1307535010540395uLL),
-         (135585182899530uLL),
-         (11310276995381uLL),
-         (756111184500uLL),
-         (40171771630uLL),
-         (1672280820uLL),
-         (53327946uLL),
-         (1256850uLL),
-         (20615uLL),
-         (210uLL),
-         (1uLL)
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2432902008176640000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8752948036761600000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(13803759753640704000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(12870931245150988800, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8037811822645051776, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(3599979517947607200, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1206647803780373360, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(311333643161390640, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(63030812099294896, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(10142299865511450, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307535010540395, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(135585182899530, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(11310276995381, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(756111184500, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(40171771630, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1672280820, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(53327946, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1256850, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(20615, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(210, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
       };
       return boost::math::tools::evaluate_rational(num, denom, z);
    }
@@ -849,23 +849,23 @@ struct lanczos17m64 : public mpl::int_<64>
          static_cast<T>(2.50662827463100050241576877135758834683L)
       };
       static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[17] = {
-         (0uLL),
-         (1307674368000uLL),
-         (4339163001600uLL),
-         (6165817614720uLL),
-         (5056995703824uLL),
-         (2706813345600uLL),
-         (1009672107080uLL),
-         (272803210680uLL),
-         (54631129553uLL),
-         (8207628000uLL),
-         (928095740uLL),
-         (78558480uLL),
-         (4899622uLL),
-         (218400uLL),
-         (6580uLL),
-         (120uLL),
-         (1uLL)
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307674368000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4339163001600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6165817614720, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(5056995703824, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2706813345600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1009672107080, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(272803210680, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(54631129553, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8207628000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(928095740, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(78558480, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4899622, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(218400, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6580, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(120, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
       };
       return boost::math::tools::evaluate_rational(num, denom, z);
    }
@@ -893,23 +893,23 @@ struct lanczos17m64 : public mpl::int_<64>
          static_cast<T>(0.1229541408909435212800785616808830746135e-4L)
       };
       static const BOOST_MATH_INT_TABLE_TYPE(T, boost::uint64_t) denom[17] = {
-         (0uLL),
-         (1307674368000uLL),
-         (4339163001600uLL),
-         (6165817614720uLL),
-         (5056995703824uLL),
-         (2706813345600uLL),
-         (1009672107080uLL),
-         (272803210680uLL),
-         (54631129553uLL),
-         (8207628000uLL),
-         (928095740uLL),
-         (78558480uLL),
-         (4899622uLL),
-         (218400uLL),
-         (6580uLL),
-         (120uLL),
-         (1uLL)
+         BOOST_MATH_INT_VALUE_SUFFIX(0, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1307674368000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4339163001600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6165817614720, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(5056995703824, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(2706813345600, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1009672107080, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(272803210680, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(54631129553, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(8207628000, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(928095740, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(78558480, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(4899622, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(218400, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(6580, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(120, uLL),
+         BOOST_MATH_INT_VALUE_SUFFIX(1, uLL)
       };
       return boost::math::tools::evaluate_rational(num, denom, z);
    }
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/special_functions/log1p.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/log1p.hpp
index 28fd487408db0bc076f55d68c52d9e1d3fb1ac98..29f224b81fd8ecf9d64c2aea5de32cc73afc4a01 100644 (file)
@@ -86,7 +86,7 @@ T log1p_imp(T const & x, const Policy& pol, const mpl::int_<0>&)
          function, 0, pol);
 
    result_type a = abs(result_type(x));
-   if(a > result_type(0.5L))
+   if(a > result_type(0.5f))
       return log(1 + result_type(x));
    // Note that without numeric_limits specialisation support, 
    // epsilon just returns zero, and our "optimisation" will always fail:
@@ -95,10 +95,10 @@ T log1p_imp(T const & x, const Policy& pol, const mpl::int_<0>&)
    detail::log1p_series<result_type> s(x);
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) && !BOOST_WORKAROUND(__EDG_VERSION__, <= 245)
-   result_type result = tools::sum_series(s, policies::digits<result_type, Policy>(), max_iter);
+   result_type result = tools::sum_series(s, policies::get_epsilon<result_type, Policy>(), max_iter);
 #else
    result_type zero = 0;
-   result_type result = tools::sum_series(s, policies::digits<result_type, Policy>(), max_iter, zero);
+   result_type result = tools::sum_series(s, policies::get_epsilon<result_type, Policy>(), max_iter, zero);
 #endif
    policies::check_series_iterations(function, max_iter, pol);
    return result;
@@ -316,9 +316,7 @@ inline long double log1p(long double z)
 #endif
 
 #if defined(BOOST_HAS_LOG1P) && !(defined(__osf__) && defined(__DECCXX_VER))
-#  if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)) \
-   || ((defined(linux) || defined(__linux) || defined(__linux__)) && !defined(__SUNPRO_CC)) \
-   || (defined(__hpux) && !defined(__hppa))
+#  ifdef BOOST_MATH_USE_C99
 template <class Policy>
 inline float log1p(float x, const Policy& pol)
 { 
@@ -386,7 +384,7 @@ inline double log1p(double x, const Policy& pol)
    if(u == 1.0) 
       return x; 
    else
-      return log(u)*(x/(u-1.0));
+      return ::log(u)*(x/(u-1.0));
 }
 template <class Policy>
 inline float log1p(float x, const Policy& pol)
@@ -406,7 +404,7 @@ inline long double log1p(long double x, const Policy& pol)
    if(u == 1.0) 
       return x; 
    else
-      return log(u)*(x/(u-1.0));
+      return ::logl(u)*(x/(u-1.0));
 }
 #endif
 
@@ -434,7 +432,7 @@ inline typename tools::promote_args<T>::type
          function, 0, pol);
 
    result_type a = abs(result_type(x));
-   if(a > result_type(0.95L))
+   if(a > result_type(0.95f))
       return log(1 + result_type(x)) - result_type(x);
    // Note that without numeric_limits specialisation support, 
    // epsilon just returns zero, and our "optimisation" will always fail:
@@ -445,9 +443,9 @@ inline typename tools::promote_args<T>::type
    boost::uintmax_t max_iter = policies::get_max_series_iterations<Policy>();
 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
    T zero = 0;
-   T result = boost::math::tools::sum_series(s, policies::digits<T, Policy>(), max_iter, zero);
+   T result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter, zero);
 #else
-   T result = boost::math::tools::sum_series(s, policies::digits<T, Policy>(), max_iter);
+   T result = boost::math::tools::sum_series(s, policies::get_epsilon<T, Policy>(), max_iter);
 #endif
    policies::check_series_iterations(function, max_iter, pol);
    return result;
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/special_functions/math_fwd.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/math_fwd.hpp
index 1af0992ca5d489e0d7c9a66ce413344b41037d74..d25181eb243ced9bbc5dc9412732f35166f3b25e 100644 (file)
@@ -1049,6 +1049,7 @@ namespace boost
    template <class T> T float_prior(const T& a){ return boost::math::float_prior(a, Policy()); }\
    template <class T> T float_distance(const T& a, const T& b){ return boost::math::float_distance(a, b, Policy()); }\
 
+
 #endif // BOOST_MATH_SPECIAL_MATH_FWD_HPP
 
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/math/special_functions/next.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/next.hpp
index a79b05fa03a477f871a4ba99ab5a40d56ad026d0..dd44e513999be24d72cd4f4d7245820be52a4782 100644 (file)
@@ -13,6 +13,7 @@
 #include <boost/math/policies/error_handling.hpp>
 #include <boost/math/special_functions/fpclassify.hpp>
 #include <boost/math/special_functions/sign.hpp>
+#include <boost/math/special_functions/trunc.hpp>
 
 #ifdef BOOST_MSVC
 #include <float.h>
@@ -183,18 +184,18 @@ T float_distance(const T& a, const T& b, const Policy& pol)
    if(a == b)
       return 0;
    if(a == 0)
-      return 1 + fabs(float_distance(boost::math::sign(b) * detail::get_smallest_value<T>(), b, pol));
+      return 1 + fabs(float_distance(static_cast<T>(boost::math::sign(b) * detail::get_smallest_value<T>()), b, pol));
    if(b == 0)
-      return 1 + fabs(float_distance(boost::math::sign(a) * detail::get_smallest_value<T>(), a, pol));
+      return 1 + fabs(float_distance(static_cast<T>(boost::math::sign(a) * detail::get_smallest_value<T>()), a, pol));
    if(boost::math::sign(a) != boost::math::sign(b))
-      return 2 + fabs(float_distance(boost::math::sign(b) * detail::get_smallest_value<T>(), b, pol))
-         + fabs(float_distance(boost::math::sign(a) * detail::get_smallest_value<T>(), a, pol));
+      return 2 + fabs(float_distance(static_cast<T>(boost::math::sign(b) * detail::get_smallest_value<T>()), b, pol))
+         + fabs(float_distance(static_cast<T>(boost::math::sign(a) * detail::get_smallest_value<T>()), a, pol));
    //
    // By the time we get here, both a and b must have the same sign, we want
    // b > a and both postive for the following logic:
    //
    if(a < 0)
-      return float_distance(-b, -a);
+      return float_distance(static_cast<T>(-b), static_cast<T>(-a));
 
    BOOST_ASSERT(a >= 0);
    BOOST_ASSERT(b >= a);
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/prime.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/prime.hpp
new file mode 100644 (file)
index 0000000..5f10aa3
--- /dev/null
@@ -0,0 +1,1214 @@
+// Copyright 2008 John Maddock
+//
+// 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)
+
+#include <boost/array.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/math/policies/error_handling.hpp>
+
+namespace boost{ namespace math{
+
+   template <class Policy>
+   boost::uint32_t prime(unsigned n, const Policy& pol)
+   {
+      //
+      // This is basically three big tables which together
+      // occupy 19946 bytes, we use the smallest type which
+      // will handle each value, and store the final set of 
+      // values in a uint16_t with the values offset by 0xffff.
+      // That gives us the first 10000 primes with the largest
+      // being 104729:
+      //
+      static const unsigned b1 = 53;
+      static const unsigned b2 = 6541;
+      static const unsigned b3 = 10000;
+      static const boost::array<unsigned char, 54> a1 = {
+         2u, 3u, 5u, 7u, 11u, 13u, 17u, 19u, 23u, 29u, 31u, 
+         37u, 41u, 43u, 47u, 53u, 59u, 61u, 67u, 71u, 73u, 
+         79u, 83u, 89u, 97u, 101u, 103u, 107u, 109u, 113u, 
+         127u, 131u, 137u, 139u, 149u, 151u, 157u, 163u, 
+         167u, 173u, 179u, 181u, 191u, 193u, 197u, 199u, 
+         211u, 223u, 227u, 229u, 233u, 239u, 241u, 251u
+      };
+      static const boost::array<boost::uint16_t, 6488> a2 = {
+         257u, 263u, 269u, 271u, 277u, 281u, 283u, 293u, 
+         307u, 311u, 313u, 317u, 331u, 337u, 347u, 349u, 353u, 
+         359u, 367u, 373u, 379u, 383u, 389u, 397u, 401u, 409u, 
+         419u, 421u, 431u, 433u, 439u, 443u, 449u, 457u, 461u, 
+         463u, 467u, 479u, 487u, 491u, 499u, 503u, 509u, 521u, 
+         523u, 541u, 547u, 557u, 563u, 569u, 571u, 577u, 587u, 
+         593u, 599u, 601u, 607u, 613u, 617u, 619u, 631u, 641u, 
+         643u, 647u, 653u, 659u, 661u, 673u, 677u, 683u, 691u, 
+         701u, 709u, 719u, 727u, 733u, 739u, 743u, 751u, 757u, 
+         761u, 769u, 773u, 787u, 797u, 809u, 811u, 821u, 823u, 
+         827u, 829u, 839u, 853u, 857u, 859u, 863u, 877u, 881u, 
+         883u, 887u, 907u, 911u, 919u, 929u, 937u, 941u, 947u, 
+         953u, 967u, 971u, 977u, 983u, 991u, 997u, 1009u, 1013u, 
+         1019u, 1021u, 1031u, 1033u, 1039u, 1049u, 1051u, 1061u, 1063u, 
+         1069u, 1087u, 1091u, 1093u, 1097u, 1103u, 1109u, 1117u, 1123u, 
+         1129u, 1151u, 1153u, 1163u, 1171u, 1181u, 1187u, 1193u, 1201u, 
+         1213u, 1217u, 1223u, 1229u, 1231u, 1237u, 1249u, 1259u, 1277u, 
+         1279u, 1283u, 1289u, 1291u, 1297u, 1301u, 1303u, 1307u, 1319u, 
+         1321u, 1327u, 1361u, 1367u, 1373u, 1381u, 1399u, 1409u, 1423u, 
+         1427u, 1429u, 1433u, 1439u, 1447u, 1451u, 1453u, 1459u, 1471u, 
+         1481u, 1483u, 1487u, 1489u, 1493u, 1499u, 1511u, 1523u, 1531u, 
+         1543u, 1549u, 1553u, 1559u, 1567u, 1571u, 1579u, 1583u, 1597u, 
+         1601u, 1607u, 1609u, 1613u, 1619u, 1621u, 1627u, 1637u, 1657u, 
+         1663u, 1667u, 1669u, 1693u, 1697u, 1699u, 1709u, 1721u, 1723u, 
+         1733u, 1741u, 1747u, 1753u, 1759u, 1777u, 1783u, 1787u, 1789u, 
+         1801u, 1811u, 1823u, 1831u, 1847u, 1861u, 1867u, 1871u, 1873u, 
+         1877u, 1879u, 1889u, 1901u, 1907u, 1913u, 1931u, 1933u, 1949u, 
+         1951u, 1973u, 1979u, 1987u, 1993u, 1997u, 1999u, 2003u, 2011u, 
+         2017u, 2027u, 2029u, 2039u, 2053u, 2063u, 2069u, 2081u, 2083u, 
+         2087u, 2089u, 2099u, 2111u, 2113u, 2129u, 2131u, 2137u, 2141u, 
+         2143u, 2153u, 2161u, 2179u, 2203u, 2207u, 2213u, 2221u, 2237u, 
+         2239u, 2243u, 2251u, 2267u, 2269u, 2273u, 2281u, 2287u, 2293u, 
+         2297u, 2309u, 2311u, 2333u, 2339u, 2341u, 2347u, 2351u, 2357u, 
+         2371u, 2377u, 2381u, 2383u, 2389u, 2393u, 2399u, 2411u, 2417u, 
+         2423u, 2437u, 2441u, 2447u, 2459u, 2467u, 2473u, 2477u, 2503u, 
+         2521u, 2531u, 2539u, 2543u, 2549u, 2551u, 2557u, 2579u, 2591u, 
+         2593u, 2609u, 2617u, 2621u, 2633u, 2647u, 2657u, 2659u, 2663u, 
+         2671u, 2677u, 2683u, 2687u, 2689u, 2693u, 2699u, 2707u, 2711u, 
+         2713u, 2719u, 2729u, 2731u, 2741u, 2749u, 2753u, 2767u, 2777u, 
+         2789u, 2791u, 2797u, 2801u, 2803u, 2819u, 2833u, 2837u, 2843u, 
+         2851u, 2857u, 2861u, 2879u, 2887u, 2897u, 2903u, 2909u, 2917u, 
+         2927u, 2939u, 2953u, 2957u, 2963u, 2969u, 2971u, 2999u, 3001u, 
+         3011u, 3019u, 3023u, 3037u, 3041u, 3049u, 3061u, 3067u, 3079u, 
+         3083u, 3089u, 3109u, 3119u, 3121u, 3137u, 3163u, 3167u, 3169u, 
+         3181u, 3187u, 3191u, 3203u, 3209u, 3217u, 3221u, 3229u, 3251u, 
+         3253u, 3257u, 3259u, 3271u, 3299u, 3301u, 3307u, 3313u, 3319u, 
+         3323u, 3329u, 3331u, 3343u, 3347u, 3359u, 3361u, 3371u, 3373u, 
+         3389u, 3391u, 3407u, 3413u, 3433u, 3449u, 3457u, 3461u, 3463u, 
+         3467u, 3469u, 3491u, 3499u, 3511u, 3517u, 3527u, 3529u, 3533u, 
+         3539u, 3541u, 3547u, 3557u, 3559u, 3571u, 3581u, 3583u, 3593u, 
+         3607u, 3613u, 3617u, 3623u, 3631u, 3637u, 3643u, 3659u, 3671u, 
+         3673u, 3677u, 3691u, 3697u, 3701u, 3709u, 3719u, 3727u, 3733u, 
+         3739u, 3761u, 3767u, 3769u, 3779u, 3793u, 3797u, 3803u, 3821u, 
+         3823u, 3833u, 3847u, 3851u, 3853u, 3863u, 3877u, 3881u, 3889u, 
+         3907u, 3911u, 3917u, 3919u, 3923u, 3929u, 3931u, 3943u, 3947u, 
+         3967u, 3989u, 4001u, 4003u, 4007u, 4013u, 4019u, 4021u, 4027u, 
+         4049u, 4051u, 4057u, 4073u, 4079u, 4091u, 4093u, 4099u, 4111u, 
+         4127u, 4129u, 4133u, 4139u, 4153u, 4157u, 4159u, 4177u, 4201u, 
+         4211u, 4217u, 4219u, 4229u, 4231u, 4241u, 4243u, 4253u, 4259u, 
+         4261u, 4271u, 4273u, 4283u, 4289u, 4297u, 4327u, 4337u, 4339u, 
+         4349u, 4357u, 4363u, 4373u, 4391u, 4397u, 4409u, 4421u, 4423u, 
+         4441u, 4447u, 4451u, 4457u, 4463u, 4481u, 4483u, 4493u, 4507u, 
+         4513u, 4517u, 4519u, 4523u, 4547u, 4549u, 4561u, 4567u, 4583u, 
+         4591u, 4597u, 4603u, 4621u, 4637u, 4639u, 4643u, 4649u, 4651u, 
+         4657u, 4663u, 4673u, 4679u, 4691u, 4703u, 4721u, 4723u, 4729u, 
+         4733u, 4751u, 4759u, 4783u, 4787u, 4789u, 4793u, 4799u, 4801u, 
+         4813u, 4817u, 4831u, 4861u, 4871u, 4877u, 4889u, 4903u, 4909u, 
+         4919u, 4931u, 4933u, 4937u, 4943u, 4951u, 4957u, 4967u, 4969u, 
+         4973u, 4987u, 4993u, 4999u, 5003u, 5009u, 5011u, 5021u, 5023u, 
+         5039u, 5051u, 5059u, 5077u, 5081u, 5087u, 5099u, 5101u, 5107u, 
+         5113u, 5119u, 5147u, 5153u, 5167u, 5171u, 5179u, 5189u, 5197u, 
+         5209u, 5227u, 5231u, 5233u, 5237u, 5261u, 5273u, 5279u, 5281u, 
+         5297u, 5303u, 5309u, 5323u, 5333u, 5347u, 5351u, 5381u, 5387u, 
+         5393u, 5399u, 5407u, 5413u, 5417u, 5419u, 5431u, 5437u, 5441u, 
+         5443u, 5449u, 5471u, 5477u, 5479u, 5483u, 5501u, 5503u, 5507u, 
+         5519u, 5521u, 5527u, 5531u, 5557u, 5563u, 5569u, 5573u, 5581u, 
+         5591u, 5623u, 5639u, 5641u, 5647u, 5651u, 5653u, 5657u, 5659u, 
+         5669u, 5683u, 5689u, 5693u, 5701u, 5711u, 5717u, 5737u, 5741u, 
+         5743u, 5749u, 5779u, 5783u, 5791u, 5801u, 5807u, 5813u, 5821u, 
+         5827u, 5839u, 5843u, 5849u, 5851u, 5857u, 5861u, 5867u, 5869u, 
+         5879u, 5881u, 5897u, 5903u, 5923u, 5927u, 5939u, 5953u, 5981u, 
+         5987u, 6007u, 6011u, 6029u, 6037u, 6043u, 6047u, 6053u, 6067u, 
+         6073u, 6079u, 6089u, 6091u, 6101u, 6113u, 6121u, 6131u, 6133u, 
+         6143u, 6151u, 6163u, 6173u, 6197u, 6199u, 6203u, 6211u, 6217u, 
+         6221u, 6229u, 6247u, 6257u, 6263u, 6269u, 6271u, 6277u, 6287u, 
+         6299u, 6301u, 6311u, 6317u, 6323u, 6329u, 6337u, 6343u, 6353u, 
+         6359u, 6361u, 6367u, 6373u, 6379u, 6389u, 6397u, 6421u, 6427u, 
+         6449u, 6451u, 6469u, 6473u, 6481u, 6491u, 6521u, 6529u, 6547u, 
+         6551u, 6553u, 6563u, 6569u, 6571u, 6577u, 6581u, 6599u, 6607u, 
+         6619u, 6637u, 6653u, 6659u, 6661u, 6673u, 6679u, 6689u, 6691u, 
+         6701u, 6703u, 6709u, 6719u, 6733u, 6737u, 6761u, 6763u, 6779u, 
+         6781u, 6791u, 6793u, 6803u, 6823u, 6827u, 6829u, 6833u, 6841u, 
+         6857u, 6863u, 6869u, 6871u, 6883u, 6899u, 6907u, 6911u, 6917u, 
+         6947u, 6949u, 6959u, 6961u, 6967u, 6971u, 6977u, 6983u, 6991u, 
+         6997u, 7001u, 7013u, 7019u, 7027u, 7039u, 7043u, 7057u, 7069u, 
+         7079u, 7103u, 7109u, 7121u, 7127u, 7129u, 7151u, 7159u, 7177u, 
+         7187u, 7193u, 7207u, 7211u, 7213u, 7219u, 7229u, 7237u, 7243u, 
+         7247u, 7253u, 7283u, 7297u, 7307u, 7309u, 7321u, 7331u, 7333u, 
+         7349u, 7351u, 7369u, 7393u, 7411u, 7417u, 7433u, 7451u, 7457u, 
+         7459u, 7477u, 7481u, 7487u, 7489u, 7499u, 7507u, 7517u, 7523u, 
+         7529u, 7537u, 7541u, 7547u, 7549u, 7559u, 7561u, 7573u, 7577u, 
+         7583u, 7589u, 7591u, 7603u, 7607u, 7621u, 7639u, 7643u, 7649u, 
+         7669u, 7673u, 7681u, 7687u, 7691u, 7699u, 7703u, 7717u, 7723u, 
+         7727u, 7741u, 7753u, 7757u, 7759u, 7789u, 7793u, 7817u, 7823u, 
+         7829u, 7841u, 7853u, 7867u, 7873u, 7877u, 7879u, 7883u, 7901u, 
+         7907u, 7919u, 7927u, 7933u, 7937u, 7949u, 7951u, 7963u, 7993u, 
+         8009u, 8011u, 8017u, 8039u, 8053u, 8059u, 8069u, 8081u, 8087u, 
+         8089u, 8093u, 8101u, 8111u, 8117u, 8123u, 8147u, 8161u, 8167u, 
+         8171u, 8179u, 8191u, 8209u, 8219u, 8221u, 8231u, 8233u, 8237u, 
+         8243u, 8263u, 8269u, 8273u, 8287u, 8291u, 8293u, 8297u, 8311u, 
+         8317u, 8329u, 8353u, 8363u, 8369u, 8377u, 8387u, 8389u, 8419u, 
+         8423u, 8429u, 8431u, 8443u, 8447u, 8461u, 8467u, 8501u, 8513u, 
+         8521u, 8527u, 8537u, 8539u, 8543u, 8563u, 8573u, 8581u, 8597u, 
+         8599u, 8609u, 8623u, 8627u, 8629u, 8641u, 8647u, 8663u, 8669u, 
+         8677u, 8681u, 8689u, 8693u, 8699u, 8707u, 8713u, 8719u, 8731u, 
+         8737u, 8741u, 8747u, 8753u, 8761u, 8779u, 8783u, 8803u, 8807u, 
+         8819u, 8821u, 8831u, 8837u, 8839u, 8849u, 8861u, 8863u, 8867u, 
+         8887u, 8893u, 8923u, 8929u, 8933u, 8941u, 8951u, 8963u, 8969u, 
+         8971u, 8999u, 9001u, 9007u, 9011u, 9013u, 9029u, 9041u, 9043u, 
+         9049u, 9059u, 9067u, 9091u, 9103u, 9109u, 9127u, 9133u, 9137u, 
+         9151u, 9157u, 9161u, 9173u, 9181u, 9187u, 9199u, 9203u, 9209u, 
+         9221u, 9227u, 9239u, 9241u, 9257u, 9277u, 9281u, 9283u, 9293u, 
+         9311u, 9319u, 9323u, 9337u, 9341u, 9343u, 9349u, 9371u, 9377u, 
+         9391u, 9397u, 9403u, 9413u, 9419u, 9421u, 9431u, 9433u, 9437u, 
+         9439u, 9461u, 9463u, 9467u, 9473u, 9479u, 9491u, 9497u, 9511u, 
+         9521u, 9533u, 9539u, 9547u, 9551u, 9587u, 9601u, 9613u, 9619u, 
+         9623u, 9629u, 9631u, 9643u, 9649u, 9661u, 9677u, 9679u, 9689u, 
+         9697u, 9719u, 9721u, 9733u, 9739u, 9743u, 9749u, 9767u, 9769u, 
+         9781u, 9787u, 9791u, 9803u, 9811u, 9817u, 9829u, 9833u, 9839u, 
+         9851u, 9857u, 9859u, 9871u, 9883u, 9887u, 9901u, 9907u, 9923u, 
+         9929u, 9931u, 9941u, 9949u, 9967u, 9973u, 10007u, 10009u, 10037u, 
+         10039u, 10061u, 10067u, 10069u, 10079u, 10091u, 10093u, 10099u, 10103u, 
+         10111u, 10133u, 10139u, 10141u, 10151u, 10159u, 10163u, 10169u, 10177u, 
+         10181u, 10193u, 10211u, 10223u, 10243u, 10247u, 10253u, 10259u, 10267u, 
+         10271u, 10273u, 10289u, 10301u, 10303u, 10313u, 10321u, 10331u, 10333u, 
+         10337u, 10343u, 10357u, 10369u, 10391u, 10399u, 10427u, 10429u, 10433u, 
+         10453u, 10457u, 10459u, 10463u, 10477u, 10487u, 10499u, 10501u, 10513u, 
+         10529u, 10531u, 10559u, 10567u, 10589u, 10597u, 10601u, 10607u, 10613u, 
+         10627u, 10631u, 10639u, 10651u, 10657u, 10663u, 10667u, 10687u, 10691u, 
+         10709u, 10711u, 10723u, 10729u, 10733u, 10739u, 10753u, 10771u, 10781u, 
+         10789u, 10799u, 10831u, 10837u, 10847u, 10853u, 10859u, 10861u, 10867u, 
+         10883u, 10889u, 10891u, 10903u, 10909u, 10937u, 10939u, 10949u, 10957u, 
+         10973u, 10979u, 10987u, 10993u, 11003u, 11027u, 11047u, 11057u, 11059u, 
+         11069u, 11071u, 11083u, 11087u, 11093u, 11113u, 11117u, 11119u, 11131u, 
+         11149u, 11159u, 11161u, 11171u, 11173u, 11177u, 11197u, 11213u, 11239u, 
+         11243u, 11251u, 11257u, 11261u, 11273u, 11279u, 11287u, 11299u, 11311u, 
+         11317u, 11321u, 11329u, 11351u, 11353u, 11369u, 11383u, 11393u, 11399u, 
+         11411u, 11423u, 11437u, 11443u, 11447u, 11467u, 11471u, 11483u, 11489u, 
+         11491u, 11497u, 11503u, 11519u, 11527u, 11549u, 11551u, 11579u, 11587u, 
+         11593u, 11597u, 11617u, 11621u, 11633u, 11657u, 11677u, 11681u, 11689u, 
+         11699u, 11701u, 11717u, 11719u, 11731u, 11743u, 11777u, 11779u, 11783u, 
+         11789u, 11801u, 11807u, 11813u, 11821u, 11827u, 11831u, 11833u, 11839u, 
+         11863u, 11867u, 11887u, 11897u, 11903u, 11909u, 11923u, 11927u, 11933u, 
+         11939u, 11941u, 11953u, 11959u, 11969u, 11971u, 11981u, 11987u, 12007u, 
+         12011u, 12037u, 12041u, 12043u, 12049u, 12071u, 12073u, 12097u, 12101u, 
+         12107u, 12109u, 12113u, 12119u, 12143u, 12149u, 12157u, 12161u, 12163u, 
+         12197u, 12203u, 12211u, 12227u, 12239u, 12241u, 12251u, 12253u, 12263u, 
+         12269u, 12277u, 12281u, 12289u, 12301u, 12323u, 12329u, 12343u, 12347u, 
+         12373u, 12377u, 12379u, 12391u, 12401u, 12409u, 12413u, 12421u, 12433u, 
+         12437u, 12451u, 12457u, 12473u, 12479u, 12487u, 12491u, 12497u, 12503u, 
+         12511u, 12517u, 12527u, 12539u, 12541u, 12547u, 12553u, 12569u, 12577u, 
+         12583u, 12589u, 12601u, 12611u, 12613u, 12619u, 12637u, 12641u, 12647u, 
+         12653u, 12659u, 12671u, 12689u, 12697u, 12703u, 12713u, 12721u, 12739u, 
+         12743u, 12757u, 12763u, 12781u, 12791u, 12799u, 12809u, 12821u, 12823u, 
+         12829u, 12841u, 12853u, 12889u, 12893u, 12899u, 12907u, 12911u, 12917u, 
+         12919u, 12923u, 12941u, 12953u, 12959u, 12967u, 12973u, 12979u, 12983u, 
+         13001u, 13003u, 13007u, 13009u, 13033u, 13037u, 13043u, 13049u, 13063u, 
+         13093u, 13099u, 13103u, 13109u, 13121u, 13127u, 13147u, 13151u, 13159u, 
+         13163u, 13171u, 13177u, 13183u, 13187u, 13217u, 13219u, 13229u, 13241u, 
+         13249u, 13259u, 13267u, 13291u, 13297u, 13309u, 13313u, 13327u, 13331u, 
+         13337u, 13339u, 13367u, 13381u, 13397u, 13399u, 13411u, 13417u, 13421u, 
+         13441u, 13451u, 13457u, 13463u, 13469u, 13477u, 13487u, 13499u, 13513u, 
+         13523u, 13537u, 13553u, 13567u, 13577u, 13591u, 13597u, 13613u, 13619u, 
+         13627u, 13633u, 13649u, 13669u, 13679u, 13681u, 13687u, 13691u, 13693u, 
+         13697u, 13709u, 13711u, 13721u, 13723u, 13729u, 13751u, 13757u, 13759u, 
+         13763u, 13781u, 13789u, 13799u, 13807u, 13829u, 13831u, 13841u, 13859u, 
+         13873u, 13877u, 13879u, 13883u, 13901u, 13903u, 13907u, 13913u, 13921u, 
+         13931u, 13933u, 13963u, 13967u, 13997u, 13999u, 14009u, 14011u, 14029u, 
+         14033u, 14051u, 14057u, 14071u, 14081u, 14083u, 14087u, 14107u, 14143u, 
+         14149u, 14153u, 14159u, 14173u, 14177u, 14197u, 14207u, 14221u, 14243u, 
+         14249u, 14251u, 14281u, 14293u, 14303u, 14321u, 14323u, 14327u, 14341u, 
+         14347u, 14369u, 14387u, 14389u, 14401u, 14407u, 14411u, 14419u, 14423u, 
+         14431u, 14437u, 14447u, 14449u, 14461u, 14479u, 14489u, 14503u, 14519u, 
+         14533u, 14537u, 14543u, 14549u, 14551u, 14557u, 14561u, 14563u, 14591u, 
+         14593u, 14621u, 14627u, 14629u, 14633u, 14639u, 14653u, 14657u, 14669u, 
+         14683u, 14699u, 14713u, 14717u, 14723u, 14731u, 14737u, 14741u, 14747u, 
+         14753u, 14759u, 14767u, 14771u, 14779u, 14783u, 14797u, 14813u, 14821u, 
+         14827u, 14831u, 14843u, 14851u, 14867u, 14869u, 14879u, 14887u, 14891u, 
+         14897u, 14923u, 14929u, 14939u, 14947u, 14951u, 14957u, 14969u, 14983u, 
+         15013u, 15017u, 15031u, 15053u, 15061u, 15073u, 15077u, 15083u, 15091u, 
+         15101u, 15107u, 15121u, 15131u, 15137u, 15139u, 15149u, 15161u, 15173u, 
+         15187u, 15193u, 15199u, 15217u, 15227u, 15233u, 15241u, 15259u, 15263u, 
+         15269u, 15271u, 15277u, 15287u, 15289u, 15299u, 15307u, 15313u, 15319u, 
+         15329u, 15331u, 15349u, 15359u, 15361u, 15373u, 15377u, 15383u, 15391u, 
+         15401u, 15413u, 15427u, 15439u, 15443u, 15451u, 15461u, 15467u, 15473u, 
+         15493u, 15497u, 15511u, 15527u, 15541u, 15551u, 15559u, 15569u, 15581u, 
+         15583u, 15601u, 15607u, 15619u, 15629u, 15641u, 15643u, 15647u, 15649u, 
+         15661u, 15667u, 15671u, 15679u, 15683u, 15727u, 15731u, 15733u, 15737u, 
+         15739u, 15749u, 15761u, 15767u, 15773u, 15787u, 15791u, 15797u, 15803u, 
+         15809u, 15817u, 15823u, 15859u, 15877u, 15881u, 15887u, 15889u, 15901u, 
+         15907u, 15913u, 15919u, 15923u, 15937u, 15959u, 15971u, 15973u, 15991u, 
+         16001u, 16007u, 16033u, 16057u, 16061u, 16063u, 16067u, 16069u, 16073u, 
+         16087u, 16091u, 16097u, 16103u, 16111u, 16127u, 16139u, 16141u, 16183u, 
+         16187u, 16189u, 16193u, 16217u, 16223u, 16229u, 16231u, 16249u, 16253u, 
+         16267u, 16273u, 16301u, 16319u, 16333u, 16339u, 16349u, 16361u, 16363u, 
+         16369u, 16381u, 16411u, 16417u, 16421u, 16427u, 16433u, 16447u, 16451u, 
+         16453u, 16477u, 16481u, 16487u, 16493u, 16519u, 16529u, 16547u, 16553u, 
+         16561u, 16567u, 16573u, 16603u, 16607u, 16619u, 16631u, 16633u, 16649u, 
+         16651u, 16657u, 16661u, 16673u, 16691u, 16693u, 16699u, 16703u, 16729u, 
+         16741u, 16747u, 16759u, 16763u, 16787u, 16811u, 16823u, 16829u, 16831u, 
+         16843u, 16871u, 16879u, 16883u, 16889u, 16901u, 16903u, 16921u, 16927u, 
+         16931u, 16937u, 16943u, 16963u, 16979u, 16981u, 16987u, 16993u, 17011u, 
+         17021u, 17027u, 17029u, 17033u, 17041u, 17047u, 17053u, 17077u, 17093u, 
+         17099u, 17107u, 17117u, 17123u, 17137u, 17159u, 17167u, 17183u, 17189u, 
+         17191u, 17203u, 17207u, 17209u, 17231u, 17239u, 17257u, 17291u, 17293u, 
+         17299u, 17317u, 17321u, 17327u, 17333u, 17341u, 17351u, 17359u, 17377u, 
+         17383u, 17387u, 17389u, 17393u, 17401u, 17417u, 17419u, 17431u, 17443u, 
+         17449u, 17467u, 17471u, 17477u, 17483u, 17489u, 17491u, 17497u, 17509u, 
+         17519u, 17539u, 17551u, 17569u, 17573u, 17579u, 17581u, 17597u, 17599u, 
+         17609u, 17623u, 17627u, 17657u, 17659u, 17669u, 17681u, 17683u, 17707u, 
+         17713u, 17729u, 17737u, 17747u, 17749u, 17761u, 17783u, 17789u, 17791u, 
+         17807u, 17827u, 17837u, 17839u, 17851u, 17863u, 17881u, 17891u, 17903u, 
+         17909u, 17911u, 17921u, 17923u, 17929u, 17939u, 17957u, 17959u, 17971u, 
+         17977u, 17981u, 17987u, 17989u, 18013u, 18041u, 18043u, 18047u, 18049u, 
+         18059u, 18061u, 18077u, 18089u, 18097u, 18119u, 18121u, 18127u, 18131u, 
+         18133u, 18143u, 18149u, 18169u, 18181u, 18191u, 18199u, 18211u, 18217u, 
+         18223u, 18229u, 18233u, 18251u, 18253u, 18257u, 18269u, 18287u, 18289u, 
+         18301u, 18307u, 18311u, 18313u, 18329u, 18341u, 18353u, 18367u, 18371u, 
+         18379u, 18397u, 18401u, 18413u, 18427u, 18433u, 18439u, 18443u, 18451u, 
+         18457u, 18461u, 18481u, 18493u, 18503u, 18517u, 18521u, 18523u, 18539u, 
+         18541u, 18553u, 18583u, 18587u, 18593u, 18617u, 18637u, 18661u, 18671u, 
+         18679u, 18691u, 18701u, 18713u, 18719u, 18731u, 18743u, 18749u, 18757u, 
+         18773u, 18787u, 18793u, 18797u, 18803u, 18839u, 18859u, 18869u, 18899u, 
+         18911u, 18913u, 18917u, 18919u, 18947u, 18959u, 18973u, 18979u, 19001u, 
+         19009u, 19013u, 19031u, 19037u, 19051u, 19069u, 19073u, 19079u, 19081u, 
+         19087u, 19121u, 19139u, 19141u, 19157u, 19163u, 19181u, 19183u, 19207u, 
+         19211u, 19213u, 19219u, 19231u, 19237u, 19249u, 19259u, 19267u, 19273u, 
+         19289u, 19301u, 19309u, 19319u, 19333u, 19373u, 19379u, 19381u, 19387u, 
+         19391u, 19403u, 19417u, 19421u, 19423u, 19427u, 19429u, 19433u, 19441u, 
+         19447u, 19457u, 19463u, 19469u, 19471u, 19477u, 19483u, 19489u, 19501u, 
+         19507u, 19531u, 19541u, 19543u, 19553u, 19559u, 19571u, 19577u, 19583u, 
+         19597u, 19603u, 19609u, 19661u, 19681u, 19687u, 19697u, 19699u, 19709u, 
+         19717u, 19727u, 19739u, 19751u, 19753u, 19759u, 19763u, 19777u, 19793u, 
+         19801u, 19813u, 19819u, 19841u, 19843u, 19853u, 19861u, 19867u, 19889u, 
+         19891u, 19913u, 19919u, 19927u, 19937u, 19949u, 19961u, 19963u, 19973u, 
+         19979u, 19991u, 19993u, 19997u, 20011u, 20021u, 20023u, 20029u, 20047u, 
+         20051u, 20063u, 20071u, 20089u, 20101u, 20107u, 20113u, 20117u, 20123u, 
+         20129u, 20143u, 20147u, 20149u, 20161u, 20173u, 20177u, 20183u, 20201u, 
+         20219u, 20231u, 20233u, 20249u, 20261u, 20269u, 20287u, 20297u, 20323u, 
+         20327u, 20333u, 20341u, 20347u, 20353u, 20357u, 20359u, 20369u, 20389u, 
+         20393u, 20399u, 20407u, 20411u, 20431u, 20441u, 20443u, 20477u, 20479u, 
+         20483u, 20507u, 20509u, 20521u, 20533u, 20543u, 20549u, 20551u, 20563u, 
+         20593u, 20599u, 20611u, 20627u, 20639u, 20641u, 20663u, 20681u, 20693u, 
+         20707u, 20717u, 20719u, 20731u, 20743u, 20747u, 20749u, 20753u, 20759u, 
+         20771u, 20773u, 20789u, 20807u, 20809u, 20849u, 20857u, 20873u, 20879u, 
+         20887u, 20897u, 20899u, 20903u, 20921u, 20929u, 20939u, 20947u, 20959u, 
+         20963u, 20981u, 20983u, 21001u, 21011u, 21013u, 21017u, 21019u, 21023u, 
+         21031u, 21059u, 21061u, 21067u, 21089u, 21101u, 21107u, 21121u, 21139u, 
+         21143u, 21149u, 21157u, 21163u, 21169u, 21179u, 21187u, 21191u, 21193u, 
+         21211u, 21221u, 21227u, 21247u, 21269u, 21277u, 21283u, 21313u, 21317u, 
+         21319u, 21323u, 21341u, 21347u, 21377u, 21379u, 21383u, 21391u, 21397u, 
+         21401u, 21407u, 21419u, 21433u, 21467u, 21481u, 21487u, 21491u, 21493u, 
+         21499u, 21503u, 21517u, 21521u, 21523u, 21529u, 21557u, 21559u, 21563u, 
+         21569u, 21577u, 21587u, 21589u, 21599u, 21601u, 21611u, 21613u, 21617u, 
+         21647u, 21649u, 21661u, 21673u, 21683u, 21701u, 21713u, 21727u, 21737u, 
+         21739u, 21751u, 21757u, 21767u, 21773u, 21787u, 21799u, 21803u, 21817u, 
+         21821u, 21839u, 21841u, 21851u, 21859u, 21863u, 21871u, 21881u, 21893u, 
+         21911u, 21929u, 21937u, 21943u, 21961u, 21977u, 21991u, 21997u, 22003u, 
+         22013u, 22027u, 22031u, 22037u, 22039u, 22051u, 22063u, 22067u, 22073u, 
+         22079u, 22091u, 22093u, 22109u, 22111u, 22123u, 22129u, 22133u, 22147u, 
+         22153u, 22157u, 22159u, 22171u, 22189u, 22193u, 22229u, 22247u, 22259u, 
+         22271u, 22273u, 22277u, 22279u, 22283u, 22291u, 22303u, 22307u, 22343u, 
+         22349u, 22367u, 22369u, 22381u, 22391u, 22397u, 22409u, 22433u, 22441u, 
+         22447u, 22453u, 22469u, 22481u, 22483u, 22501u, 22511u, 22531u, 22541u, 
+         22543u, 22549u, 22567u, 22571u, 22573u, 22613u, 22619u, 22621u, 22637u, 
+         22639u, 22643u, 22651u, 22669u, 22679u, 22691u, 22697u, 22699u, 22709u, 
+         22717u, 22721u, 22727u, 22739u, 22741u, 22751u, 22769u, 22777u, 22783u, 
+         22787u, 22807u, 22811u, 22817u, 22853u, 22859u, 22861u, 22871u, 22877u, 
+         22901u, 22907u, 22921u, 22937u, 22943u, 22961u, 22963u, 22973u, 22993u, 
+         23003u, 23011u, 23017u, 23021u, 23027u, 23029u, 23039u, 23041u, 23053u, 
+         23057u, 23059u, 23063u, 23071u, 23081u, 23087u, 23099u, 23117u, 23131u, 
+         23143u, 23159u, 23167u, 23173u, 23189u, 23197u, 23201u, 23203u, 23209u, 
+         23227u, 23251u, 23269u, 23279u, 23291u, 23293u, 23297u, 23311u, 23321u, 
+         23327u, 23333u, 23339u, 23357u, 23369u, 23371u, 23399u, 23417u, 23431u, 
+         23447u, 23459u, 23473u, 23497u, 23509u, 23531u, 23537u, 23539u, 23549u, 
+         23557u, 23561u, 23563u, 23567u, 23581u, 23593u, 23599u, 23603u, 23609u, 
+         23623u, 23627u, 23629u, 23633u, 23663u, 23669u, 23671u, 23677u, 23687u, 
+         23689u, 23719u, 23741u, 23743u, 23747u, 23753u, 23761u, 23767u, 23773u, 
+         23789u, 23801u, 23813u, 23819u, 23827u, 23831u, 23833u, 23857u, 23869u, 
+         23873u, 23879u, 23887u, 23893u, 23899u, 23909u, 23911u, 23917u, 23929u, 
+         23957u, 23971u, 23977u, 23981u, 23993u, 24001u, 24007u, 24019u, 24023u, 
+         24029u, 24043u, 24049u, 24061u, 24071u, 24077u, 24083u, 24091u, 24097u, 
+         24103u, 24107u, 24109u, 24113u, 24121u, 24133u, 24137u, 24151u, 24169u, 
+         24179u, 24181u, 24197u, 24203u, 24223u, 24229u, 24239u, 24247u, 24251u, 
+         24281u, 24317u, 24329u, 24337u, 24359u, 24371u, 24373u, 24379u, 24391u, 
+         24407u, 24413u, 24419u, 24421u, 24439u, 24443u, 24469u, 24473u, 24481u, 
+         24499u, 24509u, 24517u, 24527u, 24533u, 24547u, 24551u, 24571u, 24593u, 
+         24611u, 24623u, 24631u, 24659u, 24671u, 24677u, 24683u, 24691u, 24697u, 
+         24709u, 24733u, 24749u, 24763u, 24767u, 24781u, 24793u, 24799u, 24809u, 
+         24821u, 24841u, 24847u, 24851u, 24859u, 24877u, 24889u, 24907u, 24917u, 
+         24919u, 24923u, 24943u, 24953u, 24967u, 24971u, 24977u, 24979u, 24989u, 
+         25013u, 25031u, 25033u, 25037u, 25057u, 25073u, 25087u, 25097u, 25111u, 
+         25117u, 25121u, 25127u, 25147u, 25153u, 25163u, 25169u, 25171u, 25183u, 
+         25189u, 25219u, 25229u, 25237u, 25243u, 25247u, 25253u, 25261u, 25301u, 
+         25303u, 25307u, 25309u, 25321u, 25339u, 25343u, 25349u, 25357u, 25367u, 
+         25373u, 25391u, 25409u, 25411u, 25423u, 25439u, 25447u, 25453u, 25457u, 
+         25463u, 25469u, 25471u, 25523u, 25537u, 25541u, 25561u, 25577u, 25579u, 
+         25583u, 25589u, 25601u, 25603u, 25609u, 25621u, 25633u, 25639u, 25643u, 
+         25657u, 25667u, 25673u, 25679u, 25693u, 25703u, 25717u, 25733u, 25741u, 
+         25747u, 25759u, 25763u, 25771u, 25793u, 25799u, 25801u, 25819u, 25841u, 
+         25847u, 25849u, 25867u, 25873u, 25889u, 25903u, 25913u, 25919u, 25931u, 
+         25933u, 25939u, 25943u, 25951u, 25969u, 25981u, 25997u, 25999u, 26003u, 
+         26017u, 26021u, 26029u, 26041u, 26053u, 26083u, 26099u, 26107u, 26111u, 
+         26113u, 26119u, 26141u, 26153u, 26161u, 26171u, 26177u, 26183u, 26189u, 
+         26203u, 26209u, 26227u, 26237u, 26249u, 26251u, 26261u, 26263u, 26267u, 
+         26293u, 26297u, 26309u, 26317u, 26321u, 26339u, 26347u, 26357u, 26371u, 
+         26387u, 26393u, 26399u, 26407u, 26417u, 26423u, 26431u, 26437u, 26449u, 
+         26459u, 26479u, 26489u, 26497u, 26501u, 26513u, 26539u, 26557u, 26561u, 
+         26573u, 26591u, 26597u, 26627u, 26633u, 26641u, 26647u, 26669u, 26681u, 
+         26683u, 26687u, 26693u, 26699u, 26701u, 26711u, 26713u, 26717u, 26723u, 
+         26729u, 26731u, 26737u, 26759u, 26777u, 26783u, 26801u, 26813u, 26821u, 
+         26833u, 26839u, 26849u, 26861u, 26863u, 26879u, 26881u, 26891u, 26893u, 
+         26903u, 26921u, 26927u, 26947u, 26951u, 26953u, 26959u, 26981u, 26987u, 
+         26993u, 27011u, 27017u, 27031u, 27043u, 27059u, 27061u, 27067u, 27073u, 
+         27077u, 27091u, 27103u, 27107u, 27109u, 27127u, 27143u, 27179u, 27191u, 
+         27197u, 27211u, 27239u, 27241u, 27253u, 27259u, 27271u, 27277u, 27281u, 
+         27283u, 27299u, 27329u, 27337u, 27361u, 27367u, 27397u, 27407u, 27409u, 
+         27427u, 27431u, 27437u, 27449u, 27457u, 27479u, 27481u, 27487u, 27509u, 
+         27527u, 27529u, 27539u, 27541u, 27551u, 27581u, 27583u, 27611u, 27617u, 
+         27631u, 27647u, 27653u, 27673u, 27689u, 27691u, 27697u, 27701u, 27733u, 
+         27737u, 27739u, 27743u, 27749u, 27751u, 27763u, 27767u, 27773u, 27779u, 
+         27791u, 27793u, 27799u, 27803u, 27809u, 27817u, 27823u, 27827u, 27847u, 
+         27851u, 27883u, 27893u, 27901u, 27917u, 27919u, 27941u, 27943u, 27947u, 
+         27953u, 27961u, 27967u, 27983u, 27997u, 28001u, 28019u, 28027u, 28031u, 
+         28051u, 28057u, 28069u, 28081u, 28087u, 28097u, 28099u, 28109u, 28111u, 
+         28123u, 28151u, 28163u, 28181u, 28183u, 28201u, 28211u, 28219u, 28229u, 
+         28277u, 28279u, 28283u, 28289u, 28297u, 28307u, 28309u, 28319u, 28349u, 
+         28351u, 28387u, 28393u, 28403u, 28409u, 28411u, 28429u, 28433u, 28439u, 
+         28447u, 28463u, 28477u, 28493u, 28499u, 28513u, 28517u, 28537u, 28541u, 
+         28547u, 28549u, 28559u, 28571u, 28573u, 28579u, 28591u, 28597u, 28603u, 
+         28607u, 28619u, 28621u, 28627u, 28631u, 28643u, 28649u, 28657u, 28661u, 
+         28663u, 28669u, 28687u, 28697u, 28703u, 28711u, 28723u, 28729u, 28751u, 
+         28753u, 28759u, 28771u, 28789u, 28793u, 28807u, 28813u, 28817u, 28837u, 
+         28843u, 28859u, 28867u, 28871u, 28879u, 28901u, 28909u, 28921u, 28927u, 
+         28933u, 28949u, 28961u, 28979u, 29009u, 29017u, 29021u, 29023u, 29027u, 
+         29033u, 29059u, 29063u, 29077u, 29101u, 29123u, 29129u, 29131u, 29137u, 
+         29147u, 29153u, 29167u, 29173u, 29179u, 29191u, 29201u, 29207u, 29209u, 
+         29221u, 29231u, 29243u, 29251u, 29269u, 29287u, 29297u, 29303u, 29311u, 
+         29327u, 29333u, 29339u, 29347u, 29363u, 29383u, 29387u, 29389u, 29399u, 
+         29401u, 29411u, 29423u, 29429u, 29437u, 29443u, 29453u, 29473u, 29483u, 
+         29501u, 29527u, 29531u, 29537u, 29567u, 29569u, 29573u, 29581u, 29587u, 
+         29599u, 29611u, 29629u, 29633u, 29641u, 29663u, 29669u, 29671u, 29683u, 
+         29717u, 29723u, 29741u, 29753u, 29759u, 29761u, 29789u, 29803u, 29819u, 
+         29833u, 29837u, 29851u, 29863u, 29867u, 29873u, 29879u, 29881u, 29917u, 
+         29921u, 29927u, 29947u, 29959u, 29983u, 29989u, 30011u, 30013u, 30029u, 
+         30047u, 30059u, 30071u, 30089u, 30091u, 30097u, 30103u, 30109u, 30113u, 
+         30119u, 30133u, 30137u, 30139u, 30161u, 30169u, 30181u, 30187u, 30197u, 
+         30203u, 30211u, 30223u, 30241u, 30253u, 30259u, 30269u, 30271u, 30293u, 
+         30307u, 30313u, 30319u, 30323u, 30341u, 30347u, 30367u, 30389u, 30391u, 
+         30403u, 30427u, 30431u, 30449u, 30467u, 30469u, 30491u, 30493u, 30497u, 
+         30509u, 30517u, 30529u, 30539u, 30553u, 30557u, 30559u, 30577u, 30593u, 
+         30631u, 30637u, 30643u, 30649u, 30661u, 30671u, 30677u, 30689u, 30697u, 
+         30703u, 30707u, 30713u, 30727u, 30757u, 30763u, 30773u, 30781u, 30803u, 
+         30809u, 30817u, 30829u, 30839u, 30841u, 30851u, 30853u, 30859u, 30869u, 
+         30871u, 30881u, 30893u, 30911u, 30931u, 30937u, 30941u, 30949u, 30971u, 
+         30977u, 30983u, 31013u, 31019u, 31033u, 31039u, 31051u, 31063u, 31069u, 
+         31079u, 31081u, 31091u, 31121u, 31123u, 31139u, 31147u, 31151u, 31153u, 
+         31159u, 31177u, 31181u, 31183u, 31189u, 31193u, 31219u, 31223u, 31231u, 
+         31237u, 31247u, 31249u, 31253u, 31259u, 31267u, 31271u, 31277u, 31307u, 
+         31319u, 31321u, 31327u, 31333u, 31337u, 31357u, 31379u, 31387u, 31391u, 
+         31393u, 31397u, 31469u, 31477u, 31481u, 31489u, 31511u, 31513u, 31517u, 
+         31531u, 31541u, 31543u, 31547u, 31567u, 31573u, 31583u, 31601u, 31607u, 
+         31627u, 31643u, 31649u, 31657u, 31663u, 31667u, 31687u, 31699u, 31721u, 
+         31723u, 31727u, 31729u, 31741u, 31751u, 31769u, 31771u, 31793u, 31799u, 
+         31817u, 31847u, 31849u, 31859u, 31873u, 31883u, 31891u, 31907u, 31957u, 
+         31963u, 31973u, 31981u, 31991u, 32003u, 32009u, 32027u, 32029u, 32051u, 
+         32057u, 32059u, 32063u, 32069u, 32077u, 32083u, 32089u, 32099u, 32117u, 
+         32119u, 32141u, 32143u, 32159u, 32173u, 32183u, 32189u, 32191u, 32203u, 
+         32213u, 32233u, 32237u, 32251u, 32257u, 32261u, 32297u, 32299u, 32303u, 
+         32309u, 32321u, 32323u, 32327u, 32341u, 32353u, 32359u, 32363u, 32369u, 
+         32371u, 32377u, 32381u, 32401u, 32411u, 32413u, 32423u, 32429u, 32441u, 
+         32443u, 32467u, 32479u, 32491u, 32497u, 32503u, 32507u, 32531u, 32533u, 
+         32537u, 32561u, 32563u, 32569u, 32573u, 32579u, 32587u, 32603u, 32609u, 
+         32611u, 32621u, 32633u, 32647u, 32653u, 32687u, 32693u, 32707u, 32713u, 
+         32717u, 32719u, 32749u, 32771u, 32779u, 32783u, 32789u, 32797u, 32801u, 
+         32803u, 32831u, 32833u, 32839u, 32843u, 32869u, 32887u, 32909u, 32911u, 
+         32917u, 32933u, 32939u, 32941u, 32957u, 32969u, 32971u, 32983u, 32987u, 
+         32993u, 32999u, 33013u, 33023u, 33029u, 33037u, 33049u, 33053u, 33071u, 
+         33073u, 33083u, 33091u, 33107u, 33113u, 33119u, 33149u, 33151u, 33161u, 
+         33179u, 33181u, 33191u, 33199u, 33203u, 33211u, 33223u, 33247u, 33287u, 
+         33289u, 33301u, 33311u, 33317u, 33329u, 33331u, 33343u, 33347u, 33349u, 
+         33353u, 33359u, 33377u, 33391u, 33403u, 33409u, 33413u, 33427u, 33457u, 
+         33461u, 33469u, 33479u, 33487u, 33493u, 33503u, 33521u, 33529u, 33533u, 
+         33547u, 33563u, 33569u, 33577u, 33581u, 33587u, 33589u, 33599u, 33601u, 
+         33613u, 33617u, 33619u, 33623u, 33629u, 33637u, 33641u, 33647u, 33679u, 
+         33703u, 33713u, 33721u, 33739u, 33749u, 33751u, 33757u, 33767u, 33769u, 
+         33773u, 33791u, 33797u, 33809u, 33811u, 33827u, 33829u, 33851u, 33857u, 
+         33863u, 33871u, 33889u, 33893u, 33911u, 33923u, 33931u, 33937u, 33941u, 
+         33961u, 33967u, 33997u, 34019u, 34031u, 34033u, 34039u, 34057u, 34061u, 
+         34123u, 34127u, 34129u, 34141u, 34147u, 34157u, 34159u, 34171u, 34183u, 
+         34211u, 34213u, 34217u, 34231u, 34253u, 34259u, 34261u, 34267u, 34273u, 
+         34283u, 34297u, 34301u, 34303u, 34313u, 34319u, 34327u, 34337u, 34351u, 
+         34361u, 34367u, 34369u, 34381u, 34403u, 34421u, 34429u, 34439u, 34457u, 
+         34469u, 34471u, 34483u, 34487u, 34499u, 34501u, 34511u, 34513u, 34519u, 
+         34537u, 34543u, 34549u, 34583u, 34589u, 34591u, 34603u, 34607u, 34613u, 
+         34631u, 34649u, 34651u, 34667u, 34673u, 34679u, 34687u, 34693u, 34703u, 
+         34721u, 34729u, 34739u, 34747u, 34757u, 34759u, 34763u, 34781u, 34807u, 
+         34819u, 34841u, 34843u, 34847u, 34849u, 34871u, 34877u, 34883u, 34897u, 
+         34913u, 34919u, 34939u, 34949u, 34961u, 34963u, 34981u, 35023u, 35027u, 
+         35051u, 35053u, 35059u, 35069u, 35081u, 35083u, 35089u, 35099u, 35107u, 
+         35111u, 35117u, 35129u, 35141u, 35149u, 35153u, 35159u, 35171u, 35201u, 
+         35221u, 35227u, 35251u, 35257u, 35267u, 35279u, 35281u, 35291u, 35311u, 
+         35317u, 35323u, 35327u, 35339u, 35353u, 35363u, 35381u, 35393u, 35401u, 
+         35407u, 35419u, 35423u, 35437u, 35447u, 35449u, 35461u, 35491u, 35507u, 
+         35509u, 35521u, 35527u, 35531u, 35533u, 35537u, 35543u, 35569u, 35573u, 
+         35591u, 35593u, 35597u, 35603u, 35617u, 35671u, 35677u, 35729u, 35731u, 
+         35747u, 35753u, 35759u, 35771u, 35797u, 35801u, 35803u, 35809u, 35831u, 
+         35837u, 35839u, 35851u, 35863u, 35869u, 35879u, 35897u, 35899u, 35911u, 
+         35923u, 35933u, 35951u, 35963u, 35969u, 35977u, 35983u, 35993u, 35999u, 
+         36007u, 36011u, 36013u, 36017u, 36037u, 36061u, 36067u, 36073u, 36083u, 
+         36097u, 36107u, 36109u, 36131u, 36137u, 36151u, 36161u, 36187u, 36191u, 
+         36209u, 36217u, 36229u, 36241u, 36251u, 36263u, 36269u, 36277u, 36293u, 
+         36299u, 36307u, 36313u, 36319u, 36341u, 36343u, 36353u, 36373u, 36383u, 
+         36389u, 36433u, 36451u, 36457u, 36467u, 36469u, 36473u, 36479u, 36493u, 
+         36497u, 36523u, 36527u, 36529u, 36541u, 36551u, 36559u, 36563u, 36571u, 
+         36583u, 36587u, 36599u, 36607u, 36629u, 36637u, 36643u, 36653u, 36671u, 
+         36677u, 36683u, 36691u, 36697u, 36709u, 36713u, 36721u, 36739u, 36749u, 
+         36761u, 36767u, 36779u, 36781u, 36787u, 36791u, 36793u, 36809u, 36821u, 
+         36833u, 36847u, 36857u, 36871u, 36877u, 36887u, 36899u, 36901u, 36913u, 
+         36919u, 36923u, 36929u, 36931u, 36943u, 36947u, 36973u, 36979u, 36997u, 
+         37003u, 37013u, 37019u, 37021u, 37039u, 37049u, 37057u, 37061u, 37087u, 
+         37097u, 37117u, 37123u, 37139u, 37159u, 37171u, 37181u, 37189u, 37199u, 
+         37201u, 37217u, 37223u, 37243u, 37253u, 37273u, 37277u, 37307u, 37309u, 
+         37313u, 37321u, 37337u, 37339u, 37357u, 37361u, 37363u, 37369u, 37379u, 
+         37397u, 37409u, 37423u, 37441u, 37447u, 37463u, 37483u, 37489u, 37493u, 
+         37501u, 37507u, 37511u, 37517u, 37529u, 37537u, 37547u, 37549u, 37561u, 
+         37567u, 37571u, 37573u, 37579u, 37589u, 37591u, 37607u, 37619u, 37633u, 
+         37643u, 37649u, 37657u, 37663u, 37691u, 37693u, 37699u, 37717u, 37747u, 
+         37781u, 37783u, 37799u, 37811u, 37813u, 37831u, 37847u, 37853u, 37861u, 
+         37871u, 37879u, 37889u, 37897u, 37907u, 37951u, 37957u, 37963u, 37967u, 
+         37987u, 37991u, 37993u, 37997u, 38011u, 38039u, 38047u, 38053u, 38069u, 
+         38083u, 38113u, 38119u, 38149u, 38153u, 38167u, 38177u, 38183u, 38189u, 
+         38197u, 38201u, 38219u, 38231u, 38237u, 38239u, 38261u, 38273u, 38281u, 
+         38287u, 38299u, 38303u, 38317u, 38321u, 38327u, 38329u, 38333u, 38351u, 
+         38371u, 38377u, 38393u, 38431u, 38447u, 38449u, 38453u, 38459u, 38461u, 
+         38501u, 38543u, 38557u, 38561u, 38567u, 38569u, 38593u, 38603u, 38609u, 
+         38611u, 38629u, 38639u, 38651u, 38653u, 38669u, 38671u, 38677u, 38693u, 
+         38699u, 38707u, 38711u, 38713u, 38723u, 38729u, 38737u, 38747u, 38749u, 
+         38767u, 38783u, 38791u, 38803u, 38821u, 38833u, 38839u, 38851u, 38861u, 
+         38867u, 38873u, 38891u, 38903u, 38917u, 38921u, 38923u, 38933u, 38953u, 
+         38959u, 38971u, 38977u, 38993u, 39019u, 39023u, 39041u, 39043u, 39047u, 
+         39079u, 39089u, 39097u, 39103u, 39107u, 39113u, 39119u, 39133u, 39139u, 
+         39157u, 39161u, 39163u, 39181u, 39191u, 39199u, 39209u, 39217u, 39227u, 
+         39229u, 39233u, 39239u, 39241u, 39251u, 39293u, 39301u, 39313u, 39317u, 
+         39323u, 39341u, 39343u, 39359u, 39367u, 39371u, 39373u, 39383u, 39397u, 
+         39409u, 39419u, 39439u, 39443u, 39451u, 39461u, 39499u, 39503u, 39509u, 
+         39511u, 39521u, 39541u, 39551u, 39563u, 39569u, 39581u, 39607u, 39619u, 
+         39623u, 39631u, 39659u, 39667u, 39671u, 39679u, 39703u, 39709u, 39719u, 
+         39727u, 39733u, 39749u, 39761u, 39769u, 39779u, 39791u, 39799u, 39821u, 
+         39827u, 39829u, 39839u, 39841u, 39847u, 39857u, 39863u, 39869u, 39877u, 
+         39883u, 39887u, 39901u, 39929u, 39937u, 39953u, 39971u, 39979u, 39983u, 
+         39989u, 40009u, 40013u, 40031u, 40037u, 40039u, 40063u, 40087u, 40093u, 
+         40099u, 40111u, 40123u, 40127u, 40129u, 40151u, 40153u, 40163u, 40169u, 
+         40177u, 40189u, 40193u, 40213u, 40231u, 40237u, 40241u, 40253u, 40277u, 
+         40283u, 40289u, 40343u, 40351u, 40357u, 40361u, 40387u, 40423u, 40427u, 
+         40429u, 40433u, 40459u, 40471u, 40483u, 40487u, 40493u, 40499u, 40507u, 
+         40519u, 40529u, 40531u, 40543u, 40559u, 40577u, 40583u, 40591u, 40597u, 
+         40609u, 40627u, 40637u, 40639u, 40693u, 40697u, 40699u, 40709u, 40739u, 
+         40751u, 40759u, 40763u, 40771u, 40787u, 40801u, 40813u, 40819u, 40823u, 
+         40829u, 40841u, 40847u, 40849u, 40853u, 40867u, 40879u, 40883u, 40897u, 
+         40903u, 40927u, 40933u, 40939u, 40949u, 40961u, 40973u, 40993u, 41011u, 
+         41017u, 41023u, 41039u, 41047u, 41051u, 41057u, 41077u, 41081u, 41113u, 
+         41117u, 41131u, 41141u, 41143u, 41149u, 41161u, 41177u, 41179u, 41183u, 
+         41189u, 41201u, 41203u, 41213u, 41221u, 41227u, 41231u, 41233u, 41243u, 
+         41257u, 41263u, 41269u, 41281u, 41299u, 41333u, 41341u, 41351u, 41357u, 
+         41381u, 41387u, 41389u, 41399u, 41411u, 41413u, 41443u, 41453u, 41467u, 
+         41479u, 41491u, 41507u, 41513u, 41519u, 41521u, 41539u, 41543u, 41549u, 
+         41579u, 41593u, 41597u, 41603u, 41609u, 41611u, 41617u, 41621u, 41627u, 
+         41641u, 41647u, 41651u, 41659u, 41669u, 41681u, 41687u, 41719u, 41729u, 
+         41737u, 41759u, 41761u, 41771u, 41777u, 41801u, 41809u, 41813u, 41843u, 
+         41849u, 41851u, 41863u, 41879u, 41887u, 41893u, 41897u, 41903u, 41911u, 
+         41927u, 41941u, 41947u, 41953u, 41957u, 41959u, 41969u, 41981u, 41983u, 
+         41999u, 42013u, 42017u, 42019u, 42023u, 42043u, 42061u, 42071u, 42073u, 
+         42083u, 42089u, 42101u, 42131u, 42139u, 42157u, 42169u, 42179u, 42181u, 
+         42187u, 42193u, 42197u, 42209u, 42221u, 42223u, 42227u, 42239u, 42257u, 
+         42281u, 42283u, 42293u, 42299u, 42307u, 42323u, 42331u, 42337u, 42349u, 
+         42359u, 42373u, 42379u, 42391u, 42397u, 42403u, 42407u, 42409u, 42433u, 
+         42437u, 42443u, 42451u, 42457u, 42461u, 42463u, 42467u, 42473u, 42487u, 
+         42491u, 42499u, 42509u, 42533u, 42557u, 42569u, 42571u, 42577u, 42589u, 
+         42611u, 42641u, 42643u, 42649u, 42667u, 42677u, 42683u, 42689u, 42697u, 
+         42701u, 42703u, 42709u, 42719u, 42727u, 42737u, 42743u, 42751u, 42767u, 
+         42773u, 42787u, 42793u, 42797u, 42821u, 42829u, 42839u, 42841u, 42853u, 
+         42859u, 42863u, 42899u, 42901u, 42923u, 42929u, 42937u, 42943u, 42953u, 
+         42961u, 42967u, 42979u, 42989u, 43003u, 43013u, 43019u, 43037u, 43049u, 
+         43051u, 43063u, 43067u, 43093u, 43103u, 43117u, 43133u, 43151u, 43159u, 
+         43177u, 43189u, 43201u, 43207u, 43223u, 43237u, 43261u, 43271u, 43283u, 
+         43291u, 43313u, 43319u, 43321u, 43331u, 43391u, 43397u, 43399u, 43403u, 
+         43411u, 43427u, 43441u, 43451u, 43457u, 43481u, 43487u, 43499u, 43517u, 
+         43541u, 43543u, 43573u, 43577u, 43579u, 43591u, 43597u, 43607u, 43609u, 
+         43613u, 43627u, 43633u, 43649u, 43651u, 43661u, 43669u, 43691u, 43711u, 
+         43717u, 43721u, 43753u, 43759u, 43777u, 43781u, 43783u, 43787u, 43789u, 
+         43793u, 43801u, 43853u, 43867u, 43889u, 43891u, 43913u, 43933u, 43943u, 
+         43951u, 43961u, 43963u, 43969u, 43973u, 43987u, 43991u, 43997u, 44017u, 
+         44021u, 44027u, 44029u, 44041u, 44053u, 44059u, 44071u, 44087u, 44089u, 
+         44101u, 44111u, 44119u, 44123u, 44129u, 44131u, 44159u, 44171u, 44179u, 
+         44189u, 44201u, 44203u, 44207u, 44221u, 44249u, 44257u, 44263u, 44267u, 
+         44269u, 44273u, 44279u, 44281u, 44293u, 44351u, 44357u, 44371u, 44381u, 
+         44383u, 44389u, 44417u, 44449u, 44453u, 44483u, 44491u, 44497u, 44501u, 
+         44507u, 44519u, 44531u, 44533u, 44537u, 44543u, 44549u, 44563u, 44579u, 
+         44587u, 44617u, 44621u, 44623u, 44633u, 44641u, 44647u, 44651u, 44657u, 
+         44683u, 44687u, 44699u, 44701u, 44711u, 44729u, 44741u, 44753u, 44771u, 
+         44773u, 44777u, 44789u, 44797u, 44809u, 44819u, 44839u, 44843u, 44851u, 
+         44867u, 44879u, 44887u, 44893u, 44909u, 44917u, 44927u, 44939u, 44953u, 
+         44959u, 44963u, 44971u, 44983u, 44987u, 45007u, 45013u, 45053u, 45061u, 
+         45077u, 45083u, 45119u, 45121u, 45127u, 45131u, 45137u, 45139u, 45161u, 
+         45179u, 45181u, 45191u, 45197u, 45233u, 45247u, 45259u, 45263u, 45281u, 
+         45289u, 45293u, 45307u, 45317u, 45319u, 45329u, 45337u, 45341u, 45343u, 
+         45361u, 45377u, 45389u, 45403u, 45413u, 45427u, 45433u, 45439u, 45481u, 
+         45491u, 45497u, 45503u, 45523u, 45533u, 45541u, 45553u, 45557u, 45569u, 
+         45587u, 45589u, 45599u, 45613u, 45631u, 45641u, 45659u, 45667u, 45673u, 
+         45677u, 45691u, 45697u, 45707u, 45737u, 45751u, 45757u, 45763u, 45767u, 
+         45779u, 45817u, 45821u, 45823u, 45827u, 45833u, 45841u, 45853u, 45863u, 
+         45869u, 45887u, 45893u, 45943u, 45949u, 45953u, 45959u, 45971u, 45979u, 
+         45989u, 46021u, 46027u, 46049u, 46051u, 46061u, 46073u, 46091u, 46093u, 
+         46099u, 46103u, 46133u, 46141u, 46147u, 46153u, 46171u, 46181u, 46183u, 
+         46187u, 46199u, 46219u, 46229u, 46237u, 46261u, 46271u, 46273u, 46279u, 
+         46301u, 46307u, 46309u, 46327u, 46337u, 46349u, 46351u, 46381u, 46399u, 
+         46411u, 46439u, 46441u, 46447u, 46451u, 46457u, 46471u, 46477u, 46489u, 
+         46499u, 46507u, 46511u, 46523u, 46549u, 46559u, 46567u, 46573u, 46589u, 
+         46591u, 46601u, 46619u, 46633u, 46639u, 46643u, 46649u, 46663u, 46679u, 
+         46681u, 46687u, 46691u, 46703u, 46723u, 46727u, 46747u, 46751u, 46757u, 
+         46769u, 46771u, 46807u, 46811u, 46817u, 46819u, 46829u, 46831u, 46853u, 
+         46861u, 46867u, 46877u, 46889u, 46901u, 46919u, 46933u, 46957u, 46993u, 
+         46997u, 47017u, 47041u, 47051u, 47057u, 47059u, 47087u, 47093u, 47111u, 
+         47119u, 47123u, 47129u, 47137u, 47143u, 47147u, 47149u, 47161u, 47189u, 
+         47207u, 47221u, 47237u, 47251u, 47269u, 47279u, 47287u, 47293u, 47297u, 
+         47303u, 47309u, 47317u, 47339u, 47351u, 47353u, 47363u, 47381u, 47387u, 
+         47389u, 47407u, 47417u, 47419u, 47431u, 47441u, 47459u, 47491u, 47497u, 
+         47501u, 47507u, 47513u, 47521u, 47527u, 47533u, 47543u, 47563u, 47569u, 
+         47581u, 47591u, 47599u, 47609u, 47623u, 47629u, 47639u, 47653u, 47657u, 
+         47659u, 47681u, 47699u, 47701u, 47711u, 47713u, 47717u, 47737u, 47741u, 
+         47743u, 47777u, 47779u, 47791u, 47797u, 47807u, 47809u, 47819u, 47837u, 
+         47843u, 47857u, 47869u, 47881u, 47903u, 47911u, 47917u, 47933u, 47939u, 
+         47947u, 47951u, 47963u, 47969u, 47977u, 47981u, 48017u, 48023u, 48029u, 
+         48049u, 48073u, 48079u, 48091u, 48109u, 48119u, 48121u, 48131u, 48157u, 
+         48163u, 48179u, 48187u, 48193u, 48197u, 48221u, 48239u, 48247u, 48259u, 
+         48271u, 48281u, 48299u, 48311u, 48313u, 48337u, 48341u, 48353u, 48371u, 
+         48383u, 48397u, 48407u, 48409u, 48413u, 48437u, 48449u, 48463u, 48473u, 
+         48479u, 48481u, 48487u, 48491u, 48497u, 48523u, 48527u, 48533u, 48539u, 
+         48541u, 48563u, 48571u, 48589u, 48593u, 48611u, 48619u, 48623u, 48647u, 
+         48649u, 48661u, 48673u, 48677u, 48679u, 48731u, 48733u, 48751u, 48757u, 
+         48761u, 48767u, 48779u, 48781u, 48787u, 48799u, 48809u, 48817u, 48821u, 
+         48823u, 48847u, 48857u, 48859u, 48869u, 48871u, 48883u, 48889u, 48907u, 
+         48947u, 48953u, 48973u, 48989u, 48991u, 49003u, 49009u, 49019u, 49031u, 
+         49033u, 49037u, 49043u, 49057u, 49069u, 49081u, 49103u, 49109u, 49117u, 
+         49121u, 49123u, 49139u, 49157u, 49169u, 49171u, 49177u, 49193u, 49199u, 
+         49201u, 49207u, 49211u, 49223u, 49253u, 49261u, 49277u, 49279u, 49297u, 
+         49307u, 49331u, 49333u, 49339u, 49363u, 49367u, 49369u, 49391u, 49393u, 
+         49409u, 49411u, 49417u, 49429u, 49433u, 49451u, 49459u, 49463u, 49477u, 
+         49481u, 49499u, 49523u, 49529u, 49531u, 49537u, 49547u, 49549u, 49559u, 
+         49597u, 49603u, 49613u, 49627u, 49633u, 49639u, 49663u, 49667u, 49669u, 
+         49681u, 49697u, 49711u, 49727u, 49739u, 49741u, 49747u, 49757u, 49783u, 
+         49787u, 49789u, 49801u, 49807u, 49811u, 49823u, 49831u, 49843u, 49853u, 
+         49871u, 49877u, 49891u, 49919u, 49921u, 49927u, 49937u, 49939u, 49943u, 
+         49957u, 49991u, 49993u, 49999u, 50021u, 50023u, 50033u, 50047u, 50051u, 
+         50053u, 50069u, 50077u, 50087u, 50093u, 50101u, 50111u, 50119u, 50123u, 
+         50129u, 50131u, 50147u, 50153u, 50159u, 50177u, 50207u, 50221u, 50227u, 
+         50231u, 50261u, 50263u, 50273u, 50287u, 50291u, 50311u, 50321u, 50329u, 
+         50333u, 50341u, 50359u, 50363u, 50377u, 50383u, 50387u, 50411u, 50417u, 
+         50423u, 50441u, 50459u, 50461u, 50497u, 50503u, 50513u, 50527u, 50539u, 
+         50543u, 50549u, 50551u, 50581u, 50587u, 50591u, 50593u, 50599u, 50627u, 
+         50647u, 50651u, 50671u, 50683u, 50707u, 50723u, 50741u, 50753u, 50767u, 
+         50773u, 50777u, 50789u, 50821u, 50833u, 50839u, 50849u, 50857u, 50867u, 
+         50873u, 50891u, 50893u, 50909u, 50923u, 50929u, 50951u, 50957u, 50969u, 
+         50971u, 50989u, 50993u, 51001u, 51031u, 51043u, 51047u, 51059u, 51061u, 
+         51071u, 51109u, 51131u, 51133u, 51137u, 51151u, 51157u, 51169u, 51193u, 
+         51197u, 51199u, 51203u, 51217u, 51229u, 51239u, 51241u, 51257u, 51263u, 
+         51283u, 51287u, 51307u, 51329u, 51341u, 51343u, 51347u, 51349u, 51361u, 
+         51383u, 51407u, 51413u, 51419u, 51421u, 51427u, 51431u, 51437u, 51439u, 
+         51449u, 51461u, 51473u, 51479u, 51481u, 51487u, 51503u, 51511u, 51517u, 
+         51521u, 51539u, 51551u, 51563u, 51577u, 51581u, 51593u, 51599u, 51607u, 
+         51613u, 51631u, 51637u, 51647u, 51659u, 51673u, 51679u, 51683u, 51691u, 
+         51713u, 51719u, 51721u, 51749u, 51767u, 51769u, 51787u, 51797u, 51803u, 
+         51817u, 51827u, 51829u, 51839u, 51853u, 51859u, 51869u, 51871u, 51893u, 
+         51899u, 51907u, 51913u, 51929u, 51941u, 51949u, 51971u, 51973u, 51977u, 
+         51991u, 52009u, 52021u, 52027u, 52051u, 52057u, 52067u, 52069u, 52081u, 
+         52103u, 52121u, 52127u, 52147u, 52153u, 52163u, 52177u, 52181u, 52183u, 
+         52189u, 52201u, 52223u, 52237u, 52249u, 52253u, 52259u, 52267u, 52289u, 
+         52291u, 52301u, 52313u, 52321u, 52361u, 52363u, 52369u, 52379u, 52387u, 
+         52391u, 52433u, 52453u, 52457u, 52489u, 52501u, 52511u, 52517u, 52529u, 
+         52541u, 52543u, 52553u, 52561u, 52567u, 52571u, 52579u, 52583u, 52609u, 
+         52627u, 52631u, 52639u, 52667u, 52673u, 52691u, 52697u, 52709u, 52711u, 
+         52721u, 52727u, 52733u, 52747u, 52757u, 52769u, 52783u, 52807u, 52813u, 
+         52817u, 52837u, 52859u, 52861u, 52879u, 52883u, 52889u, 52901u, 52903u, 
+         52919u, 52937u, 52951u, 52957u, 52963u, 52967u, 52973u, 52981u, 52999u, 
+         53003u, 53017u, 53047u, 53051u, 53069u, 53077u, 53087u, 53089u, 53093u, 
+         53101u, 53113u, 53117u, 53129u, 53147u, 53149u, 53161u, 53171u, 53173u, 
+         53189u, 53197u, 53201u, 53231u, 53233u, 53239u, 53267u, 53269u, 53279u, 
+         53281u, 53299u, 53309u, 53323u, 53327u, 53353u, 53359u, 53377u, 53381u, 
+         53401u, 53407u, 53411u, 53419u, 53437u, 53441u, 53453u, 53479u, 53503u, 
+         53507u, 53527u, 53549u, 53551u, 53569u, 53591u, 53593u, 53597u, 53609u, 
+         53611u, 53617u, 53623u, 53629u, 53633u, 53639u, 53653u, 53657u, 53681u, 
+         53693u, 53699u, 53717u, 53719u, 53731u, 53759u, 53773u, 53777u, 53783u, 
+         53791u, 53813u, 53819u, 53831u, 53849u, 53857u, 53861u, 53881u, 53887u, 
+         53891u, 53897u, 53899u, 53917u, 53923u, 53927u, 53939u, 53951u, 53959u, 
+         53987u, 53993u, 54001u, 54011u, 54013u, 54037u, 54049u, 54059u, 54083u, 
+         54091u, 54101u, 54121u, 54133u, 54139u, 54151u, 54163u, 54167u, 54181u, 
+         54193u, 54217u, 54251u, 54269u, 54277u, 54287u, 54293u, 54311u, 54319u, 
+         54323u, 54331u, 54347u, 54361u, 54367u, 54371u, 54377u, 54401u, 54403u, 
+         54409u, 54413u, 54419u, 54421u, 54437u, 54443u, 54449u, 54469u, 54493u, 
+         54497u, 54499u, 54503u, 54517u, 54521u, 54539u, 54541u, 54547u, 54559u, 
+         54563u, 54577u, 54581u, 54583u, 54601u, 54617u, 54623u, 54629u, 54631u, 
+         54647u, 54667u, 54673u, 54679u, 54709u, 54713u, 54721u, 54727u, 54751u, 
+         54767u, 54773u, 54779u, 54787u, 54799u, 54829u, 54833u, 54851u, 54869u, 
+         54877u, 54881u, 54907u, 54917u, 54919u, 54941u, 54949u, 54959u, 54973u, 
+         54979u, 54983u, 55001u, 55009u, 55021u, 55049u, 55051u, 55057u, 55061u, 
+         55073u, 55079u, 55103u, 55109u, 55117u, 55127u, 55147u, 55163u, 55171u, 
+         55201u, 55207u, 55213u, 55217u, 55219u, 55229u, 55243u, 55249u, 55259u, 
+         55291u, 55313u, 55331u, 55333u, 55337u, 55339u, 55343u, 55351u, 55373u, 
+         55381u, 55399u, 55411u, 55439u, 55441u, 55457u, 55469u, 55487u, 55501u, 
+         55511u, 55529u, 55541u, 55547u, 55579u, 55589u, 55603u, 55609u, 55619u, 
+         55621u, 55631u, 55633u, 55639u, 55661u, 55663u, 55667u, 55673u, 55681u, 
+         55691u, 55697u, 55711u, 55717u, 55721u, 55733u, 55763u, 55787u, 55793u, 
+         55799u, 55807u, 55813u, 55817u, 55819u, 55823u, 55829u, 55837u, 55843u, 
+         55849u, 55871u, 55889u, 55897u, 55901u, 55903u, 55921u, 55927u, 55931u, 
+         55933u, 55949u, 55967u, 55987u, 55997u, 56003u, 56009u, 56039u, 56041u, 
+         56053u, 56081u, 56087u, 56093u, 56099u, 56101u, 56113u, 56123u, 56131u, 
+         56149u, 56167u, 56171u, 56179u, 56197u, 56207u, 56209u, 56237u, 56239u, 
+         56249u, 56263u, 56267u, 56269u, 56299u, 56311u, 56333u, 56359u, 56369u, 
+         56377u, 56383u, 56393u, 56401u, 56417u, 56431u, 56437u, 56443u, 56453u, 
+         56467u, 56473u, 56477u, 56479u, 56489u, 56501u, 56503u, 56509u, 56519u, 
+         56527u, 56531u, 56533u, 56543u, 56569u, 56591u, 56597u, 56599u, 56611u, 
+         56629u, 56633u, 56659u, 56663u, 56671u, 56681u, 56687u, 56701u, 56711u, 
+         56713u, 56731u, 56737u, 56747u, 56767u, 56773u, 56779u, 56783u, 56807u, 
+         56809u, 56813u, 56821u, 56827u, 56843u, 56857u, 56873u, 56891u, 56893u, 
+         56897u, 56909u, 56911u, 56921u, 56923u, 56929u, 56941u, 56951u, 56957u, 
+         56963u, 56983u, 56989u, 56993u, 56999u, 57037u, 57041u, 57047u, 57059u, 
+         57073u, 57077u, 57089u, 57097u, 57107u, 57119u, 57131u, 57139u, 57143u, 
+         57149u, 57163u, 57173u, 57179u, 57191u, 57193u, 57203u, 57221u, 57223u, 
+         57241u, 57251u, 57259u, 57269u, 57271u, 57283u, 57287u, 57301u, 57329u, 
+         57331u, 57347u, 57349u, 57367u, 57373u, 57383u, 57389u, 57397u, 57413u, 
+         57427u, 57457u, 57467u, 57487u, 57493u, 57503u, 57527u, 57529u, 57557u, 
+         57559u, 57571u, 57587u, 57593u, 57601u, 57637u, 57641u, 57649u, 57653u, 
+         57667u, 57679u, 57689u, 57697u, 57709u, 57713u, 57719u, 57727u, 57731u, 
+         57737u, 57751u, 57773u, 57781u, 57787u, 57791u, 57793u, 57803u, 57809u, 
+         57829u, 57839u, 57847u, 57853u, 57859u, 57881u, 57899u, 57901u, 57917u, 
+         57923u, 57943u, 57947u, 57973u, 57977u, 57991u, 58013u, 58027u, 58031u, 
+         58043u, 58049u, 58057u, 58061u, 58067u, 58073u, 58099u, 58109u, 58111u, 
+         58129u, 58147u, 58151u, 58153u, 58169u, 58171u, 58189u, 58193u, 58199u, 
+         58207u, 58211u, 58217u, 58229u, 58231u, 58237u, 58243u, 58271u, 58309u, 
+         58313u, 58321u, 58337u, 58363u, 58367u, 58369u, 58379u, 58391u, 58393u, 
+         58403u, 58411u, 58417u, 58427u, 58439u, 58441u, 58451u, 58453u, 58477u, 
+         58481u, 58511u, 58537u, 58543u, 58549u, 58567u, 58573u, 58579u, 58601u, 
+         58603u, 58613u, 58631u, 58657u, 58661u, 58679u, 58687u, 58693u, 58699u, 
+         58711u, 58727u, 58733u, 58741u, 58757u, 58763u, 58771u, 58787u, 58789u, 
+         58831u, 58889u, 58897u, 58901u, 58907u, 58909u, 58913u, 58921u, 58937u, 
+         58943u, 58963u, 58967u, 58979u, 58991u, 58997u, 59009u, 59011u, 59021u, 
+         59023u, 59029u, 59051u, 59053u, 59063u, 59069u, 59077u, 59083u, 59093u, 
+         59107u, 59113u, 59119u, 59123u, 59141u, 59149u, 59159u, 59167u, 59183u, 
+         59197u, 59207u, 59209u, 59219u, 59221u, 59233u, 59239u, 59243u, 59263u, 
+         59273u, 59281u, 59333u, 59341u, 59351u, 59357u, 59359u, 59369u, 59377u, 
+         59387u, 59393u, 59399u, 59407u, 59417u, 59419u, 59441u, 59443u, 59447u, 
+         59453u, 59467u, 59471u, 59473u, 59497u, 59509u, 59513u, 59539u, 59557u, 
+         59561u, 59567u, 59581u, 59611u, 59617u, 59621u, 59627u, 59629u, 59651u, 
+         59659u, 59663u, 59669u, 59671u, 59693u, 59699u, 59707u, 59723u, 59729u, 
+         59743u, 59747u, 59753u, 59771u, 59779u, 59791u, 59797u, 59809u, 59833u, 
+         59863u, 59879u, 59887u, 59921u, 59929u, 59951u, 59957u, 59971u, 59981u, 
+         59999u, 60013u, 60017u, 60029u, 60037u, 60041u, 60077u, 60083u, 60089u, 
+         60091u, 60101u, 60103u, 60107u, 60127u, 60133u, 60139u, 60149u, 60161u, 
+         60167u, 60169u, 60209u, 60217u, 60223u, 60251u, 60257u, 60259u, 60271u, 
+         60289u, 60293u, 60317u, 60331u, 60337u, 60343u, 60353u, 60373u, 60383u, 
+         60397u, 60413u, 60427u, 60443u, 60449u, 60457u, 60493u, 60497u, 60509u, 
+         60521u, 60527u, 60539u, 60589u, 60601u, 60607u, 60611u, 60617u, 60623u, 
+         60631u, 60637u, 60647u, 60649u, 60659u, 60661u, 60679u, 60689u, 60703u, 
+         60719u, 60727u, 60733u, 60737u, 60757u, 60761u, 60763u, 60773u, 60779u, 
+         60793u, 60811u, 60821u, 60859u, 60869u, 60887u, 60889u, 60899u, 60901u, 
+         60913u, 60917u, 60919u, 60923u, 60937u, 60943u, 60953u, 60961u, 61001u, 
+         61007u, 61027u, 61031u, 61043u, 61051u, 61057u, 61091u, 61099u, 61121u, 
+         61129u, 61141u, 61151u, 61153u, 61169u, 61211u, 61223u, 61231u, 61253u, 
+         61261u, 61283u, 61291u, 61297u, 61331u, 61333u, 61339u, 61343u, 61357u, 
+         61363u, 61379u, 61381u, 61403u, 61409u, 61417u, 61441u, 61463u, 61469u, 
+         61471u, 61483u, 61487u, 61493u, 61507u, 61511u, 61519u, 61543u, 61547u, 
+         61553u, 61559u, 61561u, 61583u, 61603u, 61609u, 61613u, 61627u, 61631u, 
+         61637u, 61643u, 61651u, 61657u, 61667u, 61673u, 61681u, 61687u, 61703u, 
+         61717u, 61723u, 61729u, 61751u, 61757u, 61781u, 61813u, 61819u, 61837u, 
+         61843u, 61861u, 61871u, 61879u, 61909u, 61927u, 61933u, 61949u, 61961u, 
+         61967u, 61979u, 61981u, 61987u, 61991u, 62003u, 62011u, 62017u, 62039u, 
+         62047u, 62053u, 62057u, 62071u, 62081u, 62099u, 62119u, 62129u, 62131u, 
+         62137u, 62141u, 62143u, 62171u, 62189u, 62191u, 62201u, 62207u, 62213u, 
+         62219u, 62233u, 62273u, 62297u, 62299u, 62303u, 62311u, 62323u, 62327u, 
+         62347u, 62351u, 62383u, 62401u, 62417u, 62423u, 62459u, 62467u, 62473u, 
+         62477u, 62483u, 62497u, 62501u, 62507u, 62533u, 62539u, 62549u, 62563u, 
+         62581u, 62591u, 62597u, 62603u, 62617u, 62627u, 62633u, 62639u, 62653u, 
+         62659u, 62683u, 62687u, 62701u, 62723u, 62731u, 62743u, 62753u, 62761u, 
+         62773u, 62791u, 62801u, 62819u, 62827u, 62851u, 62861u, 62869u, 62873u, 
+         62897u, 62903u, 62921u, 62927u, 62929u, 62939u, 62969u, 62971u, 62981u, 
+         62983u, 62987u, 62989u, 63029u, 63031u, 63059u, 63067u, 63073u, 63079u, 
+         63097u, 63103u, 63113u, 63127u, 63131u, 63149u, 63179u, 63197u, 63199u, 
+         63211u, 63241u, 63247u, 63277u, 63281u, 63299u, 63311u, 63313u, 63317u, 
+         63331u, 63337u, 63347u, 63353u, 63361u, 63367u, 63377u, 63389u, 63391u, 
+         63397u, 63409u, 63419u, 63421u, 63439u, 63443u, 63463u, 63467u, 63473u, 
+         63487u, 63493u, 63499u, 63521u, 63527u, 63533u, 63541u, 63559u, 63577u, 
+         63587u, 63589u, 63599u, 63601u, 63607u, 63611u, 63617u, 63629u, 63647u, 
+         63649u, 63659u, 63667u, 63671u, 63689u, 63691u, 63697u, 63703u, 63709u, 
+         63719u, 63727u, 63737u, 63743u, 63761u, 63773u, 63781u, 63793u, 63799u, 
+         63803u, 63809u, 63823u, 63839u, 63841u, 63853u, 63857u, 63863u, 63901u, 
+         63907u, 63913u, 63929u, 63949u, 63977u, 63997u, 64007u, 64013u, 64019u, 
+         64033u, 64037u, 64063u, 64067u, 64081u, 64091u, 64109u, 64123u, 64151u, 
+         64153u, 64157u, 64171u, 64187u, 64189u, 64217u, 64223u, 64231u, 64237u, 
+         64271u, 64279u, 64283u, 64301u, 64303u, 64319u, 64327u, 64333u, 64373u, 
+         64381u, 64399u, 64403u, 64433u, 64439u, 64451u, 64453u, 64483u, 64489u, 
+         64499u, 64513u, 64553u, 64567u, 64577u, 64579u, 64591u, 64601u, 64609u, 
+         64613u, 64621u, 64627u, 64633u, 64661u, 64663u, 64667u, 64679u, 64693u, 
+         64709u, 64717u, 64747u, 64763u, 64781u, 64783u, 64793u, 64811u, 64817u, 
+         64849u, 64853u, 64871u, 64877u, 64879u, 64891u, 64901u, 64919u, 64921u, 
+         64927u, 64937u, 64951u, 64969u, 64997u, 65003u, 65011u, 65027u, 65029u, 
+         65033u, 65053u, 65063u, 65071u, 65089u, 65099u, 65101u, 65111u, 65119u, 
+         65123u, 65129u, 65141u, 65147u, 65167u, 65171u, 65173u, 65179u, 65183u, 
+         65203u, 65213u, 65239u, 65257u, 65267u, 65269u, 65287u, 65293u, 65309u, 
+         65323u, 65327u, 65353u, 65357u, 65371u, 65381u, 65393u, 65407u, 65413u, 
+         65419u, 65423u, 65437u, 65447u, 65449u, 65479u, 65497u, 65519u, 65521u
+      };
+      static const boost::array<boost::uint16_t, 3458> a3 = {
+         2u, 4u, 8u, 16u, 22u, 28u, 44u, 
+         46u, 52u, 64u, 74u, 82u, 94u, 98u, 112u, 
+         116u, 122u, 142u, 152u, 164u, 166u, 172u, 178u, 
+         182u, 184u, 194u, 196u, 226u, 242u, 254u, 274u, 
+         292u, 296u, 302u, 304u, 308u, 316u, 332u, 346u, 
+         364u, 386u, 392u, 394u, 416u, 422u, 428u, 446u, 
+         448u, 458u, 494u, 502u, 506u, 512u, 532u, 536u, 
+         548u, 554u, 568u, 572u, 574u, 602u, 626u, 634u, 
+         638u, 644u, 656u, 686u, 704u, 736u, 758u, 766u, 
+         802u, 808u, 812u, 824u, 826u, 838u, 842u, 848u, 
+         868u, 878u, 896u, 914u, 922u, 928u, 932u, 956u, 
+         964u, 974u, 988u, 994u, 998u, 1006u, 1018u, 1034u, 
+         1036u, 1052u, 1058u, 1066u, 1082u, 1094u, 1108u, 1118u, 
+         1148u, 1162u, 1166u, 1178u, 1186u, 1198u, 1204u, 1214u, 
+         1216u, 1228u, 1256u, 1262u, 1274u, 1286u, 1306u, 1316u, 
+         1318u, 1328u, 1342u, 1348u, 1354u, 1384u, 1388u, 1396u, 
+         1408u, 1412u, 1414u, 1424u, 1438u, 1442u, 1468u, 1486u, 
+         1498u, 1508u, 1514u, 1522u, 1526u, 1538u, 1544u, 1568u, 
+         1586u, 1594u, 1604u, 1606u, 1618u, 1622u, 1634u, 1646u, 
+         1652u, 1654u, 1676u, 1678u, 1682u, 1684u, 1696u, 1712u, 
+         1726u, 1736u, 1738u, 1754u, 1772u, 1804u, 1808u, 1814u, 
+         1834u, 1856u, 1864u, 1874u, 1876u, 1886u, 1892u, 1894u, 
+         1898u, 1912u, 1918u, 1942u, 1946u, 1954u, 1958u, 1964u, 
+         1976u, 1988u, 1996u, 2002u, 2012u, 2024u, 2032u, 2042u, 
+         2044u, 2054u, 2066u, 2072u, 2084u, 2096u, 2116u, 2144u, 
+         2164u, 2174u, 2188u, 2198u, 2206u, 2216u, 2222u, 2224u, 
+         2228u, 2242u, 2248u, 2254u, 2266u, 2272u, 2284u, 2294u, 
+         2308u, 2318u, 2332u, 2348u, 2356u, 2366u, 2392u, 2396u, 
+         2398u, 2404u, 2408u, 2422u, 2426u, 2432u, 2444u, 2452u, 
+         2458u, 2488u, 2506u, 2518u, 2524u, 2536u, 2552u, 2564u, 
+         2576u, 2578u, 2606u, 2612u, 2626u, 2636u, 2672u, 2674u, 
+         2678u, 2684u, 2692u, 2704u, 2726u, 2744u, 2746u, 2776u, 
+         2794u, 2816u, 2836u, 2854u, 2864u, 2902u, 2908u, 2912u, 
+         2914u, 2938u, 2942u, 2948u, 2954u, 2956u, 2966u, 2972u, 
+         2986u, 2996u, 3004u, 3008u, 3032u, 3046u, 3062u, 3076u, 
+         3098u, 3104u, 3124u, 3134u, 3148u, 3152u, 3164u, 3176u, 
+         3178u, 3194u, 3202u, 3208u, 3214u, 3232u, 3236u, 3242u, 
+         3256u, 3278u, 3284u, 3286u, 3328u, 3344u, 3346u, 3356u, 
+         3362u, 3364u, 3368u, 3374u, 3382u, 3392u, 3412u, 3428u, 
+         3458u, 3466u, 3476u, 3484u, 3494u, 3496u, 3526u, 3532u, 
+         3538u, 3574u, 3584u, 3592u, 3608u, 3614u, 3616u, 3628u, 
+         3656u, 3658u, 3662u, 3668u, 3686u, 3698u, 3704u, 3712u, 
+         3722u, 3724u, 3728u, 3778u, 3782u, 3802u, 3806u, 3836u, 
+         3844u, 3848u, 3854u, 3866u, 3868u, 3892u, 3896u, 3904u, 
+         3922u, 3928u, 3932u, 3938u, 3946u, 3956u, 3958u, 3962u, 
+         3964u, 4004u, 4022u, 4058u, 4088u, 4118u, 4126u, 4142u, 
+         4156u, 4162u, 4174u, 4202u, 4204u, 4226u, 4228u, 4232u, 
+         4244u, 4274u, 4286u, 4292u, 4294u, 4298u, 4312u, 4322u, 
+         4324u, 4342u, 4364u, 4376u, 4394u, 4396u, 4406u, 4424u, 
+         4456u, 4462u, 4466u, 4468u, 4474u, 4484u, 4504u, 4516u, 
+         4526u, 4532u, 4544u, 4564u, 4576u, 4582u, 4586u, 4588u, 
+         4604u, 4606u, 4622u, 4628u, 4642u, 4646u, 4648u, 4664u, 
+         4666u, 4672u, 4688u, 4694u, 4702u, 4706u, 4714u, 4736u, 
+         4754u, 4762u, 4774u, 4778u, 4786u, 4792u, 4816u, 4838u, 
+         4844u, 4846u, 4858u, 4888u, 4894u, 4904u, 4916u, 4922u, 
+         4924u, 4946u, 4952u, 4954u, 4966u, 4972u, 4994u, 5002u, 
+         5014u, 5036u, 5038u, 5048u, 5054u, 5072u, 5084u, 5086u, 
+         5092u, 5104u, 5122u, 5128u, 5132u, 5152u, 5174u, 5182u, 
+         5194u, 5218u, 5234u, 5248u, 5258u, 5288u, 5306u, 5308u, 
+         5314u, 5318u, 5332u, 5342u, 5344u, 5356u, 5366u, 5378u, 
+         5384u, 5386u, 5402u, 5414u, 5416u, 5422u, 5434u, 5444u, 
+         5446u, 5456u, 5462u, 5464u, 5476u, 5488u, 5504u, 5524u, 
+         5534u, 5546u, 5554u, 5584u, 5594u, 5608u, 5612u, 5618u, 
+         5626u, 5632u, 5636u, 5656u, 5674u, 5698u, 5702u, 5714u, 
+         5722u, 5726u, 5728u, 5752u, 5758u, 5782u, 5792u, 5794u, 
+         5798u, 5804u, 5806u, 5812u, 5818u, 5824u, 5828u, 5852u, 
+         5854u, 5864u, 5876u, 5878u, 5884u, 5894u, 5902u, 5908u, 
+         5918u, 5936u, 5938u, 5944u, 5948u, 5968u, 5992u, 6002u, 
+         6014u, 6016u, 6028u, 6034u, 6058u, 6062u, 6098u, 6112u, 
+         6128u, 6136u, 6158u, 6164u, 6172u, 6176u, 6178u, 6184u, 
+         6206u, 6226u, 6242u, 6254u, 6272u, 6274u, 6286u, 6302u, 
+         6308u, 6314u, 6326u, 6332u, 6344u, 6346u, 6352u, 6364u, 
+         6374u, 6382u, 6398u, 6406u, 6412u, 6428u, 6436u, 6448u, 
+         6452u, 6458u, 6464u, 6484u, 6496u, 6508u, 6512u, 6518u, 
+         6538u, 6542u, 6554u, 6556u, 6566u, 6568u, 6574u, 6604u, 
+         6626u, 6632u, 6634u, 6638u, 6676u, 6686u, 6688u, 6692u, 
+         6694u, 6716u, 6718u, 6734u, 6736u, 6742u, 6752u, 6772u, 
+         6778u, 6802u, 6806u, 6818u, 6832u, 6844u, 6848u, 6886u, 
+         6896u, 6926u, 6932u, 6934u, 6946u, 6958u, 6962u, 6968u, 
+         6998u, 7012u, 7016u, 7024u, 7042u, 7078u, 7082u, 7088u, 
+         7108u, 7112u, 7114u, 7126u, 7136u, 7138u, 7144u, 7154u, 
+         7166u, 7172u, 7184u, 7192u, 7198u, 7204u, 7228u, 7232u, 
+         7262u, 7282u, 7288u, 7324u, 7334u, 7336u, 7348u, 7354u, 
+         7358u, 7366u, 7372u, 7376u, 7388u, 7396u, 7402u, 7414u, 
+         7418u, 7424u, 7438u, 7442u, 7462u, 7474u, 7478u, 7484u, 
+         7502u, 7504u, 7508u, 7526u, 7528u, 7544u, 7556u, 7586u, 
+         7592u, 7598u, 7606u, 7646u, 7654u, 7702u, 7708u, 7724u, 
+         7742u, 7756u, 7768u, 7774u, 7792u, 7796u, 7816u, 7826u, 
+         7828u, 7834u, 7844u, 7852u, 7882u, 7886u, 7898u, 7918u, 
+         7924u, 7936u, 7942u, 7948u, 7982u, 7988u, 7994u, 8012u, 
+         8018u, 8026u, 8036u, 8048u, 8054u, 8062u, 8072u, 8074u, 
+         8078u, 8102u, 8108u, 8116u, 8138u, 8144u, 8146u, 8158u, 
+         8164u, 8174u, 8186u, 8192u, 8216u, 8222u, 8236u, 8248u, 
+         8284u, 8288u, 8312u, 8314u, 8324u, 8332u, 8342u, 8348u, 
+         8362u, 8372u, 8404u, 8408u, 8416u, 8426u, 8438u, 8464u, 
+         8482u, 8486u, 8492u, 8512u, 8516u, 8536u, 8542u, 8558u, 
+         8564u, 8566u, 8596u, 8608u, 8614u, 8624u, 8626u, 8632u, 
+         8642u, 8654u, 8662u, 8666u, 8668u, 8674u, 8684u, 8696u, 
+         8722u, 8744u, 8752u, 8758u, 8762u, 8776u, 8782u, 8788u, 
+         8818u, 8822u, 8828u, 8842u, 8846u, 8848u, 8876u, 8878u, 
+         8884u, 8906u, 8914u, 8918u, 8936u, 8954u, 8972u, 8974u, 
+         8986u, 8992u, 8996u, 9016u, 9026u, 9032u, 9038u, 9052u, 
+         9062u, 9074u, 9076u, 9088u, 9118u, 9152u, 9164u, 9172u, 
+         9178u, 9182u, 9184u, 9194u, 9196u, 9212u, 9224u, 9226u, 
+         9236u, 9244u, 9262u, 9286u, 9292u, 9296u, 9308u, 9322u, 
+         9326u, 9334u, 9338u, 9352u, 9356u, 9362u, 9368u, 9388u, 
+         9394u, 9398u, 9406u, 9424u, 9476u, 9478u, 9482u, 9494u, 
+         9502u, 9506u, 9544u, 9548u, 9574u, 9598u, 9614u, 9626u, 
+         9632u, 9634u, 9646u, 9658u, 9674u, 9676u, 9682u, 9688u, 
+         9692u, 9704u, 9718u, 9734u, 9742u, 9754u, 9772u, 9788u, 
+         9794u, 9802u, 9812u, 9818u, 9832u, 9842u, 9854u, 9856u, 
+         9866u, 9868u, 9872u, 9896u, 9902u, 9944u, 9968u, 9976u, 
+         9986u, 9992u, 9998u, 10004u, 10006u, 10018u, 10022u, 10036u, 
+         10042u, 10048u, 10076u, 10082u, 10084u, 10094u, 10106u, 10118u, 
+         10124u, 10144u, 10148u, 10154u, 10168u, 10172u, 10174u, 10186u, 
+         10196u, 10208u, 10232u, 10238u, 10246u, 10252u, 10258u, 10262u, 
+         10286u, 10298u, 10318u, 10334u, 10348u, 10378u, 10396u, 10402u, 
+         10406u, 10432u, 10444u, 10448u, 10454u, 10456u, 10462u, 10466u, 
+         10468u, 10496u, 10504u, 10544u, 10546u, 10556u, 10564u, 10568u, 
+         10588u, 10594u, 10612u, 10622u, 10624u, 10628u, 10672u, 10678u, 
+         10696u, 10708u, 10714u, 10718u, 10724u, 10726u, 10748u, 10754u, 
+         10768u, 10798u, 10808u, 10832u, 10834u, 10844u, 10852u, 10868u, 
+         10886u, 10888u, 10906u, 10928u, 10936u, 10946u, 10952u, 10958u, 
+         10972u, 10976u, 10984u, 11002u, 11006u, 11008u, 11026u, 11044u, 
+         11062u, 11068u, 11072u, 11096u, 11114u, 11116u, 11132u, 11138u, 
+         11144u, 11162u, 11182u, 11198u, 11218u, 11222u, 11236u, 11242u, 
+         11246u, 11266u, 11284u, 11294u, 11296u, 11302u, 11312u, 11336u, 
+         11338u, 11348u, 11372u, 11378u, 11384u, 11408u, 11414u, 11426u, 
+         11428u, 11456u, 11468u, 11482u, 11488u, 11494u, 11506u, 11512u, 
+         11534u, 11546u, 11558u, 11566u, 11602u, 11606u, 11618u, 11632u, 
+         11636u, 11656u, 11666u, 11678u, 11702u, 11704u, 11708u, 11714u, 
+         11726u, 11728u, 11732u, 11734u, 11744u, 11756u, 11782u, 11788u, 
+         11804u, 11812u, 11816u, 11824u, 11834u, 11842u, 11848u, 11882u, 
+         11884u, 11896u, 11912u, 11936u, 11942u, 11944u, 11954u, 11956u, 
+         11974u, 11978u, 11986u, 11992u, 12008u, 12014u, 12016u, 12022u, 
+         12028u, 12034u, 12038u, 12052u, 12056u, 12076u, 12082u, 12086u, 
+         12106u, 12112u, 12124u, 12146u, 12152u, 12154u, 12164u, 12176u, 
+         12178u, 12184u, 12188u, 12196u, 12208u, 12212u, 12226u, 12238u, 
+         12248u, 12262u, 12266u, 12278u, 12304u, 12314u, 12328u, 12332u, 
+         12358u, 12364u, 12394u, 12398u, 12416u, 12434u, 12442u, 12448u, 
+         12464u, 12472u, 12482u, 12496u, 12506u, 12514u, 12524u, 12544u, 
+         12566u, 12586u, 12602u, 12604u, 12622u, 12628u, 12632u, 12638u, 
+         12644u, 12656u, 12658u, 12668u, 12694u, 12698u, 12706u, 12724u, 
+         12742u, 12748u, 12766u, 12772u, 12776u, 12782u, 12806u, 12812u, 
+         12832u, 12866u, 12892u, 12902u, 12904u, 12932u, 12944u, 12952u, 
+         12962u, 12974u, 12976u, 12982u, 13004u, 13006u, 13018u, 13034u, 
+         13036u, 13042u, 13048u, 13058u, 13072u, 13088u, 13108u, 13114u, 
+         13118u, 13156u, 13162u, 13172u, 13178u, 13186u, 13202u, 13244u, 
+         13246u, 13252u, 13256u, 13262u, 13268u, 13274u, 13288u, 13304u, 
+         13318u, 13322u, 13342u, 13352u, 13354u, 13358u, 13366u, 13384u, 
+         13394u, 13406u, 13442u, 13444u, 13454u, 13496u, 13504u, 13508u, 
+         13528u, 13552u, 13568u, 13576u, 13598u, 13604u, 13612u, 13616u, 
+         13618u, 13624u, 13646u, 13652u, 13658u, 13666u, 13694u, 13696u, 
+         13706u, 13724u, 13738u, 13744u, 13748u, 13766u, 13774u, 13784u, 
+         13798u, 13802u, 13814u, 13822u, 13832u, 13844u, 13858u, 13862u, 
+         13864u, 13876u, 13888u, 13892u, 13898u, 13916u, 13946u, 13958u, 
+         13996u, 14002u, 14014u, 14024u, 14026u, 14044u, 14054u, 14066u, 
+         14074u, 14078u, 14086u, 14092u, 14096u, 14098u, 14122u, 14134u, 
+         14152u, 14156u, 14158u, 14162u, 14164u, 14222u, 14234u, 14242u, 
+         14266u, 14276u, 14278u, 14282u, 14288u, 14294u, 14306u, 14308u, 
+         14312u, 14326u, 14332u, 14338u, 14354u, 14366u, 14368u, 14372u, 
+         14404u, 14408u, 14432u, 14438u, 14444u, 14452u, 14462u, 14464u, 
+         14486u, 14504u, 14516u, 14536u, 14542u, 14572u, 14576u, 14606u, 
+         14612u, 14614u, 14618u, 14632u, 14638u, 14642u, 14656u, 14672u, 
+         14674u, 14686u, 14696u, 14698u, 14704u, 14716u, 14728u, 14738u, 
+         14744u, 14752u, 14774u, 14782u, 14794u, 14806u, 14812u, 14828u, 
+         14834u, 14852u, 14872u, 14894u, 14912u, 14914u, 14936u, 14938u, 
+         14954u, 14956u, 14978u, 14992u, 15002u, 15022u, 15032u, 15064u, 
+         15068u, 15076u, 15086u, 15092u, 15094u, 15116u, 15122u, 15134u, 
+         15136u, 15142u, 15146u, 15148u, 15152u, 15166u, 15178u, 15202u, 
+         15212u, 15214u, 15226u, 15242u, 15244u, 15248u, 15254u, 15268u, 
+         15274u, 15284u, 15296u, 15298u, 15314u, 15328u, 15362u, 15374u, 
+         15376u, 15382u, 15388u, 15394u, 15398u, 15418u, 15428u, 15454u, 
+         15466u, 15478u, 15482u, 15484u, 15488u, 15496u, 15506u, 15508u, 
+         15512u, 15514u, 15536u, 15542u, 15548u, 15562u, 15566u, 15584u, 
+         15596u, 15622u, 15628u, 15638u, 15646u, 15662u, 15664u, 15668u, 
+         15688u, 15698u, 15704u, 15746u, 15748u, 15758u, 15764u, 15772u, 
+         15796u, 15808u, 15814u, 15818u, 15824u, 15836u, 15838u, 15866u, 
+         15874u, 15886u, 15904u, 15922u, 15928u, 15974u, 15982u, 15992u, 
+         15998u, 16012u, 16016u, 16018u, 16024u, 16028u, 16034u, 16076u, 
+         16084u, 16094u, 16102u, 16112u, 16114u, 16132u, 16136u, 16142u, 
+         16154u, 16166u, 16168u, 16172u, 16192u, 16202u, 16214u, 16226u, 
+         16234u, 16238u, 16264u, 16282u, 16304u, 16312u, 16318u, 16334u, 
+         16348u, 16364u, 16366u, 16384u, 16394u, 16396u, 16402u, 16408u, 
+         16418u, 16432u, 16436u, 16438u, 16468u, 16472u, 16474u, 16478u, 
+         16486u, 16496u, 16502u, 16504u, 16516u, 16532u, 16538u, 16594u, 
+         16604u, 16606u, 16618u, 16628u, 16636u, 16648u, 16654u, 16658u, 
+         16672u, 16682u, 16684u, 16688u, 16696u, 16702u, 16706u, 16726u, 
+         16732u, 16744u, 16766u, 16772u, 16804u, 16814u, 16816u, 16826u, 
+         16838u, 16852u, 16858u, 16886u, 16922u, 16928u, 16934u, 16936u, 
+         16948u, 16952u, 16958u, 16964u, 16972u, 16994u, 16996u, 17014u, 
+         17024u, 17026u, 17032u, 17036u, 17056u, 17066u, 17074u, 17078u, 
+         17084u, 17098u, 17116u, 17122u, 17164u, 17186u, 17188u, 17192u, 
+         17194u, 17222u, 17224u, 17228u, 17246u, 17252u, 17258u, 17264u, 
+         17276u, 17278u, 17302u, 17312u, 17348u, 17354u, 17356u, 17368u, 
+         17378u, 17404u, 17428u, 17446u, 17462u, 17468u, 17474u, 17488u, 
+         17512u, 17524u, 17528u, 17536u, 17542u, 17554u, 17558u, 17566u, 
+         17582u, 17602u, 17642u, 17668u, 17672u, 17684u, 17686u, 17692u, 
+         17696u, 17698u, 17708u, 17722u, 17732u, 17734u, 17738u, 17764u, 
+         17776u, 17804u, 17806u, 17822u, 17848u, 17854u, 17864u, 17866u, 
+         17872u, 17882u, 17888u, 17896u, 17902u, 17908u, 17914u, 17924u, 
+         17936u, 17942u, 17962u, 18002u, 18022u, 18026u, 18028u, 18044u, 
+         18056u, 18062u, 18074u, 18082u, 18086u, 18104u, 18106u, 18118u, 
+         18128u, 18154u, 18166u, 18182u, 18184u, 18202u, 18226u, 18238u, 
+         18242u, 18256u, 18278u, 18298u, 18308u, 18322u, 18334u, 18338u, 
+         18356u, 18368u, 18376u, 18386u, 18398u, 18404u, 18434u, 18448u, 
+         18452u, 18476u, 18482u, 18512u, 18518u, 18524u, 18526u, 18532u, 
+         18554u, 18586u, 18592u, 18596u, 18602u, 18608u, 18628u, 18644u, 
+         18646u, 18656u, 18664u, 18676u, 18686u, 18688u, 18694u, 18704u, 
+         18712u, 18728u, 18764u, 18772u, 18778u, 18782u, 18784u, 18812u, 
+         18814u, 18842u, 18854u, 18856u, 18866u, 18872u, 18886u, 18896u, 
+         18902u, 18908u, 18914u, 18922u, 18928u, 18932u, 18946u, 18964u, 
+         18968u, 18974u, 18986u, 18988u, 18998u, 19016u, 19024u, 19054u, 
+         19094u, 19096u, 19114u, 19118u, 19124u, 19138u, 19156u, 19162u, 
+         19166u, 19178u, 19184u, 19196u, 19202u, 19216u, 19226u, 19252u, 
+         19258u, 19274u, 19276u, 19292u, 19322u, 19324u, 19334u, 19336u, 
+         19378u, 19384u, 19412u, 19426u, 19432u, 19442u, 19444u, 19456u, 
+         19474u, 19486u, 19492u, 19502u, 19514u, 19526u, 19546u, 19552u, 
+         19556u, 19558u, 19568u, 19574u, 19586u, 19598u, 19612u, 19624u, 
+         19658u, 19664u, 19666u, 19678u, 19688u, 19694u, 19702u, 19708u, 
+         19712u, 19724u, 19762u, 19768u, 19778u, 19796u, 19798u, 19826u, 
+         19828u, 19834u, 19846u, 19876u, 19892u, 19894u, 19904u, 19912u, 
+         19916u, 19918u, 19934u, 19952u, 19978u, 19982u, 19988u, 19996u, 
+         20014u, 20036u, 20042u, 20062u, 20066u, 20072u, 20084u, 20086u, 
+         20092u, 20104u, 20108u, 20126u, 20132u, 20134u, 20156u, 20168u, 
+         20176u, 20182u, 20198u, 20216u, 20246u, 20258u, 20282u, 20284u, 
+         20294u, 20296u, 20302u, 20308u, 20312u, 20318u, 20354u, 20368u, 
+         20374u, 20396u, 20398u, 20456u, 20464u, 20476u, 20482u, 20492u, 
+         20494u, 20534u, 20542u, 20548u, 20576u, 20578u, 20582u, 20596u, 
+         20602u, 20608u, 20626u, 20636u, 20644u, 20648u, 20662u, 20666u, 
+         20674u, 20704u, 20708u, 20714u, 20722u, 20728u, 20734u, 20752u, 
+         20756u, 20758u, 20762u, 20776u, 20788u, 20806u, 20816u, 20818u, 
+         20822u, 20834u, 20836u, 20846u, 20854u, 20864u, 20878u, 20888u, 
+         20906u, 20918u, 20926u, 20932u, 20942u, 20956u, 20966u, 20974u, 
+         20996u, 20998u, 21004u, 21026u, 21038u, 21044u, 21052u, 21064u, 
+         21092u, 21094u, 21142u, 21154u, 21158u, 21176u, 21184u, 21194u, 
+         21208u, 21218u, 21232u, 21236u, 21248u, 21278u, 21302u, 21308u, 
+         21316u, 21322u, 21326u, 21334u, 21388u, 21392u, 21394u, 21404u, 
+         21416u, 21424u, 21434u, 21446u, 21458u, 21476u, 21478u, 21502u, 
+         21506u, 21514u, 21536u, 21548u, 21568u, 21572u, 21584u, 21586u, 
+         21598u, 21614u, 21616u, 21644u, 21646u, 21652u, 21676u, 21686u, 
+         21688u, 21716u, 21718u, 21722u, 21742u, 21746u, 21758u, 21764u, 
+         21778u, 21782u, 21788u, 21802u, 21824u, 21848u, 21868u, 21872u, 
+         21886u, 21892u, 21898u, 21908u, 21938u, 21946u, 21956u, 21974u, 
+         21976u, 21982u, 21988u, 22004u, 22006u, 22012u, 22018u, 22022u, 
+         22024u, 22048u, 22052u, 22054u, 22078u, 22088u, 22094u, 22096u, 
+         22106u, 22108u, 22114u, 22136u, 22144u, 22148u, 22156u, 22162u, 
+         22166u, 22184u, 22186u, 22204u, 22208u, 22216u, 22232u, 22258u, 
+         22262u, 22268u, 22276u, 22298u, 22318u, 22334u, 22342u, 22346u, 
+         22352u, 22376u, 22382u, 22396u, 22408u, 22424u, 22426u, 22438u, 
+         22442u, 22456u, 22466u, 22468u, 22472u, 22484u, 22502u, 22534u, 
+         22544u, 22558u, 22582u, 22594u, 22634u, 22642u, 22676u, 22688u, 
+         22702u, 22706u, 22724u, 22726u, 22754u, 22766u, 22786u, 22792u, 
+         22802u, 22804u, 22844u, 22862u, 22876u, 22888u, 22892u, 22928u, 
+         22934u, 22936u, 22958u, 22964u, 22978u, 22988u, 23012u, 23054u, 
+         23056u, 23072u, 23074u, 23108u, 23116u, 23122u, 23126u, 23128u, 
+         23132u, 23146u, 23186u, 23194u, 23206u, 23212u, 23236u, 23254u, 
+         23258u, 23264u, 23266u, 23272u, 23276u, 23278u, 23282u, 23284u, 
+         23308u, 23318u, 23326u, 23332u, 23338u, 23348u, 23362u, 23368u, 
+         23384u, 23402u, 23416u, 23434u, 23458u, 23462u, 23468u, 23474u, 
+         23482u, 23486u, 23506u, 23516u, 23522u, 23534u, 23536u, 23548u, 
+         23552u, 23566u, 23572u, 23578u, 23584u, 23588u, 23602u, 23618u, 
+         23654u, 23668u, 23674u, 23678u, 23692u, 23696u, 23702u, 23726u, 
+         23734u, 23738u, 23758u, 23768u, 23782u, 23794u, 23828u, 23836u, 
+         23846u, 23852u, 23858u, 23864u, 23878u, 23882u, 23896u, 23908u, 
+         23914u, 23924u, 23942u, 23956u, 23966u, 23978u, 23984u, 23986u, 
+         23992u, 23998u, 24026u, 24028u, 24032u, 24056u, 24062u, 24064u, 
+         24068u, 24076u, 24092u, 24098u, 24118u, 24122u, 24124u, 24134u, 
+         24136u, 24146u, 24154u, 24218u, 24224u, 24232u, 24244u, 24248u, 
+         24262u, 24274u, 24284u, 24286u, 24298u, 24304u, 24314u, 24332u, 
+         24356u, 24362u, 24364u, 24374u, 24382u, 24388u, 24404u, 24424u, 
+         24428u, 24442u, 24448u, 24454u, 24466u, 24472u, 24476u, 24482u, 
+         24484u, 24488u, 24496u, 24518u, 24524u, 24532u, 24536u, 24538u, 
+         24554u, 24572u, 24586u, 24592u, 24614u, 24628u, 24638u, 24652u, 
+         24656u, 24662u, 24664u, 24668u, 24682u, 24692u, 24704u, 24712u, 
+         24728u, 24736u, 24746u, 24754u, 24778u, 24818u, 24824u, 24836u, 
+         24838u, 24844u, 24862u, 24866u, 24868u, 24872u, 24902u, 24904u, 
+         24934u, 24938u, 24946u, 24964u, 24976u, 24988u, 24992u, 24994u, 
+         24998u, 25012u, 25048u, 25064u, 25082u, 25084u, 25096u, 25106u, 
+         25112u, 25124u, 25142u, 25144u, 25162u, 25168u, 25174u, 25196u, 
+         25214u, 25252u, 25258u, 25268u, 25286u, 25288u, 25298u, 25306u, 
+         25312u, 25328u, 25352u, 25366u, 25372u, 25376u, 25382u, 25396u, 
+         25412u, 25436u, 25442u, 25454u, 25462u, 25474u, 25484u, 25498u, 
+         25544u, 25546u, 25562u, 25564u, 25586u, 25592u, 25594u, 25604u, 
+         25606u, 25616u, 25618u, 25624u, 25628u, 25648u, 25658u, 25664u, 
+         25694u, 25702u, 25708u, 25714u, 25718u, 25748u, 25756u, 25762u, 
+         25768u, 25774u, 25796u, 25832u, 25834u, 25838u, 25846u, 25852u, 
+         25858u, 25862u, 25876u, 25888u, 25898u, 25918u, 25922u, 25924u, 
+         25928u, 25958u, 25964u, 25978u, 25994u, 26006u, 26036u, 26038u, 
+         26042u, 26048u, 26056u, 26086u, 26096u, 26104u, 26138u, 26156u, 
+         26168u, 26176u, 26198u, 26218u, 26222u, 26236u, 26246u, 26266u, 
+         26272u, 26276u, 26278u, 26288u, 26302u, 26306u, 26332u, 26338u, 
+         26374u, 26386u, 26404u, 26408u, 26416u, 26422u, 26426u, 26432u, 
+         26434u, 26462u, 26468u, 26474u, 26498u, 26506u, 26516u, 26542u, 
+         26548u, 26572u, 26576u, 26584u, 26608u, 26618u, 26638u, 26642u, 
+         26644u, 26654u, 26668u, 26684u, 26686u, 26692u, 26698u, 26702u, 
+         26708u, 26716u, 26734u, 26762u, 26776u, 26782u, 26798u, 26812u, 
+         26818u, 26822u, 26828u, 26834u, 26842u, 26846u, 26848u, 26852u, 
+         26864u, 26866u, 26878u, 26884u, 26896u, 26924u, 26926u, 26932u, 
+         26944u, 26954u, 26968u, 26972u, 27016u, 27022u, 27032u, 27034u, 
+         27046u, 27058u, 27088u, 27092u, 27104u, 27106u, 27112u, 27122u, 
+         27134u, 27136u, 27146u, 27148u, 27158u, 27164u, 27172u, 27182u, 
+         27188u, 27202u, 27218u, 27226u, 27232u, 27244u, 27254u, 27256u, 
+         27266u, 27274u, 27286u, 27296u, 27314u, 27322u, 27326u, 27328u, 
+         27332u, 27358u, 27364u, 27386u, 27392u, 27406u, 27416u, 27422u, 
+         27424u, 27452u, 27458u, 27466u, 27512u, 27518u, 27524u, 27542u, 
+         27548u, 27554u, 27562u, 27568u, 27578u, 27596u, 27598u, 27604u, 
+         27616u, 27634u, 27644u, 27652u, 27664u, 27694u, 27704u, 27706u, 
+         27716u, 27718u, 27722u, 27728u, 27746u, 27748u, 27752u, 27772u, 
+         27784u, 27788u, 27794u, 27802u, 27836u, 27842u, 27848u, 27872u, 
+         27884u, 27892u, 27928u, 27944u, 27946u, 27952u, 27956u, 27958u, 
+         27962u, 27968u, 27988u, 27994u, 28018u, 28022u, 28024u, 28028u, 
+         28046u, 28066u, 28072u, 28094u, 28102u, 28148u, 28166u, 28168u, 
+         28184u, 28204u, 28226u, 28228u, 28252u, 28274u, 28276u, 28292u, 
+         28316u, 28336u, 28352u, 28354u, 28358u, 28366u, 28376u, 28378u, 
+         28388u, 28402u, 28406u, 28414u, 28432u, 28436u, 28444u, 28448u, 
+         28462u, 28472u, 28474u, 28498u, 28514u, 28522u, 28528u, 28544u, 
+         28564u, 28574u, 28576u, 28582u, 28586u, 28616u, 28618u, 28634u, 
+         28666u, 28672u, 28684u, 28694u, 28718u, 28726u, 28738u, 28756u, 
+         28772u, 28774u, 28786u, 28792u, 28796u, 28808u, 28814u, 28816u, 
+         28844u, 28862u, 28864u, 28886u, 28892u, 28898u, 28904u, 28906u, 
+         28912u, 28928u, 28942u, 28948u, 28978u, 28994u, 28996u, 29006u, 
+         29008u, 29012u, 29024u, 29026u, 29038u, 29048u, 29062u, 29068u, 
+         29078u, 29086u, 29114u, 29116u, 29152u, 29158u, 29174u, 29188u, 
+         29192u, 29212u, 29236u, 29242u, 29246u, 29254u, 29258u, 29276u, 
+         29284u, 29288u, 29302u, 29306u, 29312u, 29314u, 29338u, 29354u, 
+         29368u, 29372u, 29398u, 29414u, 29416u, 29426u, 29458u, 29464u, 
+         29468u, 29474u, 29486u, 29492u, 29528u, 29536u, 29548u, 29552u, 
+         29554u, 29558u, 29566u, 29572u, 29576u, 29596u, 29608u, 29618u, 
+         29642u, 29654u, 29656u, 29668u, 29678u, 29684u, 29696u, 29698u, 
+         29704u, 29722u, 29726u, 29732u, 29738u, 29744u, 29752u, 29776u, 
+         29782u, 29792u, 29804u, 29834u, 29848u, 29858u, 29866u, 29878u, 
+         29884u, 29894u, 29906u, 29908u, 29926u, 29932u, 29936u, 29944u, 
+         29948u, 29972u, 29992u, 29996u, 30004u, 30014u, 30026u, 30034u, 
+         30046u, 30062u, 30068u, 30082u, 30086u, 30094u, 30098u, 30116u, 
+         30166u, 30172u, 30178u, 30182u, 30188u, 30196u, 30202u, 30212u, 
+         30238u, 30248u, 30254u, 30256u, 30266u, 30268u, 30278u, 30284u, 
+         30322u, 30334u, 30338u, 30346u, 30356u, 30376u, 30382u, 30388u, 
+         30394u, 30412u, 30422u, 30424u, 30436u, 30452u, 30454u, 30466u, 
+         30478u, 30482u, 30508u, 30518u, 30524u, 30544u, 30562u, 30602u, 
+         30614u, 30622u, 30632u, 30644u, 30646u, 30664u, 30676u, 30686u, 
+         30688u, 30698u, 30724u, 30728u, 30734u, 30746u, 30754u, 30758u, 
+         30788u, 30794u, 30796u, 30802u, 30818u, 30842u, 30866u, 30884u, 
+         30896u, 30908u, 30916u, 30922u, 30926u, 30934u, 30944u, 30952u, 
+         30958u, 30962u, 30982u, 30992u, 31018u, 31022u, 31046u, 31052u, 
+         31054u, 31066u, 31108u, 31126u, 31132u, 31136u, 31162u, 31168u, 
+         31196u, 31202u, 31204u, 31214u, 31222u, 31228u, 31234u, 31244u, 
+         31252u, 31262u, 31264u, 31286u, 31288u, 31292u, 31312u, 31316u, 
+         31322u, 31358u, 31372u, 31376u, 31396u, 31418u, 31424u, 31438u, 
+         31444u, 31454u, 31462u, 31466u, 31468u, 31472u, 31486u, 31504u, 
+         31538u, 31546u, 31568u, 31582u, 31592u, 31616u, 31622u, 31624u, 
+         31634u, 31636u, 31642u, 31652u, 31678u, 31696u, 31706u, 31724u, 
+         31748u, 31766u, 31768u, 31792u, 31832u, 31834u, 31838u, 31844u, 
+         31846u, 31852u, 31862u, 31888u, 31894u, 31906u, 31918u, 31924u, 
+         31928u, 31964u, 31966u, 31976u, 31988u, 32012u, 32014u, 32018u, 
+         32026u, 32036u, 32042u, 32044u, 32048u, 32072u, 32074u, 32078u, 
+         32114u, 32116u, 32138u, 32152u, 32176u, 32194u, 32236u, 32242u, 
+         32252u, 32254u, 32278u, 32294u, 32306u, 32308u, 32312u, 32314u, 
+         32324u, 32326u, 32336u, 32344u, 32348u, 32384u, 32392u, 32396u, 
+         32408u, 32426u, 32432u, 32438u, 32452u, 32474u, 32476u, 32482u, 
+         32506u, 32512u, 32522u, 32546u, 32566u, 32588u, 32594u, 32608u, 
+         32644u, 32672u, 32678u, 32686u, 32692u, 32716u, 32722u, 32734u, 
+         32762u, 32764u, 32782u, 32786u, 32788u, 32792u, 32812u, 32834u, 
+         32842u, 32852u, 32854u, 32872u, 32876u, 32884u, 32894u, 32908u, 
+         32918u, 32924u, 32932u, 32938u, 32944u, 32956u, 32972u, 32984u, 
+         32998u, 33008u, 33026u, 33028u, 33038u, 33062u, 33086u, 33092u, 
+         33104u, 33106u, 33128u, 33134u, 33154u, 33176u, 33178u, 33182u, 
+         33194u, 33196u, 33202u, 33238u, 33244u, 33266u, 33272u, 33274u, 
+         33302u, 33314u, 33332u, 33334u, 33338u, 33352u, 33358u, 33362u, 
+         33364u, 33374u, 33376u, 33392u, 33394u, 33404u, 33412u, 33418u, 
+         33428u, 33446u, 33458u, 33464u, 33478u, 33482u, 33488u, 33506u, 
+         33518u, 33544u, 33548u, 33554u, 33568u, 33574u, 33584u, 33596u, 
+         33598u, 33602u, 33604u, 33614u, 33638u, 33646u, 33656u, 33688u, 
+         33698u, 33706u, 33716u, 33722u, 33724u, 33742u, 33754u, 33782u, 
+         33812u, 33814u, 33832u, 33836u, 33842u, 33856u, 33862u, 33866u, 
+         33874u, 33896u, 33904u, 33934u, 33952u, 33962u, 33988u, 33992u, 
+         33994u, 34016u, 34024u, 34028u, 34036u, 34042u, 34046u, 34072u, 
+         34076u, 34088u, 34108u, 34126u, 34132u, 34144u, 34154u, 34172u, 
+         34174u, 34178u, 34184u, 34186u, 34198u, 34226u, 34232u, 34252u, 
+         34258u, 34274u, 34282u, 34288u, 34294u, 34298u, 34304u, 34324u, 
+         34336u, 34342u, 34346u, 34366u, 34372u, 34388u, 34394u, 34426u, 
+         34436u, 34454u, 34456u, 34468u, 34484u, 34508u, 34514u, 34522u, 
+         34534u, 34568u, 34574u, 34594u, 34616u, 34618u, 34634u, 34648u, 
+         34654u, 34658u, 34672u, 34678u, 34702u, 34732u, 34736u, 34744u, 
+         34756u, 34762u, 34778u, 34798u, 34808u, 34822u, 34826u, 34828u, 
+         34844u, 34856u, 34858u, 34868u, 34876u, 34882u, 34912u, 34924u, 
+         34934u, 34948u, 34958u, 34966u, 34976u, 34982u, 34984u, 34988u, 
+         35002u, 35012u, 35014u, 35024u, 35056u, 35074u, 35078u, 35086u, 
+         35114u, 35134u, 35138u, 35158u, 35164u, 35168u, 35198u, 35206u, 
+         35212u, 35234u, 35252u, 35264u, 35266u, 35276u, 35288u, 35294u, 
+         35312u, 35318u, 35372u, 35378u, 35392u, 35396u, 35402u, 35408u, 
+         35422u, 35446u, 35452u, 35464u, 35474u, 35486u, 35492u, 35516u, 
+         35528u, 35546u, 35554u, 35572u, 35576u, 35578u, 35582u, 35584u, 
+         35606u, 35614u, 35624u, 35626u, 35638u, 35648u, 35662u, 35668u, 
+         35672u, 35674u, 35686u, 35732u, 35738u, 35744u, 35746u, 35752u, 
+         35758u, 35788u, 35798u, 35806u, 35812u, 35824u, 35828u, 35842u, 
+         35848u, 35864u, 35876u, 35884u, 35894u, 35914u, 35932u, 35942u, 
+         35948u, 35954u, 35966u, 35968u, 35978u, 35992u, 35996u, 35998u, 
+         36002u, 36026u, 36038u, 36046u, 36064u, 36068u, 36076u, 36092u, 
+         36106u, 36118u, 36128u, 36146u, 36158u, 36166u, 36184u, 36188u, 
+         36202u, 36206u, 36212u, 36214u, 36236u, 36254u, 36262u, 36272u, 
+         36298u, 36302u, 36304u, 36328u, 36334u, 36338u, 36344u, 36356u, 
+         36382u, 36386u, 36394u, 36404u, 36422u, 36428u, 36442u, 36452u, 
+         36464u, 36466u, 36478u, 36484u, 36488u, 36496u, 36508u, 36524u, 
+         36526u, 36536u, 36542u, 36544u, 36566u, 36568u, 36572u, 36586u, 
+         36604u, 36614u, 36626u, 36646u, 36656u, 36662u, 36664u, 36668u, 
+         36682u, 36694u, 36698u, 36706u, 36716u, 36718u, 36724u, 36758u, 
+         36764u, 36766u, 36782u, 36794u, 36802u, 36824u, 36832u, 36862u, 
+         36872u, 36874u, 36898u, 36902u, 36916u, 36926u, 36946u, 36962u, 
+         36964u, 36968u, 36988u, 36998u, 37004u, 37012u, 37016u, 37024u, 
+         37028u, 37052u, 37058u, 37072u, 37076u, 37108u, 37112u, 37118u, 
+         37132u, 37138u, 37142u, 37144u, 37166u, 37226u, 37228u, 37234u, 
+         37258u, 37262u, 37276u, 37294u, 37306u, 37324u, 37336u, 37342u, 
+         37346u, 37376u, 37378u, 37394u, 37396u, 37418u, 37432u, 37448u, 
+         37466u, 37472u, 37508u, 37514u, 37532u, 37534u, 37544u, 37552u, 
+         37556u, 37558u, 37564u, 37588u, 37606u, 37636u, 37642u, 37648u, 
+         37682u, 37696u, 37702u, 37754u, 37756u, 37772u, 37784u, 37798u, 
+         37814u, 37822u, 37852u, 37856u, 37858u, 37864u, 37874u, 37886u, 
+         37888u, 37916u, 37922u, 37936u, 37948u, 37976u, 37994u, 38014u, 
+         38018u, 38026u, 38032u, 38038u, 38042u, 38048u, 38056u, 38078u, 
+         38084u, 38108u, 38116u, 38122u, 38134u, 38146u, 38152u, 38164u, 
+         38168u, 38188u, 38234u, 38252u, 38266u, 38276u, 38278u, 38302u, 
+         38306u, 38308u, 38332u, 38354u, 38368u, 38378u, 38384u, 38416u, 
+         38428u, 38432u, 38434u, 38444u, 38446u, 38456u, 38458u, 38462u, 
+         38468u, 38474u, 38486u, 38498u, 38512u, 38518u, 38524u, 38552u, 
+         38554u, 38572u, 38578u, 38584u, 38588u, 38612u, 38614u, 38626u, 
+         38638u, 38644u, 38648u, 38672u, 38696u, 38698u, 38704u, 38708u, 
+         38746u, 38752u, 38762u, 38774u, 38776u, 38788u, 38792u, 38812u, 
+         38834u, 38846u, 38848u, 38858u, 38864u, 38882u, 38924u, 38936u, 
+         38938u, 38944u, 38956u, 38978u, 38992u, 39002u, 39008u, 39014u, 
+         39016u, 39026u, 39044u, 39058u, 39062u, 39088u, 39104u, 39116u, 
+         39124u, 39142u, 39146u, 39148u, 39158u, 39166u, 39172u, 39176u, 
+         39182u, 39188u, 39194u
+      };
+
+      if(n <= b1)
+         return a1[n];
+      if(n <= b2)
+         return a2[n - b1 - 1];
+      if(n >= b3)
+      {
+         return boost::math::policies::raise_domain_error<boost::uint32_t>(
+            "boost::math::prime<%1%>", "Argument n out of range: got %1%", n, pol);
+      }
+      return static_cast<boost::uint32_t>(a3[n - b2 - 1]) + 0xFFFFu;
+   }
+
+   inline boost::uint32_t prime(unsigned n)
+   {
+      return boost::math::prime(n, boost::math::policies::policy<>());
+   }
+
+   static const unsigned max_prime = 10000;
+
+}} // namespace boost and math
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sign.hpp b/deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sign.hpp
new file mode 100644 (file)
index 0000000..88db777
--- /dev/null
@@ -0,0 +1,90 @@
+//  (C) Copyright John Maddock 2006.
+//  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)
+
+#ifndef BOOST_MATH_TOOLS_SIGN_HPP
+#define BOOST_MATH_TOOLS_SIGN_HPP
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <boost/math/tools/config.hpp>
+#include <boost/math/special_functions/math_fwd.hpp>
+#include <boost/math/special_functions/detail/fp_traits.hpp>
+
+namespace boost{ namespace math{ 
+
+namespace detail {
+
+#ifdef BOOST_MATH_USE_STD_FPCLASSIFY
+    template<class T> 
+    inline int signbit_impl(T x, native_tag const&)
+    {
+        return (std::signbit)(x);
+    }
+#endif
+
+    template<class T> 
+    inline int signbit_impl(T x, generic_tag<true> const&)
+    {
+        return x < 0;
+    }
+
+    template<class T> 
+    inline int signbit_impl(T x, generic_tag<false> const&)
+    {
+        return x < 0;
+    }
+
+    template<class T> 
+    inline int signbit_impl(T x, ieee_copy_all_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+        return a & traits::sign ? 1 : 0;
+    }
+
+    template<class T> 
+    inline int signbit_impl(T x, ieee_copy_leading_bits_tag const&)
+    {
+        typedef BOOST_DEDUCED_TYPENAME fp_traits<T>::type traits;
+
+        BOOST_DEDUCED_TYPENAME traits::bits a;
+        traits::get_bits(x,a);
+
+        return a & traits::sign ? 1 : 0;
+    }
+}   // namespace detail
+
+template<class T> int (signbit)(T x)
+{ //!< \brief return true if floating-point type t is NaN (Not A Number).
+   typedef typename detail::fp_traits<T>::type traits;
+   typedef typename traits::method method;
+   typedef typename boost::is_floating_point<T>::type fp_tag;
+   return detail::signbit_impl(x, method());
+}
+
+template <class T>
+inline int sign BOOST_NO_MACRO_EXPAND(const T& z)
+{
+   return (z == 0) ? 0 : (boost::math::signbit)(z) ? -1 : 1;
+}
+
+template <class T>
+inline T copysign BOOST_NO_MACRO_EXPAND(const T& x, const T& y)
+{
+   BOOST_MATH_STD_USING
+      return fabs(x) * ((boost::math::signbit)(y) ? -1 : 1);
+}
+
+} // namespace math
+} // namespace boost
+
+
+#endif // BOOST_MATH_TOOLS_SIGN_HPP
+
+
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/special_functions/sin_pi.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sin_pi.hpp
index 8a706a1d762cf5c6fd2e32cadcc4d82727d4ab4e..38c02bc99e7930ea4cb276b50c8b2baf68aa1bc5 100644 (file)
@@ -46,7 +46,7 @@ T sin_pi_imp(T x, const Policy& pol)
       return static_cast<T>(invert ? -1 : 1);
    
    rem = sin(constants::pi<T>() * rem);
-   return invert ? -rem : rem;
+   return invert ? T(-rem) : rem;
 }
 
 } // namespace detail
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/sinc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sinc.hpp
index 9c2a5c162650fa031efa7e57849cbc21e8fe4b7a..ffb19d8b99e5aaf8054ccf6c8595841168a2ce3a 100644 (file)
@@ -117,7 +117,7 @@ namespace boost
         {
 #if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) || defined(__GNUC__)
             using namespace std;
-#elif    defined(BOOST_NO_STDC_NAMESPACE)
+#elif    defined(BOOST_NO_STDC_NAMESPACE) && !defined(__SUNPRO_CC)
             using    ::abs;
             using    ::sin;
             using    ::sqrt;
similarity index 98%
rename from deal.II/contrib/boost/include/boost/math/special_functions/sinhc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/sinhc.hpp
index f90b55476b45f4fa5df683b15e5d50e994016fb0..d19a4b71c616104ec20e8dc5d69f17abcba6688b 100644 (file)
@@ -23,7 +23,6 @@
 #include <string>
 #include <stdexcept>
 
-
 #include <boost/config.hpp>
 
 
@@ -114,7 +113,7 @@ namespace boost
         {
 #if defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL) || defined(__GNUC__)
             using namespace std;
-#elif    defined(BOOST_NO_STDC_NAMESPACE)
+#elif    defined(BOOST_NO_STDC_NAMESPACE) && !defined(__SUNPRO_CC)
             using    ::abs;
             using    ::sinh;
             using    ::sqrt;
similarity index 96%
rename from deal.II/contrib/boost/include/boost/math/special_functions/spherical_harmonic.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/spherical_harmonic.hpp
index bd0c7eef0583c3c28023504ef29969111d6bd2d4..37968eadc8c0be538fc097d6edc97f1ed5383ac9 100644 (file)
@@ -61,7 +61,7 @@ T spherical_harmonic_r(unsigned n, int m, T theta, T phi, const Policy& pol)
    if(m&1)
    {
       // Check phase if theta is outside [0, PI]:
-      T mod = boost::math::tools::fmod_workaround(theta, 2 * constants::pi<T>());
+      T mod = boost::math::tools::fmod_workaround(theta, T(2 * constants::pi<T>()));
       if(mod < 0)
          mod += 2 * constants::pi<T>();
       if(mod > constants::pi<T>())
@@ -70,7 +70,7 @@ T spherical_harmonic_r(unsigned n, int m, T theta, T phi, const Policy& pol)
    // Get the value and adjust sign as required:
    T prefix = spherical_harmonic_prefix(n, m, theta, pol);
    prefix *= cos(m * phi);
-   return sign ? -prefix : prefix;
+   return sign ? T(-prefix) : prefix;
 }
 
 template <class T, class Policy>
@@ -88,7 +88,7 @@ T spherical_harmonic_i(unsigned n, int m, T theta, T phi, const Policy& pol)
    if(m&1)
    {
       // Check phase if theta is outside [0, PI]:
-      T mod = boost::math::tools::fmod_workaround(theta, 2 * constants::pi<T>());
+      T mod = boost::math::tools::fmod_workaround(theta, T(2 * constants::pi<T>()));
       if(mod < 0)
          mod += 2 * constants::pi<T>();
       if(mod > constants::pi<T>())
@@ -97,7 +97,7 @@ T spherical_harmonic_i(unsigned n, int m, T theta, T phi, const Policy& pol)
    // Get the value and adjust sign as required:
    T prefix = spherical_harmonic_prefix(n, m, theta, pol);
    prefix *= sin(m * phi);
-   return sign ? -prefix : prefix;
+   return sign ? T(-prefix) : prefix;
 }
 
 template <class T, class U, class Policy>
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/special_functions/trunc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/trunc.hpp
index 47ca0b16ef56e2e9ef9bb68e7e5189caa5aa1bfe..49f933b34a10d933719fffbdc2ef4220225f25af 100644 (file)
@@ -22,7 +22,7 @@ inline T trunc(const T& v, const Policy& pol)
    BOOST_MATH_STD_USING
    if(!(boost::math::isfinite)(v))
       return policies::raise_rounding_error("boost::math::trunc<%1%>(%1%)", 0, v, pol);
-   return (v >= 0) ? floor(v) : ceil(v);
+   return (v >= 0) ? static_cast<T>(floor(v)) : static_cast<T>(ceil(v));
 }
 template <class T>
 inline T trunc(const T& v)
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/special_functions/zeta.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/special_functions/zeta.hpp
index 7e2ac109d6bb0fbe927c53cfcd1667f42ece6583..8db2a23ac183fa899eb6da2732bf4f4eb761c47a 100644 (file)
@@ -113,7 +113,7 @@ inline T zeta_series2_imp(T s, const Policy& pol)
    zeta_series2<T> f(s);
    T result = tools::sum_series(
       f, 
-      tools::digits<T>(),
+      policies::get_epsilon<T, Policy>(),
       max_iter);
    policies::check_series_iterations("boost::math::zeta_series2<%1%>(%1%)", max_iter, pol);
    return result;
@@ -884,7 +884,7 @@ inline typename tools::promote_args<T>::type zeta(T s, const Policy&)
 
    return policies::checked_narrowing_cast<result_type, forwarding_policy>(detail::zeta_imp(
       static_cast<value_type>(s),
-      1 - static_cast<value_type>(s),
+      static_cast<value_type>(1 - static_cast<value_type>(s)),
       forwarding_policy(),
       tag_type()), "boost::math::zeta<%1%>(%1%)");
 }
similarity index 81%
rename from deal.II/contrib/boost/include/boost/math/tools/config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/config.hpp
index d53ae99a2e538d4d2a603b9f789f2046e62a4b48..daf24602417d0d1579b0525d8b353da276dd26c1 100644 (file)
 //
 #  define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
 #endif
+#if defined(unix) && defined(__INTEL_COMPILER)
+//
+// Intel compiler has sporadic issues compiling std::fpclassify depending on
+// the exact OS version used.  Use our own code for this as we know it works
+// well on Intel processors:
+//
+#define BOOST_MATH_DISABLE_STD_FPCLASSIFY
+#endif
 
 #if defined(BOOST_MSVC) && !defined(_WIN32_WCE)
    // Better safe than sorry, our tests don't support hardware exceptions:
 #  define BOOST_MATH_NO_DEDUCED_FUNCTION_POINTERS
 #endif
 
+#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901))
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if (defined(__hpux) && !defined(__hppa))
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if defined(__GNUC__) && defined(_GLIBCXX_USE_C99)
+#  define BOOST_MATH_USE_C99
+#endif
+
+#if defined(__CYGWIN__) || defined(__HP_aCC) || defined(BOOST_INTEL) \
+  || defined(BOOST_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY) \
+  || (defined(__GNUC__) && !defined(BOOST_MATH_USE_C99))
+#  define BOOST_MATH_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY
+#endif
+
 #if defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590)
 
 #  include "boost/type.hpp"
 
 #endif // defined BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS
 
-#if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) || defined(__hppa)
+#if defined(__SUNPRO_CC) || defined(__hppa) || defined(__GNUC__)
 // Sun's compiler emits a hard error if a constant underflows,
-// as does aCC on PA-RISC:
+// as does aCC on PA-RISC, while gcc issues a large number of warnings:
 #  define BOOST_MATH_SMALL_CONSTANT(x) 0
 #else
 #  define BOOST_MATH_SMALL_CONSTANT(x) x
 #  define BOOST_MATH_POLY_METHOD 3
 #  define BOOST_MATH_RATIONAL_METHOD 3
 #  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##.0L
+#endif
+
+#if defined(BOOST_NO_LONG_LONG) && !defined(BOOST_MATH_INT_TABLE_TYPE)
+#  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) RT
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##.0L
 #endif
 
 //
 #ifndef BOOST_MATH_INT_TABLE_TYPE
 #  define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
 #endif
+#ifndef BOOST_MATH_INT_VALUE_SUFFIX
+#  define BOOST_MATH_INT_VALUE_SUFFIX(RV, SUF) RV##SUF
+#endif
+
 //
 // Helper macro for controlling the FP behaviour:
 //
@@ -219,7 +255,7 @@ inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d)
 } // namespace tools
 }} // namespace boost namespace math
 
-#ifdef __linux__
+#if (defined(__linux__) && !defined(__UCLIBC__)) || defined(__QNX__) || defined(__IBMCPP__)
 
    #include <fenv.h>
 
@@ -244,9 +280,11 @@ inline T max BOOST_PREVENT_MACRO_SUBSTITUTION(T a, T b, T c, T d)
    } // namespace detail
    }} // namespaces
 
-   #define BOOST_FPU_EXCEPTION_GUARD boost::math::detail::fpu_guard local_guard_object;
+#  define BOOST_FPU_EXCEPTION_GUARD boost::math::detail::fpu_guard local_guard_object;
+#  define BOOST_MATH_INSTRUMENT_FPU do{ fexcept_t cpu_flags; fegetexceptflag(&cpu_flags, FE_ALL_EXCEPT); BOOST_MATH_INSTRUMENT_VARIABLE(cpu_flags); } while(0); 
 #else // All other platforms.
-  #define BOOST_FPU_EXCEPTION_GUARD
+#  define BOOST_FPU_EXCEPTION_GUARD
+#  define BOOST_MATH_INSTRUMENT_FPU
 #endif
 
 #ifdef BOOST_MATH_INSTRUMENT
similarity index 70%
rename from deal.II/contrib/boost/include/boost/math/tools/fraction.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/fraction.hpp
index 28af64eb98f90daa2b8989fc326931185b1b5d61..a9938094a76257e3be28097486ac448b9e69f6da 100644 (file)
@@ -84,8 +84,8 @@ namespace detail
 //
 // Note that the first a0 returned by generator Gen is disarded.
 //
-template <class Gen>
-typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits)
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor, boost::uintmax_t& max_terms)
 {
    BOOST_MATH_STD_USING // ADL of std names
 
@@ -93,7 +93,6 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g,
    typedef typename traits::result_type result_type;
    typedef typename traits::value_type value_type;
 
-   result_type factor = ldexp(1.0f, 1 - bits); // 1 / pow(result_type(2), bits);
    result_type tiny = tools::min_value<result_type>();
 
    value_type v = g();
@@ -105,6 +104,8 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g,
    C = f;
    D = 0;
 
+   boost::uintmax_t counter(max_terms);
+
    do{
       v = g();
       D = traits::b(v) + traits::a(v) * D;
@@ -116,50 +117,43 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g,
       D = 1/D;
       delta = C*D;
       f = f * delta;
-   }while(fabs(delta - 1) > factor);
+   }while((fabs(delta - 1) > factor) && --counter);
+
+   max_terms = max_terms - counter;
 
    return f;
 }
 
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, const U& factor)
+{
+   boost::uintmax_t max_terms = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_b(g, factor, max_terms);
+}
+
 template <class Gen>
-typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits, boost::uintmax_t& max_terms)
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits)
 {
    BOOST_MATH_STD_USING // ADL of std names
 
    typedef detail::fraction_traits<Gen> traits;
    typedef typename traits::result_type result_type;
-   typedef typename traits::value_type value_type;
 
    result_type factor = ldexp(1.0f, 1 - bits); // 1 / pow(result_type(2), bits);
-   result_type tiny = tools::min_value<result_type>();
-
-   value_type v = g();
-
-   result_type f, C, D, delta;
-   f = traits::b(v);
-   if(f == 0)
-      f = tiny;
-   C = f;
-   D = 0;
-
-   boost::uintmax_t counter(max_terms);
+   boost::uintmax_t max_terms = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_b(g, factor, max_terms);
+}
 
-   do{
-      v = g();
-      D = traits::b(v) + traits::a(v) * D;
-      if(D == 0)
-         D = tiny;
-      C = traits::b(v) + traits::a(v) / C;
-      if(C == 0)
-         C = tiny;
-      D = 1/D;
-      delta = C*D;
-      f = f * delta;
-   }while((fabs(delta - 1) > factor) && --counter);
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
 
-   max_terms = max_terms - counter;
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
 
-   return f;
+   result_type factor = ldexp(1.0f, 1 - bits); // 1 / pow(result_type(2), bits);
+   return continued_fraction_b(g, factor, max_terms);
 }
 
 //
@@ -176,8 +170,8 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_b(Gen& g,
 //
 // Note that the first a1 and b1 returned by generator Gen are both used.
 //
-template <class Gen>
-typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits)
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor, boost::uintmax_t& max_terms)
 {
    BOOST_MATH_STD_USING // ADL of std names
 
@@ -185,7 +179,6 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g,
    typedef typename traits::result_type result_type;
    typedef typename traits::value_type value_type;
 
-   result_type factor = ldexp(1.0f, 1-bits); // 1 / pow(result_type(2), bits);
    result_type tiny = tools::min_value<result_type>();
 
    value_type v = g();
@@ -198,6 +191,8 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g,
    C = f;
    D = 0;
 
+   boost::uintmax_t counter(max_terms);
+
    do{
       v = g();
       D = traits::b(v) + traits::a(v) * D;
@@ -209,51 +204,44 @@ typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g,
       D = 1/D;
       delta = C*D;
       f = f * delta;
-   }while(fabs(delta - 1) > factor);
+   }while((fabs(delta - 1) > factor) && --counter);
+
+   max_terms = max_terms - counter;
 
    return a0/f;
 }
 
+template <class Gen, class U>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, const U& factor)
+{
+   boost::uintmax_t max_iter = (std::numeric_limits<boost::uintmax_t>::max)();
+   return continued_fraction_a(g, factor, max_iter);
+}
+
 template <class Gen>
-typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits, boost::uintmax_t& max_terms)
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits)
 {
    BOOST_MATH_STD_USING // ADL of std names
 
    typedef detail::fraction_traits<Gen> traits;
    typedef typename traits::result_type result_type;
-   typedef typename traits::value_type value_type;
 
    result_type factor = ldexp(1.0f, 1-bits); // 1 / pow(result_type(2), bits);
-   result_type tiny = tools::min_value<result_type>();
-
-   value_type v = g();
-
-   result_type f, C, D, delta, a0;
-   f = traits::b(v);
-   a0 = traits::a(v);
-   if(f == 0)
-      f = tiny;
-   C = f;
-   D = 0;
+   boost::uintmax_t max_iter = (std::numeric_limits<boost::uintmax_t>::max)();
 
-   boost::uintmax_t counter(max_terms);
+   return continued_fraction_a(g, factor, max_iter);
+}
 
-   do{
-      v = g();
-      D = traits::b(v) + traits::a(v) * D;
-      if(D == 0)
-         D = tiny;
-      C = traits::b(v) + traits::a(v) / C;
-      if(C == 0)
-         C = tiny;
-      D = 1/D;
-      delta = C*D;
-      f = f * delta;
-   }while((fabs(delta - 1) > factor) && --counter);
+template <class Gen>
+inline typename detail::fraction_traits<Gen>::result_type continued_fraction_a(Gen& g, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING // ADL of std names
 
-   max_terms = max_terms - counter;
+   typedef detail::fraction_traits<Gen> traits;
+   typedef typename traits::result_type result_type;
 
-   return a0/f;
+   result_type factor = ldexp(1.0f, 1-bits); // 1 / pow(result_type(2), bits);
+   return continued_fraction_a(g, factor, max_terms);
 }
 
 } // namespace tools
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/tools/minima.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/minima.hpp
index 625368c5216a21bc5c385301a2265d59fb0e4f8c..3dc5356f3ed0afc2174b4083d187b6a1e9471b20 100644 (file)
@@ -77,7 +77,7 @@ std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t&
             delta = p / q;
             u = x + delta;
             if(((u - min) < fract2) || ((max- u) < fract2))
-               delta = (mid - x) < 0 ? -fabs(fract1) : fabs(fract1);
+               delta = (mid - x) < 0 ? (T)-fabs(fract1) : (T)fabs(fract1);
          }
       }
       else
@@ -87,7 +87,7 @@ std::pair<T, T> brent_find_minima(F f, T min, T max, int bits, boost::uintmax_t&
          delta = golden * delta2;
       }
       // update current position:
-      u = (fabs(delta) >= fract1) ? x + delta : (delta > 0 ? x + fabs(fract1) : x - fabs(fract1));
+      u = (fabs(delta) >= fract1) ? T(x + delta) : (delta > 0 ? T(x + fabs(fract1)) : T(x - fabs(fract1)));
       fu = f(u);
       if(fu <= fx)
       {
similarity index 99%
rename from deal.II/contrib/boost/include/boost/math/tools/precision.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/precision.hpp
index c2866dca9b924cb39b09300cb9c8f4d3589b0979..e7695e92a5a92ca3c3afb79e3b6d015fdfd8958b 100644 (file)
@@ -221,7 +221,7 @@ inline T log_min_value(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
 }
 
 template <class T>
-inline T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE(T))
+inline T epsilon(BOOST_MATH_EXPLICIT_TEMPLATE_TYPE_SPEC(T))
 {
 #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
    return detail::epsilon<T>(mpl::bool_< ::std::numeric_limits<T>::is_specialized>());
similarity index 73%
rename from deal.II/contrib/boost/include/boost/math/tools/promotion.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/promotion.hpp
index e2e6fd1cc65673fd5d325345e3fd1a98239437c7..83772f52e2a8c6a3c487984de4b06522089ce801 100644 (file)
@@ -69,6 +69,12 @@ namespace boost
       { // If T is integral type, then promote to double.
         typedef typename mpl::if_<is_integral<T>, double, T>::type type;
       };
+      // These full specialisations reduce mpl::if_ usage and speed up
+      // compilation:
+      template <> struct promote_arg<float> { typedef float type; };
+      template <> struct promote_arg<double>{ typedef double type; };
+      template <> struct promote_arg<long double> { typedef long double type; };
+      template <> struct promote_arg<int> {  typedef double type; };
 
       template <class T1, class T2>
       struct promote_args_2
@@ -89,6 +95,24 @@ namespace boost
           // else one or the other is a user-defined type:
           typename mpl::if_< ::boost::is_convertible<T1P, T2P>, T2P, T1P>::type>::type type;
       }; // promote_arg2
+      // These full specialisations reduce mpl::if_ usage and speed up
+      // compilation:
+      template <> struct promote_args_2<float, float> { typedef float type; };
+      template <> struct promote_args_2<double, double>{ typedef double type; };
+      template <> struct promote_args_2<long double, long double> { typedef long double type; };
+      template <> struct promote_args_2<int, int> {  typedef double type; };
+      template <> struct promote_args_2<int, float> {  typedef double type; };
+      template <> struct promote_args_2<float, int> {  typedef double type; };
+      template <> struct promote_args_2<int, double> {  typedef double type; };
+      template <> struct promote_args_2<double, int> {  typedef double type; };
+      template <> struct promote_args_2<int, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, int> {  typedef long double type; };
+      template <> struct promote_args_2<float, double> {  typedef double type; };
+      template <> struct promote_args_2<double, float> {  typedef double type; };
+      template <> struct promote_args_2<float, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, float> {  typedef long double type; };
+      template <> struct promote_args_2<double, long double> {  typedef long double type; };
+      template <> struct promote_args_2<long double, double> {  typedef long double type; };
 
       template <class T1, class T2=float, class T3=float, class T4=float, class T5=float, class T6=float>
       struct promote_args
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/tools/rational.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/rational.hpp
index b49d5c815df7e96db2daf7c1efd110777264e596..accffeaf26f68f85d673fed8292d39db9908629d 100644 (file)
@@ -220,19 +220,19 @@ inline V evaluate_polynomial(const boost::array<T,N>& a, const V& val)
 template <class T, class U>
 inline U evaluate_even_polynomial(const T* poly, U z, std::size_t count)
 {
-   return evaluate_polynomial(poly, z*z, count);
+   return evaluate_polynomial(poly, U(z*z), count);
 }
 
 template <std::size_t N, class T, class V>
 inline V evaluate_even_polynomial(const T(&a)[N], const V& z)
 {
-   return evaluate_polynomial(a, z*z);
+   return evaluate_polynomial(a, V(z*z));
 }
 
 template <std::size_t N, class T, class V>
 inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z)
 {
-   return evaluate_polynomial(a, z*z);
+   return evaluate_polynomial(a, V(z*z));
 }
 //
 // Odd polynomials come next:
@@ -240,21 +240,21 @@ inline V evaluate_even_polynomial(const boost::array<T,N>& a, const V& z)
 template <class T, class U>
 inline U evaluate_odd_polynomial(const T* poly, U z, std::size_t count)
 {
-   return poly[0] + z * evaluate_polynomial(poly+1, z*z, count-1);
+   return poly[0] + z * evaluate_polynomial(poly+1, U(z*z), count-1);
 }
 
 template <std::size_t N, class T, class V>
 inline V evaluate_odd_polynomial(const T(&a)[N], const V& z)
 {
    typedef mpl::int_<N-1> tag_type;
-   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a) + 1, z*z, static_cast<tag_type const*>(0));
+   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a) + 1, V(z*z), static_cast<tag_type const*>(0));
 }
 
 template <std::size_t N, class T, class V>
 inline V evaluate_odd_polynomial(const boost::array<T,N>& a, const V& z)
 {
    typedef mpl::int_<N-1> tag_type;
-   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()) + 1, z*z, static_cast<tag_type const*>(0));
+   return a[0] + z * detail::evaluate_polynomial_c_imp(static_cast<const T*>(a.data()) + 1, V(z*z), static_cast<tag_type const*>(0));
 }
 
 template <class T, class U, class V>
similarity index 95%
rename from deal.II/contrib/boost/include/boost/math/tools/roots.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/roots.hpp
index 0a356b44cf09868ab7d3be3e95a06300fe67f1c2..ce0cfe0b8403b3c2a40cc5308db96d5d1fd38449 100644 (file)
@@ -279,7 +279,7 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
    T result = guess;
 
    T factor = static_cast<T>(ldexp(1.0, 1 - digits));
-   T delta = (std::max)(10000000 * guess, T(10000000));  // arbitarily large delta
+   T delta = (std::max)(T(10000000 * guess), T(10000000));  // arbitarily large delta
    T last_f0 = 0;
    T delta1 = delta;
    T delta2 = delta;
@@ -297,6 +297,11 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
       delta2 = delta1;
       delta1 = delta;
       std::tr1::tie(f0, f1, f2) = f(result);
+
+      BOOST_MATH_INSTRUMENT_VARIABLE(f0);
+      BOOST_MATH_INSTRUMENT_VARIABLE(f1);
+      BOOST_MATH_INSTRUMENT_VARIABLE(f2);
+      
       if(0 == f0)
          break;
       if((f1 == 0) && (f2 == 0))
@@ -313,6 +318,10 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
          {
             T denom = 2 * f0;
             T num = 2 * f1 - f0 * (f2 / f1);
+
+            BOOST_MATH_INSTRUMENT_VARIABLE(denom);
+            BOOST_MATH_INSTRUMENT_VARIABLE(num);
+
             if((fabs(num) < 1) && (fabs(denom) >= fabs(num) * tools::max_value<T>()))
             {
                // possible overflow, use Newton step:
@@ -337,17 +346,21 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
       {
          // last two steps haven't converged, try bisection:
          delta = (delta > 0) ? (result - min) / 2 : (result - max) / 2;
+         if(fabs(delta) > result)
+            delta = sign(delta) * result; // protect against huge jumps!
          // reset delta2 so that this branch will *not* be taken on the
          // next iteration:
          delta2 = delta * 3;
+         BOOST_MATH_INSTRUMENT_VARIABLE(delta);
       }
       guess = result;
       result -= delta;
+      BOOST_MATH_INSTRUMENT_VARIABLE(result);
 
       // check for out of bounds step:
       if(result < min)
       {
-         T diff = ((fabs(min) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(min))) ? 1000  : result / min;
+         T diff = ((fabs(min) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(min))) ? T(1000)  : T(result / min);
          if(fabs(diff) < 1)
             diff = 1 / diff;
          if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
@@ -368,7 +381,7 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
       }
       else if(result > max)
       {
-         T diff = ((fabs(max) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(max))) ? 1000  : result / max;
+         T diff = ((fabs(max) < 1) && (fabs(result) > 1) && (tools::max_value<T>() / fabs(result) < fabs(max))) ? T(1000) : T(result / max);
          if(fabs(diff) < 1)
             diff = 1 / diff;
          if(!out_of_bounds_sentry && (diff > 0) && (diff < 3))
@@ -398,13 +411,6 @@ T halley_iterate(F f, T guess, T min, T max, int digits, boost::uintmax_t& max_i
 
 #ifdef BOOST_MATH_INSTRUMENT
    std::cout << "Halley iteration, final count = " << max_iter << std::endl;
-
-   static boost::uintmax_t max_count = 0;
-   if(max_iter > max_count)
-   {
-      max_count = max_iter;
-      std::cout << "Maximum iterations: " << max_iter << std::endl;
-   }
 #endif
 
    return result;
similarity index 66%
rename from deal.II/contrib/boost/include/boost/math/tools/series.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/series.hpp
index 1a8d74403c0b0a7946931956562d16d809ab9779..a32a33fba10cb5c4997579cb4d5583694512f347 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <boost/config/no_tr1/cmath.hpp>
 #include <boost/cstdint.hpp>
+#include <boost/limits.hpp>
 #include <boost/math/tools/config.hpp>
 
 namespace boost{ namespace math{ namespace tools{
@@ -19,26 +20,8 @@ namespace boost{ namespace math{ namespace tools{
 //
 // Simple series summation come first:
 //
-template <class Functor>
-typename Functor::result_type sum_series(Functor& func, int bits)
-{
-   BOOST_MATH_STD_USING
-
-   typedef typename Functor::result_type result_type;
-
-   result_type factor = pow(result_type(2), bits);
-   result_type result = func();
-   result_type next_term;
-   do{
-      next_term = func();
-      result += next_term;
-   }
-   while(fabs(result) < fabs(factor * next_term));
-   return result;
-}
-
-template <class Functor>
-typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+template <class Functor, class U, class V>
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms, const V& init_value)
 {
    BOOST_MATH_STD_USING
 
@@ -46,14 +29,13 @@ typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax
 
    boost::uintmax_t counter = max_terms;
 
-   result_type factor = ldexp(result_type(1), bits);
-   result_type result = func();
+   result_type result = init_value;
    result_type next_term;
    do{
       next_term = func();
       result += next_term;
    }
-   while((fabs(result) < fabs(factor * next_term)) && --counter);
+   while((fabs(factor * result) < fabs(next_term)) && --counter);
 
    // set max_terms to the actual number of terms of the series evaluated:
    max_terms = max_terms - counter;
@@ -62,46 +44,46 @@ typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax
 }
 
 template <class Functor, class U>
-typename Functor::result_type sum_series(Functor& func, int bits, U init_value)
+inline typename Functor::result_type sum_series(Functor& func, const U& factor, boost::uintmax_t& max_terms)
 {
-   BOOST_MATH_STD_USING
-
-   typedef typename Functor::result_type result_type;
-
-   result_type factor = ldexp(result_type(1), bits);
-   result_type result = static_cast<result_type>(init_value);
-   result_type next_term;
-   do{
-      next_term = func();
-      result += next_term;
-   }
-   while(fabs(result) < fabs(factor * next_term));
-
-   return result;
+   typename Functor::result_type init_value = 0;
+   return sum_series(func, factor, max_terms, init_value);
 }
 
 template <class Functor, class U>
-typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms, U init_value)
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms, const U& init_value)
 {
    BOOST_MATH_STD_USING
-
    typedef typename Functor::result_type result_type;
+   result_type factor = ldexp(result_type(1), 1 - bits);
+   return sum_series(func, factor, max_terms, init_value);
+}
 
-   boost::uintmax_t counter = max_terms;
-
-   result_type factor = ldexp(result_type(1), bits);
-   result_type result = init_value;
-   result_type next_term;
-   do{
-      next_term = func();
-      result += next_term;
-   }
-   while((fabs(result) < fabs(factor * next_term)) && --counter);
+template <class Functor>
+inline typename Functor::result_type sum_series(Functor& func, int bits)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Functor::result_type result_type;
+   boost::uintmax_t iters = (std::numeric_limits<boost::uintmax_t>::max)();
+   result_type init_val = 0;
+   return sum_series(func, bits, iters, init_val);
+}
 
-   // set max_terms to the actual number of terms of the series evaluated:
-   max_terms = max_terms - counter;
+template <class Functor>
+inline typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+{
+   BOOST_MATH_STD_USING
+   typedef typename Functor::result_type result_type;
+   result_type init_val = 0;
+   return sum_series(func, bits, max_terms, init_val);
+}
 
-   return result;
+template <class Functor, class U>
+inline typename Functor::result_type sum_series(Functor& func, int bits, const U& init_value)
+{
+   BOOST_MATH_STD_USING
+   boost::uintmax_t iters = (std::numeric_limits<boost::uintmax_t>::max)();
+   return sum_series(func, bits, iters, init_value);
 }
 
 //
@@ -117,7 +99,7 @@ typename Functor::result_type sum_series(Functor& func, int bits, boost::uintmax
 // in any case the result is still much better than a naive summation.
 //
 template <class Functor>
-typename Functor::result_type kahan_sum_series(Functor& func, int bits)
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits)
 {
    BOOST_MATH_STD_USING
 
@@ -140,7 +122,7 @@ typename Functor::result_type kahan_sum_series(Functor& func, int bits)
 }
 
 template <class Functor>
-typename Functor::result_type kahan_sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
+inline typename Functor::result_type kahan_sum_series(Functor& func, int bits, boost::uintmax_t& max_terms)
 {
    BOOST_MATH_STD_USING
 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/tools/toms748_solve.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tools/toms748_solve.hpp
index 1ab96d5f6dc8df6a44cfa55f2e0c246d4989b525..e7ada17435fbc8f00f53d6c260142f1ea1496ab4 100644 (file)
@@ -26,7 +26,7 @@ public:
    eps_tolerance(unsigned bits)
    {
       BOOST_MATH_STD_USING
-      eps = (std::max)(T(ldexp(1.0F, 1-bits)), 2 * tools::epsilon<T>());
+      eps = (std::max)(T(ldexp(1.0F, 1-bits)), T(2 * tools::epsilon<T>()));
    }
    bool operator()(const T& a, const T& b)
    {
@@ -193,9 +193,9 @@ T quadratic_interpolate(const T& a, const T& b, T const& d,
    //
    // Start by obtaining the coefficients of the quadratic polynomial:
    //
-   T B = safe_div(fb - fa, b - a, tools::max_value<T>());
-   T A = safe_div(fd - fb, d - b, tools::max_value<T>());
-   A = safe_div(A - B, d - a, T(0));
+   T B = safe_div(T(fb - fa), T(b - a), tools::max_value<T>());
+   T A = safe_div(T(fd - fb), T(d - b), tools::max_value<T>());
+   A = safe_div(T(A - B), T(d - a), T(0));
 
    if(a == 0)
    {
@@ -220,7 +220,7 @@ T quadratic_interpolate(const T& a, const T& b, T const& d,
    for(unsigned i = 1; i <= count; ++i)
    {
       //c -= safe_div(B * c, (B + A * (2 * c - a - b)), 1 + c - a);
-      c -= safe_div(fa+(B+A*(c-b))*(c-a), (B + A * (2 * c - a - b)), 1 + c - a);
+      c -= safe_div(T(fa+(B+A*(c-b))*(c-a)), T(B + A * (2 * c - a - b)), T(1 + c - a));
    }
    if((c <= a) || (c >= b))
    {
@@ -436,7 +436,7 @@ std::pair<T, T> toms748_solve(F f, const T& ax, const T& bx, const T& fax, const
       //
       e = d;
       fe = fd;
-      detail::bracket(f, a, b, a + (b - a) / 2, fa, fb, d, fd);
+      detail::bracket(f, a, b, T(a + (b - a) / 2), fa, fb, d, fd);
       --count;
       BOOST_MATH_INSTRUMENT_CODE("Not converging: Taking a bisection!!!!");
       BOOST_MATH_INSTRUMENT_CODE(" a = " << a << " b = " << b);
similarity index 97%
rename from deal.II/contrib/boost/include/boost/math/tr1.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/math/tr1.hpp
index 66f753235a59370ee6ae5d4c3728440a25c0f92b..e9de6a54f24258376b403d3933e00de15ff1064e 100644 (file)
@@ -171,15 +171,16 @@ int BOOST_MATH_TR1_DECL ilogbl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
 double BOOST_MATH_TR1_DECL lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
 float BOOST_MATH_TR1_DECL lgammaf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
 long double BOOST_MATH_TR1_DECL lgammal BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#ifdef BOOST_HAS_LONG_LONG
 #if 0
-long long BOOST_MATH_TR1_DECL llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
-long long BOOST_MATH_TR1_DECL llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
-long long BOOST_MATH_TR1_DECL llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+::boost::long_long_type BOOST_MATH_TR1_DECL llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+::boost::long_long_type BOOST_MATH_TR1_DECL llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+::boost::long_long_type BOOST_MATH_TR1_DECL llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+#endif
+::boost::long_long_type BOOST_MATH_TR1_DECL llround BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+::boost::long_long_type BOOST_MATH_TR1_DECL llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+::boost::long_long_type BOOST_MATH_TR1_DECL llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
 #endif
-long long BOOST_MATH_TR1_DECL llround BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
-long long BOOST_MATH_TR1_DECL llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
-long long BOOST_MATH_TR1_DECL llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
-
 double BOOST_MATH_TR1_DECL boost_log1p BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
 float BOOST_MATH_TR1_DECL boost_log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
 long double BOOST_MATH_TR1_DECL boost_log1pl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
@@ -487,19 +488,20 @@ inline long double lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
 template <class T>
 inline typename tools::promote_args<T>::type lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
 { return boost::math::tr1::lgamma BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<typename tools::promote_args<T>::type>(x)); }
+#ifdef BOOST_HAS_LONG_LONG
 #if 0
-long long llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
-long long llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
-long long llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
+::boost::long_long_type llrint BOOST_PREVENT_MACRO_SUBSTITUTION(double x);
+::boost::long_long_type llrintf BOOST_PREVENT_MACRO_SUBSTITUTION(float x);
+::boost::long_long_type llrintl BOOST_PREVENT_MACRO_SUBSTITUTION(long double x);
 #endif
-inline long long llround BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
 { return boost::math::tr1::llroundf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
-inline long long llround BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(long double x)
 { return boost::math::tr1::llroundl BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
 template <class T>
-inline long long llround BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
+inline ::boost::long_long_type llround BOOST_PREVENT_MACRO_SUBSTITUTION(T x)
 { return llround BOOST_PREVENT_MACRO_SUBSTITUTION(static_cast<double>(x)); }
-
+#endif
 inline float log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(float x)
 { return boost::math::tr1::boost_log1pf BOOST_PREVENT_MACRO_SUBSTITUTION(x); }
 inline double log1p BOOST_PREVENT_MACRO_SUBSTITUTION(double x)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/mem_fn.hpp b/deal.II/contrib/boost-1.41.0/include/boost/mem_fn.hpp
new file mode 100644 (file)
index 0000000..3bcd2c5
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef BOOST_MEM_FN_HPP_INCLUDED
+#define BOOST_MEM_FN_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  mem_fn.hpp - a generalization of std::mem_fun[_ref]
+//
+//  Copyright (c) 2009 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  See http://www.boost.org/libs/bind/mem_fn.html for documentation.
+//
+
+#include <boost/bind/mem_fn.hpp>
+
+#endif // #ifndef BOOST_MEM_FN_HPP_INCLUDED
similarity index 91%
rename from deal.II/contrib/boost/include/boost/mpl/aux_/config/compiler.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/config/compiler.hpp
index 01ff8b85e95fc201d43b520af1c82d6defac01b2..3238963c0c78da357607c629e4d36486c3f36ed5 100644 (file)
@@ -10,9 +10,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: compiler.hpp 49272 2008-10-11 06:50:46Z agurtovoy $
-// $Date: 2008-10-11 02:50:46 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49272 $
+// $Id: compiler.hpp 53189 2009-05-22 20:07:55Z hkaiser $
+// $Date: 2009-05-22 16:07:55 -0400 (Fri, 22 May 2009) $
+// $Revision: 53189 $
 
 #if !defined(BOOST_MPL_CFG_COMPILER_DIR)
 
@@ -35,7 +35,7 @@
 #   elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))
 #       if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)
 #           define BOOST_MPL_CFG_COMPILER_DIR bcc551
-#       elseif BOOST_WORKAROUND(__BORLANDC__, >= 0x590)
+#       elif BOOST_WORKAROUND(__BORLANDC__, >= 0x590)
 #           define BOOST_MPL_CFG_COMPILER_DIR bcc
 #       else
 #           define BOOST_MPL_CFG_COMPILER_DIR bcc_pre590
similarity index 96%
rename from deal.II/contrib/boost/include/boost/mpl/aux_/inserter_algorithm.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/inserter_algorithm.hpp
index 563ecf0d1d699bb4b51c6ec21ed01025cbc19a4c..a6f340c782b7f44a08062371328ac4fe346c4e13 100644 (file)
@@ -11,9 +11,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: inserter_algorithm.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
-// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49267 $
+// $Id: inserter_algorithm.hpp 55648 2009-08-18 05:16:53Z agurtovoy $
+// $Date: 2009-08-18 01:16:53 -0400 (Tue, 18 Aug 2009) $
+// $Revision: 55648 $
 
 #include <boost/mpl/back_inserter.hpp>
 #include <boost/mpl/front_inserter.hpp>
@@ -49,7 +49,7 @@ template< \
       BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), typename P) \
     > \
 struct name< BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P),na > \
-    : if_< has_push_back<P1> \
+    : if_< has_push_back< typename clear<P1>::type> \
         , aux::name##_impl< \
               BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(arity), P) \
             , back_inserter< typename clear<P1>::type > \
similarity index 77%
rename from deal.II/contrib/boost/include/boost/mpl/aux_/push_back_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/push_back_impl.hpp
index 54e945cd313cf8c8de525999df7cfecd866b8574..2f839cb88ac5ea226ac6d8044610133e1c7fcd93 100644 (file)
@@ -10,9 +10,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: push_back_impl.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
-// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49267 $
+// $Id: push_back_impl.hpp 55679 2009-08-20 07:50:16Z agurtovoy $
+// $Date: 2009-08-20 03:50:16 -0400 (Thu, 20 Aug 2009) $
+// $Revision: 55679 $
 
 #include <boost/mpl/push_back_fwd.hpp>
 #include <boost/mpl/assert.hpp>
@@ -25,8 +25,7 @@
 
 namespace boost { namespace mpl {
 
-template< typename Tag >
-struct has_push_back_impl;
+struct has_push_back_arg {};
 
 // agurt 05/feb/04: no default implementation; the stub definition is needed 
 // to enable the default 'has_push_back' implementation below
@@ -39,7 +38,7 @@ struct push_back_impl
         // if you've got an assert here, you are requesting a 'push_back' 
         // specialization that doesn't exist.
         BOOST_MPL_ASSERT_MSG(
-              ( boost::is_same< T, has_push_back_impl<T> >::value )
+              ( boost::is_same< T, has_push_back_arg >::value )
             , REQUESTED_PUSH_BACK_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST
             , ( Sequence )
             );
@@ -51,13 +50,13 @@ struct has_push_back_impl
 {
     template< typename Seq > struct apply
 #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
-        : aux::has_type< push_back< Seq, has_push_back_impl<Tag> > >
+        : aux::has_type< push_back< Seq, has_push_back_arg > >
     {
 #else
     {
-        typedef aux::has_type< push_back< Seq, has_push_back_impl<Tag> > > type;
+        typedef aux::has_type< push_back< Seq, has_push_back_arg > > type;
         BOOST_STATIC_CONSTANT(bool, value = 
-              (aux::has_type< push_back< Seq, has_push_back_impl<Tag> > >::value)
+              (aux::has_type< push_back< Seq, has_push_back_arg > >::value)
             );
 #endif
     };
similarity index 77%
rename from deal.II/contrib/boost/include/boost/mpl/aux_/push_front_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/aux_/push_front_impl.hpp
index dfc126170d1205aaf8169a73d1e383b102bd7b22..6723ea3894bfe3505b019049d6e090a473f4dbbe 100644 (file)
@@ -10,9 +10,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: push_front_impl.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
-// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49267 $
+// $Id: push_front_impl.hpp 55679 2009-08-20 07:50:16Z agurtovoy $
+// $Date: 2009-08-20 03:50:16 -0400 (Thu, 20 Aug 2009) $
+// $Revision: 55679 $
 
 #include <boost/mpl/push_front_fwd.hpp>
 #include <boost/mpl/assert.hpp>
@@ -25,8 +25,7 @@
 
 namespace boost { namespace mpl {
 
-template< typename Tag >
-struct has_push_front_impl;
+struct has_push_front_arg {};
 
 // agurt 05/feb/04: no default implementation; the stub definition is needed 
 // to enable the default 'has_push_front' implementation below
@@ -40,7 +39,7 @@ struct push_front_impl
         // if you've got an assert here, you are requesting a 'push_front' 
         // specialization that doesn't exist.
         BOOST_MPL_ASSERT_MSG(
-              ( boost::is_same< T, has_push_front_impl<T> >::value )
+              ( boost::is_same< T, has_push_front_arg >::value )
             , REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST
             , ( Sequence )
             );
@@ -52,13 +51,13 @@ struct has_push_front_impl
 {
     template< typename Seq > struct apply
 #if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
-        : aux::has_type< push_front< Seq, has_push_front_impl<Tag> > >
+        : aux::has_type< push_front< Seq, has_push_front_arg > >
     {
 #else
     {
-        typedef aux::has_type< push_front< Seq, has_push_front_impl<Tag> > > type;
+        typedef aux::has_type< push_front< Seq, has_push_front_arg > > type;
         BOOST_STATIC_CONSTANT(bool, value = 
-              (aux::has_type< push_front< Seq, has_push_front_impl<Tag> > >::value)
+              (aux::has_type< push_front< Seq, has_push_front_arg > >::value)
             );
 #endif
     };
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/mpl/char.hpp b/deal.II/contrib/boost-1.41.0/include/boost/mpl/char.hpp
new file mode 100644 (file)
index 0000000..08828c2
--- /dev/null
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_CHAR_HPP_INCLUDED
+#define BOOST_MPL_CHAR_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/char_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE char
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_CHAR_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/mpl/char_fwd.hpp b/deal.II/contrib/boost-1.41.0/include/boost/mpl/char_fwd.hpp
new file mode 100644 (file)
index 0000000..442d0a1
--- /dev/null
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+#define BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// Distributed under the Boost Software License, Version 1.0. 
+// (See accompanying file LICENSE_1_0.txt or copy at 
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(char, N) > struct char_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(char_)
+
+#endif // BOOST_MPL_CHAR_FWD_HPP_INCLUDED
similarity index 87%
rename from deal.II/contrib/boost/include/boost/mpl/for_each.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/for_each.hpp
index 668ec6aeea0529cc010d3c1aef21364659f7febe..89abc85d5edfd8de7d4bb6a86583f027056c3dc5 100644 (file)
@@ -10,9 +10,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: for_each.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
-// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49267 $
+// $Id: for_each.hpp 55648 2009-08-18 05:16:53Z agurtovoy $
+// $Date: 2009-08-18 01:16:53 -0400 (Tue, 18 Aug 2009) $
+// $Revision: 55648 $
 
 #include <boost/mpl/is_sequence.hpp>
 #include <boost/mpl/begin_end.hpp>
@@ -76,7 +76,7 @@ struct for_each_impl<false>
         
         typedef typename mpl::next<Iterator>::type iter;
         for_each_impl<boost::is_same<iter,LastIterator>::value>
-            ::execute((iter*)0, (LastIterator*)0, (TransformFunc*)0, f);
+            ::execute( static_cast<iter*>(0), static_cast<LastIterator*>(0), static_cast<TransformFunc*>(0), f);
     }
 };
 
@@ -98,7 +98,7 @@ void for_each(F f, Sequence* = 0, TransformOp* = 0)
     typedef typename end<Sequence>::type last;
 
     aux::for_each_impl< boost::is_same<first,last>::value >
-        ::execute((first*)0, (last*)0, (TransformOp*)0, f);
+        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_cast<TransformOp*>(0), f);
 }
 
 template<
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/string.hpp b/deal.II/contrib/boost-1.41.0/include/boost/mpl/limits/string.hpp
new file mode 100644 (file)
index 0000000..eb85aa3
--- /dev/null
@@ -0,0 +1,21 @@
+
+#ifndef BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
+#define BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
+
+// Copyright Eric Niebler 2009
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $
+// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49239 $
+
+#if !defined(BOOST_MPL_LIMIT_STRING_SIZE)
+#   define BOOST_MPL_LIMIT_STRING_SIZE 32
+#endif
+
+#endif // BOOST_MPL_LIMITS_STRING_HPP_INCLUDED
similarity index 88%
rename from deal.II/contrib/boost/include/boost/mpl/map/aux_/insert_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/mpl/map/aux_/insert_impl.hpp
index c37c134ceacb5ab228d64689c6ab004de8f9236c..411909f8f2deb8d3e5b419f591bad991816eb5ac 100644 (file)
@@ -11,9 +11,9 @@
 //
 // See http://www.boost.org/libs/mpl for documentation.
 
-// $Id: insert_impl.hpp 49267 2008-10-11 06:19:02Z agurtovoy $
-// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $
-// $Revision: 49267 $
+// $Id: insert_impl.hpp 55751 2009-08-24 04:11:00Z agurtovoy $
+// $Date: 2009-08-24 00:11:00 -0400 (Mon, 24 Aug 2009) $
+// $Revision: 55751 $
 
 #include <boost/mpl/insert_fwd.hpp>
 #include <boost/mpl/next_prior.hpp>
@@ -39,7 +39,7 @@ struct map_insert_impl
             >
 #else
         , m_item<
-              next< typename Map::size >::type::value
+              Map::order::value
             , typename Pair::first
             , typename Pair::second
             , Map
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/mpl/string.hpp b/deal.II/contrib/boost-1.41.0/include/boost/mpl/string.hpp
new file mode 100644 (file)
index 0000000..6a9481a
--- /dev/null
@@ -0,0 +1,559 @@
+
+#ifndef BOOST_MPL_STRING_HPP_INCLUDED
+#define BOOST_MPL_STRING_HPP_INCLUDED
+
+// Copyright Eric Niebler 2009
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $
+// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49239 $
+//
+// Thanks to:
+//   Dmitry Goncharov for porting this to the Sun compiler
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/detail/endian.hpp>
+#include <boost/mpl/limits/string.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/char.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/begin_end.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/insert_range.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/front_inserter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/div.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+#include <iterator> // for bidirectional_iterator_tag
+#include <climits>
+
+namespace boost { namespace mpl
+{
+    #define BOOST_MPL_STRING_MAX_PARAMS                                                             \
+      BOOST_PP_DIV(BOOST_PP_ADD(BOOST_MPL_LIMIT_STRING_SIZE, 3), 4)
+
+    // Low-level bit-twiddling is done by macros. Any implementation-defined behavior of
+    // multi-character literals should be localized to these macros.
+
+    #define BOOST_MPL_MULTICHAR_LENGTH(c)                                                           \
+      (std::size_t)((c<CHAR_MIN) ? 4 : ((c>0xffffff)+(c>0xffff)+(c>0xff)+1))
+
+    #if defined(BOOST_LITTLE_ENDIAN) && defined(__SUNPRO_CC)
+
+        #define BOOST_MPL_MULTICHAR_AT(c,i)                                                         \
+          (char)(0xff&((unsigned)(c)>>(8*(std::size_t)(i))))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i)                                                  \
+          ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i)                                                 \
+          (((unsigned)(c)<<8)|(unsigned char)(i))
+
+        #define BOOST_MPL_MULTICHAR_POP_BACK(c)                                                     \
+          (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_POP_FRONT(c)                                                    \
+          ((unsigned)(c)>>8)
+
+    #else
+
+        #define BOOST_MPL_MULTICHAR_AT(c,i)                                                         \
+          (char)(0xff&((unsigned)(c)>>(8*(BOOST_MPL_MULTICHAR_LENGTH(c)-(std::size_t)(i)-1))))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_BACK(c,i)                                                  \
+          (((unsigned)(c)<<8)|(unsigned char)(i))
+
+        #define BOOST_MPL_MULTICHAR_PUSH_FRONT(c,i)                                                 \
+          ((((unsigned char)(i))<<(BOOST_MPL_MULTICHAR_LENGTH(c)*8))|(unsigned)(c))
+
+        #define BOOST_MPL_MULTICHAR_POP_BACK(c)                                                     \
+          ((unsigned)(c)>>8)
+
+        #define BOOST_MPL_MULTICHAR_POP_FRONT(c)                                                    \
+          (((1<<((BOOST_MPL_MULTICHAR_LENGTH(c)-1)*8))-1)&(unsigned)(c))
+
+    #endif
+
+    struct string_tag;
+    struct string_iterator_tag;
+
+    template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_MPL_STRING_MAX_PARAMS, int C, 0)>
+    struct string;
+
+    template<typename Sequence, int I, int J>
+    struct string_iterator;
+
+    template<typename Sequence>
+    struct sequence_tag;
+
+    template<typename Tag>
+    struct size_impl;
+
+    template<>
+    struct size_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z, n, data)                                                                      \
+        + BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C,n))
+
+        #define M1(z, n, data)                                                                      \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+          : mpl::size_t<(0 BOOST_PP_REPEAT_ ## z(n, M0, ~))>                                        \
+        {};
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M1, ~)
+        #undef M0
+        #undef M1
+    };
+
+    template<>
+    struct size_impl<mpl::string_tag>::apply<mpl::string<> >
+      : mpl::size_t<0>
+    {};
+
+    template<typename Tag>
+    struct begin_impl;
+
+    template<>
+    struct begin_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply
+        {
+            typedef mpl::string_iterator<Sequence, 0, 0> type;
+        };
+    };
+
+    template<typename Tag>
+    struct end_impl;
+
+    template<>
+    struct end_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+        {                                                                                           \
+            typedef mpl::string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, n, 0> type;  \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+        #undef M0
+    };
+
+    template<>
+    struct end_impl<mpl::string_tag>::apply<mpl::string<> >
+    {
+        typedef mpl::string_iterator<mpl::string<>, 0, 0> type;
+    };
+
+    template<typename Tag>
+    struct push_back_impl;
+
+    template<>
+    struct push_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::back_))>
+        struct apply
+        {
+            BOOST_MPL_ASSERT_MSG(
+                (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size<Sequence>::type::value)
+              , PUSH_BACK_FAILED_MPL_STRING_IS_FULL
+              , (Sequence)
+            );
+            // If the above assertion didn't fire, then the string is sparse.
+            // Repack the string and retry the push_back
+            typedef
+                typename mpl::push_back<
+                    typename mpl::copy<
+                        Sequence
+                      , mpl::back_inserter<mpl::string<> >
+                    >::type
+                  , Value
+                >::type
+            type;
+        };
+
+        template<typename Value>
+        struct apply<mpl::string<>, Value, false>
+        {
+            typedef mpl::string<(char)Value::value> type;
+        };
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C), typename Value>                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, false>                    \
+        {                                                                                           \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C)                                   \
+                    BOOST_PP_COMMA_IF(BOOST_PP_DEC(n))                                              \
+                    ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff)                            \
+                    ?BOOST_PP_CAT(C,BOOST_PP_DEC(n))                                                \
+                    :BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n)), Value::value)   \
+                  , ((unsigned)BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff)                            \
+                    ?(char)Value::value                                                             \
+                    :0                                                                              \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), typename Value>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), C)
+                  , BOOST_MPL_MULTICHAR_PUSH_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS)), Value::value)
+                >
+            type;
+        };
+    };
+
+    template<typename Tag>
+    struct pop_back_impl;
+
+    template<>
+    struct pop_back_impl<mpl::string_tag>
+    {
+        template<typename Sequence>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)> >                                 \
+        {                                                                                           \
+            BOOST_MPL_ASSERT_MSG((C0 != 0), POP_BACK_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>));  \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C)                                   \
+                    BOOST_PP_COMMA_IF(BOOST_PP_DEC(n))                                              \
+                    BOOST_MPL_MULTICHAR_POP_BACK(BOOST_PP_CAT(C,BOOST_PP_DEC(n)))                   \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+        #undef M0
+    };
+
+    template<typename Tag>
+    struct push_front_impl;
+
+    template<>
+    struct push_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::front_))>
+        struct apply
+        {
+            BOOST_MPL_ASSERT_MSG(
+                (BOOST_MPL_LIMIT_STRING_SIZE != mpl::size<Sequence>::type::value)
+              , PUSH_FRONT_FAILED_MPL_STRING_IS_FULL
+              , (Sequence)
+            );
+            // If the above assertion didn't fire, then the string is sparse.
+            // Repack the string and retry the push_front.
+            typedef
+                typename mpl::push_front<
+                    typename mpl::reverse_copy<
+                        Sequence
+                      , mpl::front_inserter<string<> >
+                    >::type
+                  , Value
+                >::type
+            type;
+        };
+
+        #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+        template<typename Value>
+        struct apply<mpl::string<>, Value, false>
+        {
+            typedef mpl::string<(char)Value::value> type;
+        };
+        #endif
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C), typename Value>                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, true>                     \
+        {                                                                                           \
+            typedef                                                                                 \
+                mpl::string<                                                                        \
+                    (char)Value::value                                                              \
+                    BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, C)                                        \
+                >                                                                                   \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), typename Value>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_MPL_MULTICHAR_PUSH_FRONT(C0, Value::value)
+                  , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)
+                >
+            type0;
+
+            #if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+            typedef
+                typename mpl::if_<
+                    mpl::empty<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> >
+                  , mpl::string<(char)Value::value>
+                  , type0
+                >::type
+            type;
+            #else
+            typedef type0 type;
+            #endif
+        };
+    };
+
+    template<typename Tag>
+    struct pop_front_impl;
+
+    template<>
+    struct pop_front_impl<mpl::string_tag>
+    {
+        template<typename Sequence, bool B = (1==BOOST_MPL_MULTICHAR_LENGTH(Sequence::front_))>
+        struct apply;
+
+        #define M0(z,n,data)                                                                        \
+        template<BOOST_PP_ENUM_PARAMS_Z(z, n, int C)>                                               \
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, true>                            \
+        {                                                                                           \
+            BOOST_MPL_ASSERT_MSG((C0 != 0), POP_FRONT_FAILED_MPL_STRING_IS_EMPTY, (mpl::string<>)); \
+            typedef                                                                                 \
+                mpl::string<BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, n, C)>                                \
+            type;                                                                                   \
+        };
+
+        BOOST_PP_REPEAT_FROM_TO(1, BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+        #undef M0
+
+        template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>
+        struct apply<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, false>
+        {
+            typedef
+                mpl::string<
+                    BOOST_MPL_MULTICHAR_POP_FRONT(C0)
+                  , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)
+                >
+            type;
+        };
+    };
+
+    template<typename Tag>
+    struct insert_range_impl;
+
+    template<>
+    struct insert_range_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Pos, typename Range>
+        struct apply
+          : mpl::copy<
+                mpl::joint_view<
+                    mpl::iterator_range<
+                        mpl::string_iterator<Sequence, 0, 0>
+                      , Pos
+                    >
+                  , mpl::joint_view<
+                        Range
+                      , mpl::iterator_range<
+                            Pos
+                          , typename mpl::end<Sequence>::type
+                        >
+                    >
+                >
+              , mpl::back_inserter<mpl::string<> >
+            >
+        {};
+    };
+
+    template<typename Tag>
+    struct insert_impl;
+
+    template<>
+    struct insert_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename Pos, typename Value>
+        struct apply
+          : mpl::insert_range<Sequence, Pos, mpl::string<(char)Value::value> >
+        {};
+    };
+
+    template<typename Tag>
+    struct erase_impl;
+
+    template<>
+    struct erase_impl<mpl::string_tag>
+    {
+        template<typename Sequence, typename First, typename Last>
+        struct apply
+          : mpl::copy<
+                mpl::joint_view<
+                    mpl::iterator_range<
+                        mpl::string_iterator<Sequence, 0, 0>
+                      , First
+                    >
+                  , mpl::iterator_range<
+                        typename mpl::if_na<Last, typename mpl::next<First>::type>::type
+                      , typename mpl::end<Sequence>::type
+                    >
+                >
+              , mpl::back_inserter<mpl::string<> >
+            >
+        {};
+    };
+
+    template<typename Tag>
+    struct clear_impl;
+
+    template<>
+    struct clear_impl<mpl::string_tag>
+    {
+        template<typename>
+        struct apply
+        {
+            typedef mpl::string<> type;
+        };
+    };
+
+    #define M0(z, n, data)                                                                            \
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C), int J>                         \
+    struct string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, n, J>   \
+    {                                                                                                 \
+        enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == J + 1) };                   \
+        typedef mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> string;             \
+        typedef std::bidirectional_iterator_tag category;                                             \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n + eomc_, eomc_ ? 0 : J + 1>                                \
+        next;                                                                                         \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n, J - 1>                                                    \
+        prior;                                                                                        \
+        typedef mpl::char_<BOOST_MPL_MULTICHAR_AT(BOOST_PP_CAT(C, n), J)> type;                       \
+    };                                                                                                \
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>                                \
+    struct string_iterator<mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, n, 0>   \
+    {                                                                                                 \
+        enum { eomc_ = (BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, n)) == 1) };                       \
+        typedef mpl::string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> string;             \
+        typedef std::bidirectional_iterator_tag category;                                             \
+        typedef                                                                                       \
+            mpl::string_iterator<string, n + eomc_, !eomc_>                                           \
+        next;                                                                                         \
+        typedef                                                                                       \
+            mpl::string_iterator<                                                                     \
+                string                                                                                \
+              , n - 1                                                                                 \
+              , BOOST_MPL_MULTICHAR_LENGTH(BOOST_PP_CAT(C, BOOST_PP_DEC(n))) - 1                      \
+            >                                                                                         \
+        prior;                                                                                        \
+        typedef mpl::char_<BOOST_MPL_MULTICHAR_AT(BOOST_PP_CAT(C, n), 0)> type;                       \
+    };
+
+    BOOST_PP_REPEAT(BOOST_MPL_STRING_MAX_PARAMS, M0, ~)
+    #undef M0
+
+    template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, int C)>
+    struct string
+    {
+        /// INTERNAL ONLY
+        enum
+        {
+            front_  = C0
+          , back_   = BOOST_PP_CAT(C, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS))
+        };
+
+        typedef char        value_type;
+        typedef string      type;
+        typedef string_tag  tag;
+    };
+
+    namespace aux_
+    {
+        template<typename It, typename End>
+        struct next_unless
+          : mpl::next<It>
+        {};
+
+        template<typename End>
+        struct next_unless<End, End>
+        {
+            typedef End type;
+        };
+
+        template<typename It, typename End>
+        struct deref_unless
+          : mpl::deref<It>
+        {};
+
+        template<typename End>
+        struct deref_unless<End, End>
+        {
+            typedef mpl::char_<'\0'> type;
+        };
+    }
+
+    template<typename Sequence>
+    struct c_str
+    {
+        typedef typename mpl::end<Sequence>::type iend;
+        typedef typename mpl::begin<Sequence>::type i0;
+        #define M0(z, n, data)                                                                      \
+        typedef                                                                                     \
+            typename mpl::aux_::next_unless<BOOST_PP_CAT(i, n), iend>::type                         \
+        BOOST_PP_CAT(i, BOOST_PP_INC(n));
+        BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~)
+        #undef M0
+
+        typedef c_str type;
+        static typename Sequence::value_type const value[BOOST_MPL_LIMIT_STRING_SIZE+1];
+    };
+
+    template<typename Sequence>
+    typename Sequence::value_type const c_str<Sequence>::value[BOOST_MPL_LIMIT_STRING_SIZE+1] =
+    {
+        #define M0(z, n, data)                                                                      \
+        mpl::aux_::deref_unless<BOOST_PP_CAT(i, n), iend>::type::value,
+        BOOST_PP_REPEAT(BOOST_MPL_LIMIT_STRING_SIZE, M0, ~)
+        #undef M0
+        '\0'
+    };
+
+}} // namespace boost
+
+#endif // BOOST_MPL_STRING_HPP_INCLUDED
similarity index 99%
rename from deal.II/contrib/boost/include/boost/multi_index/composite_key.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/multi_index/composite_key.hpp
index a8b8325027da853e7f88823d0c783eb8221f380a..cedc75e04f1dfe18abbdb943e142741dffbdb6fa 100644 (file)
@@ -563,6 +563,11 @@ struct hash_cval:
 
 /* composite_key_result */
 
+#if defined(BOOST_MSVC)
+#pragma warning(push)
+#pragma warning(disable:4512)
+#endif
+
 template<typename CompositeKey>
 struct composite_key_result
 {
@@ -578,6 +583,10 @@ struct composite_key_result
   const value_type&         value;
 };
 
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
+#endif
+
 /* composite_key */
 
 /* NB. Some overloads of operator() have an extra dummy parameter int=0.
similarity index 98%
rename from deal.II/contrib/boost/include/boost/multi_index/detail/rnd_index_ops.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/rnd_index_ops.hpp
index 27b8aeb34ce9d8860a2ba07c3e6b80513a3fafab..5bf1ade7f5b4f73f72d976da5a20e5b2f4705f2d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
+/* Copyright 2003-2009 Joaquin M Lopez Munoz.
  * 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)
@@ -174,6 +174,8 @@ void random_access_index_sort(
    *     solution adopted.
    */
 
+  if(ptrs.size()<=1)return;
+
   typedef typename Node::value_type         value_type;
   typedef typename Node::impl_pointer       impl_pointer;
   typedef typename Node::impl_ptr_pointer   impl_ptr_pointer;
similarity index 97%
rename from deal.II/contrib/boost/include/boost/multi_index/detail/safe_mode.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/multi_index/detail/safe_mode.hpp
index 2e4d708e9b46f9bb46782b8c7c4ae8ba07a88778..dbfebd8c8fe1bec33f6e3a3cefe12229fe422689 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2008 Joaquin M Lopez Munoz.
+/* Copyright 2003-2009 Joaquin M Lopez Munoz.
  * 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)
@@ -237,15 +237,21 @@ template<typename Iterator>
 inline void detach_equivalent_iterators(Iterator& it)
 {
   if(it.valid()){
-    Iterator *prev_,*next_;
-    for(
-      prev_=static_cast<Iterator*>(&it.cont->header);
-      (next_=static_cast<Iterator*>(prev_->next))!=0;){
-      if(next_!=&it&&*next_==it){
-        prev_->next=next_->next;
-        next_->cont=0;
+    {
+#if defined(BOOST_HAS_THREADS)
+      boost::detail::lightweight_mutex::scoped_lock lock(it.cont->mutex);
+#endif
+
+      Iterator *prev_,*next_;
+      for(
+        prev_=static_cast<Iterator*>(&it.cont->header);
+        (next_=static_cast<Iterator*>(prev_->next))!=0;){
+        if(next_!=&it&&*next_==it){
+          prev_->next=next_->next;
+          next_->cont=0;
+        }
+        else prev_=next_;
       }
-      else prev_=next_;
     }
     it.detach();
   }
similarity index 96%
rename from deal.II/contrib/boost/include/boost/multi_index_container.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/multi_index_container.hpp
index bb1070a050389fcd9006bc28cf239909bc90da5f..7b4815fbca1dd047ae4044e95b9ac389e627f187 100644 (file)
@@ -1,6 +1,6 @@
 /* Multiply indexed container.
  *
- * Copyright 2003-2008 Joaquin M Lopez Munoz.
+ * Copyright 2003-2009 Joaquin M Lopez Munoz.
  * Distributed under the Boost Software License, Version 1.0.
  * (See accompanying file LICENSE_1_0.txt or copy at
  * http://www.boost.org/LICENSE_1_0.txt)
 
 #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
 #include <boost/multi_index/detail/archive_constructed.hpp>
+#include <boost/serialization/collection_size_type.hpp>
 #include <boost/serialization/nvp.hpp>
 #include <boost/serialization/split_member.hpp>
+#include <boost/serialization/version.hpp>
 #include <boost/throw_exception.hpp> 
 #endif
 
@@ -522,9 +524,9 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
 
   void erase_(node_type* x)
   {
+    --node_count;
     super::erase_(x);
     deallocate_node(x);
-    --node_count;
   }
 
   void delete_node_(node_type* x)
@@ -630,8 +632,15 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
   template<class Archive>
   void save(Archive& ar,const unsigned int version)const
   {
+
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    const serialization::collection_size_type s(size_());
+    ar<<serialization::make_nvp("count",s);
+#else
     const std::size_t s=size_();
     ar<<serialization::make_nvp("count",s);
+#endif
+
     index_saver_type sm(bfm_allocator::member,s);
 
     for(iterator it=super::begin(),it_end=super::end();it!=it_end;++it){
@@ -650,8 +659,21 @@ BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:
 
     clear_(); 
 
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+    serialization::collection_size_type s;
+    if(version<1){
+      std::size_t sz;
+      ar>>serialization::make_nvp("count",sz);
+      s=sz;
+    }
+    else{
+      ar>>serialization::make_nvp("count",s);
+    }
+#else
     std::size_t s;
     ar>>serialization::make_nvp("count",s);
+#endif
+
     index_loader_type lm(bfm_allocator::member,s);
 
     for(std::size_t n=0;n<s;++n){
@@ -1076,6 +1098,23 @@ void swap(
 
 } /* namespace multi_index */
 
+#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)&&\
+    !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+/* Serialization class version bump as we now serialize the size
+ * through boost::serialization::collection_size_type.
+ */
+
+namespace serialization {
+template<typename Value,typename IndexSpecifierList,typename Allocator>
+struct version<
+  boost::multi_index_container<Value,IndexSpecifierList,Allocator>
+>
+{
+  BOOST_STATIC_CONSTANT(unsigned int,value=1);
+};
+} /* namespace serialization */
+#endif
+
 /* Associated global functions are promoted to namespace boost, except
  * comparison operators and swap, which are meant to be Koenig looked-up.
  */
similarity index 93%
rename from deal.II/contrib/boost/include/boost/operators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/operators.hpp
index b3b1bd72a4679a817ad911eb2b86e665ca910e2d..4b47ba40c1baa21c6498ec940fc638a56ae99592 100644 (file)
@@ -8,6 +8,9 @@
 //  See http://www.boost.org/libs/utility/operators.htm for documentation.
 
 //  Revision History
+//  07 Aug 08 Added "euclidean" spelling. (Daniel Frey)
+//  03 Apr 08 Make sure "convertible to bool" is sufficient
+//            for T::operator<, etc. (Daniel Frey)
 //  24 May 07 Changed empty_base to depend on T, see
 //            http://svn.boost.org/trac/boost/ticket/979
 //  21 Oct 02 Modified implementation of operators to allow compilers with a
@@ -124,34 +127,34 @@ namespace boost
 template <class T, class U, class B = ::boost::detail::empty_base<T> >
 struct less_than_comparable2 : B
 {
-     friend bool operator<=(const T& x, const U& y) { return !(x > y); }
-     friend bool operator>=(const T& x, const U& y) { return !(x < y); }
+     friend bool operator<=(const T& x, const U& y) { return !static_cast<bool>(x > y); }
+     friend bool operator>=(const T& x, const U& y) { return !static_cast<bool>(x < y); }
      friend bool operator>(const U& x, const T& y)  { return y < x; }
      friend bool operator<(const U& x, const T& y)  { return y > x; }
-     friend bool operator<=(const U& x, const T& y) { return !(y < x); }
-     friend bool operator>=(const U& x, const T& y) { return !(y > x); }
+     friend bool operator<=(const U& x, const T& y) { return !static_cast<bool>(y < x); }
+     friend bool operator>=(const U& x, const T& y) { return !static_cast<bool>(y > x); }
 };
 
 template <class T, class B = ::boost::detail::empty_base<T> >
 struct less_than_comparable1 : B
 {
      friend bool operator>(const T& x, const T& y)  { return y < x; }
-     friend bool operator<=(const T& x, const T& y) { return !(y < x); }
-     friend bool operator>=(const T& x, const T& y) { return !(x < y); }
+     friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); }
+     friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); }
 };
 
 template <class T, class U, class B = ::boost::detail::empty_base<T> >
 struct equality_comparable2 : B
 {
      friend bool operator==(const U& y, const T& x) { return x == y; }
-     friend bool operator!=(const U& y, const T& x) { return !(x == y); }
-     friend bool operator!=(const T& y, const U& x) { return !(y == x); }
+     friend bool operator!=(const U& y, const T& x) { return !static_cast<bool>(x == y); }
+     friend bool operator!=(const T& y, const U& x) { return !static_cast<bool>(y == x); }
 };
 
 template <class T, class B = ::boost::detail::empty_base<T> >
 struct equality_comparable1 : B
 {
-     friend bool operator!=(const T& x, const T& y) { return !(x == y); }
+     friend bool operator!=(const T& x, const T& y) { return !static_cast<bool>(x == y); }
 };
 
 // A macro which produces "name_2left" from "name".
@@ -356,7 +359,7 @@ struct equivalent2 : B
 {
   friend bool operator==(const T& x, const U& y)
   {
-    return !(x < y) && !(x > y);
+    return !static_cast<bool>(x < y) && !static_cast<bool>(x > y);
   }
 };
 
@@ -365,7 +368,7 @@ struct equivalent1 : B
 {
   friend bool operator==(const T&x, const T&y)
   {
-    return !(x < y) && !(y < x);
+    return !static_cast<bool>(x < y) && !static_cast<bool>(y < x);
   }
 };
 
@@ -373,17 +376,17 @@ template <class T, class U, class B = ::boost::detail::empty_base<T> >
 struct partially_ordered2 : B
 {
   friend bool operator<=(const T& x, const U& y)
-    { return (x < y) || (x == y); }
+    { return static_cast<bool>(x < y) || static_cast<bool>(x == y); }
   friend bool operator>=(const T& x, const U& y)
-    { return (x > y) || (x == y); }
+    { return static_cast<bool>(x > y) || static_cast<bool>(x == y); }
   friend bool operator>(const U& x, const T& y)
     { return y < x; }
   friend bool operator<(const U& x, const T& y)
     { return y > x; }
   friend bool operator<=(const U& x, const T& y)
-    { return (y > x) || (y == x); }
+    { return static_cast<bool>(y > x) || static_cast<bool>(y == x); }
   friend bool operator>=(const U& x, const T& y)
-    { return (y < x) || (y == x); }
+    { return static_cast<bool>(y < x) || static_cast<bool>(y == x); }
 };
 
 template <class T, class B = ::boost::detail::empty_base<T> >
@@ -392,9 +395,9 @@ struct partially_ordered1 : B
   friend bool operator>(const T& x, const T& y)
     { return y < x; }
   friend bool operator<=(const T& x, const T& y)
-    { return (x < y) || (x == y); }
+    { return static_cast<bool>(x < y) || static_cast<bool>(x == y); }
   friend bool operator>=(const T& x, const T& y)
-    { return (y < x) || (x == y); }
+    { return static_cast<bool>(y < x) || static_cast<bool>(x == y); }
 };
 
 //  Combined operator classes (contributed by Daryle Walker) ----------------//
@@ -580,7 +583,35 @@ struct ordered_euclidian_ring_operators1
     : totally_ordered1<T
     , euclidian_ring_operators1<T, B
       > > {};
-      
+
+template <class T, class U, class B = ::boost::detail::empty_base<T> >
+struct euclidean_ring_operators2
+    : ring_operators2<T, U
+    , dividable2<T, U
+    , dividable2_left<T, U
+    , modable2<T, U
+    , modable2_left<T, U, B
+      > > > > > {};
+
+template <class T, class B = ::boost::detail::empty_base<T> >
+struct euclidean_ring_operators1
+    : ring_operators1<T
+    , dividable1<T
+    , modable1<T, B
+      > > > {};
+
+template <class T, class U, class B = ::boost::detail::empty_base<T> >
+struct ordered_euclidean_ring_operators2
+    : totally_ordered2<T, U
+    , euclidean_ring_operators2<T, U, B
+      > > {};
+
+template <class T, class B = ::boost::detail::empty_base<T> >
+struct ordered_euclidean_ring_operators1
+    : totally_ordered1<T
+    , euclidean_ring_operators1<T, B
+      > > {};
+
 template <class T, class P, class B = ::boost::detail::empty_base<T> >
 struct input_iteratable
     : equality_comparable1<T
@@ -837,6 +868,8 @@ BOOST_OPERATOR_TEMPLATE(field_operators)
 BOOST_OPERATOR_TEMPLATE(ordered_field_operators)
 BOOST_OPERATOR_TEMPLATE(euclidian_ring_operators)
 BOOST_OPERATOR_TEMPLATE(ordered_euclidian_ring_operators)
+BOOST_OPERATOR_TEMPLATE(euclidean_ring_operators)
+BOOST_OPERATOR_TEMPLATE(ordered_euclidean_ring_operators)
 BOOST_OPERATOR_TEMPLATE2(input_iteratable)
 BOOST_OPERATOR_TEMPLATE1(output_iteratable)
 BOOST_OPERATOR_TEMPLATE2(forward_iteratable)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/arg_list.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/arg_list.hpp
new file mode 100644 (file)
index 0000000..d70205f
--- /dev/null
@@ -0,0 +1,464 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef ARG_LIST_050329_HPP
+#define ARG_LIST_050329_HPP
+
+#include <boost/parameter/aux_/void.hpp>
+#include <boost/parameter/aux_/result_of0.hpp>
+#include <boost/parameter/aux_/default.hpp>
+#include <boost/parameter/aux_/parameter_requirements.hpp>
+#include <boost/parameter/aux_/yesno.hpp>
+#include <boost/parameter/aux_/maybe.hpp>
+#include <boost/parameter/config.hpp>
+
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/begin.hpp>
+#include <boost/mpl/end.hpp>
+#include <boost/mpl/iterator_tags.hpp>
+
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+
+namespace boost { namespace parameter { 
+
+// Forward declaration for aux::arg_list, below.
+template<class T> struct keyword;
+
+namespace aux {
+
+// Tag type passed to MPL lambda.
+struct lambda_tag;
+
+//
+// Structures used to build the tuple of actual arguments.  The
+// tuple is a nested cons-style list of arg_list specializations
+// terminated by an empty_arg_list.
+//
+// Each specialization of arg_list is derived from its successor in
+// the list type.  This feature is used along with using
+// declarations to build member function overload sets that can
+// match against keywords.
+//
+  
+// MPL sequence support
+struct arg_list_tag;
+
+// Terminates arg_list<> and represents an empty list.  Since this
+// is just the terminating case you might want to look at arg_list
+// first, to get a feel for what's really happening here.
+
+struct empty_arg_list
+{
+    empty_arg_list() {}
+
+    // Constructor taking BOOST_PARAMETER_MAX_ARITY empty_arg_list
+    // arguments; this makes initialization
+    empty_arg_list(
+        BOOST_PP_ENUM_PARAMS(
+            BOOST_PARAMETER_MAX_ARITY, void_ BOOST_PP_INTERCEPT
+        ))
+    {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template<class KW, class Default, class Reference>
+        struct apply
+        {
+            typedef Default type;
+        };
+    };
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    // Terminator for has_key, indicating that the keyword is unique
+    template <class KW>
+    static no_tag has_key(KW*);
+#endif
+    
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+    || (BOOST_WORKAROUND(__GNUC__, < 3)) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    
+    // The overload set technique doesn't work with these older
+    // compilers, so they need some explicit handholding.
+      
+    // A metafunction class that, given a keyword, returns the type
+    // of the base sublist whose get() function can produce the
+    // value for that key
+    struct key_owner
+    {
+        template<class KW>
+        struct apply
+        {
+            typedef empty_arg_list type;
+        };
+    };
+
+    template <class K, class T>
+    T& get(default_<K,T> x) const
+    {
+        return x.value;
+    }
+
+    template <class K, class F>
+    typename result_of0<F>::type
+    get(lazy_default<K,F> x) const
+    {
+        return x.compute_default();
+    }
+#endif
+
+    // If this function is called, it means there is no argument
+    // in the list that matches the supplied keyword. Just return
+    // the default value.
+    template <class K, class Default>
+    Default& operator[](default_<K, Default> x) const
+    {
+        return x.value;
+    }
+
+    // If this function is called, it means there is no argument
+    // in the list that matches the supplied keyword. Just evaluate
+    // and return the default value.
+    template <class K, class F>
+    typename result_of0<F>::type
+    operator[](
+        BOOST_PARAMETER_lazy_default_fallback<K,F> x) const
+    {
+        return x.compute_default();
+    }
+
+    // No argument corresponding to ParameterRequirements::key_type
+    // was found if we match this overload, so unless that parameter
+    // has a default, we indicate that the actual arguments don't
+    // match the function's requirements.
+    template <class ParameterRequirements, class ArgPack>
+    static typename ParameterRequirements::has_default
+    satisfies(ParameterRequirements*, ArgPack*);
+
+    // MPL sequence support
+    typedef empty_arg_list type;   // convenience
+    typedef arg_list_tag tag; // For dispatching to sequence intrinsics
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+template<class KW>
+no_tag operator*(empty_arg_list, KW*);
+#endif
+
+// Forward declaration for arg_list::operator,
+template <class KW, class T>
+struct tagged_argument;
+
+template <class T>
+struct is_maybe
+  : is_base_and_derived<maybe_base, T>
+{};
+
+template <class T>
+struct get_reference
+{
+    typedef typename T::reference type;
+};
+
+// A tuple of tagged arguments, terminated with empty_arg_list.
+// Every TaggedArg is an instance of tagged_argument<>.
+template <class TaggedArg, class Next = empty_arg_list>
+struct arg_list : Next
+{
+    typedef arg_list<TaggedArg,Next> self;
+    typedef typename TaggedArg::key_type key_type;
+
+    typedef typename is_maybe<typename TaggedArg::value_type>::type holds_maybe;
+
+    typedef typename mpl::eval_if<
+        holds_maybe
+      , get_reference<typename TaggedArg::value_type>
+      , get_reference<TaggedArg>
+    >::type reference;
+
+    typedef typename mpl::if_<
+        holds_maybe
+      , reference
+      , typename TaggedArg::value_type
+    >::type value_type;
+
+    TaggedArg arg;      // Stores the argument
+
+    // Store the arguments in successive nodes of this list
+    template< // class A0, class A1, ...
+        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)
+    >
+    arg_list( // A0& a0, A1& a1, ...
+        BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PARAMETER_MAX_ARITY, A, & a)
+    )
+      : Next( // a1, a2, ...
+            BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PARAMETER_MAX_ARITY, a)
+          , void_reference()
+        )
+      , arg(a0)
+    {}
+
+    // Create a new list by prepending arg to a copy of tail.  Used
+    // when incrementally building this structure with the comma
+    // operator.
+    arg_list(TaggedArg arg, Next const& tail)
+      : Next(tail)
+      , arg(arg)
+    {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template <class KW, class Default, class Reference>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::if_<Reference, reference, value_type>
+              , mpl::apply_wrap3<typename Next::binding, KW, Default, Reference>
+          >::type type;
+        };
+    };
+
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && !BOOST_WORKAROUND(__GNUC__, == 2)
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+    friend yes_tag operator*(arg_list, key_type*);
+#  define BOOST_PARAMETER_CALL_HAS_KEY(next, key) (*(next*)0 * (key*)0)
+# else
+    // Overload for key_type, so the assert below will fire if the
+    // same keyword is used again
+    static yes_tag has_key(key_type*);
+    using Next::has_key;
+    
+#  define BOOST_PARAMETER_CALL_HAS_KEY(next, key) next::has_key((key*)0)  
+# endif
+
+    BOOST_MPL_ASSERT_MSG(
+        sizeof(BOOST_PARAMETER_CALL_HAS_KEY(Next,key_type)) == sizeof(no_tag)
+      , duplicate_keyword, (key_type)
+    );
+
+# undef BOOST_PARAMETER_CALL_HAS_KEY
+#endif
+    //
+    // Begin implementation of indexing operators for looking up
+    // specific arguments by name
+    //
+
+    // Helpers that handle the case when TaggedArg is 
+    // empty<T>.
+    template <class D>
+    reference get_default(D const&, mpl::false_) const
+    {
+        return arg.value;
+    }
+
+    template <class D>
+    reference get_default(D const& d, mpl::true_) const
+    {
+        return arg.value ? arg.value.get() : arg.value.construct(d.value);
+    }
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+    || BOOST_WORKAROUND(__GNUC__, < 3) \
+    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    // These older compilers don't support the overload set creation
+    // idiom well, so we need to do all the return type calculation
+    // for the compiler and dispatch through an outer function template
+
+    // A metafunction class that, given a keyword, returns the base
+    // sublist whose get() function can produce the value for that
+    // key.
+    struct key_owner
+    {
+        template<class KW>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::identity<arg_list<TaggedArg,Next> >
+              , mpl::apply_wrap1<typename Next::key_owner,KW>
+          >::type type;
+        };
+    };
+
+    // Outer indexing operators that dispatch to the right node's
+    // get() function.
+    template <class KW>
+    typename mpl::apply_wrap3<binding, KW, void_, mpl::true_>::type
+    operator[](keyword<KW> const& x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    template <class KW, class Default>
+    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type
+    operator[](default_<KW, Default> x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    template <class KW, class F>
+    typename mpl::apply_wrap3<
+        binding,KW
+      , typename result_of0<F>::type
+      , mpl::true_
+    >::type
+    operator[](lazy_default<KW,F> x) const
+    {
+        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;
+        return sublist.get(x);
+    }
+
+    // These just return the stored value; when empty_arg_list is
+    // reached, indicating no matching argument was passed, the
+    // default is returned, or if no default_ or lazy_default was
+    // passed, compilation fails.
+    reference get(keyword<key_type> const&) const
+    {
+        BOOST_MPL_ASSERT_NOT((holds_maybe));
+        return arg.value;
+    }
+
+    template <class Default>
+    reference get(default_<key_type,Default> const& d) const
+    {
+        return get_default(d, holds_maybe());        
+    }
+
+    template <class Default>
+    reference get(lazy_default<key_type, Default>) const
+    {
+        return arg.value;
+    }
+    
+#else
+
+    reference operator[](keyword<key_type> const&) const
+    {
+        BOOST_MPL_ASSERT_NOT((holds_maybe));
+        return arg.value;
+    }
+
+    template <class Default>
+    reference operator[](default_<key_type, Default> const& d) const
+    {
+        return get_default(d, holds_maybe());
+    }
+
+    template <class Default>
+    reference operator[](lazy_default<key_type, Default>) const
+    {
+        return arg.value;
+    }
+
+    // Builds an overload set including operator[]s defined in base
+    // classes.
+    using Next::operator[];
+
+    //
+    // End of indexing support
+    //
+
+
+    //
+    // For parameter_requirements matching this node's key_type,
+    // return a bool constant wrapper indicating whether the
+    // requirements are satisfied by TaggedArg.  Used only for
+    // compile-time computation and never really called, so a
+    // declaration is enough.
+    //
+    template <class HasDefault, class Predicate, class ArgPack>
+    static typename mpl::apply_wrap2<
+        typename mpl::lambda<Predicate, lambda_tag>::type
+      , value_type, ArgPack
+    >::type
+    satisfies(
+        parameter_requirements<key_type,Predicate,HasDefault>*
+      , ArgPack*
+    );
+
+    // Builds an overload set including satisfies functions defined
+    // in base classes.
+    using Next::satisfies;
+#endif
+
+    // Comma operator to compose argument list without using parameters<>.
+    // Useful for argument lists with undetermined length.
+    template <class KW, class T2>
+    arg_list<tagged_argument<KW, T2>, self> 
+    operator,(tagged_argument<KW,T2> x) const
+    {
+        return arg_list<tagged_argument<KW,T2>, self>(x, *this);
+    }
+
+    // MPL sequence support
+    typedef self type;             // Convenience for users
+    typedef Next tail_type;        // For the benefit of iterators
+    typedef arg_list_tag tag; // For dispatching to sequence intrinsics
+};
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)  // ETI workaround
+template <> struct arg_list<int,int> {};
+#endif 
+
+// MPL sequence support
+template <class ArgumentPack>
+struct arg_list_iterator
+{
+    typedef mpl::forward_iterator_tag category;
+
+    // The incremented iterator
+    typedef arg_list_iterator<typename ArgumentPack::tail_type> next;
+    
+    // dereferencing yields the key type
+    typedef typename ArgumentPack::key_type type;
+};
+
+template <>
+struct arg_list_iterator<empty_arg_list> {};
+
+}} // namespace parameter::aux
+
+// MPL sequence support
+namespace mpl
+{
+  template <>
+  struct begin_impl<parameter::aux::arg_list_tag>
+  {
+      template <class S>
+      struct apply
+      {
+          typedef parameter::aux::arg_list_iterator<S> type;
+      };
+  };
+
+  template <>
+  struct end_impl<parameter::aux::arg_list_tag>
+  {
+      template <class>
+      struct apply
+      {
+          typedef parameter::aux::arg_list_iterator<parameter::aux::empty_arg_list> type;
+      };
+  };
+}
+
+} // namespace boost
+
+#endif // ARG_LIST_050329_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/cast.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/cast.hpp
new file mode 100644 (file)
index 0000000..c9d290d
--- /dev/null
@@ -0,0 +1,131 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_CAST_060902_HPP
+# define BOOST_PARAMETER_CAST_060902_HPP
+
+# include <boost/detail/workaround.hpp>
+
+# if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+  && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+#  include <boost/type_traits/add_reference.hpp>
+#  include <boost/type_traits/remove_const.hpp>
+# endif
+
+namespace boost { namespace parameter { namespace aux {
+
+struct use_default_tag {};
+
+# if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+#  define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) value
+
+# else
+
+// Handles possible implicit casts. Used by preprocessor.hpp to
+// normalize user input.
+//
+// cast<void*>::execute() is identity
+// cast<void*(X)>::execute() is identity
+// cast<void(X)>::execute() casts to X
+//
+// preprocessor.hpp uses this like this:
+//
+//   #define X(value, predicate)
+//      cast<void predicate>::execute(value)
+//
+//   X(something, *)
+//   X(something, *(predicate))
+//   X(something, (int))
+
+template <class T>
+struct cast;
+
+template <>
+struct cast<void*>
+{
+    static use_default_tag execute(use_default_tag)
+    {
+        return use_default_tag();
+    }
+
+    static use_default_tag remove_const(use_default_tag)
+    {
+        return use_default_tag();
+    }
+
+    template <class U>
+    static U& execute(U& value)
+    {
+        return value;
+    }
+
+    template <class U>
+    static U& remove_const(U& x)
+    {
+        return x;
+    }
+};
+
+#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))
+
+typedef void* voidstar;
+
+template <class T>
+struct cast<voidstar(T)>
+  : cast<void*>
+{
+};
+
+#else
+
+template <class T>
+struct cast<void*(T)>
+  : cast<void*>
+{
+};
+
+#endif
+
+template <class T>
+struct cast<void(T)>
+{
+    typedef typename boost::add_reference<
+        typename boost::remove_const<T>::type 
+    >::type reference;
+
+    static use_default_tag execute(use_default_tag)
+    {
+        return use_default_tag();
+    }
+
+    static use_default_tag remove_const(use_default_tag)
+    {
+        return use_default_tag();
+    }
+
+    static T execute(T value)
+    {
+        return value;
+    }
+
+    template <class U>
+    static reference remove_const(U const& x)
+    {
+        return const_cast<reference>(x);
+    }
+};
+
+#  define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) \
+    boost::parameter::aux::cast<void predicate>::remove_const( \
+        boost::parameter::aux::cast<void predicate>::execute(value) \
+    )
+
+# endif
+
+}}} // namespace boost::parameter::aux
+
+#endif // BOOST_PARAMETER_CAST_060902_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/default.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/default.hpp
new file mode 100644 (file)
index 0000000..604da61
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef DEFAULT_050329_HPP
+# define DEFAULT_050329_HPP
+
+# include <boost/detail/workaround.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+// A wrapper for the default value passed by the user when resolving
+// the value of the parameter with the given Keyword
+template <class Keyword, class Value>
+struct default_
+{
+    default_(Value& x)
+      : value(x)
+    {}
+
+    Value& value;
+};
+
+//
+// lazy_default -- 
+//
+//    A wrapper for the default value computation function passed by
+//    the user when resolving the value of the parameter with the
+//    given keyword
+//
+# if BOOST_WORKAROUND(__EDG_VERSION__, <= 300)
+// These compilers need a little extra help with overload
+// resolution; we have empty_arg_list's operator[] accept a base
+// class to make that overload less preferable.
+template <class KW, class DefaultComputer>
+struct lazy_default_base
+{
+    lazy_default_base(DefaultComputer const& x)
+      : compute_default(x)
+    {}
+    DefaultComputer const& compute_default;
+};
+
+template <class KW, class DefaultComputer>
+struct lazy_default
+  : lazy_default_base<KW,DefaultComputer>
+  {
+      lazy_default(DefaultComputer const & x)
+        : lazy_default_base<KW,DefaultComputer>(x)
+      {}
+  };
+#  define BOOST_PARAMETER_lazy_default_fallback lazy_default_base
+# else 
+template <class KW, class DefaultComputer>
+struct lazy_default
+{
+    lazy_default(const DefaultComputer& x)
+      : compute_default(x)
+    {}
+    DefaultComputer const& compute_default;
+};
+#  define BOOST_PARAMETER_lazy_default_fallback lazy_default
+# endif 
+
+}}} // namespace boost::parameter::aux
+
+#endif // DEFAULT_050329_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/maybe.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/maybe.hpp
new file mode 100644 (file)
index 0000000..7728d7b
--- /dev/null
@@ -0,0 +1,98 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_MAYBE_060211_HPP
+# define BOOST_PARAMETER_MAYBE_060211_HPP
+
+# include <boost/mpl/if.hpp>
+# include <boost/mpl/identity.hpp>
+# include <boost/type_traits/is_reference.hpp>
+# include <boost/type_traits/add_reference.hpp>
+# include <boost/optional.hpp>
+# include <boost/python/detail/referent_storage.hpp>
+# include <boost/type_traits/remove_cv.hpp>
+# include <boost/type_traits/add_const.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+struct maybe_base {};
+
+template <class T>
+struct maybe : maybe_base
+{
+    typedef typename add_reference<
+# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+        T const
+# else 
+        typename add_const<T>::type
+# endif 
+    >::type reference;
+    
+    typedef typename remove_cv<
+        BOOST_DEDUCED_TYPENAME remove_reference<reference>::type
+    >::type non_cv_value;
+        
+    explicit maybe(T value)
+      : value(value)
+      , constructed(false)
+    {}
+
+    maybe()
+      : constructed(false)
+    {}
+
+    ~maybe()
+    {
+        if (constructed)
+            this->destroy();
+    }
+
+    reference construct(reference value) const
+    {
+        return value;
+    }
+
+    template <class U>
+    reference construct2(U const& value) const
+    {
+        new (m_storage.bytes) non_cv_value(value);
+        constructed = true;
+        return *(non_cv_value*)m_storage.bytes;
+    }
+
+    template <class U>
+    reference construct(U const& value) const
+    {
+        return this->construct2(value);
+    }
+
+    void destroy()
+    {
+        ((non_cv_value*)m_storage.bytes)->~non_cv_value();
+    }
+
+    typedef reference(maybe<T>::*safe_bool)() const;
+
+    operator safe_bool() const
+    {
+        return value ? &maybe<T>::get : 0 ;
+    }
+
+    reference get() const
+    {
+        return value.get();
+    }
+
+private:
+    boost::optional<T> value;
+    mutable bool constructed;
+    mutable typename boost::python::detail::referent_storage<
+        reference
+    >::type m_storage;
+};
+
+}}} // namespace boost::parameter::aux
+
+#endif // BOOST_PARAMETER_MAYBE_060211_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/overloads.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/overloads.hpp
new file mode 100644 (file)
index 0000000..dcc92d4
--- /dev/null
@@ -0,0 +1,88 @@
+// Copyright David Abrahams, Daniel Wallin 2003. 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)
+
+// This file generates overloads in this format:
+//
+//     template<class A0, class A1>
+//     typename mpl::apply_wrap1<
+//         aux::make_arg_list<
+//             PS0,A0
+//           , aux::make_arg_list<
+//                 PS1,A1
+//               , mpl::identity<aux::empty_arg_list>
+//             >
+//         >
+//      , unnamed_list
+//     >::type
+//     operator()(A0 const& a0, A1 const& a1) const
+//     {
+//         typedef typename mpl::apply_wrap1<
+//             aux::make_arg_list<
+//                 PS0,A0
+//               , aux::make_arg_list<
+//                     PS1,A1
+//                   , mpl::identity<aux::empty_arg_list>
+//                 >
+//             >
+//         >::type arg_tuple;
+//
+//         return arg_tuple(
+//             a0
+//           , a1
+//           , aux::void_()
+//             ...
+//         );
+//     }
+//
+
+#if !defined(BOOST_PP_IS_ITERATING)
+# error Boost.Parameters - do not include this file!
+#endif
+
+#define N BOOST_PP_ITERATION()
+
+#define BOOST_PARAMETER_open_list(z, n, text) \
+    aux::item< \
+        BOOST_PP_CAT(PS, n), BOOST_PP_CAT(A, n)
+
+#define BOOST_PARAMETER_close_list(z, n, text) > 
+
+#define BOOST_PARAMETER_arg_list(n) \
+    aux::make_arg_list< \
+        BOOST_PP_ENUM(N, BOOST_PARAMETER_open_list, _) \
+      , void_ \
+        BOOST_PP_REPEAT(N, BOOST_PARAMETER_close_list, _) \
+      , deduced_list \
+      , aux::tag_keyword_arg \
+    >
+
+#define BOOST_PARAMETER_arg_pack_init(z, n, limit) \
+    BOOST_PP_CAT(a, BOOST_PP_SUB(limit,n))
+
+template<BOOST_PP_ENUM_PARAMS(N, class A)>
+typename mpl::first<
+    typename BOOST_PARAMETER_arg_list(N)::type
+>::type
+operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, & a)) const
+{
+    typedef typename BOOST_PARAMETER_arg_list(N)::type result;
+
+    typedef typename mpl::first<result>::type result_type;
+    typedef typename mpl::second<result>::type error;
+    error();
+
+    return result_type(
+        BOOST_PP_ENUM(N, BOOST_PARAMETER_arg_pack_init, BOOST_PP_DEC(N))
+        BOOST_PP_ENUM_TRAILING_PARAMS(
+            BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, N)
+          , aux::void_reference() BOOST_PP_INTERCEPT
+        ));
+}
+
+#undef BOOST_PARAMETER_arg_list
+#undef BOOST_PARAMETER_open_list
+#undef BOOST_PARAMETER_close_list
+#undef N
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parameter_requirements.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parameter_requirements.hpp
new file mode 100644 (file)
index 0000000..ad7a129
--- /dev/null
@@ -0,0 +1,25 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef PARAMETER_REQUIREMENTS_050331_HPP
+#define PARAMETER_REQUIREMENTS_050331_HPP
+
+namespace boost { namespace parameter { namespace aux {
+
+// Used to pass static information about parameter requirements
+// through the satisfies() overload set (below).  The
+// matched function is never invoked, but its type indicates whether
+// a parameter matches at compile-time
+template <class Keyword, class Predicate, class HasDefault>
+struct parameter_requirements
+{
+    typedef Keyword keyword;
+    typedef Predicate predicate;
+    typedef HasDefault has_default;
+};
+
+}}} // namespace boost::parameter::aux
+
+#endif // PARAMETER_REQUIREMENTS_050331_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parenthesized_type.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/parenthesized_type.hpp
new file mode 100644 (file)
index 0000000..c6ddd77
--- /dev/null
@@ -0,0 +1,119 @@
+// Copyright David Abrahams 2006. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP
+# define BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP
+
+# include <boost/config.hpp>
+# include <boost/detail/workaround.hpp>
+
+namespace boost { namespace parameter { namespace aux { 
+
+// A macro that takes a parenthesized C++ type name (T) and transforms
+// it into an un-parenthesized type expression equivalent to T.
+#  define BOOST_PARAMETER_PARENTHESIZED_TYPE(x)                    \
+    boost::parameter::aux::unaryfunptr_arg_type< void(*)x >::type
+
+// A metafunction that transforms void(*)(T) -> T
+template <class UnaryFunctionPointer>
+struct unaryfunptr_arg_type;
+
+# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+template <class Arg>
+struct unaryfunptr_arg_type<void(*)(Arg)>
+{
+    typedef Arg type;
+};
+
+# else
+
+// Use the "native typeof" bugfeatures of older versions of MSVC to
+// accomplish what we'd normally do with partial specialization.  This
+// capability was discovered by Igor Chesnokov.
+
+#  if BOOST_WORKAROUND(BOOST_MSVC, != 1300)
+
+// This version applies to VC6.5 and VC7.1 (except that we can just
+// use partial specialization for the latter in this case).
+
+// This gets used as a base class.  
+template<typename Address>
+struct msvc_type_memory
+{
+    // A nullary metafunction that will yield the Value type "stored"
+    // at this Address.
+    struct storage;
+};
+
+template<typename Value, typename Address>
+struct msvc_store_type : msvc_type_memory<Address>
+{
+    // VC++ somehow lets us define the base's nested storage
+    // metafunction here, where we have the Value type we'd like to
+    // "store" in it.  Later we can come back to the base class and
+    // extract the "stored type."
+    typedef msvc_type_memory<Address> location;
+    struct location::storage 
+    {
+        typedef Value type;
+    };
+};
+
+#  else
+
+// This slightly more complicated version of the same thing is
+// required for msvc-7.0
+template<typename Address>
+struct msvc_type_memory
+{
+    template<bool>
+    struct storage_impl;
+
+    typedef storage_impl<true> storage;
+};
+
+template<typename Value, typename Address>
+struct msvc_store_type : msvc_type_memory<Address>
+{
+    // Rather than supplying a definition for the base class' nested
+    // class, we specialize the base class' nested template
+    template<>
+    struct storage_impl<true>  
+    {
+        typedef Value type;
+    };
+};
+
+#  endif
+
+// Function template argument deduction does many of the same things
+// as type matching during partial specialization, so we call a
+// function template to "store" T into the type memory addressed by
+// void(*)(T).
+template <class T>
+msvc_store_type<T,void(*)(T)>
+msvc_store_argument_type(void(*)(T));
+
+template <class FunctionPointer>
+struct unaryfunptr_arg_type
+{
+    // We don't want the function to be evaluated, just instantiated,
+    // so protect it inside of sizeof.
+    enum { dummy = sizeof(msvc_store_argument_type((FunctionPointer)0)) };
+
+    // Now pull the type out of the instantiated base class
+    typedef typename msvc_type_memory<FunctionPointer>::storage::type type;
+};
+
+# endif
+
+template <>
+struct unaryfunptr_arg_type<void(*)(void)>
+{
+    typedef void type;
+};
+    
+}}} // namespace boost::parameter::aux
+
+#endif // BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/flatten.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/flatten.hpp
new file mode 100644 (file)
index 0000000..5d7615e
--- /dev/null
@@ -0,0 +1,115 @@
+// Copyright Daniel Wallin 2005. 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)
+
+#ifndef BOOST_PARAMETER_FLATTEN_051217_HPP
+# define BOOST_PARAMETER_FLATTEN_051217_HPP
+
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/preprocessor/tuple/rem.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/seq/for_each.hpp>
+# include <boost/preprocessor/seq/for_each_i.hpp>
+# include <boost/preprocessor/identity.hpp>
+# include <boost/preprocessor/selection/max.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/repetition/enum_trailing.hpp>
+# include <boost/parameter/aux_/preprocessor/for_each.hpp>
+
+# define BOOST_PARAMETER_FLATTEN_SPLIT_required required,
+# define BOOST_PARAMETER_FLATTEN_SPLIT_optional optional,
+# define BOOST_PARAMETER_FLATTEN_SPLIT_deduced deduced,
+
+# define BOOST_PARAMETER_FLATTEN_SPLIT(sub) \
+    BOOST_PP_CAT(BOOST_PARAMETER_FLATTEN_SPLIT_, sub)
+
+# define BOOST_PARAMETER_FLATTEN_QUALIFIER(sub) \
+    BOOST_PP_SPLIT(0, BOOST_PARAMETER_FLATTEN_SPLIT(sub))
+
+# define BOOST_PARAMETER_FLATTEN_ARGS(sub) \
+    BOOST_PP_SPLIT(1, BOOST_PARAMETER_FLATTEN_SPLIT(sub))
+
+# define BOOST_PARAMETER_FLATTEN_ARITY_optional(arities) \
+    BOOST_PP_TUPLE_ELEM(3,0,arities)
+
+# define BOOST_PARAMETER_FLATTEN_ARITY_required(arities) \
+    BOOST_PP_TUPLE_ELEM(3,1,arities)
+
+# define BOOST_PARAMETER_FLATTEN_SPEC0_DUMMY_ELEM(z, n, data) ~
+# define BOOST_PARAMETER_FLATTEN_SPEC0(r, n, elem, data) \
+    (( \
+        BOOST_PP_TUPLE_ELEM(3,2,data) \
+      , BOOST_PP_TUPLE_REM(BOOST_PP_TUPLE_ELEM(3,0,data)) elem \
+        BOOST_PP_ENUM_TRAILING( \
+            BOOST_PP_SUB( \
+                BOOST_PP_TUPLE_ELEM(3,1,data) \
+              , BOOST_PP_TUPLE_ELEM(3,0,data) \
+            ) \
+          , BOOST_PARAMETER_FLATTEN_SPEC0_DUMMY_ELEM \
+          , ~ \
+        ) \
+    ))
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_AUX(r, arity, max_arity, spec, transform) \
+    BOOST_PARAMETER_FOR_EACH_R( \
+        r \
+      , arity \
+      , BOOST_PARAMETER_FLATTEN_ARGS(spec) \
+      , (arity, max_arity, transform(BOOST_PARAMETER_FLATTEN_QUALIFIER(spec))) \
+      , BOOST_PARAMETER_FLATTEN_SPEC0 \
+    )
+
+# define BOOST_PARAMETER_FLATTEN_IDENTITY(x) x
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_optional(r, arities, spec) \
+    BOOST_PARAMETER_FLATTEN_SPEC_AUX( \
+        r \
+      , BOOST_PP_CAT( \
+            BOOST_PARAMETER_FLATTEN_ARITY_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \
+        )(arities) \
+      , BOOST_PP_TUPLE_ELEM(3,2,arities) \
+      , spec \
+      , BOOST_PARAMETER_FLATTEN_IDENTITY \
+    )
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_required(r, arities, spec) \
+    BOOST_PARAMETER_FLATTEN_SPEC_optional(r, arities, spec)
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_AS_DEDUCED(x) BOOST_PP_CAT(deduced_,x)
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_deduced_M(r, arities, n, spec) \
+    BOOST_PARAMETER_FLATTEN_SPEC_AUX( \
+        r \
+      , BOOST_PP_CAT( \
+            BOOST_PARAMETER_FLATTEN_ARITY_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \
+        )(arities) \
+      , BOOST_PP_TUPLE_ELEM(3,2,arities) \
+      , spec \
+      , BOOST_PARAMETER_FLATTEN_SPEC_AS_DEDUCED \
+    )
+
+# define BOOST_PARAMETER_FLATTEN_SPEC_deduced(r, arities, spec) \
+    BOOST_PP_SEQ_FOR_EACH_I_R( \
+        r \
+      , BOOST_PARAMETER_FLATTEN_SPEC_deduced_M \
+      , arities \
+      , BOOST_PARAMETER_FLATTEN_ARGS(spec) \
+    )
+
+# define BOOST_PARAMETER_FLATTEN_SPEC(r, arities, spec) \
+    BOOST_PP_CAT( \
+        BOOST_PARAMETER_FLATTEN_SPEC_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \
+    )(r, arities, spec)
+
+# define BOOST_PARAMETER_FLATTEN(optional_arity, required_arity, wanted_arity, specs) \
+    BOOST_PP_SEQ_FOR_EACH( \
+        BOOST_PARAMETER_FLATTEN_SPEC \
+      , ( \
+            optional_arity, required_arity \
+          , wanted_arity \
+        ) \
+      , specs \
+    )
+
+#endif // BOOST_PARAMETER_FLATTEN_051217_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/for_each.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/preprocessor/for_each.hpp
new file mode 100644 (file)
index 0000000..0eb1f70
--- /dev/null
@@ -0,0 +1,103 @@
+// Copyright Daniel Wallin 2005. 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)
+
+#ifndef BOOST_PARAMETER_FOR_EACH_051217_HPP
+# define BOOST_PARAMETER_FOR_EACH_051217_HPP
+
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/detail/split.hpp>
+# include <boost/preprocessor/logical/not.hpp>
+# include <boost/preprocessor/facilities/is_empty.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/repeat.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/for.hpp>
+# include <boost/preprocessor/repetition/deduce_r.hpp>
+
+# define BOOST_PARAMETER_FOR_EACH_head_aux2(x,y) (x,y), ~
+# define BOOST_PARAMETER_FOR_EACH_head_aux3(x,y,z) (x,y,z), ~
+# define BOOST_PARAMETER_FOR_EACH_head_aux4(x,y,z,u) (x,y,z,u), ~
+# define BOOST_PARAMETER_FOR_EACH_head(n,x) \
+    BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_head_aux,n) x)
+
+# define BOOST_PARAMETER_FOR_EACH_pred_aux_BOOST_PARAMETER_FOR_EACH_END_SENTINEL
+# define BOOST_PARAMETER_FOR_EACH_pred_aux_check(x) \
+    BOOST_PP_NOT(BOOST_PP_IS_EMPTY( \
+        BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_pred_aux_, x) \
+    )), ~
+
+# define BOOST_PARAMETER_FOR_EACH_pred_aux2(x,y) \
+    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)
+# define BOOST_PARAMETER_FOR_EACH_pred_aux3(x,y,z) \
+    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)
+# define BOOST_PARAMETER_FOR_EACH_pred_aux4(x,y,z,u) \
+    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)
+
+# define BOOST_PARAMETER_FOR_EACH_pred_aux0(n,x) \
+    BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_pred_aux,n) x
+
+# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
+#  define BOOST_PARAMETER_FOR_EACH_pred_SPLIT_FIRST(x) \
+    BOOST_PP_SPLIT(0, x)
+
+#  define BOOST_PARAMETER_FOR_EACH_pred(r, state) \
+    BOOST_PARAMETER_FOR_EACH_pred_SPLIT_FIRST( \
+        BOOST_PARAMETER_FOR_EACH_pred_aux0( \
+            BOOST_PP_TUPLE_ELEM(5,3,state) \
+          , BOOST_PP_TUPLE_ELEM(5,0,state) \
+        ) \
+    )
+# else
+#  define BOOST_PARAMETER_FOR_EACH_pred(r, state) \
+    BOOST_PP_SPLIT( \
+        0 \
+      , BOOST_PARAMETER_FOR_EACH_pred_aux0( \
+            BOOST_PP_TUPLE_ELEM(5,3,state) \
+          , BOOST_PP_TUPLE_ELEM(5,0,state) \
+        ) \
+    )
+# endif
+
+# define BOOST_PARAMETER_FOR_EACH_op(r, state) \
+    ( \
+        BOOST_PP_TUPLE_EAT(BOOST_PP_TUPLE_ELEM(5,3,state)) \
+          BOOST_PP_TUPLE_ELEM(5,0,state) \
+      , BOOST_PP_TUPLE_ELEM(5,1,state) \
+      , BOOST_PP_TUPLE_ELEM(5,2,state) \
+      , BOOST_PP_TUPLE_ELEM(5,3,state) \
+      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(5,4,state)) \
+    )
+
+# define BOOST_PARAMETER_FOR_EACH_macro(r, state) \
+    BOOST_PP_TUPLE_ELEM(5,2,state)( \
+        r \
+      , BOOST_PP_TUPLE_ELEM(5,4,state) \
+      , BOOST_PARAMETER_FOR_EACH_head( \
+            BOOST_PP_TUPLE_ELEM(5,3,state) \
+          , BOOST_PP_TUPLE_ELEM(5,0,state) \
+        ) \
+      , BOOST_PP_TUPLE_ELEM(5,1,state) \
+    )
+
+# define BOOST_PARAMETER_FOR_EACH_build_end_sentinel(z,n,text) \
+    BOOST_PP_COMMA_IF(n) BOOST_PARAMETER_FOR_EACH_END_SENTINEL
+# define BOOST_PARAMETER_FOR_EACH_build_end_sentinel_tuple(arity) \
+    ( \
+        BOOST_PP_REPEAT(arity, BOOST_PARAMETER_FOR_EACH_build_end_sentinel, _) \
+    )
+
+# define BOOST_PARAMETER_FOR_EACH_R(r, arity, list, data, macro) \
+    BOOST_PP_CAT(BOOST_PP_FOR_, r)( \
+        (list BOOST_PARAMETER_FOR_EACH_build_end_sentinel_tuple(arity), data, macro, arity, 0) \
+      , BOOST_PARAMETER_FOR_EACH_pred \
+      , BOOST_PARAMETER_FOR_EACH_op \
+      , BOOST_PARAMETER_FOR_EACH_macro \
+    )
+
+# define BOOST_PARAMETER_FOR_EACH(arity, list, data, macro) \
+    BOOST_PARAMETER_FOR_EACH_R(BOOST_PP_DEDUCE_R(), arity, list, data, macro)
+
+#endif // BOOST_PARAMETER_FOR_EACH_051217_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker.hpp
new file mode 100644 (file)
index 0000000..0e61d40
--- /dev/null
@@ -0,0 +1,132 @@
+// Copyright Daniel Wallin 2005. 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)
+
+#ifndef BOOST_PARAMETER_INVOKER_051210_HPP
+# define BOOST_PARAMETER_INVOKER_051210_HPP
+
+# include <boost/mpl/begin.hpp>
+# include <boost/mpl/next.hpp>
+# include <boost/mpl/deref.hpp>
+# include <boost/mpl/size.hpp>
+# include <boost/parameter/keyword.hpp>
+# include <boost/preprocessor/iteration/iterate.hpp>
+
+namespace boost { namespace parameter { namespace python { namespace aux {
+
+template <long Arity, class M, class R, class Args>
+struct invoker;
+
+template <class M, class R>
+struct make_invoker
+{
+    template <class Args>
+    struct apply
+    {
+        typedef invoker<
+            mpl::size<Args>::value, M, R, Args
+        > type;
+    };
+};
+
+template <long Arity, class M, class R, class T, class Args>
+struct member_invoker;
+
+template <class M, class R, class T>
+struct make_member_invoker
+{
+    template <class Args>
+    struct apply
+    {
+        typedef member_invoker<
+            mpl::size<Args>::value, M, R, T, Args
+        > type;
+    };
+};
+
+template <long Arity, class T, class R, class Args>
+struct call_invoker;
+
+template <class T, class R>
+struct make_call_invoker
+{
+    template <class Args>
+    struct apply
+    {
+        typedef call_invoker<
+            mpl::size<Args>::value, T, R, Args
+        > type;
+    };
+};
+
+template <long Arity, class T, class Args>
+struct init_invoker;
+
+template <class T>
+struct make_init_invoker
+{
+    template <class Args>
+    struct apply
+    {
+        typedef init_invoker<
+            mpl::size<Args>::value, T, Args
+        > type;
+    };
+};
+
+template <class M, class R, class Args>
+struct invoker<0, M, R, Args>
+{
+    static R execute()
+    {
+        return M()(boost::type<R>());
+    }
+};
+
+template <class M, class R, class T, class Args>
+struct member_invoker<0, M, R, T, Args>
+{
+    static R execute(T& self)
+    {
+        return M()(boost::type<R>(), self);
+    }
+};
+
+template <class T, class R, class Args>
+struct call_invoker<0, T, R, Args>
+{
+    static R execute(T& self)
+    {
+        return self();
+    }
+};
+
+template <class T, class Args>
+struct init_invoker<0, T, Args>
+{
+    static T* execute(T& self)
+    {
+        return new T;
+    }
+};
+
+# define BOOST_PP_ITERATION_PARAMS_1 (4, \
+    (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 1))
+# include BOOST_PP_ITERATE()
+
+# define BOOST_PP_ITERATION_PARAMS_1 (4, \
+    (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 2))
+# include BOOST_PP_ITERATE()
+
+# define BOOST_PP_ITERATION_PARAMS_1 (4, \
+    (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 3))
+# include BOOST_PP_ITERATE()
+
+# define BOOST_PP_ITERATION_PARAMS_1 (4, \
+    (1, BOOST_PARAMETER_MAX_ARITY, <boost/parameter/aux_/python/invoker_iterate.hpp>, 4))
+# include BOOST_PP_ITERATE()
+
+}}}} // namespace boost::parameter::python::aux
+
+#endif // BOOST_PARAMETER_INVOKER_051210_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker_iterate.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/python/invoker_iterate.hpp
new file mode 100644 (file)
index 0000000..c18f6d0
--- /dev/null
@@ -0,0 +1,93 @@
+// Copyright Daniel Wallin 2005. 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)
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/dec.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#define N BOOST_PP_ITERATION()
+
+#define BOOST_PARAMETER_PY_ARG_TYPES(z, n, _) \
+    typedef typename mpl::next< \
+        BOOST_PP_CAT(iter,BOOST_PP_DEC(n)) \
+    >::type BOOST_PP_CAT(iter,n); \
+    \
+    typedef typename mpl::deref<BOOST_PP_CAT(iter,n)>::type BOOST_PP_CAT(spec,n); \
+    typedef typename mpl::if_< \
+        mpl::and_< \
+            mpl::not_<typename BOOST_PP_CAT(spec,n)::required> \
+          , typename BOOST_PP_CAT(spec,n)::optimized_default \
+        > \
+      , parameter::aux::maybe<typename BOOST_PP_CAT(spec,n)::type> \
+      , typename BOOST_PP_CAT(spec,n)::type \
+    >::type BOOST_PP_CAT(arg,n); \
+    typedef typename BOOST_PP_CAT(spec,n)::keyword BOOST_PP_CAT(kw,n);
+
+#if BOOST_PP_ITERATION_FLAGS() == 1
+template <class M, class R, class Args>
+struct invoker<N, M, R, Args>
+#elif BOOST_PP_ITERATION_FLAGS() == 2
+template <class T, class R, class Args>
+struct call_invoker<N, T, R, Args>
+#elif BOOST_PP_ITERATION_FLAGS() == 3
+template <class T, class Args>
+struct init_invoker<N, T, Args>
+#elif BOOST_PP_ITERATION_FLAGS() == 4
+template <class M, class R, class T, class Args>
+struct member_invoker<N, M, R, T, Args>
+#endif
+{
+    typedef typename mpl::begin<Args>::type iter0;
+    typedef typename mpl::deref<iter0>::type spec0;
+    typedef typename mpl::if_<
+        mpl::and_<
+            mpl::not_<typename spec0::required>
+          , typename spec0::optimized_default
+        >
+      , parameter::aux::maybe<typename spec0::type>
+      , typename spec0::type
+    >::type arg0;
+    typedef typename spec0::keyword kw0;
+
+    BOOST_PP_REPEAT_FROM_TO(1, N, BOOST_PARAMETER_PY_ARG_TYPES, ~)
+
+    static
+#if BOOST_PP_ITERATION_FLAGS() == 3
+    T*
+#else
+    R
+#endif 
+    execute(
+#if BOOST_PP_ITERATION_FLAGS() == 2 || BOOST_PP_ITERATION_FLAGS() == 4
+        T& self
+      ,
+#endif
+        BOOST_PP_ENUM_BINARY_PARAMS(N, arg, a)
+    )
+    {
+        return
+#if BOOST_PP_ITERATION_FLAGS() == 1 || BOOST_PP_ITERATION_FLAGS() == 4
+         M()(
+              boost::type<R>()
+# if BOOST_PP_ITERATION_FLAGS() == 4
+            , self
+# endif
+            , BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword<kw, >::get() = a)
+         );
+#elif BOOST_PP_ITERATION_FLAGS() == 2
+         self(
+            BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword<kw, >::get() = a)
+         );
+#elif BOOST_PP_ITERATION_FLAGS() == 3
+         new T(
+             BOOST_PP_ENUM_BINARY_PARAMS(N, parameter::keyword<kw, >::get() = a)
+         );
+#endif
+    }
+};
+
+#undef BOOST_PARAMETER_PY_ARG_TYPES
+#undef N
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/result_of0.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/result_of0.hpp
new file mode 100644 (file)
index 0000000..e009614
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright David Abrahams 2005. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP
+# define BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP
+
+# include <boost/utility/result_of.hpp>
+
+// A metafunction returning the result of invoking a nullary function
+// object of the given type.
+
+#ifndef BOOST_NO_RESULT_OF
+
+# include <boost/utility/result_of.hpp>
+namespace boost { namespace parameter { namespace aux { 
+template <class F>
+struct result_of0 : result_of<F()>
+{};
+
+}}} // namespace boost::parameter::aux_
+
+#else
+
+namespace boost { namespace parameter { namespace aux { 
+template <class F>
+struct result_of0
+{
+    typedef typename F::result_type type;
+};
+
+}}} // namespace boost::parameter::aux_
+
+#endif 
+
+
+#endif // BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/set.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/set.hpp
new file mode 100644 (file)
index 0000000..1c4ccf5
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_SET_060912_HPP
+# define BOOST_PARAMETER_SET_060912_HPP
+
+# include <boost/detail/workaround.hpp>
+
+# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) \
+  && !BOOST_WORKAROUND(__GNUC__, < 3)
+#  include <boost/mpl/insert.hpp>
+#  include <boost/mpl/set/set0.hpp>
+#  include <boost/mpl/has_key.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+typedef mpl::set0<> set0;
+
+template <class Set, class K>
+struct insert_
+{
+    typedef typename mpl::insert<Set, K>::type type;
+};
+
+template <class Set, class K>
+struct has_key_
+{
+    typedef typename mpl::has_key<Set, K>::type type;
+};
+
+}}} // namespace boost::parameter::aux
+
+# else
+
+#  include <boost/mpl/list.hpp>
+#  include <boost/mpl/end.hpp>
+#  include <boost/mpl/find.hpp>
+#  include <boost/mpl/not.hpp>
+#  include <boost/mpl/push_front.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+typedef mpl::list0<> set0;
+
+template <class Set, class K>
+struct insert_
+{
+    typedef typename mpl::push_front<Set, K>::type type;
+};
+
+template <class Set, class K>
+struct has_key_
+{
+    typedef typename mpl::find<Set, K>::type iter;
+    typedef mpl::not_<
+        is_same<iter, typename mpl::end<Set>::type> 
+    > type;
+};
+
+}}} // namespace boost::parameter::aux
+
+# endif
+
+
+#endif // BOOST_PARAMETER_SET_060912_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tag.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tag.hpp
new file mode 100644 (file)
index 0000000..475efb9
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright David Abrahams 2005. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP
+# define BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP
+
+# include <boost/parameter/aux_/unwrap_cv_reference.hpp>
+# include <boost/parameter/aux_/tagged_argument.hpp>
+
+namespace boost { namespace parameter { namespace aux { 
+
+template <class Keyword, class ActualArg
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+        , class = typename is_cv_reference_wrapper<ActualArg>::type
+#endif 
+          >
+struct tag
+{
+    typedef tagged_argument<
+        Keyword
+      , typename unwrap_cv_reference<ActualArg>::type
+    > type;
+};
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template <class Keyword, class ActualArg>
+struct tag<Keyword,ActualArg,mpl::false_>
+{
+    typedef tagged_argument<
+        Keyword
+      , ActualArg
+    > type;
+};
+#endif 
+
+}}} // namespace boost::parameter::aux_
+
+#endif // BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tagged_argument.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/tagged_argument.hpp
new file mode 100644 (file)
index 0000000..6248be2
--- /dev/null
@@ -0,0 +1,188 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
+# define BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
+
+# include <boost/parameter/aux_/void.hpp>
+# include <boost/parameter/aux_/arg_list.hpp>
+# include <boost/parameter/aux_/result_of0.hpp>
+# include <boost/mpl/if.hpp>
+# include <boost/mpl/apply_wrap.hpp>
+# include <boost/mpl/and.hpp>
+# include <boost/mpl/not.hpp>
+# include <boost/type_traits/is_same.hpp>
+# include <boost/type_traits/is_convertible.hpp>
+# include <boost/type_traits/is_reference.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+struct empty_arg_list;
+struct arg_list_tag;
+
+struct tagged_argument_base {};
+
+// Holds a reference to an argument of type Arg associated with
+// keyword Keyword
+    
+template <class Keyword, class Arg>
+struct tagged_argument : tagged_argument_base
+{
+    typedef Keyword key_type;
+    typedef Arg value_type;
+    typedef Arg& reference;
+
+    tagged_argument(reference x) : value(x) {}
+
+    // A metafunction class that, given a keyword and a default
+    // type, returns the appropriate result type for a keyword
+    // lookup given that default
+    struct binding
+    {
+        template <class KW, class Default, class Reference>
+        struct apply
+        {
+          typedef typename mpl::eval_if<
+                boost::is_same<KW, key_type>
+              , mpl::if_<Reference, reference, value_type>
+              , mpl::identity<Default>
+          >::type type;
+        };
+    };
+
+    // Comma operator to compose argument list without using parameters<>.
+    // Useful for argument lists with undetermined length.
+    template <class Keyword2, class Arg2>
+    arg_list<
+        tagged_argument<Keyword, Arg>
+      , arg_list<tagged_argument<Keyword2, Arg2> > 
+    >
+    operator,(tagged_argument<Keyword2, Arg2> x) const
+    {
+        return arg_list<
+            tagged_argument<Keyword, Arg>
+          , arg_list<tagged_argument<Keyword2, Arg2> > 
+        >(
+            *this
+          , arg_list<tagged_argument<Keyword2, Arg2> >(x, empty_arg_list())
+        );
+    }
+
+    reference operator[](keyword<Keyword> const&) const
+    {
+        return value;
+    }
+
+# if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    template <class KW, class Default>
+    Default& get_with_default(default_<KW,Default> const& x, int) const
+    {
+        return x.value;
+    }
+
+    template <class Default>
+    reference get_with_default(default_<key_type,Default> const&, long) const
+    {
+        return value;
+    }
+
+    template <class KW, class Default>
+    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type
+    operator[](default_<KW,Default> const& x) const
+    {
+        return get_with_default(x, 0L);
+    }
+
+    template <class KW, class F>
+    typename result_of0<F>::type 
+    get_with_lazy_default(lazy_default<KW,F> const& x, int) const
+    {
+        return x.compute_default();
+    }
+
+    template <class F>
+    reference get_with_lazy_default(lazy_default<key_type,F> const&, long) const
+    {
+        return value;
+    }
+
+    template <class KW, class F>
+    typename mpl::apply_wrap3<
+        binding,KW
+      , typename result_of0<F>::type
+      , mpl::true_
+    >::type
+    operator[](lazy_default<KW,F> const& x) const
+    {
+        return get_with_lazy_default(x, 0L);
+    }
+# else
+    template <class Default>
+    reference operator[](default_<key_type,Default> const& x) const
+    {
+        return value;
+    }
+
+    template <class F>
+    reference operator[](lazy_default<key_type,F> const& x) const
+    {
+        return value;
+    }
+
+    template <class KW, class Default>
+    Default& operator[](default_<KW,Default> const& x) const
+    {
+        return x.value;
+    }
+
+    template <class KW, class F>
+    typename result_of0<F>::type operator[](lazy_default<KW,F> const& x) const
+    {
+        return x.compute_default();
+    }
+
+    template <class ParameterRequirements>
+    static typename ParameterRequirements::has_default
+    satisfies(ParameterRequirements*);
+
+    template <class HasDefault, class Predicate>
+    static typename mpl::apply1<Predicate, value_type>::type
+    satisfies(
+        parameter_requirements<key_type,Predicate,HasDefault>*
+    );
+# endif
+
+    reference value;
+# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
+    // warning suppression
+ private:
+    void operator=(tagged_argument const&);
+ public:    
+# endif
+    // MPL sequence support
+    typedef tagged_argument type;            // Convenience for users
+    typedef empty_arg_list tail_type;        // For the benefit of iterators
+    typedef arg_list_tag tag; // For dispatching to sequence intrinsics
+};
+
+// Defines a metafunction, is_tagged_argument, that identifies
+// tagged_argument specializations and their derived classes.
+template <class T>
+struct is_tagged_argument_aux
+  : is_convertible<T*,tagged_argument_base const*>
+{};
+
+template <class T>
+struct is_tagged_argument
+  : mpl::and_<
+        mpl::not_<is_reference<T> >
+      , is_tagged_argument_aux<T>
+    >
+{};
+
+}}} // namespace boost::parameter::aux
+
+#endif // BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/template_keyword.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/template_keyword.hpp
new file mode 100644 (file)
index 0000000..5a02f00
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP
+# define BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP
+
+# include <boost/mpl/and.hpp>
+# include <boost/mpl/not.hpp>
+# include <boost/type_traits/is_convertible.hpp>
+# include <boost/type_traits/is_reference.hpp>
+
+namespace boost { namespace parameter { 
+
+namespace aux 
+{
+
+  struct template_keyword_tag {}; 
+
+  template <class T, class U>
+  struct is_pointer_convertible
+    : is_convertible<T*, U*>
+  {};
+
+  template <class T>
+  struct is_template_keyword
+    : mpl::and_<
+          mpl::not_<is_reference<T> >
+        , is_pointer_convertible<T, template_keyword_tag>
+      >
+  {};
+
+} // namespace aux
+
+template <class Tag, class T>
+struct template_keyword
+  : aux::template_keyword_tag
+{
+    typedef Tag key_type;
+    typedef T value_type;
+    typedef value_type reference;
+};
+
+}} // namespace boost::parameter
+
+#endif // BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/unwrap_cv_reference.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/unwrap_cv_reference.hpp
new file mode 100644 (file)
index 0000000..e7aa0c1
--- /dev/null
@@ -0,0 +1,97 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef UNWRAP_CV_REFERENCE_050328_HPP
+#define UNWRAP_CV_REFERENCE_050328_HPP
+
+#include <boost/parameter/aux_/yesno.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+namespace boost { template<class T> class reference_wrapper; }
+
+namespace boost { namespace parameter { namespace aux {
+
+//
+// reference_wrapper support -- because of the forwarding problem,
+// when passing arguments positionally by non-const reference, we
+// ask users of named parameter interfaces to use ref(x) to wrap
+// them.
+//
+
+// is_cv_reference_wrapper returns mpl::true_ if T is of type
+// reference_wrapper<U> cv
+template <class U>
+yes_tag is_cv_reference_wrapper_check(reference_wrapper<U> const volatile*);
+no_tag is_cv_reference_wrapper_check(...);
+
+template <class T>
+struct is_cv_reference_wrapper
+{
+    BOOST_STATIC_CONSTANT(
+        bool, value = (
+            sizeof(is_cv_reference_wrapper_check((T*)0)) == sizeof(yes_tag)
+        )
+    );
+
+    typedef mpl::bool_<
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+        is_cv_reference_wrapper::
+#endif 
+    value> type;
+};
+
+#if BOOST_WORKAROUND(MSVC, == 1200)
+template <>
+struct is_cv_reference_wrapper<int>
+  : mpl::false_ {};
+#endif
+
+// Needed for unwrap_cv_reference below. T might be const, so
+// eval_if might fail because of deriving from T const on EDG.
+template <class T>
+struct get_type
+{
+    typedef typename T::type type;
+};
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template <class T, class is_reference_wrapper = typename is_cv_reference_wrapper<T>::type>
+struct unwrap_cv_reference
+{
+    typedef T type;
+};
+
+template <class T>
+struct unwrap_cv_reference<T const, mpl::false_>
+{
+    typedef T const type;
+};
+
+template <class T>
+struct unwrap_cv_reference<T, mpl::true_>
+  : T
+{};
+
+#else 
+// Produces the unwrapped type to hold a reference to in named<>
+// Can't use boost::unwrap_reference<> here because it
+// doesn't handle the case where T = reference_wrapper<U> cv
+template <class T>
+struct unwrap_cv_reference
+{
+    typedef typename mpl::eval_if<
+        is_cv_reference_wrapper<T>
+      , get_type<T>
+      , mpl::identity<T>
+    >::type type;
+};
+#endif
+
+}}} // namespace boost::parameter::aux
+
+#endif // UNWRAP_CV_REFERENCE_050328_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/void.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/void.hpp
new file mode 100644 (file)
index 0000000..7061a7d
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef BOOST_PARAMETER_VOID_050329_HPP
+#define BOOST_PARAMETER_VOID_050329_HPP
+
+namespace boost { namespace parameter { 
+
+// A placemarker for "no argument passed."
+// MAINTAINER NOTE: Do not make this into a metafunction
+struct void_ {}; 
+
+namespace aux 
+{
+
+  inline void_& void_reference()
+  {
+      static void_ instance;
+      return instance;
+  }
+
+} // namespace aux
+
+}} // namespace boost::parameter
+
+#endif // BOOST_PARAMETER_VOID_050329_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/yesno.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/aux_/yesno.hpp
new file mode 100644 (file)
index 0000000..13fa545
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef YESNO_050328_HPP
+#define YESNO_050328_HPP
+
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+// types used with the "sizeof trick" to capture the results of
+// overload resolution at compile-time.
+typedef char yes_tag;
+typedef char (&no_tag)[2];
+
+// mpl::true_ and mpl::false_ are not distinguishable by sizeof(),
+// so we pass them through these functions to get a type that is.
+yes_tag to_yesno(mpl::true_);
+no_tag to_yesno(mpl::false_);
+
+}}} // namespace boost::parameter::aux
+
+#endif // YESNO_050328_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/binding.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/binding.hpp
new file mode 100644 (file)
index 0000000..632f0fd
--- /dev/null
@@ -0,0 +1,106 @@
+// Copyright David Abrahams 2005. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_PARAMETER_BINDING_DWA200558_HPP
+# define BOOST_PARAMETER_BINDING_DWA200558_HPP
+
+# include <boost/mpl/apply.hpp>
+# include <boost/mpl/assert.hpp>
+# include <boost/mpl/and.hpp>
+# include <boost/parameter/aux_/result_of0.hpp>
+# include <boost/parameter/aux_/void.hpp>
+# include <boost/type_traits/is_same.hpp>
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  include <boost/mpl/eval_if.hpp>
+# endif
+
+namespace boost { namespace parameter { 
+
+// A metafunction that, given an argument pack, returns the type of
+// the parameter identified by the given keyword.  If no such
+// parameter has been specified, returns Default
+
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template <class Parameters, class Keyword, class Default>
+struct binding0
+{
+    typedef typename mpl::apply_wrap3<
+        typename Parameters::binding,Keyword,Default,mpl::true_
+    >::type type;
+
+    BOOST_MPL_ASSERT_NOT((
+        mpl::and_<
+            is_same<Default, void_>
+          , is_same<type, void_>
+        >
+    ));
+};
+# endif
+
+template <class Parameters, class Keyword, class Default = void_>
+# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+struct binding
+# else
+struct binding_eti
+# endif
+{
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    typedef typename mpl::eval_if<
+        mpl::is_placeholder<Parameters>
+      , mpl::identity<int>
+      , binding0<Parameters,Keyword,Default>
+    >::type type;
+# else
+    typedef typename mpl::apply_wrap3<
+        typename Parameters::binding,Keyword,Default,mpl::true_
+    >::type type;
+
+    BOOST_MPL_ASSERT_NOT((
+        mpl::and_<
+            is_same<Default, void_>
+          , is_same<type, void_>
+        >
+    ));
+# endif
+
+# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,binding,(Parameters,Keyword,Default))
+# endif
+};
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+template <class Parameters, class Keyword, class Default = void_>
+struct binding
+{
+    typedef typename mpl::eval_if<
+        is_same<Parameters, int>
+      , mpl::identity<int>
+      , binding_eti<Parameters, Keyword, Default>
+    >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,binding,(Parameters,Keyword,Default))
+};
+# endif
+
+// A metafunction that, given an argument pack, returns the type of
+// the parameter identified by the given keyword.  If no such
+// parameter has been specified, returns the type returned by invoking
+// DefaultFn
+template <class Parameters, class Keyword, class DefaultFn>
+struct lazy_binding
+{
+  typedef typename mpl::apply_wrap3<
+      typename Parameters::binding
+    , Keyword
+    , typename aux::result_of0<DefaultFn>::type
+    , mpl::true_
+  >::type type;
+};
+
+
+}} // namespace boost::parameter
+
+#endif // BOOST_PARAMETER_BINDING_DWA200558_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/config.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/config.hpp
new file mode 100644 (file)
index 0000000..e4fcc29
--- /dev/null
@@ -0,0 +1,14 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef BOOST_PARAMETER_CONFIG_050403_HPP
+#define BOOST_PARAMETER_CONFIG_050403_HPP
+
+#ifndef BOOST_PARAMETER_MAX_ARITY
+# define BOOST_PARAMETER_MAX_ARITY 5
+#endif
+
+#endif // BOOST_PARAMETER_CONFIG_050403_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/keyword.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/keyword.hpp
new file mode 100644 (file)
index 0000000..cfb4bfd
--- /dev/null
@@ -0,0 +1,152 @@
+// Copyright Daniel Wallin, David Abrahams 2005. 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)
+
+#ifndef KEYWORD_050328_HPP
+#define KEYWORD_050328_HPP
+
+#include <boost/parameter/aux_/unwrap_cv_reference.hpp>
+#include <boost/parameter/aux_/tag.hpp>
+#include <boost/parameter/aux_/default.hpp>
+
+namespace boost { namespace parameter {
+
+// Instances of unique specializations of keyword<...> serve to
+// associate arguments with parameter names.  For example:
+//
+//    struct rate_;           // parameter names
+//    struct skew_;
+//    namespace
+//    {
+//      keyword<rate_> rate;  // keywords
+//      keyword<skew_> skew;
+//    }
+//
+//    ...
+//
+//    f(rate = 1, skew = 2.4);
+//
+template <class Tag>
+struct keyword
+{
+    template <class T>
+    typename aux::tag<Tag, T>::type const
+    operator=(T& x) const
+    {
+        typedef typename aux::tag<Tag, T>::type result;
+        return result(x);
+    }
+
+    template <class Default>
+    aux::default_<Tag, Default>
+    operator|(Default& default_) const
+    {
+        return aux::default_<Tag, Default>(default_);
+    }
+
+    template <class Default>
+    aux::lazy_default<Tag, Default>
+    operator||(Default& default_) const
+    {
+        return aux::lazy_default<Tag, Default>(default_);
+    }
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)  // avoid partial ordering bugs
+    template <class T>
+    typename aux::tag<Tag, T const>::type const
+    operator=(T const& x) const
+    {
+        typedef typename aux::tag<Tag, T const>::type result;
+        return result(x);
+    }
+#endif 
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)  // avoid partial ordering bugs
+    template <class Default>
+    aux::default_<Tag, const Default>
+    operator|(const Default& default_) const
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+        volatile
+#endif 
+    {
+        return aux::default_<Tag, const Default>(default_);
+    }
+
+    template <class Default>
+    aux::lazy_default<Tag, Default>
+    operator||(Default const& default_) const
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+        volatile
+#endif 
+    {
+        return aux::lazy_default<Tag, Default>(default_);
+    }
+#endif
+
+ public: // Insurance against ODR violations
+    
+    // People will need to define these keywords in header files.  To
+    // prevent ODR violations, it's important that the keyword used in
+    // every instantiation of a function template is the same object.
+    // We provide a reference to a common instance of each keyword
+    // object and prevent construction by users.
+    static keyword<Tag> const instance;
+
+    // This interface is deprecated
+    static keyword<Tag>& get()
+    {
+        return const_cast<keyword<Tag>&>(instance);
+    }
+};
+
+template <class Tag>
+keyword<Tag> const keyword<Tag>::instance = {};
+
+// Reduces boilerplate required to declare and initialize keywords
+// without violating ODR.  Declares a keyword tag type with the given
+// name in namespace tag_namespace, and declares and initializes a
+// reference in an anonymous namespace to a singleton instance of that
+// type.
+
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+
+# define BOOST_PARAMETER_KEYWORD(tag_namespace,name)                    \
+    namespace tag_namespace                                             \
+    {                                                                   \
+      struct name                                                       \
+      {                                                                 \
+          static char const* keyword_name()                             \
+          {                                                             \
+              return #name;                                             \
+          }                                                             \
+      };                                                                \
+    }                                                                   \
+    static ::boost::parameter::keyword<tag_namespace::name> const& name \
+       = ::boost::parameter::keyword<tag_namespace::name>::instance;
+
+#else
+
+#define BOOST_PARAMETER_KEYWORD(tag_namespace,name)                 \
+    namespace tag_namespace                                         \
+    {                                                               \
+      struct name                                                   \
+      {                                                             \
+          static char const* keyword_name()                         \
+          {                                                         \
+              return #name;                                         \
+          }                                                         \
+      };                                                            \
+    }                                                               \
+    namespace                                                       \
+    {                                                               \
+       ::boost::parameter::keyword<tag_namespace::name> const& name \
+       = ::boost::parameter::keyword<tag_namespace::name>::instance;\
+    }
+
+#endif
+
+}} // namespace boost::parameter
+
+#endif // KEYWORD_050328_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/macros.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/macros.hpp
new file mode 100644 (file)
index 0000000..83fbfb5
--- /dev/null
@@ -0,0 +1,99 @@
+// Copyright David Abrahams, Daniel Wallin 2003. 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)
+
+#ifndef BOOST_PARAMETER_MACROS_050412_HPP
+#define BOOST_PARAMETER_MACROS_050412_HPP
+
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/detail/workaround.hpp>
+
+#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD1(n) \
+    template<BOOST_PP_ENUM_PARAMS(n, class T)>
+
+#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD0(n)
+
+#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) 
+
+# define BOOST_PARAMETER_MATCH_TYPE(n, param)           \
+            BOOST_PP_EXPR_IF(n, typename) param::match  \
+            <                                           \
+                BOOST_PP_ENUM_PARAMS(n, T)              \
+            >::type 
+
+#else
+
+# define BOOST_PARAMETER_MATCH_TYPE(n, param) param
+
+#endif
+
+#define BOOST_PARAMETER_FUN_DECL(z, n, params)                                      \
+                                                                                    \
+    BOOST_PP_CAT(BOOST_PARAMETER_FUN_TEMPLATE_HEAD, BOOST_PP_BOOL(n))(n)            \
+                                                                                    \
+    BOOST_PP_TUPLE_ELEM(3, 0, params)                                               \
+        BOOST_PP_TUPLE_ELEM(3, 1, params)(                                          \
+            BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& p)                             \
+            BOOST_PP_COMMA_IF(n)                                                    \
+            BOOST_PARAMETER_MATCH_TYPE(n,BOOST_PP_TUPLE_ELEM(3, 2, params))         \
+            kw = BOOST_PP_TUPLE_ELEM(3, 2, params)()                                \
+        )                                                                           \
+    {                                                                               \
+        return BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 1, params), _with_named_params)( \
+            kw(BOOST_PP_ENUM_PARAMS(n, p))                                          \
+        );                                                                          \
+    }
+
+// Generates:
+//
+// template<class Params>
+// ret name ## _with_named_params(Params const&);
+//
+// template<class T0>
+// ret name(T0 const& p0, typename parameters::match<T0>::type kw = parameters())
+// {
+//     return name ## _with_named_params(kw(p0));
+// }
+//
+// template<class T0, ..., class TN>
+// ret name(T0 const& p0, ..., TN const& PN
+//    , typename parameters::match<T0, ..., TN>::type kw = parameters())
+// {
+//     return name ## _with_named_params(kw(p0, ..., pN));
+// }
+//
+// template<class Params>
+// ret name ## _with_named_params(Params const&)
+//
+// lo and hi determines the min and max arity of the generated functions.
+
+#define BOOST_PARAMETER_FUN(ret, name, lo, hi, parameters)                          \
+                                                                                    \
+    template<class Params>                                                          \
+    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p);                    \
+                                                                                    \
+    BOOST_PP_REPEAT_FROM_TO(                                                        \
+        lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL, (ret, name, parameters))    \
+                                                                                    \
+    template<class Params>                                                          \
+    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p)
+
+#define BOOST_PARAMETER_MEMFUN(ret, name, lo, hi, parameters)                       \
+                                                                                    \
+    BOOST_PP_REPEAT_FROM_TO(                                                        \
+        lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL, (ret, name, parameters))    \
+                                                                                    \
+    template<class Params>                                                          \
+    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p)
+
+#endif // BOOST_PARAMETER_MACROS_050412_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/match.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/match.hpp
new file mode 100644 (file)
index 0000000..2fa3f17
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright David Abrahams 2005. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#ifndef BOOST_PARAMETER_MATCH_DWA2005714_HPP
+# define BOOST_PARAMETER_MATCH_DWA2005714_HPP
+
+# include <boost/detail/workaround.hpp>
+# include <boost/preprocessor/seq/enum.hpp>
+
+# if BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
+// Temporary version of BOOST_PP_SEQ_ENUM until Paul M. integrates the workaround.
+#  define BOOST_PARAMETER_SEQ_ENUM_I(size,seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, size) seq
+#  define BOOST_PARAMETER_SEQ_ENUM(seq) BOOST_PARAMETER_SEQ_ENUM_I(BOOST_PP_SEQ_SIZE(seq), seq)
+# else
+#  define BOOST_PARAMETER_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM(seq)
+# endif 
+
+# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+#  include <boost/parameter/config.hpp>
+#  include <boost/parameter/aux_/void.hpp>
+#  include <boost/preprocessor/arithmetic/sub.hpp>
+#  include <boost/preprocessor/facilities/intercept.hpp>
+#  include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+
+#  define BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)              \
+        BOOST_PP_ENUM_TRAILING_PARAMS(                          \
+            BOOST_PP_SUB(                                       \
+                BOOST_PARAMETER_MAX_ARITY                       \
+              , BOOST_PP_SEQ_SIZE(ArgTypes)                     \
+            )                                                   \
+          , ::boost::parameter::void_ BOOST_PP_INTERCEPT   \
+        )
+
+# else
+
+#  define BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)
+
+# endif 
+
+//
+// Generates, e.g.
+//
+//    typename dfs_params::match<A1,A2>::type name = dfs_params()
+//
+// with workarounds for Borland compatibility.
+//
+
+# define BOOST_PARAMETER_MATCH(ParameterSpec, ArgTypes, name)   \
+    typename ParameterSpec ::match<                             \
+        BOOST_PARAMETER_SEQ_ENUM(ArgTypes)                      \
+        BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)                \
+    >::type name = ParameterSpec ()
+
+#endif // BOOST_PARAMETER_MATCH_DWA2005714_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/name.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/name.hpp
new file mode 100644 (file)
index 0000000..8850f05
--- /dev/null
@@ -0,0 +1,156 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_NAME_060806_HPP
+# define BOOST_PARAMETER_NAME_060806_HPP
+
+# include <boost/parameter/keyword.hpp>
+# include <boost/parameter/value_type.hpp>
+# include <boost/detail/workaround.hpp>
+# include <boost/preprocessor/cat.hpp>
+# include <boost/preprocessor/stringize.hpp>
+# include <boost/preprocessor/control/iif.hpp>
+# include <boost/preprocessor/tuple/eat.hpp>
+# include <boost/preprocessor/tuple/elem.hpp>
+# include <boost/mpl/placeholders.hpp>
+
+# if !defined(BOOST_NO_SFINAE) \
+  && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
+  && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+
+#  include <boost/utility/enable_if.hpp>
+#  include <boost/mpl/lambda.hpp>
+
+namespace boost { namespace parameter { namespace aux {
+
+// Tag type passed to MPL lambda.
+struct lambda_tag;
+
+struct name_tag_base 
+{};
+
+template <class Tag>
+struct name_tag
+{};
+
+template <class T>
+struct is_name_tag
+  : mpl::false_
+{};
+
+}}} // namespace boost::parameter::aux
+
+namespace boost { namespace mpl {
+
+template <class T>
+struct lambda<
+    T
+  , typename enable_if<
+        parameter::aux::is_name_tag<T>, parameter::aux::lambda_tag
+    >::type
+>
+{
+    typedef true_ is_le;
+    typedef bind3< quote3<parameter::value_type>, arg<2>, T, void> result_;
+    typedef result_ type;
+};
+
+}} // namespace boost::mpl
+
+# endif
+
+# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+# include <boost/preprocessor/detail/split.hpp>
+// From Paul Mensonides
+#  define BOOST_PARAMETER_IS_BINARY(x) \
+    BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_BINARY_C x BOOST_PP_COMMA() 0) \
+    /**/
+#  define BOOST_PARAMETER_IS_BINARY_C(x,y) \
+    ~, 1 BOOST_PP_RPAREN() \
+    BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \
+    /**/
+# else
+#  include <boost/preprocessor/detail/is_binary.hpp>
+#  define BOOST_PARAMETER_IS_BINARY(x) BOOST_PP_IS_BINARY(x)
+# endif
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  define BOOST_PARAMETER_NAME_OBJECT(tag, name)                    \
+    static ::boost::parameter::keyword<tag> const& name             \
+       = ::boost::parameter::keyword<tag>::instance;
+# else
+#  define BOOST_PARAMETER_NAME_OBJECT(tag, name)                    \
+    namespace                                                       \
+    {                                                               \
+       ::boost::parameter::keyword<tag> const& name                 \
+       = ::boost::parameter::keyword<tag>::instance;                \
+    }
+# endif
+
+# define BOOST_PARAMETER_BASIC_NAME(tag_namespace, tag, name)       \
+    namespace tag_namespace                                         \
+    {                                                               \
+      struct tag                                                    \
+      {                                                             \
+          static char const* keyword_name()                         \
+          {                                                         \
+              return BOOST_PP_STRINGIZE(tag);                       \
+          }                                                         \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _;                                                      \
+                                                                    \
+          typedef boost::parameter::value_type<                     \
+              boost::mpl::_2, tag, boost::parameter::void_          \
+          > _1;                                                     \
+      };                                                            \
+    }                                                               \
+    BOOST_PARAMETER_NAME_OBJECT(tag_namespace::tag, name)
+
+# define BOOST_PARAMETER_COMPLEX_NAME_TUPLE1(tag,namespace)         \
+    (tag, namespace), ~
+
+# define BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)                   \
+    BOOST_PP_TUPLE_ELEM(2, 0, (BOOST_PARAMETER_COMPLEX_NAME_TUPLE1 name))
+
+# define BOOST_PARAMETER_COMPLEX_NAME_TAG(name)                     \
+    BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))
+
+# define BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name)               \
+    BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))
+
+# define BOOST_PARAMETER_COMPLEX_NAME(name)                         \
+    BOOST_PARAMETER_BASIC_NAME(                                     \
+        BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name)                \
+      , BOOST_PP_TUPLE_EAT(2) name                                  \
+      , BOOST_PARAMETER_COMPLEX_NAME_TAG(name)                      \
+    )                                                               \
+/**/
+
+# define BOOST_PARAMETER_SIMPLE_NAME(name)                          \
+    BOOST_PARAMETER_BASIC_NAME(tag, name, BOOST_PP_CAT(_, name))
+
+# define BOOST_PARAMETER_NAME(name)                                 \
+    BOOST_PP_IIF(                                                   \
+        BOOST_PARAMETER_IS_BINARY(name)                             \
+      , BOOST_PARAMETER_COMPLEX_NAME                                \
+      , BOOST_PARAMETER_SIMPLE_NAME                                 \
+    )(name)                                                         \
+/**/
+
+
+# define BOOST_PARAMETER_TEMPLATE_KEYWORD(name)                     \
+    namespace tag                                                   \
+    {                                                               \
+      struct name;                                                  \
+    }                                                               \
+    template <class T>                                              \
+    struct name                                                     \
+      : boost::parameter::template_keyword<tag::name, T>            \
+    {};                                                             \
+/**/
+
+#endif // BOOST_PARAMETER_NAME_060806_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/parameters.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/parameters.hpp
new file mode 100644 (file)
index 0000000..97e1024
--- /dev/null
@@ -0,0 +1,931 @@
+// Copyright David Abrahams, Daniel Wallin 2003. 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)
+
+#ifndef BOOST_PARAMETERS_031014_HPP
+#define BOOST_PARAMETERS_031014_HPP
+
+#include <boost/detail/is_xxx.hpp>
+
+#include <boost/type_traits/is_const.hpp>
+
+#include <boost/mpl/lambda.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/pair.hpp>
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/repetition/enum_shifted.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/iteration/iterate.hpp>
+#include <boost/preprocessor/facilities/intercept.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#include <boost/parameter/aux_/arg_list.hpp>
+#include <boost/parameter/aux_/yesno.hpp>
+#include <boost/parameter/aux_/void.hpp>
+#include <boost/parameter/aux_/default.hpp>
+#include <boost/parameter/aux_/unwrap_cv_reference.hpp>
+#include <boost/parameter/aux_/tagged_argument.hpp>
+#include <boost/parameter/aux_/tag.hpp>
+#include <boost/parameter/aux_/template_keyword.hpp>
+#include <boost/parameter/aux_/set.hpp>
+#include <boost/parameter/config.hpp>
+
+namespace parameter_
+{
+  template <class T>
+  struct unmatched_argument
+  {
+      BOOST_MPL_ASSERT((boost::is_same<T,void>));
+      typedef int type;
+  }; 
+} // namespace parameter_
+
+namespace boost {
+
+template<class T> class reference_wrapper;
+
+namespace parameter {
+
+namespace aux { struct use_default {}; }
+
+// These templates can be used to describe the treatment of particular
+// named parameters for the purposes of overload elimination with
+// SFINAE, by placing specializations in the parameters<...> list.  In
+// order for a treated function to participate in overload resolution:
+//
+//   - all keyword tags wrapped in required<...> must have a matching
+//     actual argument
+//
+//   - The actual argument type matched by every keyword tag
+//     associated with a predicate must satisfy that predicate
+//
+// If a keyword k is specified without an optional<...> or
+// required<...>, wrapper, it is treated as though optional<k> were
+// specified.
+//
+// If a keyword k is specified with deduced<...>, that keyword
+// will be automatically deduced from the argument list.
+//
+template <class Tag, class Predicate = aux::use_default>
+struct required
+{
+    typedef Tag key_type;
+    typedef Predicate predicate;
+};
+
+template <class Tag, class Predicate = aux::use_default>
+struct optional
+{
+    typedef Tag key_type;
+    typedef Predicate predicate;
+};
+
+template <class Tag>
+struct deduced
+{
+    typedef Tag key_type;
+};
+
+namespace aux
+{
+  // Defines metafunctions, is_required and is_optional, that
+  // identify required<...>, optional<...> and deduced<...> specializations.
+  BOOST_DETAIL_IS_XXX_DEF(required, required, 2)
+  BOOST_DETAIL_IS_XXX_DEF(optional, optional, 2)
+  BOOST_DETAIL_IS_XXX_DEF(deduced_aux, deduced, 1)
+
+  template <class S>
+  struct is_deduced0
+    : is_deduced_aux<
+          typename S::key_type
+      >::type
+  {};
+
+  template <class S>
+  struct is_deduced
+    : mpl::eval_if<
+          mpl::or_<
+              is_optional<S>, is_required<S>
+          >
+        , is_deduced0<S>
+        , mpl::false_
+      >::type
+  {};
+
+  //
+  // key_type, has_default, and predicate --
+  //
+  // These metafunctions accept a ParameterSpec and extract the
+  // keyword tag, whether or not a default is supplied for the
+  // parameter, and the predicate that the corresponding actual
+  // argument type is required match.
+  //
+  // a ParameterSpec is a specialization of either keyword<...>,
+  // required<...>, optional<...>
+  //
+
+  // helper for key_type<...>, below.
+  template <class T>
+  struct get_tag_type0
+  {
+      typedef typename T::key_type type;
+  };
+
+  template <class T>
+  struct get_tag_type
+    : mpl::eval_if<
+          is_deduced_aux<typename T::key_type>
+        , get_tag_type0<typename T::key_type>
+        , mpl::identity<typename T::key_type>
+      >
+  {};
+
+  template <class T>
+  struct tag_type
+    : mpl::eval_if<
+          mpl::or_<
+              is_optional<T>
+            , is_required<T>
+          >
+        , get_tag_type<T>
+        , mpl::identity<T>
+      >
+  {};
+
+  template <class T>
+  struct has_default
+    : mpl::not_<is_required<T> >
+  {};
+
+  // helper for get_predicate<...>, below
+  template <class T>
+  struct get_predicate_or_default
+  {
+      typedef T type;
+  };
+
+  template <>
+  struct get_predicate_or_default<use_default>
+  {
+      typedef mpl::always<mpl::true_> type;
+  };
+
+  // helper for predicate<...>, below
+  template <class T>
+  struct get_predicate
+  {
+      typedef typename
+          get_predicate_or_default<typename T::predicate>::type
+      type;
+  };
+
+  template <class T>
+  struct predicate
+    : mpl::eval_if<
+         mpl::or_<
+              is_optional<T>
+            , is_required<T>
+          >
+        , get_predicate<T>
+        , mpl::identity<mpl::always<mpl::true_> >
+      >
+  {
+  };
+
+
+  // Converts a ParameterSpec into a specialization of
+  // parameter_requirements.  We need to do this in order to get the
+  // tag_type into the type in a way that can be conveniently matched
+  // by a satisfies(...) member function in arg_list.
+  template <class ParameterSpec>
+  struct as_parameter_requirements
+  {
+      typedef parameter_requirements<
+          typename tag_type<ParameterSpec>::type
+        , typename predicate<ParameterSpec>::type
+        , typename has_default<ParameterSpec>::type
+      > type;
+  };
+
+  template <class T>
+  struct is_named_argument
+    : mpl::or_<
+          is_template_keyword<T>
+        , is_tagged_argument<T>
+      >
+  {};
+  
+  // Returns mpl::true_ iff the given ParameterRequirements are
+  // satisfied by ArgList.
+  template <class ArgList, class ParameterRequirements>
+  struct satisfies
+  {
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+      // VC7.1 can't handle the sizeof() implementation below,
+      // so we use this instead.
+      typedef typename mpl::apply_wrap3<
+          typename ArgList::binding
+        , typename ParameterRequirements::keyword
+        , void_
+        , mpl::false_
+      >::type bound;
+
+      typedef typename mpl::eval_if<
+          is_same<bound, void_>
+        , typename ParameterRequirements::has_default
+        , mpl::apply_wrap2<
+              typename mpl::lambda<
+                  typename ParameterRequirements::predicate, lambda_tag
+              >::type
+            , bound
+            , ArgList
+          >
+      >::type type;
+#else
+      BOOST_STATIC_CONSTANT(
+          bool, value = (
+              sizeof(
+                  aux::to_yesno(
+                      ArgList::satisfies((ParameterRequirements*)0, (ArgList*)0)
+                  )
+              ) == sizeof(yes_tag)
+          )
+      );
+
+      typedef mpl::bool_<satisfies::value> type;
+#endif
+  };
+
+  // Returns mpl::true_ if the requirements of the given ParameterSpec
+  // are satisfied by ArgList.
+  template <class ArgList, class ParameterSpec>
+  struct satisfies_requirements_of
+    : satisfies<
+          ArgList
+        , typename as_parameter_requirements<ParameterSpec>::type
+      >
+  {};
+
+  // Tags a deduced argument Arg with the keyword tag of Spec using TagFn.
+  // Returns the tagged argument and the mpl::set<> UsedArgs with the
+  // tag of Spec inserted.
+  template <class UsedArgs, class Spec, class Arg, class TagFn>
+  struct tag_deduced
+  {
+      typedef mpl::pair<
+          typename mpl::apply_wrap2<TagFn, typename tag_type<Spec>::type, Arg>::type
+        , typename aux::insert_<UsedArgs, typename tag_type<Spec>::type>::type
+      > type;
+  };
+
+  template <
+      class Argument
+    , class ArgumentPack
+    , class DeducedArgs
+    , class UsedArgs
+    , class TagFn
+  >
+  struct deduce_tag;
+
+  // Tag type passed to MPL lambda.
+  struct lambda_tag;
+
+  // Helper for deduce_tag<> below.
+  template <
+      class Argument
+    , class ArgumentPack
+    , class DeducedArgs
+    , class UsedArgs
+    , class TagFn
+  >
+  struct deduce_tag0
+  {
+      typedef typename DeducedArgs::spec spec;
+
+      typedef typename mpl::apply_wrap2<
+          typename mpl::lambda<
+              typename spec::predicate, lambda_tag
+          >::type
+        , Argument
+        , ArgumentPack
+      >::type condition;
+
+      // Deduced parameter matches several arguments.
+
+      BOOST_MPL_ASSERT((
+          mpl::not_<mpl::and_<
+              condition
+            , aux::has_key_<UsedArgs, typename tag_type<spec>::type>
+          > >
+      ));
+
+      typedef typename mpl::eval_if<
+          condition
+        , tag_deduced<UsedArgs, spec, Argument, TagFn>
+        , deduce_tag<Argument, ArgumentPack, typename DeducedArgs::tail, UsedArgs, TagFn>
+      >::type type;
+  };
+
+  // Tries to deduced a keyword tag for a given Argument.
+  // Returns an mpl::pair<> consisting of the tagged_argument<>, 
+  // and an mpl::set<> where the new tag has been inserted.
+  //
+  //  Argument: The argument type to be tagged.
+  //
+  //  ArgumentPack: The ArgumentPack built so far.
+  //
+  //  DeducedArgs: A specialization of deduced_item<> (see below).
+  //               A list containing only the deduced ParameterSpecs.
+  //
+  //  UsedArgs: An mpl::set<> containing the keyword tags used so far.
+  //
+  //  TagFn: A metafunction class used to tag positional or deduced
+  //         arguments with a keyword tag.
+
+  template <
+      class Argument
+    , class ArgumentPack
+    , class DeducedArgs
+    , class UsedArgs
+    , class TagFn
+  >
+  struct deduce_tag
+  {
+      typedef typename mpl::eval_if<
+          is_same<DeducedArgs, void_>
+        , mpl::pair<void_, UsedArgs>
+        , deduce_tag0<Argument, ArgumentPack, DeducedArgs, UsedArgs, TagFn>
+      >::type type;
+  };
+
+  template <
+      class List
+    , class DeducedArgs
+    , class TagFn
+    , class Positional
+    , class UsedArgs
+    , class ArgumentPack
+    , class Error
+  >
+  struct make_arg_list_aux;
+
+  // Inserts Tagged::key_type into the UserArgs set.
+  // Extra indirection to lazily evaluate Tagged::key_type.
+  template <class UsedArgs, class Tagged>
+  struct insert_tagged
+  {
+      typedef typename aux::insert_<
+          UsedArgs, typename Tagged::key_type
+      >::type type;
+  };
+
+  // Borland needs the insane extra-indirection workaround below
+  // so that it doesn't magically drop the const qualifier from
+  // the argument type.
+
+  template <
+      class List
+    , class DeducedArgs
+    , class TagFn
+    , class Positional
+    , class UsedArgs
+    , class ArgumentPack
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    , class argument
+#endif
+    , class Error
+  >
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+  struct make_arg_list00
+#else
+  struct make_arg_list0
+#endif
+  {
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+      typedef typename List::arg argument;
+#endif
+      typedef typename List::spec parameter_spec;
+      typedef typename tag_type<parameter_spec>::type tag_;
+
+      typedef is_named_argument<argument> is_tagged;
+
+      // If this argument is either explicitly tagged or a deduced
+      // parameter, we turn off positional matching.
+      typedef mpl::and_<
+          mpl::not_<
+              mpl::or_<is_deduced<parameter_spec>, is_tagged> 
+          > 
+        , Positional
+      > positional;
+
+      // If this parameter is explicitly tagged we add it to the
+      // used-parmeters set. We only really need to add parameters
+      // that are deduced, but we would need a way to check if
+      // a given tag corresponds to a deduced parameter spec.
+      typedef typename mpl::eval_if<
+          is_tagged
+        , insert_tagged<UsedArgs, argument>
+        , mpl::identity<UsedArgs>
+      >::type used_args;
+
+      // If this parameter is neither explicitly tagged, nor
+      // positionally matched; deduce the tag from the deduced
+      // parameter specs.
+      typedef typename mpl::eval_if<
+          mpl::or_<is_tagged, positional>
+        , mpl::pair<void_, used_args>
+        , deduce_tag<argument, ArgumentPack, DeducedArgs, used_args, TagFn>
+      >::type deduced_data;
+
+      // If this parameter is explicitly tagged..
+      typedef typename mpl::eval_if<
+          is_tagged
+        , mpl::identity<argument>                        // .. just use it
+        , mpl::eval_if<                                  // .. else, if positional matching is turned on..
+                positional
+              , mpl::apply_wrap2<TagFn, tag_, argument>  // .. tag it positionally
+              , mpl::first<deduced_data>                 // .. else, use the deduced tag
+          >
+      >::type tagged;
+
+      // We build the arg_list incrementally as we go, prepending new
+      // nodes.
+
+      typedef typename mpl::if_<
+          mpl::and_<
+              is_same<Error, void_>
+            , is_same<tagged, void_>
+          >
+        , parameter_::unmatched_argument<argument>
+        , void_
+      >::type error;
+
+      typedef typename mpl::if_<
+          is_same<tagged, void_>
+        , ArgumentPack
+        , arg_list<tagged, ArgumentPack>
+      >::type argument_pack;
+
+      typedef typename make_arg_list_aux<
+          typename List::tail
+        , DeducedArgs
+        , TagFn
+        , positional
+        , typename deduced_data::second
+        , argument_pack
+        , error
+      >::type type;
+  };
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+  template <
+      class List
+    , class DeducedArgs
+    , class TagFn
+    , class Positional
+    , class UsedArgs
+    , class ArgumentPack
+    , class Error
+  >
+  struct make_arg_list0
+  {
+      typedef typename mpl::eval_if<
+          typename List::is_arg_const
+        , make_arg_list00<
+              List
+            , DeducedArgs
+            , TagFn
+            , Positional
+            , UsedArgs
+            , ArgumentPack
+            , typename List::arg const
+            , Error
+          >
+        , make_arg_list00<
+              List
+            , DeducedArgs
+            , TagFn
+            , Positional
+            , UsedArgs
+            , ArgumentPack
+            , typename List::arg
+            , Error
+          >
+      >::type type;
+  };
+#endif
+
+  // Returns an ArgumentPack where the list of arguments has
+  // been tagged with keyword tags.
+  //
+  //   List: A specialization of item<> (see below). Contains
+  //         both the ordered ParameterSpecs, and the given arguments.
+  //
+  //   DeducedArgs: A specialization of deduced_item<> (see below).
+  //                A list containing only the deduced ParameterSpecs.
+  //
+  //   TagFn: A metafunction class used to tag positional or deduced
+  //          arguments with a keyword tag.
+  //
+  //   Position: An mpl::bool_<> specialization indicating if positional
+  //             matching is to be performed.
+  //
+  //   DeducedSet: An mpl::set<> containing the keyword tags used so far.
+  //
+  //   ArgumentPack: The ArgumentPack built so far. This is initially an
+  //                 empty_arg_list and is built incrementally.
+  //
+
+  template <
+      class List
+    , class DeducedArgs
+    , class TagFn
+    , class Positional
+    , class DeducedSet
+    , class ArgumentPack
+    , class Error
+  >
+  struct make_arg_list_aux
+  {
+      typedef typename mpl::eval_if<
+          is_same<List, void_>
+        , mpl::identity<mpl::pair<ArgumentPack, Error> >
+        , make_arg_list0<List, DeducedArgs, TagFn, Positional, DeducedSet, ArgumentPack, Error>
+      >::type type;
+  };
+
+  // VC6.5 was choking on the default parameters for make_arg_list_aux, so
+  // this just forwards to that adding in the defaults.
+  template <
+      class List
+    , class DeducedArgs
+    , class TagFn
+    , class EmitErrors = mpl::true_
+  >
+  struct make_arg_list
+  {
+      typedef typename make_arg_list_aux<
+          List, DeducedArgs, TagFn, mpl::true_, aux::set0, empty_arg_list, void_
+      >::type type;
+  };
+
+  // A parameter spec item typelist.
+  template <class Spec, class Arg, class Tail = void_>
+  struct item
+  {
+      typedef Spec spec;
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+      typedef is_const<Arg> is_arg_const;
+#endif
+
+      typedef Arg arg;
+      typedef Tail tail;
+  };
+
+  template <class Spec, class Arg, class Tail>
+  struct make_item
+  {
+      typedef item<Spec, Arg, typename Tail::type> type;
+  };
+
+  // Creates a item typelist.
+  template <class Spec, class Arg, class Tail>
+  struct make_items
+  {
+      typedef typename mpl::eval_if<
+          is_same<Arg, void_>
+        , mpl::identity<void_>
+        , make_item<Spec, Arg, Tail>
+      >::type type;
+  };
+
+  // A typelist that stored deduced parameter specs.
+  template <class ParameterSpec, class Tail = void_>
+  struct deduced_item
+  {
+      typedef ParameterSpec spec;
+      typedef Tail tail;
+  };
+
+  // Evaluate Tail and construct deduced_item list.
+  template <class Spec, class Tail>
+  struct make_deduced_item
+  {
+      typedef deduced_item<Spec, typename Tail::type> type;
+  };
+
+  template <class Spec, class Tail>
+  struct make_deduced_items
+  {
+      typedef typename mpl::eval_if<
+          is_same<Spec, void_>
+        , mpl::identity<void_>
+        , mpl::eval_if<
+              is_deduced<Spec>
+            , make_deduced_item<Spec, Tail>
+            , Tail
+          >
+      >::type type;
+  };
+
+  // Generates:
+  //
+  //   make<
+  //       parameter_spec#0, argument_type#0
+  //     , make<
+  //           parameter_spec#1, argument_type#1
+  //         , ... mpl::identity<aux::empty_arg_list>
+  //    ...>
+  //   >
+#define BOOST_PARAMETER_make_arg_list(z, n, names)      \
+      BOOST_PP_SEQ_ELEM(0,names)<                       \
+          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names), n),  \
+          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2,names), n), 
+
+#define BOOST_PARAMETER_right_angle(z, n, text) >
+
+#define BOOST_PARAMETER_build_arg_list(n, make, parameter_spec, argument_type)      \
+  BOOST_PP_REPEAT(                                                                  \
+      n, BOOST_PARAMETER_make_arg_list, (make)(parameter_spec)(argument_type))      \
+      mpl::identity<void_>                                                          \
+  BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)
+
+#define BOOST_PARAMETER_make_deduced_list(z, n, names)  \
+      BOOST_PP_SEQ_ELEM(0,names)<                       \
+          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names), n),
+
+#define BOOST_PARAMETER_build_deduced_list(n, make, parameter_spec)                 \
+  BOOST_PP_REPEAT(                                                                  \
+      n, BOOST_PARAMETER_make_deduced_list, (make)(parameter_spec))                 \
+  mpl::identity<void_>                                                              \
+  BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)
+
+  struct tag_keyword_arg
+  {
+      template <class K, class T>
+      struct apply
+        : tag<K,T>
+      {};
+  };
+
+  struct tag_template_keyword_arg
+  {
+      template <class K, class T>
+      struct apply
+      {
+          typedef template_keyword<K,T> type;
+      };
+  };
+
+} // namespace aux
+
+#define BOOST_PARAMETER_FORWARD_TYPEDEF(z, i, names) \
+    typedef BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0,names),i) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names),i);
+
+#define BOOST_PARAMETER_FORWARD_TYPEDEFS(n, src, dest) \
+    BOOST_PP_REPEAT(n, BOOST_PARAMETER_FORWARD_TYPEDEF, (src)(dest))
+
+
+#define BOOST_PARAMETER_TEMPLATE_ARGS(z, n, text) class BOOST_PP_CAT(PS, n) = void_
+
+template<
+     class PS0
+   , BOOST_PP_ENUM_SHIFTED(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_TEMPLATE_ARGS, _)
+>
+struct parameters
+{
+#undef BOOST_PARAMETER_TEMPLATE_ARGS
+
+    typedef typename BOOST_PARAMETER_build_deduced_list(
+        BOOST_PARAMETER_MAX_ARITY, aux::make_deduced_items, PS
+    )::type deduced_list;
+
+    // if the elements of NamedList match the criteria of overload
+    // resolution, returns a type which can be constructed from
+    // parameters.  Otherwise, this is not a valid metafunction (no nested
+    // ::type).
+
+
+#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+    // If NamedList satisfies the PS0, PS1, ..., this is a
+    // metafunction returning parameters.  Otherwise it 
+    // has no nested ::type.
+    template <class ArgumentPackAndError>
+    struct match_base
+      : mpl::if_<
+            // mpl::and_<
+            //    aux::satisfies_requirements_of<NamedList,PS0>
+            //  , mpl::and_<
+            //       aux::satisfies_requirements_of<NamedList,PS1>...
+            //           ..., mpl::true_
+            // ...> >
+            
+# define BOOST_PARAMETER_satisfies(z, n, text)                                      \
+            mpl::and_<                                                              \
+                aux::satisfies_requirements_of<                                     \
+                    typename mpl::first<ArgumentPackAndError>::type                 \
+                  , BOOST_PP_CAT(PS, n)>                                            \
+                  ,
+            mpl::and_<
+                is_same<typename mpl::second<ArgumentPackAndError>::type, void_>
+              , BOOST_PP_REPEAT(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_satisfies, _)
+                mpl::true_
+                BOOST_PP_REPEAT(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_right_angle, _)
+            >
+
+# undef BOOST_PARAMETER_satisfies
+
+          , mpl::identity<parameters>
+          , void_
+        >
+    {};
+#endif
+    
+    // Specializations are to be used as an optional argument to
+    // eliminate overloads via SFINAE
+    template<
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+        // Borland simply can't handle default arguments in member
+        // class templates.  People wishing to write portable code can
+        // explicitly specify BOOST_PARAMETER_MAX_ARITY arguments
+        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)
+#else 
+        BOOST_PP_ENUM_BINARY_PARAMS(
+            BOOST_PARAMETER_MAX_ARITY, class A, = void_ BOOST_PP_INTERCEPT
+        )
+#endif
+    >
+    struct match
+# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+      : match_base<
+            typename aux::make_arg_list<
+                typename BOOST_PARAMETER_build_arg_list(
+                    BOOST_PARAMETER_MAX_ARITY, aux::make_items, PS, A
+                )::type
+              , deduced_list
+              , aux::tag_keyword_arg
+              , mpl::false_ // Don't emit errors when doing SFINAE
+            >::type
+        >::type
+    {};
+# else
+    { 
+        typedef parameters<
+            BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, PS)
+        > type; 
+    };
+# endif
+
+    // Metafunction that returns an ArgumentPack.
+
+    // TODO, bind has to instantiate the error type in the result
+    // of make_arg_list.
+
+    template <
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+        // Borland simply can't handle default arguments in member
+        // class templates.  People wishing to write portable code can
+        // explicitly specify BOOST_PARAMETER_MAX_ARITY arguments
+        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)
+#else 
+        BOOST_PP_ENUM_BINARY_PARAMS(
+            BOOST_PARAMETER_MAX_ARITY, class A, = void_ BOOST_PP_INTERCEPT
+        )
+#endif            
+    >
+    struct bind
+    {
+        typedef typename aux::make_arg_list<
+            typename BOOST_PARAMETER_build_arg_list(
+                BOOST_PARAMETER_MAX_ARITY, aux::make_items, PS, A
+            )::type
+          , deduced_list
+          , aux::tag_template_keyword_arg
+        >::type result;
+
+        typedef typename mpl::first<result>::type type;
+    };
+
+    BOOST_PARAMETER_FORWARD_TYPEDEFS(BOOST_PARAMETER_MAX_ARITY, PS, parameter_spec)
+
+    //
+    // The function call operator is used to build an arg_list that
+    // labels the positional parameters and maintains whatever other
+    // tags may have been specified by the caller.
+    //
+    // !!!NOTE!!!
+    //
+    // The make_arg_list<> produces a reversed arg_list, so
+    // we need to pass the arguments to its constructor
+    // reversed.
+    //
+    aux::empty_arg_list operator()() const
+    {
+       return aux::empty_arg_list();
+    }
+
+    template<class A0>
+    typename mpl::first<
+        typename aux::make_arg_list<
+            aux::item<
+                PS0,A0
+            >
+          , deduced_list
+          , aux::tag_keyword_arg
+        >::type
+    >::type
+    operator()(A0& a0) const
+    {
+        typedef typename aux::make_arg_list<
+            aux::item<
+                PS0,A0
+            >
+          , deduced_list
+          , aux::tag_keyword_arg
+        >::type result;
+
+        typedef typename mpl::first<result>::type result_type;
+        typedef typename mpl::second<result>::type error;
+        error();
+
+        return result_type(
+            a0
+            // , void_(), void_(), void_() ...
+            BOOST_PP_ENUM_TRAILING_PARAMS(
+                BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, 1)
+              , aux::void_reference() BOOST_PP_INTERCEPT)
+        );
+    }
+
+    template<class A0, class A1>
+    typename mpl::first<
+        typename aux::make_arg_list<
+            aux::item<
+                PS0,A0
+              , aux::item<
+                    PS1,A1
+                >
+            >
+          , deduced_list
+          , aux::tag_keyword_arg
+        >::type
+    >::type
+    operator()(A0& a0, A1& a1) const
+    {
+        typedef typename aux::make_arg_list<
+            aux::item<
+                PS0,A0
+              , aux::item<
+                    PS1,A1
+                >
+            >
+          , deduced_list
+          , aux::tag_keyword_arg
+        >::type result;
+
+        typedef typename mpl::first<result>::type result_type;
+        typedef typename mpl::second<result>::type error;
+        error();
+
+        return result_type(
+            a1,a0
+            // , void_(), void_() ...
+            BOOST_PP_ENUM_TRAILING_PARAMS(
+                BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, 2)
+              , aux::void_reference() BOOST_PP_INTERCEPT)
+        );
+    }
+
+    // Higher arities are handled by the preprocessor
+#define BOOST_PP_ITERATION_PARAMS_1 (3,( \
+        3,BOOST_PARAMETER_MAX_ARITY,<boost/parameter/aux_/overloads.hpp> \
+    ))
+#include BOOST_PP_ITERATE()
+
+};
+
+} // namespace parameter
+
+} // namespace boost
+
+#endif // BOOST_PARAMETERS_031014_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/preprocessor.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/preprocessor.hpp
new file mode 100644 (file)
index 0000000..92a0ac8
--- /dev/null
@@ -0,0 +1,1170 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_PREPROCESSOR_060206_HPP
+# define BOOST_PARAMETER_PREPROCESSOR_060206_HPP
+
+# include <boost/parameter/parameters.hpp>
+# include <boost/parameter/binding.hpp>
+# include <boost/parameter/match.hpp>
+
+# include <boost/parameter/aux_/parenthesized_type.hpp>
+# include <boost/parameter/aux_/cast.hpp>
+# include <boost/parameter/aux_/preprocessor/flatten.hpp>
+
+# include <boost/preprocessor/repetition/repeat_from_to.hpp>
+# include <boost/preprocessor/control/if.hpp>
+# include <boost/preprocessor/control/expr_if.hpp>
+# include <boost/preprocessor/repetition/enum_params.hpp>
+# include <boost/preprocessor/repetition/enum_binary_params.hpp>
+# include <boost/preprocessor/repetition/enum_trailing.hpp>
+# include <boost/preprocessor/seq/first_n.hpp>
+# include <boost/preprocessor/seq/for_each_product.hpp>
+# include <boost/preprocessor/seq/for_each_i.hpp> 
+# include <boost/preprocessor/tuple/elem.hpp> 
+# include <boost/preprocessor/seq/fold_left.hpp>
+# include <boost/preprocessor/seq/size.hpp>
+# include <boost/preprocessor/seq/enum.hpp>
+
+# include <boost/preprocessor/detail/is_nullary.hpp>
+
+# include <boost/mpl/always.hpp>
+# include <boost/mpl/apply_wrap.hpp>
+
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+#  include <boost/type.hpp>
+# endif
+
+namespace boost { namespace parameter { namespace aux {
+
+#  if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+
+// Given Match, which is "void x" where x is an argument matching
+// criterion, extract a corresponding MPL predicate.
+template <class Match>
+struct unwrap_predicate;
+
+// Match anything
+template <>
+struct unwrap_predicate<void*>
+{
+    typedef mpl::always<mpl::true_> type;
+};
+
+#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))
+
+typedef void* voidstar;
+
+// A matching predicate is explicitly specified
+template <class Predicate>
+struct unwrap_predicate<voidstar (Predicate)>
+{
+    typedef Predicate type;
+};
+
+#else
+
+// A matching predicate is explicitly specified
+template <class Predicate>
+struct unwrap_predicate<void *(Predicate)>
+{
+    typedef Predicate type;
+};
+
+#endif 
+
+
+// A type to which the argument is supposed to be convertible is
+// specified
+template <class Target>
+struct unwrap_predicate<void (Target)>
+{
+    typedef is_convertible<mpl::_, Target> type;
+};
+
+// Recast the ParameterSpec's nested match metafunction as a free metafunction
+template <
+    class Parameters
+  , BOOST_PP_ENUM_BINARY_PARAMS(
+        BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT
+    )
+>
+struct match
+  : Parameters::template match<
+        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, A)
+    >
+{};
+# endif 
+
+# if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+
+// Function template argument deduction does many of the same things
+// as type matching during partial specialization, so we call a
+// function template to "store" T into the type memory addressed by
+// void(*)(T).
+template <class T>
+msvc_store_type<T,void*(*)(void**(T))>
+msvc_store_predicate_type(void*(*)(void**(T)));
+
+template <class T>
+msvc_store_type<boost::is_convertible<mpl::_,T>,void*(*)(void*(T))>
+msvc_store_predicate_type(void*(*)(void*(T)));
+
+template <class FunctionType>
+struct unwrap_predicate
+{
+    static FunctionType f;
+
+    // We don't want the function to be evaluated, just instantiated,
+    // so protect it inside of sizeof.
+    enum { dummy = sizeof(msvc_store_predicate_type(f)) };
+
+    // Now pull the type out of the instantiated base class
+    typedef typename msvc_type_memory<FunctionType>::storage::type type;
+};
+
+template <>
+struct unwrap_predicate<void*(*)(void**)>
+{
+    typedef mpl::always<mpl::true_> type;
+};
+
+# endif
+
+# undef false_
+
+template <
+    class Parameters
+  , BOOST_PP_ENUM_BINARY_PARAMS(
+        BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT
+    )
+>
+struct argument_pack
+{
+    typedef typename make_arg_list<
+        typename BOOST_PARAMETER_build_arg_list(
+            BOOST_PARAMETER_MAX_ARITY, make_items, typename Parameters::parameter_spec, A
+        )::type
+      , typename Parameters::deduced_list
+      , tag_keyword_arg
+      , mpl::false_
+    >::type result;
+    typedef typename mpl::first<result>::type type;
+};
+
+# if 1 //BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+// Works around VC6 problem where it won't accept rvalues.
+template <class T>
+T& as_lvalue(T& value, long)
+{
+    return value;
+}
+
+template <class T>
+T const& as_lvalue(T const& value, int)
+{
+    return value;
+}
+# endif
+
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+template <class Predicate, class T, class Args>
+struct apply_predicate
+{
+    BOOST_MPL_ASSERT((
+        mpl::and_<mpl::false_,T>
+    ));
+
+    typedef typename mpl::if_<
+        typename mpl::apply2<Predicate,T,Args>::type
+      , char
+      , int
+    >::type type;
+};
+
+template <class P>
+struct funptr_predicate
+{
+    static P p;
+
+    template <class T, class Args, class P0>
+    static typename apply_predicate<P0,T,Args>::type
+    check_predicate(type<T>, Args*, void**(*)(P0));
+
+    template <class T, class Args, class P0>
+    static typename mpl::if_<
+        is_convertible<T,P0>
+      , char
+      , int
+     >::type check_predicate(type<T>, Args*, void*(*)(P0));
+
+    template <class T, class Args>
+    struct apply
+    {
+        BOOST_STATIC_CONSTANT(bool, result = 
+            sizeof(check_predicate(boost::type<T>(), (Args*)0, &p)) == 1
+        );
+
+        typedef mpl::bool_<apply<T,Args>::result> type;
+    };
+};
+
+template <>
+struct funptr_predicate<void**>
+  : mpl::always<mpl::true_>
+{};
+
+# endif
+
+}}} // namespace boost::parameter::aux
+
+# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+// From Paul Mensonides
+#  define BOOST_PARAMETER_IS_NULLARY(x) \
+    BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_NULLARY_C x BOOST_PP_COMMA() 0) \
+    /**/
+#  define BOOST_PARAMETER_IS_NULLARY_C() \
+    ~, 1 BOOST_PP_RPAREN() \
+    BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \
+    /**/
+# else
+#  define BOOST_PARAMETER_IS_NULLARY(x) BOOST_PP_IS_NULLARY(x)
+# endif
+
+# define BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_static ()
+# define BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
+    BOOST_PARAMETER_IS_NULLARY( \
+        BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_,name) \
+    )
+
+# if !defined(BOOST_MSVC)
+#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static
+#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
+    BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name)
+# else
+// Workaround for MSVC preprocessor.
+//
+// When stripping static from "static f", msvc will produce
+// " f". The leading whitespace doesn't go away when pasting
+// the token with something else, so this thing is a hack to
+// strip the whitespace.
+#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static (
+#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
+    BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name))
+#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
+    BOOST_PP_SEQ_HEAD( \
+        BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
+    )
+# endif
+
+# define BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
+    BOOST_PP_EXPR_IF( \
+        BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
+      , static \
+    )
+
+# define BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \
+    BOOST_PP_IF( \
+        BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
+      , BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC \
+      , name BOOST_PP_TUPLE_EAT(1) \
+    )(name)
+
+// Calculates [begin, end) arity range.
+
+# define BOOST_PARAMETER_ARITY_RANGE_M_optional(state) state
+# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_optional(state) state
+# define BOOST_PARAMETER_ARITY_RANGE_M_required(state) BOOST_PP_INC(state)
+# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_required(state) BOOST_PP_INC(state)
+
+# define BOOST_PARAMETER_ARITY_RANGE_M(s, state, x) \
+    BOOST_PP_CAT( \
+        BOOST_PARAMETER_ARITY_RANGE_M_ \
+      , BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \
+    )(state)
+/**/
+
+# define BOOST_PARAMETER_ARITY_RANGE(args) \
+    ( \
+        BOOST_PP_SEQ_FOLD_LEFT(BOOST_PARAMETER_ARITY_RANGE_M, 0, args) \
+      , BOOST_PP_INC(BOOST_PP_SEQ_SIZE(args)) \
+    )
+/**/
+
+// Accessor macros for the argument specs tuple.
+# define BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \
+    BOOST_PP_TUPLE_ELEM(4,0,x)
+/**/
+
+# define BOOST_PARAMETER_FN_ARG_NAME(x) \
+    BOOST_PP_TUPLE_ELEM(4,1,x)
+/**/
+
+# define BOOST_PARAMETER_FN_ARG_PRED(x) \
+    BOOST_PP_TUPLE_ELEM(4,2,x)
+/**/
+
+# define BOOST_PARAMETER_FN_ARG_DEFAULT(x) \
+    BOOST_PP_TUPLE_ELEM(4,3,x)
+/**/
+
+# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_out(x)
+# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_in_out(x)
+
+// Returns 1 if x is either "out(k)" or "in_out(k)".
+# define BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \
+    BOOST_PP_IS_EMPTY( \
+        BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_, x) \
+    ) \
+/**/
+
+# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_out(x) x
+# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_in_out(x) x
+# define BOOST_PARAMETER_FUNCTION_KEYWORD_GET(x) \
+    BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_, x)
+/**/
+
+// Returns the keyword of x, where x is either a keyword qualifier
+// or a keyword.
+//
+//   k => k
+//   out(k) => k
+//   in_out(k) => k
+//
+# define BOOST_PARAMETER_FUNCTION_KEYWORD(x) \
+    BOOST_PP_IF( \
+        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \
+      , BOOST_PARAMETER_FUNCTION_KEYWORD_GET \
+      , x BOOST_PP_TUPLE_EAT(1) \
+    )(x)
+/**/
+
+# define BOOST_PARAMETER_FN_ARG_KEYWORD(x) \
+    BOOST_PARAMETER_FUNCTION_KEYWORD( \
+        BOOST_PARAMETER_FN_ARG_NAME(x) \
+    )
+
+// Builds forwarding functions.
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z(z, n) \
+    template<BOOST_PP_ENUM_PARAMS_Z(z, n, class ParameterArgumentType)>
+/**/
+
+# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
+#  define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n) \
+    , typename boost::parameter::aux::match< \
+          parameters, BOOST_PP_ENUM_PARAMS(n, ParameterArgumentType) \
+      >::type boost_parameter_enabler_argument = parameters()
+# else
+#  define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n)
+# endif
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(base) \
+    BOOST_PP_CAT( \
+        boost_param_parameters_ \
+      , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \
+    )
+
+// Produce a name for a result type metafunction for the function
+// named base
+# define BOOST_PARAMETER_FUNCTION_RESULT_NAME(base) \
+    BOOST_PP_CAT( \
+        boost_param_result_ \
+      , BOOST_PP_CAT(__LINE__,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \
+    )
+
+// Can't do boost_param_impl_ ## basee because base might start with an underscore
+// daniel: what? how is that relevant? the reason for using CAT() is to make sure
+// base is expanded. i'm not sure we need to here, but it's more stable to do it.
+# define BOOST_PARAMETER_IMPL(base) \
+    BOOST_PP_CAT(boost_param_impl,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base))
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00(z, n, r, data, elem) \
+    BOOST_PP_IF( \
+        n \
+      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \
+    )(z,n) \
+    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(7,3,data)) \
+    inline \
+    BOOST_PP_EXPR_IF(n, typename) \
+        BOOST_PARAMETER_FUNCTION_RESULT_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))<   \
+        BOOST_PP_EXPR_IF(n, typename) \
+        boost::parameter::aux::argument_pack< \
+            BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \
+            BOOST_PP_COMMA_IF(n) \
+            BOOST_PP_IF( \
+                n, BOOST_PP_SEQ_ENUM, BOOST_PP_TUPLE_EAT(1) \
+            )(elem) \
+        >::type \
+    >::type \
+    BOOST_PARAMETER_MEMBER_FUNCTION_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))( \
+        BOOST_PP_IF( \
+            n \
+          , BOOST_PP_SEQ_FOR_EACH_I_R \
+          , BOOST_PP_TUPLE_EAT(4) \
+        )( \
+            r \
+          , BOOST_PARAMETER_FUNCTION_ARGUMENT \
+          , ~ \
+          , elem \
+        ) \
+        BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \
+            z \
+          , BOOST_PP_TUPLE_ELEM(7,3,data) \
+          , BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \
+          , n \
+        ) \
+    ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(7,4,data), const) \
+    { \
+        return BOOST_PARAMETER_IMPL(BOOST_PP_TUPLE_ELEM(7,3,data))( \
+            BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))()( \
+                BOOST_PP_ENUM_PARAMS_Z(z, n, a) \
+            ) \
+        ); \
+    }
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0(r, data, elem) \
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \
+        BOOST_PP_TUPLE_ELEM(7,0,data) \
+      , BOOST_PP_TUPLE_ELEM(7,1,data) \
+      , r \
+      , data \
+      , elem \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0(z, n, data) \
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \
+        z, n, BOOST_PP_DEDUCE_R() \
+      , (z, n, BOOST_PP_TUPLE_REM(5) data) \
+      , ~ \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N(z, n, data) \
+    BOOST_PP_SEQ_FOR_EACH( \
+        BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0 \
+      , (z, n, BOOST_PP_TUPLE_REM(5) data) \
+      , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
+            BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \
+          , BOOST_PP_SEQ_FIRST_N( \
+                n, BOOST_PP_TUPLE_ELEM(5,3,data) \
+            ) \
+        ) \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION(z, n, data) \
+    BOOST_PP_IF( \
+        n \
+      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N \
+      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0 \
+    )(z,n,data) \
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \
+    result,name,args,const_,combinations,range \
+) \
+    BOOST_PP_REPEAT_FROM_TO( \
+        BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \
+      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION \
+      , (result,name,const_,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(result,name,args, const_, combinations) \
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \
+        result, name, args, const_, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \
+    )
+/**/
+
+// Builds boost::parameter::parameters<> specialization
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_optional(tag) \
+    optional<tag
+
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_required(tag) \
+    required<tag
+
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_optional(tag) \
+    optional<boost::parameter::deduced<tag>
+
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_required(tag) \
+    required<boost::parameter::deduced<tag>
+
+# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+
+#  if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+#   define BOOST_PARAMETER_PREDICATE_TYPE(p) void*(*) (void* p)
+#  else
+#   define BOOST_PARAMETER_PREDICATE_TYPE(p) void p
+#  endif
+
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \
+    BOOST_PP_COMMA_IF(i) \
+    boost::parameter::BOOST_PP_CAT( \
+        BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \
+      , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
+    )( \
+        tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \
+            BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \
+        ) \
+    ) \
+      , typename boost::parameter::aux::unwrap_predicate< \
+            BOOST_PARAMETER_PREDICATE_TYPE(BOOST_PARAMETER_FN_ARG_PRED(elem)) \
+        >::type \
+    >
+# elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \
+    BOOST_PP_COMMA_IF(i) \
+    boost::parameter::BOOST_PP_CAT( \
+        BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \
+      , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
+    )( \
+        tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \
+            BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \
+        ) \
+    ) \
+      , boost::parameter::aux::funptr_predicate< \
+            void* BOOST_PARAMETER_FN_ARG_PRED(elem) \
+        > \
+    >
+# elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \
+    BOOST_PP_COMMA_IF(i) \
+    boost::parameter::BOOST_PP_CAT( \
+        BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \
+      , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
+    )( \
+        tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \
+            BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \
+        ) \
+    ) \
+      , boost::mpl::always<boost::mpl::true_> \
+    >
+# endif
+
+# define BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, base, args)             \
+    template <class BoostParameterDummy>                                            \
+    struct BOOST_PP_CAT(                                                            \
+            BOOST_PP_CAT(boost_param_params_, __LINE__)                             \
+          , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)                              \
+    ) : boost::parameter::parameters<                                               \
+            BOOST_PP_SEQ_FOR_EACH_I(                                                \
+                BOOST_PARAMETER_FUNCTION_PARAMETERS_M, tag_namespace, args          \
+            )                                                                       \
+        >                                                                           \
+    {};                                                                             \
+                                                                                    \
+    typedef BOOST_PP_CAT( \
+            BOOST_PP_CAT(boost_param_params_, __LINE__) \
+          , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
+    )<int>
+
+// Defines result type metafunction
+# define BOOST_PARAMETER_FUNCTION_RESULT_ARG(z, _, i, x) \
+    BOOST_PP_COMMA_IF(i) class BOOST_PP_TUPLE_ELEM(3,1,x)
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args)                                   \
+    template <class Args>                                                                       \
+    struct BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)                                           \
+    {                                                                                           \
+        typedef typename BOOST_PARAMETER_PARENTHESIZED_TYPE(result) type;                       \
+    };
+
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+#  define BOOST_PARAMETER_FUNCTION_RESULT(result, name, args)  \
+    BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args)        \
+    template <>                                                 \
+    struct BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<int>      \
+    { typedef int type; };
+
+# else
+
+#  define BOOST_PARAMETER_FUNCTION_RESULT(result, name, args)  \
+    BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args)
+
+# endif
+
+// Defines implementation function
+# define BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name)           \
+    template <class Args>                                   \
+    typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<    \
+       Args                                                 \
+    >::type BOOST_PARAMETER_IMPL(name)(Args const& args)
+
+# define BOOST_PARAMETER_FUNCTION_IMPL_FWD(name) \
+    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name);
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg) \
+    ( \
+        BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 0, state)) \
+      , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 1, state), arg) \
+      , BOOST_PP_TUPLE_ELEM(4, 2, state) \
+      , BOOST_PP_TUPLE_ELEM(4, 3, state) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_required(state, arg) \
+    BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg)
+
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg) \
+    ( \
+        BOOST_PP_TUPLE_ELEM(4, 0, state) \
+      , BOOST_PP_TUPLE_ELEM(4, 1, state) \
+      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, state)) \
+      , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 3, state), arg) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_optional(state, arg) \
+    BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg)
+
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG(s, state, arg) \
+    BOOST_PP_CAT( \
+        BOOST_PARAMETER_FUNCTION_SPLIT_ARG_ \
+      , BOOST_PARAMETER_FN_ARG_QUALIFIER(arg) \
+    )(state, arg)
+
+// Returns (required_count, required, optional_count, optionals) tuple
+# define BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args) \
+    BOOST_PP_SEQ_FOLD_LEFT( \
+        BOOST_PARAMETER_FUNCTION_SPLIT_ARG \
+      , (0,BOOST_PP_SEQ_NIL, 0,BOOST_PP_SEQ_NIL) \
+      , args \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME(keyword) \
+    BOOST_PP_CAT(BOOST_PP_CAT(keyword,_),type)
+
+// Helpers used as parameters to BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG(r, _, arg) \
+    , class BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \
+              BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
+      )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG(r, _, arg) \
+    , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \
+              BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
+      )& BOOST_PARAMETER_FN_ARG_KEYWORD(arg)
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER(r, _, arg) \
+    , BOOST_PARAMETER_FN_ARG_KEYWORD(arg)
+
+// Produces a name for the dispatch functions.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name) \
+    BOOST_PP_CAT( \
+        boost_param_default_ \
+      , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name)) \
+    )
+
+// Helper macro used below to produce lists based on the keyword argument
+// names. macro is applied to every element. n is the number of
+// optional arguments that should be included.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS(macro, n, split_args) \
+    BOOST_PP_SEQ_FOR_EACH( \
+        macro \
+      , ~ \
+      , BOOST_PP_TUPLE_ELEM(4,1,split_args) \
+    ) \
+    BOOST_PP_SEQ_FOR_EACH( \
+        macro \
+      , ~ \
+      , BOOST_PP_SEQ_FIRST_N( \
+          BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \
+        , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
+        ) \
+    )
+
+// Generates a keyword | default expression.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT(arg, tag_namespace) \
+    boost::parameter::keyword< \
+        tag_namespace::BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
+    >::instance | boost::parameter::aux::use_default_tag()
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG(arg, tag_ns) \
+    BOOST_PARAMETER_FUNCTION_CAST( \
+        args[ \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT( \
+                arg, tag_ns \
+            ) \
+        ] \
+      , BOOST_PARAMETER_FN_ARG_PRED(arg) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY(name, n, split_args, tag_namespace) \
+    { \
+        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
+            (ResultType(*)())0 \
+          , args \
+          , 0L \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+                BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \
+              , n \
+              , split_args \
+            ) \
+          , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG( \
+                BOOST_PP_SEQ_ELEM( \
+                    BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \
+                  , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
+                ) \
+              , tag_namespace \
+            ) \
+        ); \
+    }
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT(arg) \
+    BOOST_PARAMETER_FUNCTION_CAST( \
+        boost::parameter::aux::as_lvalue(BOOST_PARAMETER_FN_ARG_DEFAULT(arg), 0L) \
+      , BOOST_PARAMETER_FN_ARG_PRED(arg) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY(name, n, split_args, tag_ns, const_) \
+    template < \
+        class ResultType \
+      , class Args \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
+          , BOOST_PP_INC(n) \
+          , split_args \
+        ) \
+    > \
+    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
+    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
+        ResultType(*)() \
+      , Args const& args \
+      , long \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
+          , BOOST_PP_INC(n) \
+          , split_args \
+        ) \
+      , boost::parameter::aux::use_default_tag \
+    ) BOOST_PP_EXPR_IF(const_, const) \
+    { \
+        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
+            (ResultType(*)())0 \
+          , args \
+          , 0L \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+                BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \
+              , BOOST_PP_INC(n) \
+              , split_args \
+            ) \
+          , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT( \
+                BOOST_PP_SEQ_ELEM( \
+                    BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), BOOST_PP_INC(n)) \
+                  , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
+                ) \
+            ) \
+        ); \
+    }
+
+// Produces a forwarding layer in the default evaluation machine.
+//
+// data is a tuple:
+//
+//   (name, split_args)
+//
+// Where name is the base name of the function, and split_args is a tuple:
+//
+//   (required_count, required_args, optional_count, required_args)
+//
+
+
+// defines the actual function body for BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION below.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0(z, n, data) \
+    template < \
+        class ResultType \
+      , class Args \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
+          , n \
+          , BOOST_PP_TUPLE_ELEM(5,1,data) \
+        ) \
+    > \
+    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(5,0,data)) \
+    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(BOOST_PP_TUPLE_ELEM(5,0,data))( \
+        ResultType(*)() \
+      , Args const& args \
+      , int \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
+          , n \
+          , BOOST_PP_TUPLE_ELEM(5,1,data) \
+        ) \
+    ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(5,2,data), const) \
+    BOOST_PP_IF( \
+        n \
+      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY \
+      , ; BOOST_PP_TUPLE_EAT(4) \
+    )( \
+        BOOST_PP_TUPLE_ELEM(5,0,data) \
+      , n \
+      , BOOST_PP_TUPLE_ELEM(5,1,data) \
+      , BOOST_PP_TUPLE_ELEM(5,3,data) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION(z, n, data) \
+    BOOST_PP_IF( \
+        BOOST_PP_AND( \
+            BOOST_PP_NOT(n) \
+          , BOOST_PP_TUPLE_ELEM(5,4,data) \
+        ) \
+      , BOOST_PP_TUPLE_EAT(3) \
+      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0 \
+    )(z, n, data) \
+    BOOST_PP_IF( \
+        BOOST_PP_EQUAL(n, BOOST_PP_TUPLE_ELEM(4,2,BOOST_PP_TUPLE_ELEM(5,1,data))) \
+      , BOOST_PP_TUPLE_EAT(5) \
+      , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY \
+    )( \
+        BOOST_PP_TUPLE_ELEM(5,0,data) \
+      , n \
+      , BOOST_PP_TUPLE_ELEM(5,1,data) \
+      , BOOST_PP_TUPLE_ELEM(5,3,data) \
+      , BOOST_PP_TUPLE_ELEM(5,2,data) \
+    )
+
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG(r, tag_ns, arg) \
+    , BOOST_PARAMETER_FUNCTION_CAST( \
+          args[ \
+              boost::parameter::keyword<tag_ns::BOOST_PARAMETER_FN_ARG_KEYWORD(arg)>::instance \
+          ] \
+        , BOOST_PARAMETER_FN_ARG_PRED(arg) \
+      )
+
+// Generates the function template that recives a ArgumentPack, and then
+// goes on to call the layers of overloads generated by 
+// BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER.
+# define BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_ns) \
+    template <class Args> \
+    typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type \
+    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
+    BOOST_PARAMETER_IMPL(name)(Args const& args) BOOST_PP_EXPR_IF(const_, const) \
+    { \
+        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
+            (typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type(*)())0 \
+          , args \
+          , 0L \
+ \
+            BOOST_PP_SEQ_FOR_EACH( \
+                BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG \
+              , tag_ns \
+              , BOOST_PP_TUPLE_ELEM(4,1,split_args) \
+            ) \
+ \
+        ); \
+    }
+
+// Helper for BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER below.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \
+    name, split_args, skip_fwd_decl, const_, tag_namespace \
+  ) \
+    BOOST_PP_REPEAT_FROM_TO( \
+        0 \
+      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, split_args)) \
+      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION \
+      , (name, split_args, const_, tag_namespace, skip_fwd_decl) \
+    ) \
+ \
+    BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_namespace) \
+\
+    template < \
+        class ResultType \
+      , class Args \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
+          , 0 \
+          , split_args \
+        ) \
+    > \
+    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
+    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
+        ResultType(*)() \
+      , Args const& args \
+      , int \
+        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
+            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
+          , 0 \
+          , split_args \
+        ) \
+    ) BOOST_PP_EXPR_IF(const_, const)
+
+// Generates a bunch of forwarding functions that each extract
+// one more argument.
+# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, skip_fwd_decl, const_, tag_ns) \
+    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \
+        name, BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args), skip_fwd_decl, const_, tag_ns \
+    )
+/**/
+
+// Defines the result metafunction and the parameters specialization.
+# define BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)   \
+      BOOST_PARAMETER_FUNCTION_RESULT(result, name, args)                   \
+                                                                            \
+          BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, name, args)    \
+          BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(name);                   \
+
+// Helper for BOOST_PARAMETER_FUNCTION below.
+# define BOOST_PARAMETER_FUNCTION_AUX(result, name, tag_namespace, args)    \
+    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)         \
+    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name); \
+\
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                  \
+        result, name, args, 0                                                \
+      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                      \
+    )                                                                        \
+                                                                             \
+    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 0, 0, tag_namespace)
+
+// Defines a Boost.Parameter enabled function with the new syntax.
+# define BOOST_PARAMETER_FUNCTION(result, name, tag_namespace, args)    \
+    BOOST_PARAMETER_FUNCTION_AUX(                                       \
+        result, name, tag_namespace                                      \
+      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \
+    )                                                                    \
+/**/
+
+// Defines a Boost.Parameter enabled function.
+# define BOOST_PARAMETER_BASIC_FUNCTION_AUX(result, name, tag_namespace, args)    \
+    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)        \
+                                                                            \
+    BOOST_PARAMETER_FUNCTION_IMPL_FWD(name)                                 \
+                                                                            \
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                 \
+        result, name, args, 0                                               \
+      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                     \
+    )                                                                       \
+                                                                            \
+    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name)
+
+# define BOOST_PARAMETER_BASIC_FUNCTION(result, name, tag_namespace, args)  \
+    BOOST_PARAMETER_BASIC_FUNCTION_AUX(                                     \
+        result, name, tag_namespace                                     \
+      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args)                          \
+    )                                                                   \
+/**/
+
+// Defines a Boost.Parameter enabled member function.
+# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX(result, name, tag_namespace, args, const_) \
+    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)                    \
+                                                                                        \
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                             \
+        result, name, args, const_                                                      \
+      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                                 \
+    )                                                                                   \
+                                                                                        \
+    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name) BOOST_PP_EXPR_IF(const_, const)            \
+/**/
+
+# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION(result, name, tag_namespace, args) \
+    BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \
+        result, name, tag_namespace \
+      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
+      , 0 \
+    )
+/**/
+
+# define BOOST_PARAMETER_BASIC_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args) \
+    BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \
+        result, name, tag_namespace \
+      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
+      , 1 \
+    )
+/**/
+
+
+
+# define BOOST_PARAMETER_MEMBER_FUNCTION_AUX(result, name, tag_namespace, const_, args)    \
+    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)         \
+\
+    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                  \
+        result, name, args, const_                                           \
+      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                      \
+    )                                                                        \
+                                                                             \
+    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 1, const_, tag_namespace)
+
+// Defines a Boost.Parameter enabled function with the new syntax.
+# define BOOST_PARAMETER_MEMBER_FUNCTION(result, name, tag_namespace, args)    \
+    BOOST_PARAMETER_MEMBER_FUNCTION_AUX(                                       \
+        result, name, tag_namespace, 0                                     \
+      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \
+    )                                                                    \
+/**/
+
+# define BOOST_PARAMETER_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args)    \
+    BOOST_PARAMETER_MEMBER_FUNCTION_AUX(                                       \
+        result, name, tag_namespace, 1                                     \
+      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \
+    )                                                                    \
+/**/
+
+// Defines a Boost.Parameter enabled constructor.
+
+# define BOOST_PARAMETER_FUNCTION_ARGUMENT(r, _, i, elem) \
+    BOOST_PP_COMMA_IF(i) elem& BOOST_PP_CAT(a, i)
+/**/
+
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+// Older MSVC can't do what's necessary to handle commas in base names; just
+// use a typedef instead if you have a base name that contains commas.
+#  define BOOST_PARAMETER_PARENTHESIZED_BASE(x) BOOST_PP_SEQ_HEAD(x)
+
+# else
+
+#  define BOOST_PARAMETER_PARENTHESIZED_BASE(x) BOOST_PARAMETER_PARENTHESIZED_TYPE(x)
+
+# endif
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00(z, n, r, data, elem) \
+    BOOST_PP_IF( \
+        n \
+      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \
+    )(z, n) \
+    BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(n,1), explicit) \
+    BOOST_PP_TUPLE_ELEM(6,2,data)( \
+        BOOST_PP_IF( \
+            n \
+          , BOOST_PP_SEQ_FOR_EACH_I_R \
+          , BOOST_PP_TUPLE_EAT(4) \
+        )( \
+            r \
+          , BOOST_PARAMETER_FUNCTION_ARGUMENT \
+          , ~ \
+          , elem \
+        ) \
+        BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \
+            z \
+          , BOOST_PP_TUPLE_ELEM(6,3,data) \
+          , BOOST_PP_CAT(constructor_parameters, __LINE__) \
+          , n \
+        ) \
+    ) \
+      : BOOST_PARAMETER_PARENTHESIZED_BASE(BOOST_PP_TUPLE_ELEM(6,3,data)) ( \
+            BOOST_PP_CAT(constructor_parameters, __LINE__)()( \
+                BOOST_PP_ENUM_PARAMS_Z(z, n, a) \
+            ) \
+        ) \
+    {}
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0(r, data, elem) \
+    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \
+        BOOST_PP_TUPLE_ELEM(6,0,data) \
+      , BOOST_PP_TUPLE_ELEM(6,1,data) \
+      , r \
+      , data \
+      , elem \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_PRODUCT(r, product) \
+    (product)
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0(z, n, data) \
+    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \
+        z, n, BOOST_PP_DEDUCE_R() \
+      , (z, n, BOOST_PP_TUPLE_REM(4) data) \
+      , ~ \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N(z, n, data) \
+    BOOST_PP_SEQ_FOR_EACH( \
+        BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0 \
+      , (z, n, BOOST_PP_TUPLE_REM(4) data) \
+      , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
+            BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \
+          , BOOST_PP_SEQ_FIRST_N( \
+                n, BOOST_PP_TUPLE_ELEM(4,2,data) \
+            ) \
+        ) \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR(z, n, data) \
+    BOOST_PP_IF( \
+        n \
+      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N \
+      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0 \
+    )(z,n,data) \
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0(class_,base,args,combinations,range) \
+    BOOST_PP_REPEAT_FROM_TO( \
+        BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \
+      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR \
+      , (class_,base,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \
+    )
+/**/
+
+# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS(class_,base,args,combinations) \
+    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0( \
+        class_, base, args, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \
+    )
+/**/
+
+# define BOOST_PARAMETER_CONSTRUCTOR_AUX(class_, base, tag_namespace, args) \
+    BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, ctor, args)          \
+        BOOST_PP_CAT(constructor_parameters, __LINE__); \
+\
+    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS( \
+        class_, base, args \
+      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
+    ) \
+/**/
+
+# define BOOST_PARAMETER_CONSTRUCTOR(class_, base, tag_namespace, args) \
+    BOOST_PARAMETER_CONSTRUCTOR_AUX( \
+        class_, base, tag_namespace \
+      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
+    )
+/**/
+
+# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+#  define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \
+    (BOOST_PP_IF( \
+        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \
+            BOOST_PARAMETER_FN_ARG_NAME(elem) \
+        ) \
+      , (const ParameterArgumentType ## i)(ParameterArgumentType ## i) \
+      , (const ParameterArgumentType ## i) \
+    ))
+// MSVC6.5 lets us bind rvalues to T&.
+# elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \
+    (BOOST_PP_IF( \
+        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \
+            BOOST_PARAMETER_FN_ARG_NAME(elem) \
+        ) \
+      , (ParameterArgumentType ## i) \
+      , (const ParameterArgumentType ## i) \
+    ))
+// No partial ordering. This feature doesn't work.
+// This is exactly the same as for VC6.5, but we might change it later.
+# else
+#  define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \
+    (BOOST_PP_IF( \
+        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \
+            BOOST_PARAMETER_FN_ARG_NAME(elem) \
+        ) \
+      , (ParameterArgumentType ## i) \
+      , (const ParameterArgumentType ## i) \
+    ))
+# endif
+
+# define BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
+    BOOST_PP_SEQ_FOR_EACH_I(BOOST_PARAMETER_FUNCTION_FWD_COMBINATION, ~, args)
+
+#endif // BOOST_PARAMETER_PREPROCESSOR_060206_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/python.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/python.hpp
new file mode 100644 (file)
index 0000000..a52fc6e
--- /dev/null
@@ -0,0 +1,735 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_PYTHON_060209_HPP
+# define BOOST_PARAMETER_PYTHON_060209_HPP
+
+# include <boost/mpl/vector.hpp>
+# include <boost/mpl/fold.hpp>
+# include <boost/mpl/prior.hpp>
+# include <boost/mpl/shift_right.hpp>
+# include <boost/mpl/shift_left.hpp>
+# include <boost/mpl/bitand.hpp>
+# include <boost/mpl/pair.hpp>
+# include <boost/mpl/size.hpp>
+# include <boost/mpl/push_back.hpp>
+# include <boost/mpl/or.hpp>
+# include <boost/mpl/count_if.hpp>
+# include <boost/mpl/transform.hpp>
+# include <boost/mpl/front.hpp>
+# include <boost/mpl/iterator_range.hpp>
+# include <boost/mpl/next.hpp>
+# include <boost/mpl/begin_end.hpp>
+# include <boost/mpl/not.hpp>
+# include <boost/mpl/empty.hpp>
+# include <boost/python/def.hpp>
+# include <boost/python/make_constructor.hpp>
+# include <boost/python/init.hpp>
+# include <boost/python/to_python_converter.hpp>
+# include <boost/parameter/aux_/maybe.hpp>
+# include <boost/parameter/aux_/python/invoker.hpp>
+
+namespace boost { namespace parameter { namespace python 
+{
+  namespace python_ = boost::python;
+}}}
+
+namespace boost { namespace parameter { namespace python { namespace aux 
+{
+
+  inline PyObject* unspecified_type()
+  {
+      static PyTypeObject unspecified = {
+          PyObject_HEAD_INIT(NULL)
+          0,                                /* ob_size        */
+          "Boost.Parameter.Unspecified",    /* tp_name        */
+          PyType_Type.tp_basicsize,         /* tp_basicsize   */
+          0,                                /* tp_itemsize    */
+          0,                                /* tp_dealloc     */
+          0,                                /* tp_print       */
+          0,                                /* tp_getattr     */
+          0,                                /* tp_setattr     */
+          0,                                /* tp_compare     */
+          0,                                /* tp_repr        */
+          0,                                /* tp_as_number   */
+          0,                                /* tp_as_sequence */
+          0,                                /* tp_as_mapping  */
+          0,                                /* tp_hash        */
+          0,                                /* tp_call        */
+          0,                                /* tp_str         */
+          0,                                /* tp_getattro    */
+          0,                                /* tp_setattro    */
+          0,                                /* tp_as_buffer   */
+          Py_TPFLAGS_DEFAULT,               /* tp_flags       */
+          0,                                /* tp_doc         */
+      };
+
+      if (unspecified.ob_type == 0)
+      {
+          unspecified.ob_type = &PyType_Type;
+          PyType_Ready(&unspecified);
+      }
+
+      return (PyObject*)&unspecified;
+  }
+
+  struct empty_tag {};
+
+  struct empty_tag_to_python
+  {
+      static PyObject* convert(empty_tag)
+      {
+          return python_::xincref(unspecified_type());
+      }
+  };
+
+}}}} // namespace boost::parameter::python::aux
+
+namespace boost { namespace python 
+{
+
+  // Converts a Python value to a maybe<T>
+  template <class T>
+  struct arg_from_python<parameter::aux::maybe<T> >
+    : arg_from_python<T>
+  {
+      arg_from_python(PyObject* p)
+        : arg_from_python<T>(p)
+        , empty(parameter::python::aux::unspecified_type() == p)
+      {}
+
+      bool convertible() const
+      {
+          return empty || arg_from_python<T>::convertible();
+      }
+
+      parameter::aux::maybe<T> operator()()
+      {
+          if (empty)
+          {
+              return parameter::aux::maybe<T>();
+          }
+          else
+          {
+              return parameter::aux::maybe<T>(
+                  arg_from_python<T>::operator()()
+              );
+          }
+      }
+
+      bool empty;
+  };
+
+}} // namespace boost::python
+
+namespace boost { namespace parameter { namespace python {
+
+namespace aux
+{
+
+  template <class K>
+  struct is_optional
+    : mpl::not_<
+          mpl::or_<typename K::required, typename K::optimized_default>
+      >
+  {};
+
+  template <class K, class Required, class Optimized, class T>
+  struct arg_spec
+  {
+      typedef K keyword;
+      typedef Required required;
+      typedef T type;
+      typedef Optimized optimized_default;
+  };
+  
+  template <class K, class T, class Optimized = mpl::false_>
+  struct make_arg_spec_impl
+  {
+      typedef arg_spec<
+          typename K::first, typename K::second, Optimized, T
+      > type;
+  };
+
+  template <class K, class T>
+  struct make_arg_spec_impl<K, T, typename K::third>
+  {
+      typedef arg_spec<
+          typename K::first, typename K::second, typename K::third, T
+      > type;
+  };
+
+  template <class K, class T>
+  struct make_arg_spec
+    : make_arg_spec_impl<K, T>
+  {
+  };
+
+  template <class Spec, class State>
+  struct combinations_op
+  {
+      typedef typename State::second bits;
+      typedef typename State::first result0;
+
+      typedef typename mpl::if_<
+          mpl::or_<
+              typename Spec::required
+            , typename Spec::optimized_default
+            , mpl::bitand_<bits, mpl::long_<1> >
+          >
+        , typename mpl::push_back<result0, Spec>::type
+        , result0
+      >::type result;
+
+      typedef typename mpl::if_<
+          mpl::or_<
+              typename Spec::required
+            , typename Spec::optimized_default
+          >
+        , bits
+        , typename mpl::shift_right<bits, mpl::long_<1> >::type
+      >::type next_bits;
+
+      typedef mpl::pair<
+          result
+        , next_bits
+      > type;
+  };
+
+  // Used as start value in the recursive arg() composition below.
+  struct no_keywords
+  {
+      template <class T>
+      T const& operator,(T const& x) const
+      {
+          return x;
+      }
+  };
+
+  template <class Def, class F, class Iter, class End, class Keywords>
+  void def_combination_aux0(
+      Def def, F f, Iter, End, Keywords const& keywords, mpl::false_)
+  {
+      typedef typename mpl::deref<Iter>::type spec;
+      typedef typename spec::keyword kw;
+
+      def_combination_aux(
+          def, f, typename mpl::next<Iter>::type(), End()
+        , (
+              keywords, boost::python::arg(kw::keyword_name())
+          )
+      );
+  }
+
+  template <class Def, class F, class Iter, class End, class Keywords>
+  void def_combination_aux0(
+      Def def, F f, Iter, End, Keywords const& keywords, mpl::true_)
+  {
+      typedef typename mpl::deref<Iter>::type spec;
+      typedef typename spec::keyword kw;
+
+      def_combination_aux(
+          def, f, typename mpl::next<Iter>::type(), End()
+        , (
+              keywords, boost::python::arg(kw::keyword_name()) = empty_tag()
+          )
+      );
+  }
+
+  inline void initialize_converter()
+  {
+      static python_::to_python_converter<empty_tag, empty_tag_to_python> x;
+  }
+
+  template <class Def, class F, class Iter, class End, class Keywords>
+  void def_combination_aux(
+      Def def, F f, Iter, End, Keywords const& keywords)
+  {
+      typedef typename mpl::deref<Iter>::type spec;
+
+      typedef typename mpl::and_<
+          typename spec::optimized_default
+        , mpl::not_<typename spec::required>
+      >::type optimized_default;
+      
+      def_combination_aux0(
+          def, f, Iter(), End(), keywords, optimized_default()
+      );
+  }
+
+  template <class Def, class F, class End, class Keywords>
+  void def_combination_aux(
+      Def def, F f, End, End, Keywords const& keywords)
+  {
+      def(f, keywords);
+  } 
+
+  template <class Def, class F, class End>
+  void def_combination_aux(
+      Def def, F f, End, End, no_keywords const&)
+  {
+      def(f);
+  }
+
+  template <
+      class Def, class Specs, class Bits, class Invoker
+  >
+  void def_combination(
+      Def def, Specs*, Bits, Invoker*)
+  {
+      typedef typename mpl::fold<
+          Specs
+        , mpl::pair<mpl::vector0<>, Bits>
+        , combinations_op<mpl::_2, mpl::_1>
+      >::type combination0;
+
+      typedef typename combination0::first combination;
+
+      typedef typename mpl::apply_wrap1<
+          Invoker, combination
+      >::type invoker;
+
+      def_combination_aux(
+          def
+        , &invoker::execute
+        , typename mpl::begin<combination>::type()
+        , typename mpl::end<combination>::type()
+        , no_keywords()
+      );
+  }
+
+  template <
+      class Def, class Specs, class Bits, class End, class Invoker
+  >
+  void def_combinations(
+      Def def, Specs*, Bits, End, Invoker*)
+  {
+      initialize_converter();
+
+      def_combination(def, (Specs*)0, Bits(), (Invoker*)0);
+
+      def_combinations(
+          def
+        , (Specs*)0
+        , mpl::long_<Bits::value + 1>()
+        , End()
+        , (Invoker*)0
+      );
+  }
+
+  template <
+      class Def, class Specs, class End, class Invoker
+  >
+  void def_combinations(
+      Def, Specs*, End, End, Invoker*)
+  {}
+
+  struct not_specified {};
+
+  template <class CallPolicies>
+  struct call_policies_as_options
+  {
+      call_policies_as_options(CallPolicies const& call_policies)
+        : call_policies(call_policies)
+      {}
+
+      CallPolicies const& policies() const
+      {
+          return call_policies;
+      }
+
+      char const* doc() const
+      {
+          return 0;
+      }
+
+      CallPolicies call_policies;
+  };
+
+  template <class Class, class Options = not_specified>
+  struct def_class
+  {
+      def_class(Class& cl, char const* name, Options options = Options())
+        : cl(cl)
+        , name(name)
+        , options(options)
+      {}
+
+      template <class F>
+      void def(F f, not_specified const*) const
+      {
+          cl.def(name, f);
+      }
+
+      template <class F>
+      void def(F f, void const*) const
+      {
+          cl.def(name, f, options.doc(), options.policies());
+      }
+      
+      template <class F>
+      void operator()(F f) const
+      {
+          this->def(f, &options);
+      }
+
+      template <class F, class Keywords>
+      void def(F f, Keywords const& keywords, not_specified const*) const
+      {
+          cl.def(name, f, keywords);
+      }
+
+      template <class F, class Keywords>
+      void def(F f, Keywords const& keywords, void const*) const
+      {
+          cl.def(name, f, keywords, options.doc(), options.policies());
+      }
+
+      template <class F, class Keywords>
+      void operator()(F f, Keywords const& keywords) const
+      {
+          this->def(f, keywords, &options);
+      }
+
+      Class& cl;
+      char const* name;
+      Options options;
+  };
+
+  template <class Class, class CallPolicies = boost::python::default_call_policies>
+  struct def_init
+  {
+      def_init(Class& cl, CallPolicies call_policies = CallPolicies())
+        : cl(cl)
+        , call_policies(call_policies)
+      {}
+
+      template <class F>
+      void operator()(F f) const
+      {
+          cl.def(
+              "__init__"
+            , boost::python::make_constructor(f, call_policies)
+          );
+      }
+
+      template <class F, class Keywords>
+      void operator()(F f, Keywords const& keywords) const
+      {
+          cl.def(
+              "__init__"
+            , boost::python::make_constructor(f, call_policies, keywords)
+          );
+      }
+
+      Class& cl;
+      CallPolicies call_policies;
+  };
+
+  struct def_function
+  {
+      def_function(char const* name)
+        : name(name)
+      {}
+      
+      template <class F>
+      void operator()(F f) const
+      {
+          boost::python::def(name, f);
+      }
+
+      template <class F, class Keywords>
+      void operator()(F f, Keywords const& keywords) const
+      {
+          boost::python::def(name, f, keywords);
+      }
+
+      char const* name;
+  };
+
+} // namespace aux
+
+template <class M, class Signature>
+void def(char const* name, Signature)
+{
+    typedef mpl::iterator_range<
+        typename mpl::next<
+            typename mpl::begin<Signature>::type
+        >::type
+      , typename mpl::end<Signature>::type
+    > arg_types;
+
+    typedef typename mpl::transform<
+        typename M::keywords
+      , arg_types
+      , aux::make_arg_spec<mpl::_1, mpl::_2>
+      , mpl::back_inserter<mpl::vector0<> >
+    >::type arg_specs;
+
+    typedef typename mpl::count_if<
+        arg_specs
+      , aux::is_optional<mpl::_1>
+    >::type optional_arity;
+    
+    typedef typename mpl::front<Signature>::type result_type;
+    typedef typename mpl::shift_left<mpl::long_<1>, optional_arity>::type upper;
+
+    aux::def_combinations(
+        aux::def_function(name)
+      , (arg_specs*)0
+      , mpl::long_<0>()
+      , mpl::long_<upper::value>()
+      , (aux::make_invoker<M, result_type>*)0
+    );
+}
+
+template <class M, class Class, class Signature>
+void def(Class& cl, char const* name, Signature)
+{
+    typedef mpl::iterator_range<
+        typename mpl::next<
+            typename mpl::begin<Signature>::type
+        >::type
+      , typename mpl::end<Signature>::type
+    > arg_types;
+
+    typedef typename mpl::transform<
+        typename M::keywords
+      , arg_types
+      , aux::make_arg_spec<mpl::_1, mpl::_2>
+      , mpl::back_inserter<mpl::vector0<> >
+    >::type arg_specs;
+
+    typedef typename mpl::count_if<
+        arg_specs
+      , aux::is_optional<mpl::_1>
+    >::type optional_arity;
+    
+    typedef typename mpl::front<Signature>::type result_type;
+    typedef typename mpl::shift_left<mpl::long_<1>, optional_arity>::type upper;
+
+    aux::def_combinations(
+        aux::def_class<Class>(cl, name)
+      , (arg_specs*)0
+      , mpl::long_<0>()
+      , mpl::long_<upper::value>()
+      , (aux::make_invoker<M, result_type>*)0
+    );
+}
+
+namespace aux
+{
+
+  template <class K>
+  struct keyword
+  {
+      typedef K type;
+  };
+
+  template <class K>
+  struct keyword<K*>
+  {
+      typedef K type;
+  };
+
+  template <class K>
+  struct keyword<K**>
+  {
+      typedef K type;
+  };
+
+  template <class K>
+  struct required
+  {
+      typedef mpl::true_ type;
+  };
+
+  template <class K>
+  struct required<K*>
+  {
+      typedef mpl::false_ type;
+  };
+
+  template <class K>
+  struct optimized
+  {
+      typedef mpl::true_ type;
+  };
+
+  template <class K>
+  struct optimized<K**>
+  {
+      typedef mpl::false_ type;
+  };
+
+  template <class T>
+  struct make_kw_spec;
+
+  template <class K, class T>
+  struct make_kw_spec<K(T)>
+  {
+      typedef arg_spec<
+          typename keyword<K>::type
+        , typename required<K>::type
+        , typename optimized<K>::type
+        , T
+      > type;
+  };
+
+} // namespace aux
+
+template <class ParameterSpecs, class CallPolicies = boost::python::default_call_policies>
+struct init 
+  : boost::python::def_visitor<init<ParameterSpecs, CallPolicies> >
+{
+    init(CallPolicies call_policies = CallPolicies())
+      : call_policies(call_policies)
+    {}
+
+    template <class CallPolicies1>
+    init<ParameterSpecs, CallPolicies1> 
+    operator[](CallPolicies1 const& call_policies) const
+    {
+        return init<ParameterSpecs, CallPolicies1>(call_policies);
+    }
+
+    template <class Class>
+    void visit_aux(Class& cl, mpl::true_) const
+    {
+        cl.def(boost::python::init<>()[call_policies]);
+    }
+
+    template <class Class>
+    void visit_aux(Class& cl, mpl::false_) const
+    {
+        typedef typename mpl::transform<
+            ParameterSpecs
+          , aux::make_kw_spec<mpl::_>
+          , mpl::back_inserter<mpl::vector0<> >
+        >::type arg_specs;
+
+        typedef typename mpl::count_if<
+            arg_specs
+          , aux::is_optional<mpl::_>
+        >::type optional_arity;
+
+        typedef typename mpl::shift_left<mpl::long_<1>, optional_arity>::type upper;
+
+        aux::def_combinations(
+            aux::def_init<Class, CallPolicies>(cl, call_policies)
+          , (arg_specs*)0
+          , mpl::long_<0>()
+          , mpl::long_<upper::value>()
+          , (aux::make_init_invoker<typename Class::wrapped_type>*)0
+        );
+    }
+
+    template <class Class>
+    void visit(Class& cl) const
+    {
+        visit_aux(cl, mpl::empty<ParameterSpecs>());
+    }
+
+    CallPolicies call_policies;
+};
+
+template <class ParameterSpecs, class CallPolicies = boost::python::default_call_policies>
+struct call 
+  : boost::python::def_visitor<call<ParameterSpecs, CallPolicies> >
+{
+    call(CallPolicies const& call_policies = CallPolicies())
+      : call_policies(call_policies)
+    {}
+
+    template <class CallPolicies1>
+    call<ParameterSpecs, CallPolicies1>
+    operator[](CallPolicies1 const& call_policies) const
+    {
+        return call<ParameterSpecs, CallPolicies1>(call_policies);
+    }
+
+    template <class Class>
+    void visit(Class& cl) const
+    {
+        typedef mpl::iterator_range<
+            typename mpl::next<
+                typename mpl::begin<ParameterSpecs>::type
+            >::type
+          , typename mpl::end<ParameterSpecs>::type
+        > arg_types;
+
+        typedef typename mpl::front<ParameterSpecs>::type result_type;
+
+        typedef typename mpl::transform<
+            arg_types
+          , aux::make_kw_spec<mpl::_>
+          , mpl::back_inserter<mpl::vector0<> >
+        >::type arg_specs;
+
+        typedef typename mpl::count_if<
+            arg_specs
+          , aux::is_optional<mpl::_>
+        >::type optional_arity;
+
+        typedef typename mpl::shift_left<mpl::long_<1>, optional_arity>::type upper;
+
+        typedef aux::call_policies_as_options<CallPolicies> options;
+
+        aux::def_combinations(
+            aux::def_class<Class, options>(cl, "__call__", options(call_policies))
+          , (arg_specs*)0
+          , mpl::long_<0>()
+          , mpl::long_<upper::value>()
+          , (aux::make_call_invoker<typename Class::wrapped_type, result_type>*)0
+        );
+    }
+
+    CallPolicies call_policies;
+};
+
+template <class Fwd, class ParameterSpecs>
+struct function 
+  : boost::python::def_visitor<function<Fwd, ParameterSpecs> >
+{
+    template <class Class, class Options>
+    void visit(Class& cl, char const* name, Options const& options) const
+    {
+        typedef mpl::iterator_range<
+            typename mpl::next<
+                typename mpl::begin<ParameterSpecs>::type
+            >::type
+          , typename mpl::end<ParameterSpecs>::type
+        > arg_types;
+
+        typedef typename mpl::front<ParameterSpecs>::type result_type;
+
+        typedef typename mpl::transform<
+            arg_types
+          , aux::make_kw_spec<mpl::_>
+          , mpl::back_inserter<mpl::vector0<> >
+        >::type arg_specs;
+
+        typedef typename mpl::count_if<
+            arg_specs
+          , aux::is_optional<mpl::_>
+        >::type optional_arity;
+
+        typedef typename mpl::shift_left<mpl::long_<1>, optional_arity>::type upper;
+
+        aux::def_combinations(
+            aux::def_class<Class, Options>(cl, name, options)
+          , (arg_specs*)0
+          , mpl::long_<0>()
+          , mpl::long_<upper::value>()
+          , (aux::make_member_invoker<
+                Fwd, result_type, typename Class::wrapped_type
+            >*)0
+        );
+    }
+};
+
+}}} // namespace boost::parameter::python
+
+#endif // BOOST_PARAMETER_PYTHON_060209_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/parameter/value_type.hpp b/deal.II/contrib/boost-1.41.0/include/boost/parameter/value_type.hpp
new file mode 100644 (file)
index 0000000..7415a5c
--- /dev/null
@@ -0,0 +1,108 @@
+// Copyright Daniel Wallin 2006. 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)
+
+#ifndef BOOST_PARAMETER_VALUE_TYPE_060921_HPP
+# define BOOST_PARAMETER_VALUE_TYPE_060921_HPP
+
+# include <boost/mpl/apply.hpp>
+# include <boost/mpl/assert.hpp>
+# include <boost/mpl/and.hpp>
+# include <boost/parameter/aux_/result_of0.hpp>
+# include <boost/parameter/aux_/void.hpp>
+# include <boost/type_traits/is_same.hpp>
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+#  include <boost/mpl/eval_if.hpp>
+# endif
+
+namespace boost { namespace parameter { 
+
+// A metafunction that, given an argument pack, returns the type of
+// the parameter identified by the given keyword.  If no such
+// parameter has been specified, returns Default
+
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+template <class Parameters, class Keyword, class Default>
+struct value_type0
+{
+    typedef typename mpl::apply_wrap3<
+        typename Parameters::binding,Keyword,Default,mpl::false_
+    >::type type;
+
+    BOOST_MPL_ASSERT_NOT((
+        mpl::and_<
+            is_same<Default, void_>
+          , is_same<type, void_>
+        >
+    ));
+};
+# endif
+
+template <class Parameters, class Keyword, class Default = void_>
+# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+struct value_type
+# else
+struct value_type_eti
+# endif
+{
+# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
+  || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    typedef typename mpl::eval_if<
+        mpl::is_placeholder<Parameters>
+      , mpl::identity<int>
+      , value_type0<Parameters,Keyword,Default>
+    >::type type;
+# else
+    typedef typename mpl::apply_wrap3<
+        typename Parameters::binding,Keyword,Default,mpl::false_
+    >::type type;
+
+    BOOST_MPL_ASSERT_NOT((
+        mpl::and_<
+            is_same<Default, void_>
+          , is_same<type, void_>
+        >
+    ));
+# endif
+
+# if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,value_type,(Parameters,Keyword,Default))
+# endif
+};
+
+# if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+template <class Parameters, class Keyword, class Default = void_>
+struct value_type
+{
+    typedef typename mpl::eval_if<
+        is_same<Parameters, int>
+      , mpl::identity<int>
+      , value_type_eti<Parameters, Keyword, Default>
+    >::type type;
+
+    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,value_type,(Parameters,Keyword,Default))
+};
+# endif
+
+// A metafunction that, given an argument pack, returns the type of
+// the parameter identified by the given keyword.  If no such
+// parameter has been specified, returns the type returned by invoking
+// DefaultFn
+template <class Parameters, class Keyword, class DefaultFn>
+struct lazy_value_type
+{
+  typedef typename mpl::apply_wrap3<
+      typename Parameters::binding
+    , Keyword
+    , typename aux::result_of0<DefaultFn>::type
+    , mpl::false_
+  >::type type;
+};
+
+
+}} // namespace boost::parameter
+
+#endif // BOOST_PARAMETER_VALUE_TYPE_060921_HPP
+
similarity index 98%
rename from deal.II/contrib/boost/include/boost/pending/fibonacci_heap.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/pending/fibonacci_heap.hpp
index dfaae4a46edd270cac3b9adda97525d6868aebf0..a386e285e35a1df58aa0116c6e00f2b861feae66 100644 (file)
@@ -14,7 +14,7 @@
 #include <vector>
 #include <functional>
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 //
 // An adaptation of Knuth's Fibonacci heap implementation
@@ -193,7 +193,7 @@ public:
         }
         if (_mark[p] == false) {
           _mark[p] = true;
-         --_degree[p];
+          --_degree[p];
           break;
         } else
           --_degree[p];
similarity index 98%
rename from deal.II/contrib/boost/include/boost/pending/indirect_cmp.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/pending/indirect_cmp.hpp
index c97594933f928b5696bbfda46bc99aff3cfba7fe..5e866561b7683967b81d5a6fab0de040d2b110d1 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <functional>
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 
 namespace boost {
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/pending/mutable_queue.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/pending/mutable_queue.hpp
index b0f1073f12f0778fd256bb4e7b90432936749cf0..a4e2050d9f45a4d53c73d3f55cadbd5d88aab721 100644 (file)
@@ -14,7 +14,7 @@
 #include <vector>
 #include <algorithm>
 #include <functional>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/pending/mutable_heap.hpp>
 #include <boost/pending/is_heap.hpp>
 #include <boost/graph/detail/array_binary_tree.hpp>
similarity index 55%
rename from deal.II/contrib/boost/include/boost/pending/property.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/pending/property.hpp
index f4d2cb91eaa3f507f096818e2f01618f781eefde..448a71911d5eeef29a910b46684b80910d3b83fe 100644 (file)
@@ -1,4 +1,4 @@
-//  (C) Copyright Jeremy Siek 2004 
+//  (C) Copyright Jeremy Siek 2004
 //  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)
@@ -10,7 +10,7 @@
 
 namespace boost {
 
-  struct no_property { 
+  struct no_property {
     typedef no_property tag_type;
     typedef no_property next_type;
     typedef no_property value_type;
@@ -47,14 +47,14 @@ namespace boost {
   };
 
   template <class P>
-  struct has_property { 
+  struct has_property {
     BOOST_STATIC_CONSTANT(bool, value = true);
     typedef true_type type;
   };
   template <>
-  struct has_property<no_property> { 
-    BOOST_STATIC_CONSTANT(bool, value = false); 
-    typedef false_type type; 
+  struct has_property<no_property> {
+    BOOST_STATIC_CONSTANT(bool, value = false);
+    typedef false_type type;
   };
 
 } // namespace boost
@@ -72,13 +72,19 @@ namespace boost {
     typedef typename detail::build_property_tag_value_alist<PropertyList>::type AList;
     typedef typename detail::ev_selector<AList>::type Extractor;
     typedef typename Extractor::template bind_<AList,Tag>::type type;
-#endif  
+#endif
   };
 
+  template <class Tag2>
+  inline detail::error_property_not_found
+  get_property_value(const no_property& p, Tag2) {
+    return detail::error_property_not_found();
+  }
+
   template <class Tag1, class Tag2, class T1, class Base>
-  inline typename property_value<property<Tag1,T1,Base>, Tag2>::type& 
+  inline typename property_value<property<Tag1,T1,Base>, Tag2>::type&
   get_property_value(property<Tag1,T1,Base>& p, Tag2 tag2) {
-    BOOST_STATIC_CONSTANT(bool, 
+    BOOST_STATIC_CONSTANT(bool,
                           match = (detail::same_property<Tag1,Tag2>::value));
     typedef property<Tag1,T1,Base> Prop;
     typedef typename property_value<Prop, Tag2>::type T2;
@@ -88,9 +94,9 @@ namespace boost {
   }
   template <class Tag1, class Tag2, class T1, class Base>
   inline
-  const typename property_value<property<Tag1,T1,Base>, Tag2>::type& 
+  const typename property_value<property<Tag1,T1,Base>, Tag2>::type&
   get_property_value(const property<Tag1,T1,Base>& p, Tag2 tag2) {
-    BOOST_STATIC_CONSTANT(bool, 
+    BOOST_STATIC_CONSTANT(bool,
                           match = (detail::same_property<Tag1,Tag2>::value));
     typedef property<Tag1,T1,Base> Prop;
     typedef typename property_value<Prop, Tag2>::type T2;
@@ -100,33 +106,68 @@ namespace boost {
   }
 
  namespace detail {
+
+     /** This trait returns true if T is no_property. */
+    template <typename T>
+    struct is_no_property
+        : mpl::bool_<is_same<T, no_property>::value>
+    { };
+
 #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
-   template<typename FinalTag, typename FinalType>
-   struct retag_property_list
-   {
-     typedef property<FinalTag, FinalType> type;
-     typedef FinalType retagged;
-   };
-
-   template<typename FinalTag, typename Tag, typename T, typename Base>
-   struct retag_property_list<FinalTag, property<Tag, T, Base> >
-   {
-   private:
-     typedef retag_property_list<FinalTag, Base> next;
-
-   public:
-     typedef property<Tag, T, typename next::type> type;
-     typedef typename next::retagged retagged;
-   };
-
-   template<typename FinalTag>
-   struct retag_property_list<FinalTag, no_property>
-   {
-     typedef no_property type;
-     typedef no_property retagged;
-   };
+    /** @internal @name Retag Property List
+     * This metafunction is used internally to normalize a property if it is
+     * actually modeling a property. Specifically this is used in Boost.Graph
+     * to map user-provided classes into bundled properties.
+     */
+    //@{
+    // One base case of the recursive form (see below). This matches any
+    // retag request that does not include a property<...> or no_property as
+    // the FinalType. This is used for generating bundles in Boost.Graph.
+    template<typename FinalTag, typename FinalType>
+    struct retag_property_list
+    {
+        typedef property<FinalTag, FinalType> type;
+        typedef FinalType retagged;
+    };
+
+    // Recursively retag the nested property list.
+    template<typename FinalTag, typename Tag, typename T, typename Base>
+    struct retag_property_list<FinalTag, property<Tag, T, Base> >
+    {
+    private:
+        typedef retag_property_list<FinalTag, Base> next;
+
+    public:
+        typedef property<Tag, T, typename next::type> type;
+        typedef typename next::retagged retagged;
+    };
+
+    // This base case will correctly deduce the final property type if the
+    // retagged property is given in property form. This should not hide
+    // the base case below.
+    // NOTE: This addresses a problem of layering bundled properties in the BGL
+    // where multiple retaggings will fail to deduce the correct retagged
+    // type.
+    template<typename FinalTag, typename FinalType>
+    struct retag_property_list<FinalTag, property<FinalTag, FinalType> >
+    {
+    public:
+        typedef property<FinalTag, FinalType> type;
+        typedef FinalType retagged;
+    };
+
+    // A final base case of the retag_propert_list, this will terminate a
+    // properly structured list.
+    template<typename FinalTag>
+    struct retag_property_list<FinalTag, no_property>
+    {
+        typedef no_property type;
+        typedef no_property retagged;
+    };
+    //@}
 #endif
-  }
+} // namespace detail
+
 } // namesapce boost
 
 #endif /* BOOST_PROPERTY_HPP */
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/pending/property_serialize.hpp b/deal.II/contrib/boost-1.41.0/include/boost/pending/property_serialize.hpp
new file mode 100644 (file)
index 0000000..ff2623f
--- /dev/null
@@ -0,0 +1,70 @@
+//  (C) Copyright Jeremy Siek 2006
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_PROPERTY_SERIALIZE_HPP
+#define BOOST_PROPERTY_SERIALIZE_HPP
+
+#include <boost/pending/property.hpp>
+#ifdef BOOST_GRAPH_USE_MPI
+#include <boost/mpi/datatype.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#endif // BOOST_GRAPH_USE_MPI
+
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/nvp.hpp>
+
+namespace boost {
+  template<class Archive>
+  inline void serialize(Archive&, no_property&, const unsigned int) { }
+
+  template<class Archive, class Tag, class T, class Base>
+  void 
+  serialize(Archive& ar, property<Tag, T, Base>& prop, 
+            const unsigned int version) 
+  {
+    ar & serialization::make_nvp( "property_base" , boost::serialization::base_object<Base>(prop) );
+    ar & serialization::make_nvp( "property_value" , prop.m_value );
+  }
+
+#ifdef BOOST_GRAPH_USE_MPI
+  namespace mpi {
+    template<typename Tag, typename T, typename Base>
+    struct is_mpi_datatype<property<Tag, T, Base> >
+      : mpl::and_<is_mpi_datatype<T>,
+                  is_mpi_datatype<Base> > { };
+  }
+
+  namespace serialization {
+    template<typename Tag, typename T, typename Base>
+    struct is_bitwise_serializable<property<Tag, T, Base> >
+      : mpl::and_<is_bitwise_serializable<T>,
+                  is_bitwise_serializable<Base> > { };
+
+  template<typename Tag, typename T, typename Base>
+  struct implementation_level<property<Tag, T, Base>  >
+   : mpl::int_<object_serializable> {} ;
+
+  template<typename Tag, typename T, typename Base>
+  struct tracking_level<property<Tag, T, Base>  >
+   : mpl::int_<track_never> {} ;
+
+  }
+#endif // BOOST_GRAPH_USE_MPI
+  
+} // end namespace boost
+
+#ifdef BOOST_GRAPH_USE_MPI
+namespace boost { namespace mpi {
+    template<>
+    struct is_mpi_datatype<boost::no_property> : mpl::true_ { };
+
+} } // end namespace boost::mpi
+
+BOOST_IS_BITWISE_SERIALIZABLE(boost::no_property)
+BOOST_CLASS_IMPLEMENTATION(boost::no_property,object_serializable)
+BOOST_CLASS_TRACKING(boost::no_property,track_never)
+#endif // BOOST_GRAPH_USE_MPI
+
+#endif // BOOST_PROPERTY_SERIALIZE_HPP
similarity index 99%
rename from deal.II/contrib/boost/include/boost/pending/relaxed_heap.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/pending/relaxed_heap.hpp
index 727009a6a49028f4912f46864849450d1a3de706..b3ab2ed202f0fd39c06efcf01e0780ff420abc36 100644 (file)
@@ -10,7 +10,7 @@
 #define BOOST_RELAXED_HEAP_HEADER
 
 #include <functional>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/optional.hpp>
 #include <vector>
 #include <climits> // for CHAR_BIT
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map.hpp
new file mode 100644 (file)
index 0000000..3a64e93
--- /dev/null
@@ -0,0 +1,19 @@
+/*=============================================================================
+Copyright (c) 2009 Trustees of Indiana University
+
+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)
+=============================================================================*/
+// Redirect/warning header, adapted from the version in Spirit
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/property_map/property_map.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/property_map/property_map.hpp"
+#endif
+#endif
+
+#include <boost/property_map/property_map.hpp>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/dynamic_property_map.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/property_map/dynamic_property_map.hpp
index 4fc269b2cb6d831f82be7fe4af827248b9a25185..ea95d544388732c5cc3033aa8281187d376b0996 100644 (file)
@@ -18,7 +18,7 @@
 
 
 #include <boost/config.hpp>
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/any.hpp>
 #include <boost/function/function3.hpp>
@@ -253,7 +253,7 @@ public:
     std::auto_ptr<dynamic_property_map> pm(
       new detail::dynamic_property_map_adaptor<PropertyMap>(property_map));
     property_maps_type::iterator i =
-      property_maps.insert(property_maps_type::value_type(name, 0));
+      property_maps.insert(property_maps_type::value_type(name, (dynamic_property_map*)0));
     i->second = pm.release();
 
     return *this;
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/caching_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/caching_property_map.hpp
new file mode 100644 (file)
index 0000000..54cf146
--- /dev/null
@@ -0,0 +1,96 @@
+// Copyright 2004 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_PARALLEL_CACHING_PROPERTY_MAP_HPP
+#define BOOST_PARALLEL_CACHING_PROPERTY_MAP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/property_map/property_map.hpp>
+
+namespace boost { 
+
+// This probably doesn't belong here
+template<typename Key, typename Value>
+inline void local_put(dummy_property_map, const Key&, const Value&) {}
+
+namespace parallel {
+
+/** Property map that caches values placed in it but does not
+ * broadcast values to remote processors.  This class template is
+ * meant as an adaptor for @ref distributed_property_map that
+ * suppresses communication in the event of a remote @c put operation
+ * by mapping it to a local @c put operation.
+ *
+ * @todo Find a better name for @ref caching_property_map
+ */
+template<typename PropertyMap>
+class caching_property_map
+{
+public:
+  typedef typename property_traits<PropertyMap>::key_type   key_type;
+  typedef typename property_traits<PropertyMap>::value_type value_type;
+  typedef typename property_traits<PropertyMap>::reference  reference;
+  typedef typename property_traits<PropertyMap>::category   category;
+
+  explicit caching_property_map(const PropertyMap& property_map)
+    : property_map(property_map) {}
+
+  PropertyMap&        base()       { return property_map; }
+  const PropertyMap&  base() const { return property_map; }
+
+  template<typename Reduce>
+  void set_reduce(const Reduce& reduce)
+  { property_map.set_reduce(reduce); }
+
+  void reset() { property_map.reset(); }
+
+#if 0
+  reference operator[](const key_type& key) const
+  {
+    return property_map[key];
+  }
+#endif
+
+private:
+  PropertyMap property_map;
+};
+
+template<typename PropertyMap, typename Key>
+inline typename caching_property_map<PropertyMap>::value_type
+get(const caching_property_map<PropertyMap>& pm, const Key& key)
+{ return get(pm.base(), key); }
+
+template<typename PropertyMap, typename Key, typename Value>
+inline void
+local_put(const caching_property_map<PropertyMap>& pm, const Key& key,
+          const Value& value)
+{ local_put(pm.base(), key, value); }
+
+template<typename PropertyMap, typename Key, typename Value>
+inline void
+cache(const caching_property_map<PropertyMap>& pm, const Key& key,
+      const Value& value)
+{ cache(pm.base(), key, value); }
+
+template<typename PropertyMap, typename Key, typename Value>
+inline void
+put(const caching_property_map<PropertyMap>& pm, const Key& key,
+    const Value& value)
+{ local_put(pm.base(), key, value); }
+
+template<typename PropertyMap>
+inline caching_property_map<PropertyMap>
+make_caching_property_map(const PropertyMap& pm)
+{ return caching_property_map<PropertyMap>(pm); }
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_PARALLEL_CACHING_PROPERTY_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/distributed_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/distributed_property_map.hpp
new file mode 100644 (file)
index 0000000..a58d286
--- /dev/null
@@ -0,0 +1,694 @@
+// Copyright (C) 2004-2008 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Nick Edmonds
+//           Andrew Lumsdaine
+
+// The placement of this #include probably looks very odd relative to
+// the #ifndef/#define pair below. However, this placement is
+// extremely important to allow the various property map headers to be
+// included in any order.
+#include <boost/property_map/property_map.hpp>
+
+#ifndef BOOST_PARALLEL_DISTRIBUTED_PROPERTY_MAP_HPP
+#define BOOST_PARALLEL_DISTRIBUTED_PROPERTY_MAP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <boost/optional.hpp>
+#include <boost/graph/parallel/process_group.hpp>
+#include <boost/graph/detail/edge.hpp>
+#include <boost/function/function1.hpp>
+#include <vector>
+#include <set>
+#include <boost/graph/parallel/basic_reduce.hpp>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+#include <map>
+#include <boost/version.hpp>
+#include <boost/graph/distributed/unsafe_serialize.hpp>
+#include <boost/multi_index_container.hpp>
+#include <boost/multi_index/hashed_index.hpp>
+#include <boost/multi_index/member.hpp>
+#include <boost/multi_index/sequenced_index.hpp>
+
+// Serialization functions for constructs we use
+#include <boost/serialization/utility.hpp>
+
+namespace boost { namespace parallel {
+
+using boost::graph::parallel::trigger_receive_context;
+
+namespace detail {
+  /**************************************************************************
+   * Metafunction that degrades an Lvalue Property Map category tag to
+   * a Read Write Property Map category tag.
+   **************************************************************************/
+  template<bool IsLvaluePropertyMap>
+  struct make_nonlvalue_property_map
+  {
+    template<typename T> struct apply { typedef T type; };
+  };
+
+  template<>
+  struct make_nonlvalue_property_map<true>
+  {
+    template<typename>
+    struct apply
+    {
+      typedef read_write_property_map_tag type;
+    };
+  };
+
+  /**************************************************************************
+   * Performs a "put" on a property map so long as the property map is
+   * a Writable Property Map or a mutable Lvalue Property Map. This
+   * is required because the distributed property map's message
+   * handler handles "put" messages even for a const property map,
+   * although receipt of a "put" message is ill-formed.
+   **************************************************************************/
+  template<bool IsLvaluePropertyMap>
+  struct maybe_put_in_lvalue_pm
+  {
+    template<typename PropertyMap, typename Key, typename Value>
+    static inline void
+    do_put(PropertyMap, const Key&, const Value&)
+    { assert(false); }
+  };
+
+  template<>
+  struct maybe_put_in_lvalue_pm<true>
+  {
+    template<typename PropertyMap, typename Key, typename Value>
+    static inline void
+    do_put(PropertyMap pm, const Key& key, const Value& value)
+    { 
+      using boost::put;
+
+      put(pm, key, value); 
+    }
+  };
+
+  template<typename PropertyMap, typename Key, typename Value>
+  inline void
+  maybe_put_impl(PropertyMap pm, const Key& key, const Value& value,
+                 writable_property_map_tag)
+  {
+    using boost::put;
+
+    put(pm, key, value);
+  }
+
+  template<typename PropertyMap, typename Key, typename Value>
+  inline void
+  maybe_put_impl(PropertyMap pm, const Key& key, const Value& value,
+                 lvalue_property_map_tag)
+  {
+    typedef typename property_traits<PropertyMap>::value_type value_type;
+    typedef typename property_traits<PropertyMap>::reference reference;
+    // DPG TBD: Some property maps are improperly characterized as
+    // lvalue_property_maps, when in fact they do not provide true
+    // references. The most typical example is those property maps
+    // built from vector<bool> and its iterators, which deal with
+    // proxies. We don't want to mischaracterize these as not having a
+    // "put" operation, so we only consider an lvalue_property_map as
+    // constant if its reference is const value_type&. In fact, this
+    // isn't even quite correct (think of a
+    // vector<bool>::const_iterator), but at present C++ doesn't
+    // provide us with any alternatives.
+    typedef is_same<const value_type&, reference> is_constant;
+
+    maybe_put_in_lvalue_pm<(!is_constant::value)>::do_put(pm, key, value);
+  }
+
+  template<typename PropertyMap, typename Key, typename Value>
+  inline void
+  maybe_put_impl(PropertyMap, const Key&, const Value&, ...)
+  { assert(false); }
+
+  template<typename PropertyMap, typename Key, typename Value>
+  inline void
+  maybe_put(PropertyMap pm, const Key& key, const Value& value)
+  {
+    maybe_put_impl(pm, key, value,
+                   typename property_traits<PropertyMap>::category());
+  }
+} // end namespace detail
+
+/** The consistency model used by the distributed property map. */
+enum consistency_model {
+  cm_forward = 1 << 0,
+  cm_backward = 1 << 1,
+  cm_bidirectional = cm_forward | cm_backward,
+  cm_flush = 1 << 2,
+  cm_reset = 1 << 3,
+  cm_clear = 1 << 4
+};
+
+/** Distributed property map adaptor.
+ *
+ *  The distributed property map adaptor is a property map whose
+ *  stored values are distributed across multiple non-overlapping
+ *  memory spaces on different processes. Values local to the current
+ *  process are stored within a local property map and may be
+ *  immediately accessed via @c get and @c put. Values stored on
+ *  remote processes may also be access via @c get and @c put, but the
+ *  behavior differs slightly:
+ *
+ *  - @c put operations update a local ghost cell and send a "put"
+ *    message to the process that owns the value. The owner is free to
+ *    update its own "official" value or may ignore the put request.
+ *
+ *  - @c get operations returns the contents of the local ghost
+ *    cell. If no ghost cell is available, one is created using the
+ *    default value provided by the "reduce" operation. See, e.g.,
+ *    @ref basic_reduce and @ref property_reduce.
+ *
+ * Using distributed property maps requires a bit more care than using
+ * local, sequential property maps. While the syntax and semantics are
+ * similar, distributed property maps may contain out-of-date
+ * information that can only be guaranteed to be synchronized by
+ * calling the @ref synchronize function in all processes.
+ *
+ * To address the issue of out-of-date values, distributed property
+ * maps are supplied with a reduction operation. The reduction
+ * operation has two roles:
+ *
+ *   -# When a value is needed for a remote key but no value is
+ *      immediately available, the reduction operation provides a
+ *      suitable default. For instance, a distributed property map
+ *      storing distances may have a reduction operation that returns
+ *      an infinite value as the default, whereas a distributed
+ *      property map for vertex colors may return white as the
+ *      default.
+ *
+ *   -# When a value is received from a remote process, the process
+ *      owning the key associated with that value must determine which
+ *      value---the locally stored value, the value received from a
+ *      remote process, or some combination of the two---will be
+ *      stored as the "official" value in the property map. The
+ *      reduction operation transforms the local and remote values
+ *      into the "official" value to be stored.
+ *
+ * @tparam ProcessGroup the type of the process group over which the
+ * property map is distributed and is also the medium for
+ * communication.
+ *
+ * @tparam StorageMap the type of the property map that will
+ * store values for keys local to this processor. The @c value_type of
+ * this property map will become the @c value_type of the distributed
+ * property map. The distributed property map models the same property
+ * map concepts as the @c LocalPropertyMap, with one exception: a
+ * distributed property map cannot be an LvaluePropertyMap (because
+ * remote values are not addressable), and is therefore limited to
+ * ReadWritePropertyMap.
+ */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+class distributed_property_map
+{
+ public:
+  /// The key type of the property map.
+  typedef typename property_traits<GlobalMap>::key_type key_type;
+
+  /// The value type of the property map.
+  typedef typename property_traits<StorageMap>::value_type value_type;
+  typedef typename property_traits<StorageMap>::reference  reference;
+  typedef ProcessGroup                        process_group_type;
+
+ private:
+  typedef distributed_property_map            self_type;
+  typedef typename property_traits<StorageMap>::category local_category;
+  typedef typename property_traits<StorageMap>::key_type local_key_type;
+  typedef typename property_traits<GlobalMap>::value_type owner_local_pair;
+  typedef typename ProcessGroup::process_id_type process_id_type;
+
+  enum property_map_messages {
+    /** A request to store a value in a property map. The message
+     * contains a std::pair<key, data>.
+     */
+    property_map_put,
+
+    /** A request to retrieve a particular value in a property
+     *  map. The message contains a key. The owner of that key will 
+     *  reply with a value.
+     */
+    property_map_get,
+
+    /** A request to update values stored on a remote processor. The
+     * message contains a vector of keys for which the source
+     * requests updated values. This message will only be transmitted
+     * during synchronization.
+     */
+    property_map_multiget,
+
+    /** A request to store values in a ghost cell. This message
+     * contains a vector of key/value pairs corresponding to the
+     * sequence of keys sent to the source processor.
+     */
+    property_map_multiget_reply,
+
+    /** The payload containing a vector of local key-value pairs to be
+     * put into the remote property map. A key-value std::pair will be
+     * used to store each local key-value pair.
+     */
+    property_map_multiput
+  };
+
+ public:
+  /// The type of the ghost cells
+  typedef multi_index::multi_index_container<
+            std::pair<key_type, value_type>,
+            multi_index::indexed_by<
+              multi_index::sequenced<>,
+              multi_index::hashed_unique<
+                multi_index::member<std::pair<key_type, value_type>,
+                                    key_type,
+                                    &std::pair<key_type, value_type>::first>
+              >
+            >
+          > ghost_cells_type;
+
+  /// Iterator into the ghost cells
+  typedef typename ghost_cells_type::iterator iterator;
+
+  /// Key-based index into the ghost cells
+  typedef typename ghost_cells_type::template nth_index<1>::type
+    ghost_cells_key_index_type;
+
+  /// Iterator into the ghost cells (by key)
+  typedef typename ghost_cells_key_index_type::iterator key_iterator;
+
+  /** The property map category.  A distributed property map cannot be
+   * an Lvalue Property Map, because values on remote processes cannot
+   * be addresses.
+   */
+  typedef typename detail::make_nonlvalue_property_map<
+    (is_base_and_derived<lvalue_property_map_tag, local_category>::value
+     || is_same<lvalue_property_map_tag, local_category>::value)>
+    ::template apply<local_category>::type category;
+
+  /** Default-construct a distributed property map.  This function
+   * creates an initialized property map that must be assigned to a
+   * valid value before being used. It is only provided here because
+   * property maps must be Default Constructible.
+   */
+  distributed_property_map() {}
+
+  /** Construct a distributed property map.  Builds a distributed
+   * property map communicating over the given process group and using
+   * the given local property map for storage. Since no reduction
+   * operation is provided, the default reduction operation @c
+   * basic_reduce<value_type> is used.
+   */
+  distributed_property_map(const ProcessGroup& pg, const GlobalMap& global,
+                           const StorageMap& pm)
+    : data(new data_t(pg, global, pm, basic_reduce<value_type>(), false))
+  {
+    typedef handle_message<basic_reduce<value_type> > Handler;
+
+    data->ghost_cells.reset(new ghost_cells_type());
+    Handler handler(data);
+    data->process_group.replace_handler(handler, true);
+    data->process_group.template get_receiver<Handler>()
+      ->setup_triggers(data->process_group);
+  }
+
+  /** Construct a distributed property map.  Builds a distributed
+   * property map communicating over the given process group and using
+   * the given local property map for storage. The given @p reduce
+   * parameter is used as the reduction operation.
+   */
+  template<typename Reduce>
+  distributed_property_map(const ProcessGroup& pg, const GlobalMap& global,
+                           const StorageMap& pm,
+                           const Reduce& reduce);
+
+  ~distributed_property_map();
+
+  /// Set the reduce operation of the distributed property map.
+  template<typename Reduce>
+  void set_reduce(const Reduce& reduce);
+
+  // Set the consistency model for the distributed property map
+  void set_consistency_model(int model);
+
+  // Get the consistency model
+  int get_consistency_model() const { return data->model; }
+
+  // Set the maximum number of ghost cells that we are allowed to
+  // maintain. If 0, all ghost cells will be retained.
+  void set_max_ghost_cells(std::size_t max_ghost_cells);
+
+  // Clear out all ghost cells
+  void clear();
+
+  // Reset the values in all ghost cells to the default value
+  void reset();
+
+  // Flush all values destined for remote processors
+  void flush();
+
+  reference operator[](const key_type& key) const
+  {
+    owner_local_pair p = get(data->global, key);
+    
+    if (p.first == process_id(data->process_group)) {
+      return data->storage[p.second];
+    } else {
+      return cell(key);
+    }
+  }
+
+  process_group_type process_group() const
+  {
+    return data->process_group.base();
+  }
+
+  StorageMap&       base()       { return data->storage; }
+  const StorageMap& base() const { return data->storage; }
+
+  /** Sends a "put" request.
+   * \internal
+   *
+   */
+  void 
+  request_put(process_id_type p, const key_type& k, const value_type& v) const
+  { 
+    send(data->process_group, p, property_map_put, 
+         boost::parallel::detail::make_untracked_pair(k, v)); 
+  }
+
+  /** Access the ghost cell for the given key.
+   * \internal
+   */
+  value_type& cell(const key_type& k, bool request_if_missing = true) const;
+
+  /** Perform synchronization
+   * \internal
+   */
+  void do_synchronize();
+
+  const GlobalMap& global() const { return data->global; }
+  GlobalMap&       global()       { return data->global; }
+
+  struct data_t
+  {
+    data_t(const ProcessGroup& pg, const GlobalMap& global, 
+           const StorageMap& pm, const function1<value_type, key_type>& dv,
+           bool has_default_resolver)
+      : process_group(pg), global(global), storage(pm), 
+        ghost_cells(), max_ghost_cells(1000000), get_default_value(dv), 
+        has_default_resolver(has_default_resolver), model(cm_forward) { }
+
+    /// The process group
+    ProcessGroup process_group;
+
+    /// A mapping from the keys of this property map to the global
+    /// descriptor.
+    GlobalMap global;
+
+    /// Local property map
+    StorageMap storage;
+
+    /// The ghost cells
+    shared_ptr<ghost_cells_type> ghost_cells;
+
+    /// The maximum number of ghost cells we are permitted to hold. If
+    /// zero, we are permitted to have an infinite number of ghost
+    /// cells.
+    std::size_t max_ghost_cells;
+
+    /// Default value for remote ghost cells, as defined by the
+    /// reduction operation.
+    function1<value_type, key_type> get_default_value;
+
+    /// True if this resolver is the "default" resolver, meaning that
+    /// we should not be able to get() a default value; it needs to be
+    /// request()ed first.
+    bool has_default_resolver;
+
+    // Current consistency model
+    int model;
+
+    // Function that resets all of the ghost cells to their default
+    // values. It knows the type of the resolver, so we can eliminate
+    // a large number of calls through function pointers.
+    void (data_t::*reset)();
+
+    // Clear out all ghost cells
+    void clear();
+
+    // Flush all values destined for remote processors
+    void flush();
+
+    // Send out requests to "refresh" the values of ghost cells that
+    // we're holding.
+    void refresh_ghost_cells();
+
+  private:
+    template<typename Resolver> void do_reset();
+
+    friend class distributed_property_map;
+  };
+  friend struct data_t;
+
+  shared_ptr<data_t> data;
+
+ private:
+  // Prunes the least recently used ghost cells until we have @c
+  // max_ghost_cells or fewer ghost cells.
+  void prune_ghost_cells() const;
+
+  /** Handles incoming messages.
+   *
+   * This function object is responsible for handling all incoming
+   * messages for the distributed property map.
+   */
+  template<typename Reduce>
+  struct handle_message
+  {
+    explicit handle_message(const shared_ptr<data_t>& data,
+                            const Reduce& reduce = Reduce())
+      : data_ptr(data), reduce(reduce) { }
+
+    void operator()(process_id_type source, int tag);
+
+    /// Individual message handlers
+    void 
+    handle_put(int source, int tag, 
+               const boost::parallel::detail::untracked_pair<key_type, value_type>& data, 
+               trigger_receive_context);
+
+    value_type
+    handle_get(int source, int tag, const key_type& data, 
+               trigger_receive_context);
+
+    void
+    handle_multiget(int source, int tag, 
+                    const std::vector<key_type>& data,
+                    trigger_receive_context);
+
+    void
+    handle_multiget_reply
+      (int source, int tag, 
+       const std::vector<boost::parallel::detail::untracked_pair<key_type, value_type> >& msg,
+       trigger_receive_context);
+
+    void
+    handle_multiput
+      (int source, int tag, 
+       const std::vector<unsafe_pair<local_key_type, value_type> >& data,
+       trigger_receive_context);
+
+    void setup_triggers(process_group_type& pg);
+
+  private:
+    weak_ptr<data_t> data_ptr;
+    Reduce reduce;
+  };
+
+  /* Sets up the next stage in a multi-stage synchronization, for
+     bidirectional consistency. */
+  struct on_synchronize
+  {
+    explicit on_synchronize(const shared_ptr<data_t>& data) : data_ptr(data) { }
+
+    void operator()();
+
+  private:
+    weak_ptr<data_t> data_ptr;
+  };
+};
+
+/* An implementation helper macro for the common case of naming
+   distributed property maps with all of the normal template
+   parameters. */
+#define PBGL_DISTRIB_PMAP                                       \
+  distributed_property_map<ProcessGroup, GlobalMap, StorageMap>
+
+/* Request that the value for the given remote key be retrieved in
+   the next synchronization round. */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline void
+request(const PBGL_DISTRIB_PMAP& pm,
+        typename PBGL_DISTRIB_PMAP::key_type const& key)
+{
+  if (get(pm.data->global, key).first != process_id(pm.data->process_group))
+    pm.cell(key, false);
+}
+
+/** Get the value associated with a particular key.  Retrieves the
+ * value associated with the given key. If the key denotes a
+ * locally-owned object, it returns the value from the local property
+ * map; if the key denotes a remotely-owned object, retrieves the
+ * value of the ghost cell for that key, which may be the default
+ * value provided by the reduce operation.
+ *
+ * Complexity: For a local key, O(1) get operations on the underlying
+ * property map. For a non-local key, O(1) accesses to the ghost cells.
+ */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline
+typename PBGL_DISTRIB_PMAP::value_type
+get(const PBGL_DISTRIB_PMAP& pm,
+    typename PBGL_DISTRIB_PMAP::key_type const& key)
+{
+  using boost::get;
+
+  typename property_traits<GlobalMap>::value_type p = 
+    get(pm.data->global, key);
+
+  if (p.first == process_id(pm.data->process_group)) {
+    return get(pm.data->storage, p.second);
+  } else {
+    return pm.cell(key);
+  }
+}
+
+/** Put a value associated with the given key into the property map.
+ * When the key denotes a locally-owned object, this operation updates
+ * the underlying local property map. Otherwise, the local ghost cell
+ * is updated and a "put" message is sent to the processor owning this
+ * key.
+ *
+ * Complexity: For a local key, O(1) put operations on the underlying
+ * property map. For a nonlocal key, O(1) accesses to the ghost cells
+ * and will send O(1) messages of size O(sizeof(key) + sizeof(value)).
+ */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+put(const PBGL_DISTRIB_PMAP& pm,
+    typename PBGL_DISTRIB_PMAP::key_type const & key,
+    typename PBGL_DISTRIB_PMAP::value_type const & value)
+{
+  using boost::put;
+
+  typename property_traits<GlobalMap>::value_type p = 
+    get(pm.data->global, key);
+
+  if (p.first == process_id(pm.data->process_group)) {
+    put(pm.data->storage, p.second, value);
+  } else {
+    if (pm.data->model & cm_forward) 
+      pm.request_put(p.first, key, value);
+
+    pm.cell(key, false) = value;
+  }
+}
+
+/** Put a value associated with a given key into the local view of the
+ * property map. This operation is equivalent to @c put, but with one
+ * exception: no message will be sent to the owning processor in the
+ * case of a remote update. The effect is that any value written via
+ * @c local_put for a remote key may be overwritten in the next
+ * synchronization round.
+ */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+local_put(const PBGL_DISTRIB_PMAP& pm,
+          typename PBGL_DISTRIB_PMAP::key_type const & key,
+          typename PBGL_DISTRIB_PMAP::value_type const & value)
+{
+  using boost::put;
+
+  typename property_traits<GlobalMap>::value_type p = 
+    get(pm.data->global, key);
+
+  if (p.first == process_id(pm.data->process_group))
+    put(pm.data->storage, p.second, value);
+  else pm.cell(key, false) = value;
+}
+
+/** Cache the value associated with the given remote key. If the key
+ *  is local, ignore the operation. */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline void
+cache(const PBGL_DISTRIB_PMAP& pm,
+      typename PBGL_DISTRIB_PMAP::key_type const & key,
+      typename PBGL_DISTRIB_PMAP::value_type const & value)
+{
+  typename ProcessGroup::process_id_type id = get(pm.data->global, key).first;
+
+  if (id != process_id(pm.data->process_group)) pm.cell(key, false) = value;
+}
+
+/// Synchronize the property map.
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+synchronize(PBGL_DISTRIB_PMAP& pm)
+{
+  pm.do_synchronize();
+}
+
+/// Create a distributed property map.
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+inline distributed_property_map<ProcessGroup, GlobalMap, StorageMap>
+make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, 
+                              StorageMap storage)
+{
+  typedef distributed_property_map<ProcessGroup, GlobalMap, StorageMap>
+    result_type;
+  return result_type(pg, global, storage);
+}
+
+/**
+ * \overload
+ */
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap, 
+         typename Reduce>
+inline distributed_property_map<ProcessGroup, GlobalMap, StorageMap>
+make_distributed_property_map(const ProcessGroup& pg, GlobalMap global, 
+                              StorageMap storage, Reduce reduce)
+{
+  typedef distributed_property_map<ProcessGroup, GlobalMap, StorageMap>
+    result_type;
+  return result_type(pg, global, storage, reduce);
+}
+
+} } // end namespace boost::parallel
+
+// Boost's functional/hash
+namespace boost {
+  template<typename D, typename V>
+  struct hash<boost::detail::edge_desc_impl<D, V> >
+  {
+    std::size_t operator()(const boost::detail::edge_desc_impl<D, V> & x) const
+    { return hash_value(x.get_property()); }
+  };
+}
+
+#include <boost/property_map/parallel/impl/distributed_property_map.ipp>
+
+#undef PBGL_DISTRIB_PMAP
+
+#endif // BOOST_PARALLEL_DISTRIBUTED_PROPERTY_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/global_index_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/global_index_map.hpp
new file mode 100644 (file)
index 0000000..e40d27a
--- /dev/null
@@ -0,0 +1,74 @@
+// Copyright 2005 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+#ifndef BOOST_PARALLEL_GLOBAL_INDEX_MAP_HPP
+#define BOOST_PARALLEL_GLOBAL_INDEX_MAP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <boost/property_map/property_map.hpp>
+#include <vector>
+#include <boost/shared_ptr.hpp>
+
+namespace boost { namespace parallel {
+
+template<typename IndexMap, typename GlobalMap>
+class global_index_map
+{
+public:
+  typedef typename property_traits<IndexMap>::key_type key_type;
+  typedef typename property_traits<IndexMap>::value_type value_type;
+  typedef value_type reference;
+  typedef readable_property_map_tag category;
+
+  template<typename ProcessGroup>
+  global_index_map(ProcessGroup pg, value_type num_local_indices, 
+                   IndexMap index_map, GlobalMap global)
+    : index_map(index_map), global(global)
+  {
+    typedef typename ProcessGroup::process_id_type process_id_type;
+    starting_index.reset(new std::vector<value_type>(num_processes(pg) + 1));
+    send(pg, 0, 0, num_local_indices);
+    synchronize(pg);
+    
+    // Populate starting_index in all processes
+    if (process_id(pg) == 0) {
+      (*starting_index)[0] = 0;
+      for (process_id_type src = 0; src < num_processes(pg); ++src) {
+        value_type n;
+        receive(pg, src, 0, n);
+        (*starting_index)[src + 1] = (*starting_index)[src] + n;
+      }
+      for (process_id_type dest = 1; dest < num_processes(pg); ++dest)
+        send(pg, dest, 1, &starting_index->front(), num_processes(pg));
+      synchronize(pg);
+    } else {
+      synchronize(pg);
+      receive(pg, 0, 1, &starting_index->front(), num_processes(pg));
+    }
+  }
+
+  friend inline value_type 
+  get(const global_index_map& gim, const key_type& x)
+  {
+    using boost::get;
+    return (*gim.starting_index)[get(gim.global, x).first]
+           + get(gim.index_map, x);
+  }
+
+private:
+  shared_ptr<std::vector<value_type> > starting_index;
+  IndexMap index_map;
+  GlobalMap global;
+};
+
+} } // end namespace boost::parallel
+
+#endif // BOOST_PARALLEL_GLOBAL_INDEX_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/impl/distributed_property_map.ipp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/impl/distributed_property_map.ipp
new file mode 100644 (file)
index 0000000..0d8f946
--- /dev/null
@@ -0,0 +1,431 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Nick Edmonds
+//           Andrew Lumsdaine
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/graph/parallel/detail/untracked_pair.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/bind.hpp>
+#include <boost/graph/parallel/simple_trigger.hpp>
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+namespace boost { namespace parallel {
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+PBGL_DISTRIB_PMAP
+::distributed_property_map(const ProcessGroup& pg, const GlobalMap& global,
+                           const StorageMap& pm, const Reduce& reduce)
+  : data(new data_t(pg, global, pm, reduce, Reduce::non_default_resolver))
+{
+  typedef handle_message<Reduce> Handler;
+
+  data->ghost_cells.reset(new ghost_cells_type());
+  data->reset = &data_t::template do_reset<Reduce>;
+  data->process_group.replace_handler(Handler(data, reduce));
+  data->process_group.template get_receiver<Handler>()
+    ->setup_triggers(data->process_group);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+PBGL_DISTRIB_PMAP::~distributed_property_map() { }
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void 
+PBGL_DISTRIB_PMAP::set_reduce(const Reduce& reduce)
+{
+  typedef handle_message<Reduce> Handler;
+  data->process_group.replace_handler(Handler(data, reduce));
+  Handler* handler = data->process_group.template get_receiver<Handler>();
+  assert(handler);
+  handler->setup_triggers(data->process_group);
+  data->get_default_value = reduce;
+  data->has_default_resolver = Reduce::non_default_resolver;
+  int model = data->model;
+  data->reset = &data_t::template do_reset<Reduce>;
+  set_consistency_model(model);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::prune_ghost_cells() const
+{
+  if (data->max_ghost_cells == 0)
+    return;
+
+  while (data->ghost_cells->size() > data->max_ghost_cells) {
+    // Evict the last ghost cell
+
+    if (data->model & cm_flush) {
+      // We need to flush values when we evict them.
+      boost::parallel::detail::untracked_pair<key_type, value_type> const& victim
+        = data->ghost_cells->back();
+      send(data->process_group, get(data->global, victim.first).first, 
+           property_map_put, victim);
+    }
+
+    // Actually remove the ghost cell
+    data->ghost_cells->pop_back();
+  }
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+typename PBGL_DISTRIB_PMAP::value_type&
+PBGL_DISTRIB_PMAP::cell(const key_type& key, bool request_if_missing) const
+{
+  // Index by key
+  ghost_cells_key_index_type const& key_index 
+    = data->ghost_cells->template get<1>();
+
+  // Search for the ghost cell by key, and project back to the sequence
+  iterator ghost_cell 
+    = data->ghost_cells->template project<0>(key_index.find(key));
+  if (ghost_cell == data->ghost_cells->end()) {
+    value_type value;
+    if (data->has_default_resolver)
+      // Since we have a default resolver, use it to create a default
+      // value for this ghost cell.
+      value = data->get_default_value(key);
+    else if (request_if_missing)
+      // Request the actual value of this key from its owner
+      send_oob_with_reply(data->process_group, get(data->global, key).first, 
+                          property_map_get, key, value);
+    else
+      value = value_type();
+
+    // Create a ghost cell containing the new value
+    ghost_cell 
+      = data->ghost_cells->push_front(std::make_pair(key, value)).first;
+
+    // If we need to, prune the ghost cells
+    if (data->max_ghost_cells > 0)
+      prune_ghost_cells();
+  } else if (data->max_ghost_cells > 0)
+    // Put this cell at the beginning of the MRU list
+    data->ghost_cells->relocate(data->ghost_cells->begin(), ghost_cell);
+
+  return const_cast<value_type&>(ghost_cell->second);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP
+::handle_message<Reduce>::operator()(process_id_type source, int tag)
+{
+  assert(false);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+handle_put(int /*source*/, int /*tag*/, 
+           const boost::parallel::detail::untracked_pair<key_type, value_type>& req, trigger_receive_context)
+{
+  using boost::get;
+
+  shared_ptr<data_t> data(data_ptr);
+
+  owner_local_pair p = get(data->global, req.first);
+  assert(p.first == process_id(data->process_group));
+
+  detail::maybe_put(data->storage, p.second,
+                    reduce(req.first,
+                           get(data->storage, p.second),
+                           req.second));
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+typename PBGL_DISTRIB_PMAP::value_type
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+handle_get(int source, int /*tag*/, const key_type& key, 
+           trigger_receive_context)
+{
+  using boost::get;
+
+  shared_ptr<data_t> data(data_ptr);
+  assert(data);
+
+  owner_local_pair p = get(data->global, key);
+  return get(data->storage, p.second);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+handle_multiget(int source, int tag, const std::vector<key_type>& keys,
+                trigger_receive_context)
+{
+  shared_ptr<data_t> data(data_ptr);
+  assert(data);
+
+  typedef boost::parallel::detail::untracked_pair<key_type, value_type> key_value;
+  std::vector<key_value> results;
+  std::size_t n = keys.size();
+  results.reserve(n);
+
+  using boost::get;
+
+  for (std::size_t i = 0; i < n; ++i) {
+    local_key_type local_key = get(data->global, keys[i]).second;
+    results.push_back(key_value(keys[i], get(data->storage, local_key)));
+  }
+  send(data->process_group, source, property_map_multiget_reply, results);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+handle_multiget_reply
+  (int source, int tag, 
+   const std::vector<boost::parallel::detail::untracked_pair<key_type, value_type> >& msg,
+   trigger_receive_context)
+{
+  shared_ptr<data_t> data(data_ptr);
+  assert(data);
+
+  // Index by key
+  ghost_cells_key_index_type const& key_index 
+    = data->ghost_cells->template get<1>();
+
+  std::size_t n = msg.size();
+  for (std::size_t i = 0; i < n; ++i) {
+    // Search for the ghost cell by key, and project back to the sequence
+    iterator position
+      = data->ghost_cells->template project<0>(key_index.find(msg[i].first));
+
+    if (position != data->ghost_cells->end())
+      const_cast<value_type&>(position->second) = msg[i].second;
+  }
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+handle_multiput
+  (int source, int tag, 
+   const std::vector<unsafe_pair<local_key_type, value_type> >& values,
+   trigger_receive_context)
+{
+  using boost::get;
+
+  shared_ptr<data_t> data(data_ptr);
+  assert(data);
+
+  std::size_t n = values.size();
+  for (std::size_t i = 0; i < n; ++i) {
+    local_key_type local_key = values[i].first;
+    value_type local_value = get(data->storage, local_key);
+    detail::maybe_put(data->storage, values[i].first,
+                      reduce(values[i].first,
+                             local_value,
+                             values[i].second));
+  }
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Reduce>
+void
+PBGL_DISTRIB_PMAP::handle_message<Reduce>::
+setup_triggers(process_group_type& pg)
+{
+  using boost::graph::parallel::simple_trigger;
+
+  simple_trigger(pg, property_map_put, this, &handle_message::handle_put);
+  simple_trigger(pg, property_map_get, this, &handle_message::handle_get);
+  simple_trigger(pg, property_map_multiget, this, 
+                 &handle_message::handle_multiget);
+  simple_trigger(pg, property_map_multiget_reply, this, 
+                 &handle_message::handle_multiget_reply);
+  simple_trigger(pg, property_map_multiput, this, 
+                 &handle_message::handle_multiput);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+PBGL_DISTRIB_PMAP
+::on_synchronize::operator()()
+{
+  int stage=0; // we only get called at the start now
+  shared_ptr<data_t> data(data_ptr);
+  assert(data);
+
+  // Determine in which stage backward consistency messages should be sent.
+  int backward_stage = -1;
+  if (data->model & cm_backward) {
+    if (data->model & cm_flush) backward_stage = 1;
+    else backward_stage = 0;
+  }
+
+  // Flush results in first stage
+  if (stage == 0 && data->model & cm_flush)
+    data->flush();
+
+  // Backward consistency
+  if (stage == backward_stage && !(data->model & (cm_clear | cm_reset)))
+    data->refresh_ghost_cells();
+
+  // Optionally clear results
+  if (data->model & cm_clear)
+    data->clear();
+
+  // Optionally reset results
+  if (data->model & cm_reset) {
+    if (data->reset) ((*data).*data->reset)();
+  }
+}
+
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+PBGL_DISTRIB_PMAP::set_consistency_model(int model)
+{
+  data->model = model;
+
+  int stages = 1;
+  bool need_on_synchronize = (model != cm_forward);
+
+  // Backward consistency is a two-stage process.
+  if (model & cm_backward) {
+    if (model & cm_flush) stages = 3;
+    else stages = 2;
+
+    // For backward consistency to work, we absolutely cannot throw
+    // away any ghost cells.
+    data->max_ghost_cells = 0;
+  }
+
+  // attach the on_synchronize handler.
+  if (need_on_synchronize)
+    data->process_group.replace_on_synchronize_handler(on_synchronize(data));
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void
+PBGL_DISTRIB_PMAP::set_max_ghost_cells(std::size_t max_ghost_cells)
+{
+  if ((data->model & cm_backward) && max_ghost_cells > 0)
+      boost::throw_exception(std::runtime_error("distributed_property_map::set_max_ghost_cells: "
+                                                "cannot limit ghost-cell usage with a backward "
+                                                "consistency model"));
+
+  if (max_ghost_cells == 1)
+    // It is not safe to have only 1 ghost cell; the cell() method
+    // will fail.
+    max_ghost_cells = 2;
+
+  data->max_ghost_cells = max_ghost_cells;
+  prune_ghost_cells();
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::clear()
+{
+  data->clear();
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::data_t::clear()
+{
+  ghost_cells->clear();
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::reset()
+{
+  if (data->reset) ((*data).*data->reset)();
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::flush()
+{
+  data->flush();
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::data_t::refresh_ghost_cells()
+{
+  using boost::get;
+
+  std::vector<std::vector<key_type> > keys;
+  keys.resize(num_processes(process_group));
+
+  // Collect the set of keys for which we will request values
+  for (iterator i = ghost_cells->begin(); i != ghost_cells->end(); ++i)
+    keys[get(global, i->first).first].push_back(i->first);
+
+  // Send multiget requests to each of the other processors
+  typedef typename ProcessGroup::process_size_type process_size_type;
+  process_size_type n = num_processes(process_group);
+  process_id_type id = process_id(process_group);
+  for (process_size_type p = (id + 1) % n ; p != id ; p = (p + 1) % n) {
+    if (!keys[p].empty())
+      send(process_group, p, property_map_multiget, keys[p]);
+  }  
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::data_t::flush()
+{
+  using boost::get;
+
+  int n = num_processes(process_group);
+  std::vector<std::vector<unsafe_pair<local_key_type, value_type> > > values;
+  values.resize(n);
+
+  // Collect all of the flushed values
+  for (iterator i = ghost_cells->begin(); i != ghost_cells->end(); ++i) {
+    std::pair<int, local_key_type> g = get(global, i->first);
+    values[g.first].push_back(std::make_pair(g.second, i->second));
+  }
+
+  // Transmit flushed values
+  for (int p = 0; p < n; ++p) {
+    if (!values[p].empty())
+      send(process_group, p, property_map_multiput, values[p]);
+  }
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+void PBGL_DISTRIB_PMAP::do_synchronize()
+{
+  if (data->model & cm_backward) {
+    synchronize(data->process_group);
+    return;
+  }
+
+  // Request refreshes of the values of our ghost cells
+  data->refresh_ghost_cells();
+
+  // Allows all of the multigets to get to their destinations
+  synchronize(data->process_group);
+
+  // Allows all of the multiget responses to get to their destinations
+  synchronize(data->process_group);
+}
+
+template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+template<typename Resolver>
+void PBGL_DISTRIB_PMAP::data_t::do_reset()
+{
+  Resolver* resolver = get_default_value.template target<Resolver>();
+  assert(resolver);
+
+  for (iterator i = ghost_cells->begin(); i != ghost_cells->end(); ++i)
+    const_cast<value_type&>(i->second) = (*resolver)(i->first);
+}
+
+} } // end namespace boost::parallel
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/local_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/parallel/local_property_map.hpp
new file mode 100644 (file)
index 0000000..85e4274
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright (C) 2004-2006 The Trustees of Indiana University.
+
+// 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)
+
+//  Authors: Douglas Gregor
+//           Andrew Lumsdaine
+
+// The placement of this #include probably looks very odd relative to
+// the #ifndef/#define pair below. However, this placement is
+// extremely important to allow the various property map headers to be
+// included in any order.
+#include <boost/property_map/property_map.hpp>
+
+#ifndef BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
+#define BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
+
+#ifndef BOOST_GRAPH_USE_MPI
+#error "Parallel BGL files should not be included unless <boost/graph/use_mpi.hpp> has been included"
+#endif
+
+#include <cassert>
+
+namespace boost {
+  /** Property map that accesses an underlying, local property map
+   * using a subset of the global keys.
+   */
+  template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+  class local_property_map
+  {
+    typedef typename property_traits<GlobalMap>::value_type owner_local_pair;
+
+  public:
+    typedef ProcessGroup                                   process_group_type;
+    typedef typename property_traits<StorageMap>::value_type value_type;
+    typedef typename property_traits<GlobalMap>::key_type key_type;
+    typedef typename property_traits<StorageMap>::reference  reference;
+    typedef typename property_traits<StorageMap>::category   category;
+
+    local_property_map() { }
+
+    local_property_map(const ProcessGroup& process_group, 
+                       const GlobalMap& global, const StorageMap& storage)
+      : process_group_(process_group), global_(global), storage(storage) { }
+
+    reference operator[](const key_type& key) 
+    { 
+      owner_local_pair p = get(global_, key);
+      assert(p.first == process_id(process_group_));
+      return storage[p.second]; 
+    }
+
+    GlobalMap& global() const { return global_; }
+    StorageMap& base() const { return storage; }
+
+    ProcessGroup&       process_group()       { return process_group_; }
+    const ProcessGroup& process_group() const { return process_group_; }
+
+  private:
+    ProcessGroup process_group_;
+    mutable GlobalMap global_;
+    mutable StorageMap storage;
+  };
+
+  template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+  inline
+  typename local_property_map<ProcessGroup, GlobalMap, StorageMap>::reference
+  get(const local_property_map<ProcessGroup, GlobalMap, StorageMap>& pm, 
+      typename local_property_map<ProcessGroup, GlobalMap, StorageMap>::key_type
+        const & key)
+
+  {
+    typename property_traits<GlobalMap>::value_type p = get(pm.global(), key);
+    return get(pm.base(), p.second);
+  }
+
+  template<typename ProcessGroup, typename GlobalMap, typename StorageMap>
+  inline void
+  put(const local_property_map<ProcessGroup, GlobalMap, StorageMap>& pm, 
+      typename local_property_map<ProcessGroup, GlobalMap, StorageMap>
+                 ::key_type const & key,
+      typename local_property_map<ProcessGroup, GlobalMap, StorageMap>
+                 ::value_type const& v)
+  {
+    typename property_traits<GlobalMap>::value_type p = get(pm.global(), key);
+    assert(p.first == process_id(pm.process_group()));
+    put(pm.base(), p.second, v);
+  }
+} // end namespace boost
+#endif // BOOST_PARALLEL_LOCAL_PROPERTY_MAP_HPP
similarity index 66%
rename from deal.II/contrib/boost/include/boost/property_map.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/property_map/property_map.hpp
index f2875a01c76ab1e6294159285dbccf63cc903c56..1f1c51ff6619ea8568d8b5045a1fa8f185a81474 100644 (file)
@@ -1,4 +1,7 @@
 //  (C) Copyright Jeremy Siek 1999-2001.
+//  Copyright (C) 2006 Trustees of Indiana University
+//  Authors: Douglas Gregor and Jeremy Siek
+
 // 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)
@@ -498,24 +501,42 @@ namespace boost {
   }
 
   //=========================================================================
-  // A property map that always returns a reference to the same object.
+  // A property map that always returns the same object by value.
   //
-template <typename KeyType, typename ValueType>
-class ref_property_map :
-  public
-    boost::put_get_helper<ValueType&,ref_property_map<KeyType,ValueType> >
-{ 
-  ValueType* value;
-public:
-  typedef KeyType key_type;
-  typedef ValueType value_type;
-  typedef ValueType& reference;
-  typedef lvalue_property_map_tag category;
-  ref_property_map(ValueType& v) : value(&v) {}
-  ValueType& operator[](key_type const&) const { return *value; }
-
-};
+  template <typename ValueType>
+  class static_property_map :
+      public
+  boost::put_get_helper<ValueType,static_property_map<ValueType> >
+  { 
+    ValueType value;
+  public:
+    typedef void key_type;
+    typedef ValueType value_type;
+    typedef ValueType reference;
+    typedef readable_property_map_tag category;
+    static_property_map(ValueType v) : value(v) {}
+    
+    template<typename T>
+    inline reference operator[](T) const { return value; }
+  };
 
+  //=========================================================================
+  // A property map that always returns a reference to the same object.
+  //
+  template <typename KeyType, typename ValueType>
+  class ref_property_map :
+    public
+      boost::put_get_helper<ValueType&,ref_property_map<KeyType,ValueType> >
+  { 
+    ValueType* value;
+  public:
+    typedef KeyType key_type;
+    typedef ValueType value_type;
+    typedef ValueType& reference;
+    typedef lvalue_property_map_tag category;
+    ref_property_map(ValueType& v) : value(&v) {}
+    ValueType& operator[](key_type const&) const { return *value; }
+  };
 
   //=========================================================================
   // A property map that applies the identity function to integers
@@ -560,9 +581,226 @@ public:
     value_type c;
   };
 
+  // Convert a Readable property map into a function object
+  template <typename PropMap>
+  class property_map_function {
+    PropMap pm;
+    typedef typename property_traits<PropMap>::key_type param_type;
+    public:
+    explicit property_map_function(const PropMap& pm): pm(pm) {}
+    typedef typename property_traits<PropMap>::value_type result_type;
+    result_type operator()(const param_type& k) const {return get(pm, k);}
+  };
+
+  template <typename PropMap>
+  property_map_function<PropMap>
+  make_property_map_function(const PropMap& pm) {
+    return property_map_function<PropMap>(pm);
+  }
 
 } // namespace boost
 
+#ifdef BOOST_GRAPH_USE_MPI
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+
+namespace boost {
+/** Distributed iterator property map.
+ *
+ * This specialization of @ref iterator_property_map builds a
+ * distributed iterator property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class iterator_property_map
+        <RandomAccessIterator, 
+         local_property_map<ProcessGroup, GlobalMap, StorageMap>,
+         ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap, 
+              iterator_property_map<RandomAccessIterator, StorageMap,
+                                    ValueType, Reference> >
+{
+  typedef iterator_property_map<RandomAccessIterator, StorageMap, 
+                                ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap>
+    index_map_type;
+  typedef iterator_property_map self_type;
+
+public:
+  iterator_property_map() { }
+
+  iterator_property_map(RandomAccessIterator cc, const index_map_type& id)
+    : inherited(id.process_group(), id.global(), 
+                local_iterator_map(cc, id.base())) { }
+};
+
+/** Distributed iterator property map.
+ *
+ * This specialization of @ref iterator_property_map builds a
+ * distributed iterator property map given a distributed index
+ * map. Only the local portion of the distributed index property map
+ * is utilized.
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class iterator_property_map<
+        RandomAccessIterator, 
+        parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>,
+        ValueType, Reference
+      >
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              iterator_property_map<RandomAccessIterator, StorageMap,
+                                    ValueType, Reference> >
+{
+  typedef iterator_property_map<RandomAccessIterator, StorageMap,
+                                ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  iterator_property_map() { }
+
+  iterator_property_map(RandomAccessIterator cc, const index_map_type& id)
+    : inherited(id.process_group(), id.global(),
+                local_iterator_map(cc, id.base())) { }
+};
+
+namespace parallel {
+// Generate an iterator property map with a specific kind of ghost
+// cells
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap>
+distributed_property_map<ProcessGroup, 
+                         GlobalMap,
+                         iterator_property_map<RandomAccessIterator, 
+                                               StorageMap> >
+make_iterator_property_map(RandomAccessIterator cc,
+                           local_property_map<ProcessGroup, GlobalMap, 
+                                              StorageMap> index_map)
+{
+  typedef distributed_property_map<
+            ProcessGroup, GlobalMap,
+            iterator_property_map<RandomAccessIterator, StorageMap> >
+    result_type;
+  return result_type(index_map.process_group(), index_map.global(),
+                     make_iterator_property_map(cc, index_map.base()));
+}
+
+} // end namespace parallel
+
+/** Distributed safe iterator property map.
+ *
+ * This specialization of @ref safe_iterator_property_map builds a
+ * distributed iterator property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, typename ValueType,
+         typename Reference>
+class safe_iterator_property_map
+        <RandomAccessIterator, 
+         local_property_map<ProcessGroup, GlobalMap, StorageMap>,
+         ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                         ValueType, Reference> >
+{
+  typedef safe_iterator_property_map<RandomAccessIterator, StorageMap, 
+                                     ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> index_map_type;
+
+public:
+  safe_iterator_property_map() { }
+
+  safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, 
+                             const index_map_type& id)
+    : inherited(id.process_group(), id.global(),
+                local_iterator_map(cc, n, id.base())) { }
+};
+
+/** Distributed safe iterator property map.
+ *
+ * This specialization of @ref safe_iterator_property_map builds a
+ * distributed iterator property map given a distributed index
+ * map. Only the local portion of the distributed index property map
+ * is utilized.
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename RandomAccessIterator, typename ProcessGroup,
+         typename GlobalMap, typename StorageMap, 
+         typename ValueType, typename Reference>
+class safe_iterator_property_map<
+        RandomAccessIterator, 
+        parallel::distributed_property_map<ProcessGroup,GlobalMap,StorageMap>,
+        ValueType, Reference>
+  : public parallel::distributed_property_map
+             <ProcessGroup, 
+              GlobalMap,
+              safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                         ValueType, Reference> >
+{
+  typedef safe_iterator_property_map<RandomAccessIterator, StorageMap,
+                                     ValueType, Reference> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap,
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  safe_iterator_property_map() { }
+
+  safe_iterator_property_map(RandomAccessIterator cc, std::size_t n, 
+                             const index_map_type& id)
+    : inherited(id.process_group(), id.global(), 
+                local_iterator_map(cc, n, id.base())) { }
+};                                            
+
+}
+#endif // BOOST_GRAPH_USE_MPI
+
+#include <boost/property_map/vector_property_map.hpp>
 
 #endif /* BOOST_PROPERTY_MAP_HPP */
 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/property_map_iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/property_map/property_map_iterator.hpp
index 9874cbf4adbe1c8170f59cd2c3dffa6889b358e8..a7be8afecfc8d9993f2745d0fdba23abb59b640c 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef BOOST_PROPERTY_MAP_ITERATOR_HPP
 #define BOOST_PROPERTY_MAP_ITERATOR_HPP
 
-#include <boost/property_map.hpp>
+#include <boost/property_map/property_map.hpp>
 #include <boost/iterator/iterator_adaptor.hpp>
 #include <boost/mpl/if.hpp>
 #include <boost/type_traits/is_same.hpp>
@@ -16,7 +16,7 @@
 namespace boost {
 
   //======================================================================
-  // property iterator, generalized from ideas by François Faure
+  // property iterator, generalized from ideas by Francois Faure
 
   namespace detail {
 
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/shared_array_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/shared_array_property_map.hpp
new file mode 100644 (file)
index 0000000..8056d95
--- /dev/null
@@ -0,0 +1,52 @@
+//  Copyright (C) 2009 Trustees of Indiana University
+//  Authors: Jeremiah Willcock, Andrew Lumsdaine
+
+// 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)
+
+//  See http://www.boost.org/libs/property_map for documentation.
+
+#ifndef BOOST_SHARED_ARRAY_PROPERTY_MAP_HPP
+#define BOOST_SHARED_ARRAY_PROPERTY_MAP_HPP
+
+#include <boost/smart_ptr/shared_array.hpp>
+#include <boost/property_map/property_map.hpp>
+
+namespace boost {
+
+template <class T, class IndexMap>
+class shared_array_property_map
+  : public boost::put_get_helper<T&, shared_array_property_map<T, IndexMap> >
+{
+  public:
+  typedef typename property_traits<IndexMap>::key_type key_type;
+  typedef T value_type;
+  typedef T& reference;
+  typedef boost::lvalue_property_map_tag category;
+
+  inline shared_array_property_map(): data(), index() {}
+
+  explicit inline shared_array_property_map(
+    size_t n,
+    const IndexMap& _id = IndexMap())
+  : data(new T[n]), index(_id) {}
+
+  inline T& operator[](key_type v) const {
+    return data[get(index, v)];
+  }
+
+  private:
+  boost::shared_array<T> data;
+  IndexMap index;
+};
+
+template <class T, class IndexMap>
+shared_array_property_map<T, IndexMap>
+make_shared_array_property_map(size_t n, const T&, const IndexMap& index) {
+  return shared_array_property_map<T, IndexMap>(n, index);
+}
+
+} // end namespace boost
+
+#endif // BOOST_SHARED_ARRAY_PROPERTY_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map/vector_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map/vector_property_map.hpp
new file mode 100644 (file)
index 0000000..a97fb81
--- /dev/null
@@ -0,0 +1,185 @@
+// Copyright (C) Vladimir Prus 2003.
+// 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)
+//
+// See http://www.boost.org/libs/graph/vector_property_map.html for
+// documentation.
+//
+
+#ifndef VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
+#define VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
+
+#include <boost/property_map/property_map.hpp>
+#include <boost/shared_ptr.hpp>
+#include <vector>
+
+namespace boost {
+    template<typename T, typename IndexMap = identity_property_map>
+    class vector_property_map
+        : public boost::put_get_helper< 
+              typename std::iterator_traits< 
+                  typename std::vector<T>::iterator >::reference,
+              vector_property_map<T, IndexMap> >
+    {
+    public:
+        typedef typename property_traits<IndexMap>::key_type  key_type;
+        typedef T value_type;
+        typedef typename std::iterator_traits< 
+            typename std::vector<T>::iterator >::reference reference;
+        typedef boost::lvalue_property_map_tag category;
+        
+        vector_property_map(const IndexMap& index = IndexMap())
+        : store(new std::vector<T>()), index(index)
+        {}
+
+        vector_property_map(unsigned initial_size, 
+                            const IndexMap& index = IndexMap())
+        : store(new std::vector<T>(initial_size)), index(index)
+        {}
+
+        typename std::vector<T>::iterator storage_begin()
+        {
+            return store->begin();
+        }
+
+        typename std::vector<T>::iterator storage_end()
+        {
+            return store->end();
+        }
+
+        typename std::vector<T>::const_iterator storage_begin() const
+        {
+            return store->begin();
+        }
+
+        typename std::vector<T>::const_iterator storage_end() const
+        {
+            return store->end();
+        }
+                 
+        IndexMap&       get_index_map()       { return index; }
+        const IndexMap& get_index_map() const { return index; }
+          
+    public:
+        // Copy ctor absent, default semantics is OK.
+        // Assignment operator absent, default semantics is OK.
+        // CONSIDER: not sure that assignment to 'index' is correct.
+        
+        reference operator[](const key_type& v) const {
+            typename property_traits<IndexMap>::value_type i = get(index, v);
+            if (static_cast<unsigned>(i) >= store->size()) {
+                store->resize(i + 1, T());
+            }
+            return (*store)[i];
+        }
+    private:
+        // Conceptually, we have a vector of infinite size. For practical 
+        // purposes, we start with an empty vector and grow it as needed.
+        // Note that we cannot store pointer to vector here -- we cannot
+        // store pointer to data, because if copy of property map resizes
+        // the vector, the pointer to data will be invalidated. 
+        // I wonder if class 'pmap_ref' is simply needed.
+        shared_ptr< std::vector<T> > store;        
+        IndexMap index;
+    };
+    
+    template<typename T, typename IndexMap>
+    vector_property_map<T, IndexMap>
+    make_vector_property_map(IndexMap index)
+    {
+        return vector_property_map<T, IndexMap>(index);
+    }
+}
+
+#ifdef BOOST_GRAPH_USE_MPI
+#include <boost/property_map/parallel/distributed_property_map.hpp>
+#include <boost/property_map/parallel/local_property_map.hpp>
+
+namespace boost {
+
+/** Distributed vector property map.
+ *
+ * This specialization of @ref vector_property_map builds a
+ * distributed vector property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename T, typename ProcessGroup, typename GlobalMap, 
+         typename StorageMap>
+class vector_property_map<T, 
+                          local_property_map<ProcessGroup, GlobalMap,
+                                             StorageMap> >
+  : public parallel::distributed_property_map<
+             ProcessGroup, GlobalMap, vector_property_map<T, StorageMap> >
+{
+  typedef vector_property_map<T, StorageMap> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             local_iterator_map> inherited;
+
+  typedef local_property_map<ProcessGroup, GlobalMap, StorageMap> index_map_type;
+
+public:
+  vector_property_map(const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(index.base())) { }
+
+  vector_property_map(unsigned inital_size, 
+                      const index_map_type& index = index_map_type())
+    : inherited(index.process_group(),  index.global(),
+                local_iterator_map(inital_size, index.base())) { }
+};
+
+/** Distributed vector property map.
+ *
+ * This specialization of @ref vector_property_map builds a
+ * distributed vector property map given the local index maps
+ * generated by distributed graph types that automatically have index
+ * properties. 
+ *
+ * This specialization is useful when creating external distributed
+ * property maps via the same syntax used to create external
+ * sequential property maps.
+ */
+template<typename T, typename ProcessGroup, typename GlobalMap, 
+         typename StorageMap>
+class vector_property_map<
+        T, 
+        parallel::distributed_property_map<
+          ProcessGroup,
+          GlobalMap,
+          StorageMap
+        >
+      > 
+  : public parallel::distributed_property_map<
+             ProcessGroup, GlobalMap, vector_property_map<T, StorageMap> >
+{
+  typedef vector_property_map<T, StorageMap> local_iterator_map;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             local_iterator_map> inherited;
+
+  typedef parallel::distributed_property_map<ProcessGroup, GlobalMap, 
+                                             StorageMap>
+    index_map_type;
+
+public:
+  vector_property_map(const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(index.base())) { }
+
+  vector_property_map(unsigned inital_size, 
+                      const index_map_type& index = index_map_type())
+    : inherited(index.process_group(), index.global(),
+                local_iterator_map(inital_size, index.base())) { }
+};
+
+}
+#endif // BOOST_GRAPH_USE_MPI
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/property_map_iterator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/property_map_iterator.hpp
new file mode 100644 (file)
index 0000000..3079971
--- /dev/null
@@ -0,0 +1,19 @@
+/*=============================================================================
+Copyright (c) 2009 Trustees of Indiana University
+
+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)
+=============================================================================*/
+// Redirect/warning header, adapted from the version in Spirit
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/property_map/property_map_iterator.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/property_map/property_map_iterator.hpp"
+#endif
+#endif
+
+#include <boost/property_map/property_map_iterator.hpp>
similarity index 92%
rename from deal.II/contrib/boost/include/boost/python/call.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/call.hpp
index 9a3d974b77242be9667b05376b14353a23e6da8d..5d2d7d2341860d961f6cdd02a6558bc512b2133b 100644 (file)
@@ -38,7 +38,10 @@ namespace boost { namespace python {
 
 # endif // CALL_DWA2002411_HPP
 
-#elif BOOST_PP_ITERATION_DEPTH() == 1
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, call.hpp)
@@ -76,4 +79,5 @@ call(PyObject* callable
 
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 92%
rename from deal.II/contrib/boost/include/boost/python/call_method.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/call_method.hpp
index 0bca0610dff1e0c4811e04655840263a74913b5a..410f66820e2821aa6bcc9f872cd7b8d09998bf75 100644 (file)
@@ -37,7 +37,10 @@ namespace boost { namespace python {
 
 # endif // CALL_METHOD_DWA2002411_HPP
 
-#elif BOOST_PP_ITERATION_DEPTH() == 1
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, call_method.hpp)
@@ -76,4 +79,5 @@ call_method(PyObject* self, char const* name
 
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif // BOOST_PP_IS_ITERATING
similarity index 89%
rename from deal.II/contrib/boost/include/boost/python/converter/builtin_converters.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/converter/builtin_converters.hpp
index df32ad21d9601a036c2bf52e73acbf5ab3da2d1d..63ae1e1a7fd34ec106da90c6b222e0f40b464b30 100644 (file)
@@ -90,6 +90,14 @@ namespace detail
         BOOST_PYTHON_ARG_TO_PYTHON_BY_VALUE(T,expr)
 
 // Specialize converters for signed and unsigned T to Python Int
+#if PY_VERSION_HEX >= 0x03000000
+
+# define BOOST_PYTHON_TO_INT(T)                                         \
+    BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed T, ::PyLong_FromLong(x), &PyLong_Type)      \
+    BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned T, ::PyLong_FromUnsignedLong(x), &PyLong_Type)
+
+#else
+
 # define BOOST_PYTHON_TO_INT(T)                                         \
     BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed T, ::PyInt_FromLong(x), &PyInt_Type)      \
     BOOST_PYTHON_TO_PYTHON_BY_VALUE(                                    \
@@ -98,6 +106,7 @@ namespace detail
                 (std::numeric_limits<long>::max)())                     \
         ? ::PyLong_FromUnsignedLong(x)                                  \
         : ::PyInt_FromLong(x), &PyInt_Type)
+#endif
 
 // Bool is not signed.
 #if PY_VERSION_HEX >= 0x02030000
@@ -116,17 +125,24 @@ BOOST_PYTHON_TO_INT(long)
 // using Python's macro instead of Boost's - we don't seem to get the
 // config right all the time.
 # ifdef HAVE_LONG_LONG 
-BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed BOOST_PYTHON_LONG_LONG, ::PyLong_FromLongLong(x), &PyInt_Type)
-BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUnsignedLongLong(x), &PyInt_Type)
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(signed BOOST_PYTHON_LONG_LONG, ::PyLong_FromLongLong(x), &PyLong_Type)
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(unsigned BOOST_PYTHON_LONG_LONG, ::PyLong_FromUnsignedLongLong(x), &PyLong_Type)
 # endif
     
 # undef BOOST_TO_PYTHON_INT
 
+#if PY_VERSION_HEX >= 0x03000000
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x), &PyUnicode_Type)
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x), &PyUnicode_Type)
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyUnicode_FromStringAndSize(x.data(),implicit_cast<ssize_t>(x.size())), &PyUnicode_Type)
+#else
 BOOST_PYTHON_TO_PYTHON_BY_VALUE(char, converter::do_return_to_python(x), &PyString_Type)
 BOOST_PYTHON_TO_PYTHON_BY_VALUE(char const*, converter::do_return_to_python(x), &PyString_Type)
 BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::string, ::PyString_FromStringAndSize(x.data(),implicit_cast<ssize_t>(x.size())), &PyString_Type)
+#endif
+
 #if defined(Py_USING_UNICODE) && !defined(BOOST_NO_STD_WSTRING)
-BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast<ssize_t>(x.size())), &PyString_Type)
+BOOST_PYTHON_TO_PYTHON_BY_VALUE(std::wstring, ::PyUnicode_FromWideChar(x.data(),implicit_cast<ssize_t>(x.size())), &PyUnicode_Type)
 # endif 
 BOOST_PYTHON_TO_PYTHON_BY_VALUE(float, ::PyFloat_FromDouble(x), &PyFloat_Type)
 BOOST_PYTHON_TO_PYTHON_BY_VALUE(double, ::PyFloat_FromDouble(x), &PyFloat_Type)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/python/converter/pyobject_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/converter/pyobject_traits.hpp
index 03ef4460757312b4ddbc1579102d2af98e1ba259..43e384af8dd19a5ac84f509b1618e382dc9d5d82 100644 (file)
@@ -34,7 +34,9 @@ struct pyobject_traits<PyObject>
 // This is not an exhaustive list; should be expanded.
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Type);
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(List);
+#if PY_VERSION_HEX < 0x03000000
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Int);
+#endif
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Long);
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Dict);
 BOOST_PYTHON_BUILTIN_OBJECT_TRAITS(Tuple);
similarity index 98%
rename from deal.II/contrib/boost/include/boost/python/converter/rvalue_from_python_data.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/converter/rvalue_from_python_data.hpp
index 7d2b3e07f20190f234ec6ea8e5182b4e380bdc14..471a5255b6f1b953f1d2175bd2367a87f53ed15e 100644 (file)
@@ -117,9 +117,9 @@ struct rvalue_from_python_data : rvalue_from_python_storage<T>
 // Implementataions
 //
 template <class T>
-inline rvalue_from_python_data<T>::rvalue_from_python_data(rvalue_from_python_stage1_data const& stage1)
+inline rvalue_from_python_data<T>::rvalue_from_python_data(rvalue_from_python_stage1_data const& _stage1)
 {
-    this->stage1 = stage1;
+    this->stage1 = _stage1;
 }
 
 template <class T>
similarity index 85%
rename from deal.II/contrib/boost/include/boost/python/converter/shared_ptr_from_python.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/converter/shared_ptr_from_python.hpp
index 6b49c469516fafc62cf0359ebaf1a8a9b8de80af..c09107765c02adb7f46b75c146e3c66e525830c2 100644 (file)
@@ -45,10 +45,14 @@ struct shared_ptr_from_python
         if (data->convertible == source)
             new (storage) shared_ptr<T>();
         else
+        {
+            boost::shared_ptr<void> hold_convertible_ref_count(
+              (void*)0, shared_ptr_deleter(handle<>(borrowed(source))) );
+            // use aliasing constructor
             new (storage) shared_ptr<T>(
-                static_cast<T*>(data->convertible),
-                shared_ptr_deleter(handle<>(borrowed(source)))
-                );
+                hold_convertible_ref_count,
+                static_cast<T*>(data->convertible));
+        }
         
         data->convertible = storage;
     }
similarity index 98%
rename from deal.II/contrib/boost/include/boost/python/data_members.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/data_members.hpp
index 8cbc0ac365fd2c55667d258e4bed31480c20d6ae..b0851fb1b3ffe2cb862511b1bbcdd6f1532f2a32 100644 (file)
@@ -265,7 +265,8 @@ inline object make_getter(D const& d, Policies const& policies)
 template <class D>
 inline object make_getter(D& x)
 {
-    detail::not_specified policy;
+    detail::not_specified policy
+        = detail::not_specified(); // suppress a SunPro warning
     return detail::make_getter(x, policy, is_member_pointer<D>(), 0L);
 }
 
@@ -273,7 +274,8 @@ inline object make_getter(D& x)
 template <class D>
 inline object make_getter(D const& d)
 {
-    detail::not_specified policy;
+    detail::not_specified policy
+        = detail::not_specified(); // Suppress a SunPro warning
     return detail::make_getter(d, policy, is_member_pointer<D>(), 0L);
 }
 #  endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/python/detail/decorated_type_id.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/decorated_type_id.hpp
index 2e44ac2c97a706d412262267b2351c665763d854..535508b43d56aec4d114063c8f5142d8994eeec5 100644 (file)
@@ -55,8 +55,8 @@ inline decorated_type_info::decorated_type_info(type_info base_t, decoration dec
 inline bool decorated_type_info::operator<(decorated_type_info const& rhs) const
 {
     return m_decoration < rhs.m_decoration
-        || m_decoration == rhs.m_decoration
-           && m_base_type < rhs.m_base_type;
+      || (m_decoration == rhs.m_decoration
+          && m_base_type < rhs.m_base_type);
 }
 
 inline bool decorated_type_info::operator==(decorated_type_info const& rhs) const
similarity index 94%
rename from deal.II/contrib/boost/include/boost/python/detail/operator_id.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/operator_id.hpp
index 4a2785ed8a74a8b4a739aca1372c9f08e8c288ba..25642fba0356e8e352541c4941dea65ccf4a5a44 100644 (file)
@@ -47,7 +47,11 @@ enum operator_id
     op_ixor,
     op_ior,
     op_complex,
+#if PY_VERSION_HEX >= 0x03000000
+    op_bool,
+#else
     op_nonzero,
+#endif
     op_repr
 };
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/python/detail/result.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/result.hpp
index 80e4387f12cb54a8ed71f130f2693d4276ea2511..9b8b48642334e5be5e11cf05c2b127629f9a6dd3 100644 (file)
@@ -86,7 +86,10 @@ result(X const&, short = 0) { return 0; }
 # endif // RESULT_DWA2002521_HPP
 
 /* --------------- function pointers --------------- */
-#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, result.hpp(function pointers))
@@ -128,4 +131,5 @@ boost::type<R>* result(R (T::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)) Q, int = 0)
 # undef N
 # undef Q
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 90%
rename from deal.II/contrib/boost/include/boost/python/detail/target.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/target.hpp
index 5079699a7ef3f54812440b12f04f19936b10dca8..137801bb2b015019862f62b7881e91f36ec8a6b3 100644 (file)
@@ -37,7 +37,10 @@ T& (* target(R (T::*)) )() { return 0; }
 # endif // TARGET_DWA2002521_HPP
 
 /* --------------- function pointers --------------- */
-#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == BOOST_PYTHON_FUNCTION_POINTER
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, target.hpp(function_pointers))
@@ -79,4 +82,5 @@ T& (* target(R (T::*)(BOOST_PP_ENUM_PARAMS_Z(1, N, A)) Q) )()
 # undef N
 # undef Q
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 91%
rename from deal.II/contrib/boost/include/boost/python/detail/translate_exception.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/translate_exception.hpp
index 466b8c890798c7d5820f33c026b74ca4e596568f..df7ec2dd6c134764587aa22214dadf0c562317c4 100644 (file)
@@ -2,13 +2,15 @@
 // Distributed under the Boost Software License, Version 1.0. (See
 // accompanying file LICENSE_1_0.txt or copy at
 // http://www.boost.org/LICENSE_1_0.txt)
-#ifndef TRANSLATE_EXCEPTION_DWA2002810_HPP
-# define TRANSLATE_EXCEPTION_DWA2002810_HPP
+#ifndef TRANSLATE_EXCEPTION_TDS20091020_HPP
+# define TRANSLATE_EXCEPTION_TDS20091020_HPP
 
 # include <boost/python/detail/exception_handler.hpp>
 
 # include <boost/call_traits.hpp>
 # include <boost/type_traits/add_const.hpp>
+# include <boost/type_traits/add_reference.hpp>
+# include <boost/type_traits/remove_reference.hpp>
 
 # include <boost/function/function0.hpp>
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/python/detail/wrap_python.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/detail/wrap_python.hpp
index af76fcceb5f0ec64ccfbcadbb0a2eac31cb2add5..4868a987c75520a79af363f0613e5e172ed3f22f 100644 (file)
@@ -175,6 +175,19 @@ typedef int pid_t;
         ( (op)->ob_type = (typeobj), _Py_NewReference((PyObject *)(op)), (op) )
 #endif
 
+// Define Python 3 macros for Python 2.x
+#if PY_VERSION_HEX < 0x02060000
+
+# define Py_TYPE(o)    (((PyObject*)(o))->ob_type)
+# define Py_REFCNT(o)  (((PyObject*)(o))->ob_refcnt)
+# define Py_SIZE(o)    (((PyVarObject*)(o))->ob_size)
+
+# define PyVarObject_HEAD_INIT(type, size)     \
+       PyObject_HEAD_INIT(type) size,
+
+#endif
+
+
 #ifdef __MWERKS__
 # pragma warn_possunwant off
 #elif _MSC_VER
similarity index 96%
rename from deal.II/contrib/boost/include/boost/python/enum.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/enum.hpp
index 57684530efc9918a1d9a59de0209ff4f81d37d23..9631a0edc81117cba6cf500e8f5cba303dede754 100644 (file)
@@ -41,7 +41,7 @@ inline enum_<T>::enum_(char const* name, char const* doc )
         , &enum_<T>::convertible_from_python
         , &enum_<T>::construct
         , type_id<T>()
-               , doc
+        , doc
         )
 {
 }
@@ -79,7 +79,11 @@ void* enum_<T>::convertible_from_python(PyObject* obj)
 template <class T>
 void enum_<T>::construct(PyObject* obj, converter::rvalue_from_python_stage1_data* data)
 {
+#if PY_VERSION_HEX >= 0x03000000
+    T x = static_cast<T>(PyLong_AS_LONG(obj));
+#else
     T x = static_cast<T>(PyInt_AS_LONG(obj));
+#endif
     void* const storage = ((converter::rvalue_from_python_storage<T>*)data)->storage.bytes;
     new (storage) T(x);
     data->convertible = storage;
similarity index 81%
rename from deal.II/contrib/boost/include/boost/python/exec.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/exec.hpp
index 359830a4b9aa4d231758fbd8090d615eebf7a432..3ed1e15ce9cefdac12e75e77b685a170a45960aa 100644 (file)
@@ -20,6 +20,13 @@ object
 BOOST_PYTHON_DECL
 eval(str string, object global = object(), object local = object());
 
+// Execute an individual python statement from str.
+// global and local are the global and local scopes respectively,
+// used during execution.
+object 
+BOOST_PYTHON_DECL
+exec_statement(str string, object global = object(), object local = object());
+
 // Execute python source code from str.
 // global and local are the global and local scopes respectively,
 // used during execution.
similarity index 92%
rename from deal.II/contrib/boost/include/boost/python/list.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/list.hpp
index 0f6d1e8e9ca42d5be52aaebd119fca85b187004c..10fd40fda57efc664fb5e4a78b4b9655386adfe6 100644 (file)
@@ -19,7 +19,7 @@ namespace detail
   {
       void append(object_cref); // append object to end
 
-      long count(object_cref value) const; // return number of occurrences of value
+      ssize_t count(object_cref value) const; // return number of occurrences of value
 
       void extend(object_cref sequence); // extend list by appending sequence elements
     
@@ -37,8 +37,12 @@ namespace detail
       void reverse(); // reverse *IN PLACE*
 
       void sort(); //  sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1
+#if PY_VERSION_HEX >= 0x03000000
+      void sort(args_proxy const &args, 
+                 kwds_proxy const &kwds);
+#else
       void sort(object_cref cmpfunc);
-
+#endif
 
    protected:
       list_base(); // new list
@@ -113,13 +117,15 @@ class list : public detail::list_base
         base::remove(object(value));
     }
 
+#if PY_VERSION_HEX <= 0x03000000
     void sort() { base::sort(); }
-    
+
     template <class T>
     void sort(T const& value)
     {
         base::sort(object(value));
     }
+#endif
     
  public: // implementation detail -- for internal use only
     BOOST_PYTHON_FORWARD_OBJECT_CONSTRUCTORS(list, base)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/python/lvalue_from_pytype.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/lvalue_from_pytype.hpp
index 019d4ae54c03f7d58968c2babded253067f4f131..e15dfbbb85c3e3913d7461eb8cdcf5c73f2eee83 100644 (file)
@@ -63,7 +63,7 @@ struct extract_member
 {
     static MemberType& execute(InstanceType& c)
     {
-        (void)c.ob_type; // static assertion
+        (void)Py_TYPE(&c); // static assertion
         return c.*member;
     }
 };
@@ -75,7 +75,7 @@ struct extract_identity
 {
     static InstanceType& execute(InstanceType& c)
     {
-        (void)c.ob_type; // static assertion
+        (void)Py_TYPE(&c); // static assertion
         return c;
     }
 };
similarity index 98%
rename from deal.II/contrib/boost/include/boost/python/make_constructor.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/make_constructor.hpp
index 972de5fc1cd8deef3865c33307dc413105153400..8ae722bbe30f01609ffef67e64a8f0f023a11753 100644 (file)
@@ -105,12 +105,12 @@ namespace detail
       // If the BasePolicy_ supplied a result converter it would be
       // ignored; issue an error if it's not the default.
 #if defined _MSC_VER && _MSC_VER < 1300
-         typedef is_same<
+      typedef is_same<
               typename BasePolicy_::result_converter
             , default_result_converter
           > same_result_converter;
-         //see above for explanation
-         BOOST_STATIC_ASSERT(same_result_converter::value) ;
+      //see above for explanation
+      BOOST_STATIC_ASSERT(same_result_converter::value) ;
 #else
       BOOST_MPL_ASSERT_MSG(
          (is_same<
similarity index 57%
rename from deal.II/contrib/boost/include/boost/python/module_init.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/module_init.hpp
index aaf2a0f9388f32e9e06b96cd98f1f7bd61f87017..e552dcce338609a85b69293fe1bb9146df67c422 100644 (file)
 
 namespace boost { namespace python { namespace detail {
 
-BOOST_PYTHON_DECL void init_module(char const* name, void(*)());
+BOOST_PYTHON_DECL PyObject* init_module(char const* name, void(*)());
 
 }}}
 
-#  if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(BOOST_PYTHON_STATIC_MODULE)
+#  if PY_VERSION_HEX >= 0x03000000
+
+#   define _BOOST_PYTHON_MODULE_INIT(name)              \
+PyObject* PyInit_##name()      \
+{                                                       \
+    return boost::python::detail::init_module(          \
+            #name,&init_module_##name);                 \
+}                                                       \
+void init_module_##name()
+
+#  else
 
-#   define BOOST_PYTHON_MODULE_INIT(name)               \
-void init_module_##name();                              \
-extern "C" __declspec(dllexport) void init##name()      \
+#   define _BOOST_PYTHON_MODULE_INIT(name)              \
+void init##name()                                       \
 {                                                       \
     boost::python::detail::init_module(                 \
         #name,&init_module_##name);                     \
 }                                                       \
 void init_module_##name()
 
+#  endif
+
+#  if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(BOOST_PYTHON_STATIC_MODULE)
+
+#   define BOOST_PYTHON_MODULE_INIT(name)                           \
+void init_module_##name();                                          \
+extern "C" __declspec(dllexport) _BOOST_PYTHON_MODULE_INIT(name)
+
 #  elif BOOST_PYTHON_USE_GCC_SYMBOL_VISIBILITY
 
 #   define BOOST_PYTHON_MODULE_INIT(name)                               \
 void init_module_##name();                                              \
-extern "C" __attribute__ ((visibility("default"))) void init##name()    \
-{                                                                       \
-    boost::python::detail::init_module(#name, &init_module_##name);     \
-}                                                                       \
-void init_module_##name()
+extern "C" __attribute__ ((visibility("default"))) _BOOST_PYTHON_MODULE_INIT(name)
 
 #  else
 
 #   define BOOST_PYTHON_MODULE_INIT(name)                               \
 void init_module_##name();                                              \
-extern "C"  void init##name()                                           \
-{                                                                       \
-    boost::python::detail::init_module(#name, &init_module_##name);     \
-}                                                                       \
-void init_module_##name()
+extern "C" _BOOST_PYTHON_MODULE_INIT(name)
 
 #  endif
 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/python/object/class_metadata.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/class_metadata.hpp
index 05740b8e04ea2c2bdc8a63e7e783c7624af057e3..0738bbe38bb13ba1bc52ed04b4b23b770ea01581 100644 (file)
@@ -236,7 +236,7 @@ struct class_metadata
     //
     // Support for converting smart pointers to python
     //
-    inline static void maybe_register_pointer_to_python(void*,void*,void*) {}
+    inline static void maybe_register_pointer_to_python(...) {}
 
 #ifndef BOOST_PYTHON_NO_PY_SYGNATURES
     inline static void maybe_register_pointer_to_python(void*,void*,mpl::true_*) 
similarity index 99%
rename from deal.II/contrib/boost/include/boost/python/object/iterator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/iterator.hpp
index 3e24afd26031e01d82091ab114fe42969534fc00..ab748fe82db381cf3f60a7839db19896d1a3b783 100644 (file)
@@ -129,7 +129,11 @@ namespace detail
       return class_<range_>(name, no_init)
           .def("__iter__", identity_function())
           .def(
+#if PY_VERSION_HEX >= 0x03000000
+              "__next__"
+#else
               "next"
+#endif
             , make_function(
                 next_fn()
               , policies
similarity index 94%
rename from deal.II/contrib/boost/include/boost/python/object/make_holder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/make_holder.hpp
index 9d5de98dade1e0ea186e3caa6e485a68cf7044e2..eb3c603dbee4cfd012aa1746ced4029eece8d10d 100644 (file)
@@ -47,7 +47,10 @@ template <int nargs> struct make_holder;
 
 # endif // MAKE_HOLDER_DWA20011215_HPP
 
-#elif BOOST_PP_ITERATION_DEPTH() == 1
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, make_holder.hpp)
@@ -102,4 +105,5 @@ struct make_holder<N>
 
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 97%
rename from deal.II/contrib/boost/include/boost/python/object/make_instance.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/make_instance.hpp
index 55771eca0a257332cf1bfd286873879d5314cd32..8f355fe2edc9480d1709d9f3d2105377c9fb31ea 100644 (file)
@@ -43,7 +43,7 @@ struct make_instance_impl
               
             // Note the position of the internally-stored Holder,
             // for the sake of destruction
-            instance->ob_size = offsetof(instance_t, storage);
+            Py_SIZE(instance) = offsetof(instance_t, storage);
 
             // Release ownership of the python object
             protect.cancel();
similarity index 93%
rename from deal.II/contrib/boost/include/boost/python/object/pointer_holder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/pointer_holder.hpp
index 7fad2a2546315f3dc359b8df5af7c44b33d9c811..2dc6dda93d50573fcb9479c69b14346b41a1ad66 100644 (file)
@@ -127,7 +127,14 @@ void* pointer_holder<Pointer, Value>::holds(type_info dst_t, bool null_ptr_only)
     )
         return &this->m_p;
 
-    Value* p = get_pointer(this->m_p);
+    Value* p
+#  if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
+        = static_cast<Value*>( get_pointer(this->m_p) )
+#  else 
+        = get_pointer(this->m_p)
+#  endif
+        ;
+    
     if (p == 0)
         return 0;
     
@@ -163,7 +170,10 @@ void* pointer_holder_back_reference<Pointer, Value>::holds(type_info dst_t, bool
 # endif // POINTER_HOLDER_DWA20011215_HPP
 
 /* --------------- pointer_holder --------------- */
-#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, pointer_holder.hpp)
@@ -205,4 +215,5 @@ void* pointer_holder_back_reference<Pointer, Value>::holds(type_info dst_t, bool
 
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/python/object/value_holder.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object/value_holder.hpp
index e53866a187d5eb6b84519db23d757f8543f05b70..f4d452cab180942ed03dbd99e26a0556e59a80ed 100644 (file)
@@ -117,7 +117,10 @@ void* value_holder_back_reference<Value,Held>::holds(
 
 // --------------- value_holder ---------------
 
-#elif BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1 && BOOST_PP_ITERATION_FLAGS() == 1
 # if !(BOOST_WORKAROUND(__MWERKS__, > 0x3100)                      \
         && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3201)))
 #  line BOOST_PP_LINE(__LINE__, value_holder.hpp(value_holder))
@@ -163,4 +166,5 @@ void* value_holder_back_reference<Value,Held>::holds(
 
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif
similarity index 85%
rename from deal.II/contrib/boost/include/boost/python/object_core.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object_core.hpp
index b4a0ea822c5c2b7f829b3b82d9b19fbfbd410267..5857422f0459328a1c187d0d77f72f3e2b02b1ce 100644 (file)
 
 namespace boost { namespace python { 
 
+namespace detail
+{
+  class kwds_proxy; 
+  class args_proxy; 
+} 
+
 namespace converter
 {
   template <class T> struct arg_to_python;
@@ -102,6 +108,11 @@ namespace api
 
 # define BOOST_PP_ITERATION_PARAMS_1 (3, (1, BOOST_PYTHON_MAX_ARITY, <boost/python/object_call.hpp>))
 # include BOOST_PP_ITERATE()
+    
+      detail::args_proxy operator* () const; 
+      object operator()(detail::args_proxy const &args) const; 
+      object operator()(detail::args_proxy const &args, 
+                        detail::kwds_proxy const &kwds) const; 
 
       // truth value testing
       //
@@ -115,6 +126,10 @@ namespace api
       const_object_objattribute attr(object const&) const;
       object_objattribute attr(object const&);
 
+      // Wrap 'in' operator (aka. __contains__)
+      template <class T>
+      object contains(T const& key) const;
+      
       // item access
       //
       const_object_item operator[](object_cref) const;
@@ -219,11 +234,11 @@ namespace api
       inline object_base(object_base const&);
       inline object_base(PyObject* ptr);
       
-      object_base& operator=(object_base const& rhs);
-      ~object_base();
+      inline object_base& operator=(object_base const& rhs);
+      inline ~object_base();
         
       // Underlying object access -- returns a borrowed reference
-      PyObject* ptr() const;
+      inline PyObject* ptr() const;
       
    private:
       PyObject* m_ptr;
@@ -393,7 +408,7 @@ namespace api
       static PyObject*
       get(T const& x, U)
       {
-          return python::incref(get_managed_object(x, tag));
+          return python::incref(get_managed_object(x, boost::python::tag));
       }
   };
 
@@ -416,6 +431,71 @@ template <class T> struct extract;
 // implementation
 //
 
+namespace detail 
+{
+
+class call_proxy 
+{ 
+public: 
+  call_proxy(object target) : m_target(target) {} 
+  operator object() const { return m_target;} 
+ private: 
+    object m_target; 
+}; 
+class kwds_proxy : public call_proxy 
+{ 
+public: 
+  kwds_proxy(object o = object()) : call_proxy(o) {} 
+}; 
+class args_proxy : public call_proxy 
+{ 
+public: 
+  args_proxy(object o) : call_proxy(o) {} 
+  kwds_proxy operator* () const { return kwds_proxy(*this);} 
+}; 
+} 
+template <typename U> 
+detail::args_proxy api::object_operators<U>::operator* () const 
+{ 
+  object_cref2 x = *static_cast<U const*>(this); 
+  return boost::python::detail::args_proxy(x); 
+} 
+template <typename U> 
+object api::object_operators<U>::operator()(detail::args_proxy const &args) const 
+{ 
+  U const& self = *static_cast<U const*>(this); 
+  PyObject *result = PyObject_Call(get_managed_object(self, boost::python::tag), 
+                                   args.operator object().ptr(), 
+                                   0); 
+  return object(boost::python::detail::new_reference(result)); 
+} 
+template <typename U> 
+object api::object_operators<U>::operator()(detail::args_proxy const &args, 
+                                            detail::kwds_proxy const &kwds) const 
+{ 
+  U const& self = *static_cast<U const*>(this); 
+  PyObject *result = PyObject_Call(get_managed_object(self, boost::python::tag), 
+                                   args.operator object().ptr(), 
+                                   kwds.operator object().ptr()); 
+  return object(boost::python::detail::new_reference(result)); 
+}  
+
+
+template <typename U>
+template <class T>
+object api::object_operators<U>::contains(T const& key) const
+{
+    return this->attr("__contains__")(object(key));
+}
+
+
 inline object::object()
     : object_base(python::incref(Py_None))
 {}
similarity index 94%
rename from deal.II/contrib/boost/include/boost/python/object_operators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object_operators.hpp
index f27f88f8a4934c690542687662a7835c6da8c4b3..d436bb0144a8e8ca9ca3fbad8a1d5a1b5d45d876 100644 (file)
@@ -60,7 +60,9 @@ inline
 object_operators<U>::operator bool_type() const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return PyObject_IsTrue(x.ptr()) ? &object::ptr : 0;
+    int is_true = PyObject_IsTrue(x.ptr());
+    if (is_true < 0) throw_error_already_set();
+    return is_true ? &object::ptr : 0;
 }
 
 template <class U>
@@ -68,7 +70,9 @@ inline bool
 object_operators<U>::operator!() const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return !PyObject_IsTrue(x.ptr());
+    int is_true = PyObject_IsTrue(x.ptr());
+    if (is_true < 0) throw_error_already_set();
+    return !is_true;
 }
 
 # define BOOST_PYTHON_COMPARE_OP(op, opid)                              \
similarity index 89%
rename from deal.II/contrib/boost/include/boost/python/object_protocol.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object_protocol.hpp
index e8d35866a41feb2cb2a3300b338c0b4a05f0df9e..7c1c02830e41b80708bf2531447cdf6193f5c6ae 100644 (file)
 # include <boost/python/object_protocol_core.hpp>
 # include <boost/python/object_core.hpp>
 
+# include <boost/detail/workaround.hpp>
+
 namespace boost { namespace python { namespace api {
 
-# if BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580)
+# if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
 // attempt to use SFINAE to prevent functions accepting T const& from
 // coming up as ambiguous with the one taking a char const* when a
 // string literal is passed
@@ -22,45 +24,45 @@ namespace boost { namespace python { namespace api {
 # endif
 
 template <class Target, class Key>
-object getattr(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(key))
+object getattr(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     return getattr(object(target), object(key));
 }
 
 template <class Target, class Key, class Default>
-object getattr(Target const& target, Key const& key, Default const& default_ BOOST_PYTHON_NO_ARRAY_ARG(key))
+object getattr(Target const& target, Key const& key, Default const& default_ BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     return getattr(object(target), object(key), object(default_));
 }
 
 
 template <class Key, class Value>
-void setattr(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(key))
+void setattr(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     setattr(target, object(key), object(value));
 }
 
 template <class Key>
-void delattr(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(key))
+void delattr(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     delattr(target, object(key));
 }
 
 template <class Target, class Key>
-object getitem(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(key))
+object getitem(Target const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     return getitem(object(target), object(key));
 }
 
 
 template <class Key, class Value>
-void setitem(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(key))
+void setitem(object const& target, Key const& key, Value const& value BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     setitem(target, object(key), object(value));
 }
 
 template <class Key>
-void delitem(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(key))
+void delitem(object const& target, Key const& key BOOST_PYTHON_NO_ARRAY_ARG(Key))
 {
     delitem(target, object(key));
 }
similarity index 83%
rename from deal.II/contrib/boost/include/boost/python/object_slices.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/object_slices.hpp
index e70faff7a4754e9979f5c6fa302224915b75a7e0..748c2e954b2f59094bc597764ecaa8a07e95ff5f 100644 (file)
@@ -27,6 +27,12 @@ struct slice_policies : const_slice_policies
     static void del(object const& target, key_type const& key);
 };
 
+template <class T, class U>
+inline slice_policies::key_type slice_key(T x, U y)
+{
+    return slice_policies::key_type(handle<>(x), handle<>(y));
+}
+    
 //
 // implementation
 //
@@ -35,7 +41,7 @@ object_slice
 object_operators<U>::slice(object_cref start, object_cref finish)
 {
     object_cref2 x = *static_cast<U*>(this);
-    return object_slice(x, std::make_pair(borrowed(start.ptr()), borrowed(finish.ptr())));
+    return object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr())));
 }
 
 template <class U>
@@ -43,7 +49,7 @@ const_object_slice
 object_operators<U>::slice(object_cref start, object_cref finish) const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return const_object_slice(x, std::make_pair(borrowed(start.ptr()), borrowed(finish.ptr())));
+    return const_object_slice(x, api::slice_key(borrowed(start.ptr()), borrowed(finish.ptr())));
 }
 
 template <class U>
@@ -51,7 +57,7 @@ object_slice
 object_operators<U>::slice(slice_nil, object_cref finish)
 {
     object_cref2 x = *static_cast<U*>(this);
-    return object_slice(x, std::make_pair(allow_null((PyObject*)0), borrowed(finish.ptr())));
+    return object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr())));
 }
 
 template <class U>
@@ -59,7 +65,7 @@ const_object_slice
 object_operators<U>::slice(slice_nil, object_cref finish) const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return const_object_slice(x, std::make_pair(allow_null((PyObject*)0), borrowed(finish.ptr())));
+    return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), borrowed(finish.ptr())));
 }
 
 template <class U>
@@ -67,7 +73,7 @@ object_slice
 object_operators<U>::slice(slice_nil, slice_nil)
 {
     object_cref2 x = *static_cast<U*>(this);
-    return object_slice(x, std::make_pair(allow_null((PyObject*)0), allow_null((PyObject*)0)));
+    return object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0)));
 }
 
 template <class U>
@@ -75,7 +81,7 @@ const_object_slice
 object_operators<U>::slice(slice_nil, slice_nil) const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return const_object_slice(x, std::make_pair(allow_null((PyObject*)0), allow_null((PyObject*)0)));
+    return const_object_slice(x, api::slice_key(allow_null((PyObject*)0), allow_null((PyObject*)0)));
 }
 
 template <class U>
@@ -83,7 +89,7 @@ object_slice
 object_operators<U>::slice(object_cref start, slice_nil)
 {
     object_cref2 x = *static_cast<U*>(this);
-    return object_slice(x, std::make_pair(borrowed(start.ptr()), allow_null((PyObject*)0)));
+    return object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0)));
 }
 
 template <class U>
@@ -91,7 +97,7 @@ const_object_slice
 object_operators<U>::slice(object_cref start, slice_nil) const
 {
     object_cref2 x = *static_cast<U const*>(this);
-    return const_object_slice(x, std::make_pair(borrowed(start.ptr()), allow_null((PyObject*)0)));
+    return const_object_slice(x, api::slice_key(borrowed(start.ptr()), allow_null((PyObject*)0)));
 }
 # if !defined(BOOST_MSVC) || BOOST_MSVC > 1300
 template <class U>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/python/opaque_pointer_converter.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/opaque_pointer_converter.hpp
index 745a5cd4fbc5882685e4df75aef8131ad0b7d5e0..10eb4234c891fc63b38433b77d2e1055d9996b9e 100644 (file)
@@ -121,8 +121,7 @@ opaque<Pointee> opaque<Pointee>::instance;
 template <class Pointee>
 PyTypeObject opaque<Pointee>::type_object =
 {
-    PyObject_HEAD_INIT(0)
-    0,
+    PyVarObject_HEAD_INIT(NULL, 0)
     0,
     sizeof( BOOST_DEDUCED_TYPENAME opaque<Pointee>::python_instance ),
     0,
similarity index 99%
rename from deal.II/contrib/boost/include/boost/python/operators.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/operators.hpp
index e929779e01171770f4cd5b95ec5be4c49fc534e8..9a60b344a5c93bdc737e899e82d06715f78db12e 100644 (file)
@@ -341,7 +341,11 @@ BOOST_PYTHON_UNARY_OPERATOR(neg, -, operator-)
 BOOST_PYTHON_UNARY_OPERATOR(pos, +, operator+)
 BOOST_PYTHON_UNARY_OPERATOR(abs, abs, abs)
 BOOST_PYTHON_UNARY_OPERATOR(invert, ~, operator~)
+#if PY_VERSION_HEX >= 0x03000000
+BOOST_PYTHON_UNARY_OPERATOR(bool, !!, operator!)
+#else
 BOOST_PYTHON_UNARY_OPERATOR(nonzero, !!, operator!)
+#endif
 BOOST_PYTHON_UNARY_OPERATOR(int, long, int_)
 BOOST_PYTHON_UNARY_OPERATOR(long, PyLong_FromLong, long_)
 BOOST_PYTHON_UNARY_OPERATOR(float, double, float_)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/python/signature.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/signature.hpp
index c4151814f73ababd56f1f6e9c03262083298caf2..1bb2b226f543a807f714fe5f19c7bcaf4a7d8c47 100644 (file)
@@ -113,7 +113,10 @@ struct most_derived
 
 # endif // SIGNATURE_JDG20020813_HPP
 
-#elif BOOST_PP_ITERATION_DEPTH() == 1 // defined(BOOST_PP_IS_ITERATING)
+// For gcc 4.4 compatability, we must include the
+// BOOST_PP_ITERATION_DEPTH test inside an #else clause.
+#else // BOOST_PP_IS_ITERATING
+#if BOOST_PP_ITERATION_DEPTH() == 1 // defined(BOOST_PP_IS_ITERATING)
 
 # define N BOOST_PP_ITERATION()
 
@@ -176,4 +179,5 @@ get_signature(
 # undef Q
 # undef N
 
+#endif // BOOST_PP_ITERATION_DEPTH()
 #endif // !defined(BOOST_PP_IS_ITERATING)
similarity index 98%
rename from deal.II/contrib/boost/include/boost/python/str.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/python/str.hpp
index 86bc3ba6e8f9a8c4eec32261fb29e294614f7351..426a3a255c70527094f7d3b5fdd66bd2c62550f4 100644 (file)
@@ -37,10 +37,12 @@ namespace detail
     
       long count(object_cref sub, object_cref start, object_cref end) const;
 
+#if PY_VERSION_HEX < 0x03000000
       object decode() const;
       object decode(object_cref encoding) const;
 
       object decode(object_cref encoding, object_cref errors) const;
+#endif
 
       object encode() const;
       object encode(object_cref encoding) const;
@@ -185,6 +187,7 @@ class str : public detail::str_base
         return base::count(object(sub), object(start));
     }
 
+#if PY_VERSION_HEX < 0x03000000
     object decode() const { return base::decode(); }
     
     template<class T>
@@ -198,6 +201,7 @@ class str : public detail::str_base
     {
         return base::decode(object(encoding),object(errors));
     }
+#endif
 
     object encode() const { return base::encode(); }
 
@@ -404,7 +408,11 @@ namespace converter
 {
   template <>
   struct object_manager_traits<str>
+#if PY_VERSION_HEX >= 0x03000000
+      : pytype_object_manager_traits<&PyUnicode_Type,str>
+#else
       : pytype_object_manager_traits<&PyString_Type,str>
+#endif
   {
   };
 }
similarity index 91%
rename from deal.II/contrib/boost/include/boost/random/additive_combine.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/additive_combine.hpp
index f15989e310ec0b3bca4b568cb4e84259b9fe7768..2a43239f94b9732f7265b5028b399554163331be 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: additive_combine.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: additive_combine.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -20,6 +20,7 @@
 #include <algorithm> // for std::min and std::max
 #include <boost/config.hpp>
 #include <boost/cstdint.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/linear_congruential.hpp>
 
 namespace boost {
@@ -53,6 +54,8 @@ public:
   additive_combine(typename MLCG1::result_type seed1, 
                    typename MLCG2::result_type seed2)
     : _mlcg1(seed1), _mlcg2(seed2) { }
+  additive_combine(result_type seed)
+    : _mlcg1(seed), _mlcg2(seed) { }
   template<class It> additive_combine(It& first, It last)
     : _mlcg1(first, last), _mlcg2(first, last) { }
 
@@ -62,6 +65,12 @@ public:
     _mlcg2.seed();
   }
 
+  void seed(result_type seed)
+  {
+    _mlcg1.seed(seed);
+    _mlcg2.seed(seed);
+  }
+
   void seed(typename MLCG1::result_type seed1,
             typename MLCG2::result_type seed2)
   {
@@ -85,7 +94,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const additive_combine& r)
similarity index 92%
rename from deal.II/contrib/boost/include/boost/random/bernoulli_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/bernoulli_distribution.hpp
index a1e3bd78c84862428380c344beca188e4ccaad34..a716edf000ca9fc31052a71a34ba70e47b2f656d 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: bernoulli_distribution.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: bernoulli_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -18,6 +18,7 @@
 
 #include <cassert>
 #include <iostream>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -53,7 +54,7 @@ public:
       return RealType(eng() - (eng.min)()) <= _p * RealType((eng.max)()-(eng.min)());
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const bernoulli_distribution& bd)
similarity index 92%
rename from deal.II/contrib/boost/include/boost/random/binomial_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/binomial_distribution.hpp
index 414ea9881a926b2b3ae01fcf07fc9db62e4e80bc..17c96e1926a4677e2f4d80daf3029f860e0b4dba 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: binomial_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: binomial_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  */
 
@@ -16,6 +16,7 @@
 
 #include <boost/config/no_tr1/cmath.hpp>
 #include <cassert>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/bernoulli_distribution.hpp>
 
 namespace boost {
@@ -53,7 +54,7 @@ public:
     return n;
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const binomial_distribution& bd)
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/cauchy_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/cauchy_distribution.hpp
index f16269d13a8de1b404bbc3b280a6d8b4f8245f68..9723ced2b2566d2dd12f4fa5ad0b18228ea8dc5e 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: cauchy_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: cauchy_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -20,6 +20,7 @@
 #include <iostream>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -62,7 +63,7 @@ public:
     return _median + _sigma * tan(pi*(eng()-result_type(0.5)));
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const cauchy_distribution& cd)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/random/detail/config.hpp b/deal.II/contrib/boost-1.41.0/include/boost/random/detail/config.hpp
new file mode 100644 (file)
index 0000000..d6bc0cc
--- /dev/null
@@ -0,0 +1,18 @@
+/* boost random/detail/config.hpp header file
+ *
+ * Copyright Steven Watanabe 2009
+ * 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)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id: config.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
+ */
+
+#include <boost/config.hpp>
+
+#if (defined(BOOST_NO_OPERATORS_IN_NAMESPACE) || defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)) \
+    && !defined(BOOST_MSVC)
+    #define BOOST_RANDOM_NO_STREAM_OPERATORS
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/random/detail/seed.hpp b/deal.II/contrib/boost-1.41.0/include/boost/random/detail/seed.hpp
new file mode 100644 (file)
index 0000000..e1df433
--- /dev/null
@@ -0,0 +1,88 @@
+/* boost random/detail/seed.hpp header file
+ *
+ * Copyright Steven Watanabe 2009
+ * 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)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id: seed.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
+ */
+
+#ifndef BOOST_RANDOM_DETAIL_SEED_HPP
+#define BOOST_RANDOM_DETAIL_SEED_HPP
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_SFINAE)
+
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+
+namespace boost {
+namespace random {
+namespace detail {
+
+template<class T>
+struct disable_seed : boost::disable_if<boost::is_arithmetic<T> > {};
+
+template<class Engine, class T>
+struct disable_constructor : disable_seed<T> {};
+
+template<class Engine>
+struct disable_constructor<Engine, Engine> {
+};
+
+#define BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(Self, Generator, gen) \
+    template<class Generator>                                           \
+    explicit Self(Generator& gen, typename ::boost::random::detail::disable_constructor<Self, Generator>::type* = 0)
+
+#define BOOST_RANDOM_DETAIL_GENERATOR_SEED(Self, Generator, gen)    \
+    template<class Generator>                                       \
+    void seed(Generator& gen, typename ::boost::random::detail::disable_seed<Generator>::type* = 0)
+
+#define BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(Self, T, x)  \
+    explicit Self(const T& x)
+
+#define BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(Self, T, x) \
+    void seed(const T& x)
+
+}
+}
+}
+
+#else
+
+#include <boost/type_traits/is_arithmetic.hpp>
+#include <boost/mpl/bool.hpp>
+
+#define BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(Self, Generator, gen) \
+    Self(Self& other) { *this = other; }                                \
+    Self(const Self& other) { *this = other; }                          \
+    template<class Generator>                                           \
+    explicit Self(Generator& gen) {                                     \
+        boost_random_constructor_impl(gen, ::boost::is_arithmetic<Generator>());\
+    }                                                                   \
+    template<class Generator>                                           \
+    void boost_random_constructor_impl(Generator& gen, ::boost::mpl::false_)
+
+#define BOOST_RANDOM_DETAIL_GENERATOR_SEED(Self, Generator, gen)    \
+    template<class Generator>                                       \
+    void seed(Generator& gen) {                                     \
+        boost_random_seed_impl(gen, ::boost::is_arithmetic<Generator>());\
+    }\
+    template<class Generator>\
+    void boost_random_seed_impl(Generator& gen, ::boost::mpl::false_)
+
+#define BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(Self, T, x)  \
+    explicit Self(const T& x) { boost_random_constructor_impl(x, ::boost::mpl::true_()); }\
+    void boost_random_constructor_impl(const T& x, ::boost::mpl::true_)
+
+#define BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(Self, T, x) \
+    void seed(const T& x) { boost_random_seed_impl(x, ::boost::mpl::true_()); }\
+    void boost_random_seed_impl(const T& x, ::boost::mpl::true_)
+
+#endif
+
+#endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/random/detail/signed_unsigned_tools.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/detail/signed_unsigned_tools.hpp
index 609a273262fa48eb5733ab525cb9f547c932e18a..3c81cf49c1349918c40a4f11bbf1157724c995b7 100644 (file)
@@ -61,7 +61,7 @@ template<class T1, class T2>
 struct add<T1, T2, /* signed */ false>
 {
   typedef T2 result_type;
-  result_type operator()(T1 x, T2 y) { return x + y; }
+  result_type operator()(T1 x, T2 y) { return T2(x) + y; }
 };
 
 template<class T1, class T2>
@@ -71,7 +71,7 @@ struct add<T1, T2, /* signed */ true>
   result_type operator()(T1 x, T2 y)
   {
     if (y >= 0)
-      return x + y;
+      return T2(x) + y;
     // y < 0
     if (x >= T1(-(y+1)))  // result >= 0 after subtraction
       // avoid the nasty two's complement edge case for y == min()
similarity index 92%
rename from deal.II/contrib/boost/include/boost/random/detail/uniform_int_float.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/detail/uniform_int_float.hpp
index ec86ac07a093c72533cc4bc7c59ba88abea74f68..4607021e62b54ef21beb9d4b4da428bbddd2ccee 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: uniform_int_float.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: uniform_int_float.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  */
 
@@ -15,6 +15,7 @@
 #define BOOST_RANDOM_DETAIL_UNIFORM_INT_FLOAT_HPP
 
 #include <boost/config.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/uniform_01.hpp>
 
 
@@ -45,7 +46,7 @@ public:
     return static_cast<IntType>(_rng() * _range) + _min;
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_int_float& ud)
similarity index 94%
rename from deal.II/contrib/boost/include/boost/random/discard_block.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/discard_block.hpp
index 218c6dd133339d26deaafd6c88ff8950ba4d078d..6b97ab332cc381273615466f2b29764060faf20c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: discard_block.hpp 29116 2005-05-21 15:57:01Z dgregor $
+ * $Id: discard_block.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2001-03-02  created
@@ -20,6 +20,7 @@
 #include <boost/config.hpp>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 
 namespace boost {
@@ -42,6 +43,7 @@ public:
 
   discard_block() : _rng(), _n(0) { }
   explicit discard_block(const base_type & rng) : _rng(rng), _n(0) { }
+  template<class T> explicit discard_block(T s) : _rng(s), _n(0) {}
   template<class It> discard_block(It& first, It last)
     : _rng(first, last), _n(0) { }
   void seed() { _rng.seed(); _n = 0; }
@@ -69,7 +71,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const discard_block& s)
similarity index 92%
rename from deal.II/contrib/boost/include/boost/random/exponential_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/exponential_distribution.hpp
index 2c7f044c09f2bd67c6e6590d36381afc5feb7c6a..56ac8a21ca76f51b300cdb661ea2a3739228371f 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: exponential_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: exponential_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -21,6 +21,7 @@
 #include <iostream>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -54,7 +55,7 @@ public:
     return -result_type(1) / _lambda * log(result_type(1)-eng());
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const exponential_distribution& ed)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/gamma_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/gamma_distribution.hpp
index bf74822cc51d7ea8e5a4473b59ec7e2ab0b446ba..9e95bb8ef807a83bab02048a35fefb3b67b0fdeb 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: gamma_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: gamma_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  */
 
@@ -18,6 +18,7 @@
 #include <cassert>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/exponential_distribution.hpp>
 
 namespace boost {
@@ -93,7 +94,7 @@ public:
     }
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const gamma_distribution& gd)
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/geometric_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/geometric_distribution.hpp
index e457de44d313e776128730672e9c44d13d733a3e..b7e98a1d7b78653851a6c1f4028f96221d7d9a9c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: geometric_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: geometric_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -19,6 +19,7 @@
 #include <boost/config/no_tr1/cmath.hpp>          // std::log
 #include <cassert>
 #include <iostream>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/uniform_01.hpp>
 
 namespace boost {
@@ -59,7 +60,7 @@ public:
     return IntType(floor(log(RealType(1)-eng()) / _log_p)) + IntType(1);
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const geometric_distribution& gd)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/inversive_congruential.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/inversive_congruential.hpp
index 00be9556554c150fff811bdccec2bf8b8146d2c8..aa001a96f144591b31d67b34d872adb95777c2ca 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: inversive_congruential.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: inversive_congruential.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -21,6 +21,7 @@
 #include <stdexcept>
 #include <boost/config.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/detail/const_mod.hpp>
 
 namespace boost {
@@ -71,11 +72,11 @@ public:
     return value;
   }
 
-  bool validation(result_type x) const { return val == x; }
+  static bool validation(result_type x) { return val == x; }
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, inversive_congruential x)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/lagged_fibonacci.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/lagged_fibonacci.hpp
index b09925589e0dfa1e72c32c915fd170508c5658b7..5432885d83d10e62cdcd2a4117153b20192d2e09 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: lagged_fibonacci.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: lagged_fibonacci.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -27,6 +27,8 @@
 #include <boost/detail/workaround.hpp>
 #include <boost/random/linear_congruential.hpp>
 #include <boost/random/uniform_01.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/detail/seed.hpp>
 #include <boost/random/detail/pass_through_engine.hpp>
 
 namespace boost {
@@ -141,7 +143,7 @@ public:
   
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const lagged_fibonacci& f)
@@ -266,9 +268,10 @@ public:
   BOOST_STATIC_CONSTANT(unsigned int, short_lag = q);
 
   lagged_fibonacci_01() { init_modulus(); seed(); }
-  explicit lagged_fibonacci_01(uint32_t value) { init_modulus(); seed(value); }
-  template<class Generator>
-  explicit lagged_fibonacci_01(Generator & gen) { init_modulus(); seed(gen); }
+  BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(lagged_fibonacci_01, uint32_t, value)
+  { init_modulus(); seed(value); }
+  BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(lagged_fibonacci_01, Generator, gen)
+  { init_modulus(); seed(gen); }
   template<class It> lagged_fibonacci_01(It& first, It last)
   { init_modulus(); seed(first, last); }
   // compiler-generated copy ctor and assignment operator are fine
@@ -284,7 +287,8 @@ private:
   }
 
 public:
-  void seed(uint32_t value = 331u)
+  void seed() { seed(331u); }
+  BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(lagged_fibonacci_01, uint32_t, value)
   {
     minstd_rand0 intgen(value);
     seed(intgen);
@@ -293,8 +297,7 @@ public:
   // For GCC, moving this function out-of-line prevents inlining, which may
   // reduce overall object code size.  However, MSVC does not grok
   // out-of-line template member functions.
-  template<class Generator>
-  void seed(Generator & gen)
+  BOOST_RANDOM_DETAIL_GENERATOR_SEED(lagged_fibonacci, Generator, gen)
   {
     // use pass-by-reference, but wrap argument in pass_through_engine
     typedef detail::pass_through_engine<Generator&> ref_gen;
@@ -317,12 +320,14 @@ public:
     unsigned long mask = ~((~0u) << (w%32));   // now lowest w bits set
     RealType two32 = pow(RealType(2), 32);
     unsigned int j;
-    for(j = 0; j < long_lag && first != last; ++j, ++first) {
+    for(j = 0; j < long_lag && first != last; ++j) {
       x[j] = RealType(0);
       for(int k = 0; k < w/32 && first != last; ++k, ++first)
         x[j] += *first / pow(two32,k+1);
-      if(first != last && mask != 0)
+      if(first != last && mask != 0) {
         x[j] += fmod((*first & mask) / _modulus, RealType(1));
+        ++first;
+      }
     }
     i = long_lag;
     if(first == last && j < long_lag)
@@ -352,7 +357,7 @@ public:
   
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const lagged_fibonacci_01&f)
similarity index 88%
rename from deal.II/contrib/boost/include/boost/random/linear_congruential.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/linear_congruential.hpp
index 3e64ab4408e023724e3e1c8f93c3a319eab05b3a..ce971ca29bbc564f85133f735e371cbc468bc564 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: linear_congruential.hpp 29116 2005-05-21 15:57:01Z dgregor $
+ * $Id: linear_congruential.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -22,6 +22,7 @@
 #include <boost/config.hpp>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/detail/const_mod.hpp>
 #include <boost/detail/workaround.hpp>
 
@@ -65,7 +66,11 @@ public:
   }
 
   template<class It>
-  linear_congruential(It& first, It last) { seed(first, last); }
+  linear_congruential(It& first, It last)
+    : _modulus(modulus)
+  {
+      seed(first, last);
+  }
 
   // compiler-generated copy constructor and assignment operator are fine
   void seed(IntType x0 = 1)
@@ -110,7 +115,7 @@ public:
                          const linear_congruential& y)
   { return !(x == y); }
     
-#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+#if !defined(BOOST_RANDOM_NO_STREAM_OPERATORS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os,
@@ -152,7 +157,7 @@ operator>>(std::istream& is,
 {
     return is >> lcg._x;
 }
-#elif defined(BOOST_NO_OPERATORS_IN_NAMESPACE) || defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+#elif defined(BOOST_RANDOM_NO_STREAM_OPERATORS) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
 template<class CharT, class Traits, class IntType, IntType a, IntType c, IntType m, IntType val>
 std::basic_ostream<CharT,Traits>&
 operator<<(std::basic_ostream<CharT,Traits>& os,
@@ -207,12 +212,12 @@ public:
   int32_t min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return 0; }
   int32_t max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return std::numeric_limits<int32_t>::max BOOST_PREVENT_MACRO_SUBSTITUTION (); }
   
-  explicit rand48(int32_t x0 = 1) : lcf(cnv(x0)) { }
-  explicit rand48(uint64_t x0) : lcf(x0) { }
+  rand48() : lcf(cnv(static_cast<int32_t>(1))) {}
+  template<class T> explicit rand48(T x0) : lcf(cnv(x0)) { }
   template<class It> rand48(It& first, It last) : lcf(first, last) { }
   // compiler-generated copy ctor and assignment operator are fine
-  void seed(int32_t x0 = 1) { lcf.seed(cnv(x0)); }
-  void seed(uint64_t x0) { lcf.seed(x0); }
+  void seed() { seed(static_cast<int32_t>(1)); }
+  template<class T> void seed(T x0) { lcf.seed(cnv(x0)); }
   template<class It> void seed(It& first, It last) { lcf.seed(first,last); }
 
   int32_t operator()() { return static_cast<int32_t>(lcf() >> 17); }
@@ -221,7 +226,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT,class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const rand48& r)
@@ -248,8 +253,18 @@ private:
   random::linear_congruential<uint64_t,
     uint64_t(0xDEECE66DUL) | (uint64_t(0x5) << 32), // xxxxULL is not portable
     0xB, uint64_t(1)<<48, /* unknown */ 0> lcf;
-  static uint64_t cnv(int32_t x) 
-  { return (static_cast<uint64_t>(x) << 16) | 0x330e;  }
+  template<class T>
+  static uint64_t cnv(T x) 
+  {
+    if(sizeof(T) < sizeof(uint64_t)) {
+      return (static_cast<uint64_t>(x) << 16) | 0x330e;
+    } else {
+        return(static_cast<uint64_t>(x));
+    }
+  }
+  static uint64_t cnv(float x) { return(static_cast<uint64_t>(x)); }
+  static uint64_t cnv(double x) { return(static_cast<uint64_t>(x)); }
+  static uint64_t cnv(long double x) { return(static_cast<uint64_t>(x)); }
 };
 #endif /* !BOOST_NO_INT64_T && !BOOST_NO_INTEGRAL_INT64_T */
 
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/linear_feedback_shift.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/linear_feedback_shift.hpp
index b754254b1d3ff260e5ddd60e58e4906ed6fe3e96..cb01062c62a53e6800bb2d8ee658cddf965fb645 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: linear_feedback_shift.hpp 29116 2005-05-21 15:57:01Z dgregor $
+ * $Id: linear_feedback_shift.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  */
 
@@ -20,6 +20,7 @@
 #include <boost/config.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/limits.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 namespace random {
@@ -92,11 +93,11 @@ public:
     value = ((value & mask) << s) ^ b;
     return value;
   }
-  bool validation(result_type x) const { return val == x; }
+  static bool validation(result_type x) { return val == x; }
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, linear_feedback_shift x)
similarity index 94%
rename from deal.II/contrib/boost/include/boost/random/lognormal_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/lognormal_distribution.hpp
index 55bf6a3fad0d99e81741029fb28cba02660005a7..05f6ff6ad63da24cf124019f246cb061811d8048 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: lognormal_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: lognormal_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -21,6 +21,7 @@
 #include <iostream>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/normal_distribution.hpp>
 
 #ifdef BOOST_NO_STDC_NAMESPACE
@@ -74,7 +75,7 @@ public:
     return exp(_normal(eng) * _nsigma + _nmean);
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const lognormal_distribution& ld)
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/mersenne_twister.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/mersenne_twister.hpp
index 5bd278e610fc3f411ae0730263ada9a900e9d890..b60aadfab0100c94af3b7041aa810f6b63d453da 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: mersenne_twister.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: mersenne_twister.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -26,7 +26,9 @@
 #include <boost/cstdint.hpp>
 #include <boost/random/linear_congruential.hpp>
 #include <boost/detail/workaround.hpp>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/detail/ptr_helper.hpp>
+#include <boost/random/detail/seed.hpp>
 
 namespace boost {
 namespace random {
@@ -54,28 +56,18 @@ public:
   
   mersenne_twister() { seed(); }
 
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x520)
-  // Work around overload resolution problem (Gennadiy E. Rozental)
-  explicit mersenne_twister(const UIntType& value)
-#else
-  explicit mersenne_twister(UIntType value)
-#endif
+  BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(mersenne_twister, UIntType, value)
   { seed(value); }
   template<class It> mersenne_twister(It& first, It last) { seed(first,last); }
 
-  template<class Generator>
-  explicit mersenne_twister(Generator & gen) { seed(gen); }
+  BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(mersenne_twister, Generator, gen)
+  { seed(gen); }
 
   // compiler-generated copy ctor and assignment operator are fine
 
   void seed() { seed(UIntType(5489)); }
 
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x520)
-  // Work around overload resolution problem (Gennadiy E. Rozental)
-  void seed(const UIntType& value)
-#else
-  void seed(UIntType value)
-#endif
+  BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(mersenne_twister, UIntType, value)
   {
     // New seeding algorithm from 
     // http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/emt19937ar.html
@@ -92,8 +84,7 @@ public:
   // For GCC, moving this function out-of-line prevents inlining, which may
   // reduce overall object code size.  However, MSVC does not grok
   // out-of-line definitions of member function templates.
-  template<class Generator>
-  void seed(Generator & gen)
+  BOOST_RANDOM_DETAIL_GENERATOR_SEED(mersenne_twister, Generator, gen)
   {
 #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
     BOOST_STATIC_ASSERT(!std::numeric_limits<result_type>::is_signed);
@@ -130,7 +121,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const mersenne_twister& mt)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/normal_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/normal_distribution.hpp
index 5e8ec41489cf18310dbcc01fe3e63e3b383a6381..486411e02a923808356f511ee2294dd3b10ae396 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: normal_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: normal_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -21,6 +21,7 @@
 #include <iostream>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -80,7 +81,7 @@ public:
       * _sigma + _mean;
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const normal_distribution& nd)
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/poisson_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/poisson_distribution.hpp
index 09d9f793fc59ff65e78eabb6831bd84abae3d1f9..3cc2ba6cbc32892de128123931ea8a17581c12ae 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: poisson_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: poisson_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  */
 
@@ -19,6 +19,7 @@
 #include <iostream>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -60,7 +61,7 @@ public:
     }
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const poisson_distribution& pd)
similarity index 97%
rename from deal.II/contrib/boost/include/boost/random/shuffle_output.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/shuffle_output.hpp
index 96241b6882068fe61e510194a9febe01e1b8dc13..cacf8c380474f6b10ebea294a146181e93a6d8bb 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: shuffle_output.hpp 41369 2007-11-25 18:07:19Z bemandawes $
+ * $Id: shuffle_output.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -84,7 +84,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const shuffle_output& s)
similarity index 95%
rename from deal.II/contrib/boost/include/boost/random/subtract_with_carry.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/subtract_with_carry.hpp
index e75726239c7cfdf8cb60d96903ac18680c416f3c..2c851ff738270fbe42c84a3fce7e7b19fbd3ac89 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: subtract_with_carry.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: subtract_with_carry.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  * Revision history
  *  2002-03-02  created
@@ -26,6 +26,8 @@
 #include <boost/cstdint.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/detail/workaround.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/detail/seed.hpp>
 #include <boost/random/linear_congruential.hpp>
 
 
@@ -85,14 +87,16 @@ public:
 #endif
     seed();
   }
-  explicit subtract_with_carry(uint32_t value) { seed(value); }
-  template<class Generator>
-  explicit subtract_with_carry(Generator & gen) { seed(gen); }
+  BOOST_RANDOM_DETAIL_ARITHMETIC_CONSTRUCTOR(subtract_with_carry, uint32_t, value)
+  { seed(value); }
+  BOOST_RANDOM_DETAIL_GENERATOR_CONSTRUCTOR(subtract_with_carry, Generator, gen)
+  { seed(gen); }
   template<class It> subtract_with_carry(It& first, It last) { seed(first,last); }
 
   // compiler-generated copy ctor and assignment operator are fine
 
-  void seed(uint32_t value = 19780503u)
+  void seed() { seed(19780503u); }
+  BOOST_RANDOM_DETAIL_ARITHMETIC_SEED(subtract_with_carry, uint32_t, value)
   {
     random::linear_congruential<int32_t, 40014, 0, 2147483563, 0> intgen(value);
     seed(intgen);
@@ -101,8 +105,7 @@ public:
   // For GCC, moving this function out-of-line prevents inlining, which may
   // reduce overall object code size.  However, MSVC does not grok
   // out-of-line template member functions.
-  template<class Generator>
-  void seed(Generator & gen)
+  BOOST_RANDOM_DETAIL_GENERATOR_SEED(subtract_with_carry, Generator, gen)
   {
     // I could have used std::generate_n, but it takes "gen" by value
     for(unsigned int j = 0; j < long_lag; ++j)
@@ -153,7 +156,7 @@ public:
   
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os,
@@ -345,7 +348,7 @@ public:
   
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os,
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/triangle_distribution.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/triangle_distribution.hpp
index 819e0b61e6baf7e3a532fea71970bcce96aa379e..1659b933460b5fa2b4f6266f6abc33337b21ad5b 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: triangle_distribution.hpp 49314 2008-10-13 09:00:03Z johnmaddock $
+ * $Id: triangle_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -18,6 +18,7 @@
 
 #include <boost/config/no_tr1/cmath.hpp>
 #include <cassert>
+#include <boost/random/detail/config.hpp>
 #include <boost/random/uniform_01.hpp>
 
 namespace boost {
@@ -60,7 +61,7 @@ public:
       return _c - d3*sqrt(d2*u-d1);
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const triangle_distribution& td)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_01.hpp b/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_01.hpp
new file mode 100644 (file)
index 0000000..459735c
--- /dev/null
@@ -0,0 +1,220 @@
+/* boost random/uniform_01.hpp header file
+ *
+ * Copyright Jens Maurer 2000-2001
+ * 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)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id: uniform_01.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
+ *
+ * Revision history
+ *  2001-02-18  moved to individual header files
+ */
+
+#ifndef BOOST_RANDOM_UNIFORM_01_HPP
+#define BOOST_RANDOM_UNIFORM_01_HPP
+
+#include <iostream>
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/detail/pass_through_engine.hpp>
+
+namespace boost {
+
+namespace detail {
+
+template<class RealType>
+class new_uniform_01
+{
+public:
+  typedef RealType input_type;
+  typedef RealType result_type;
+  // compiler-generated copy ctor and copy assignment are fine
+  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(0); }
+  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(1); }
+  void reset() { }
+
+  template<class Engine>
+  result_type operator()(Engine& eng) {
+    for (;;) {
+      typedef typename Engine::result_type base_result;
+      result_type factor = result_type(1) /
+              (result_type((eng.max)()-(eng.min)()) +
+               result_type(std::numeric_limits<base_result>::is_integer ? 1 : 0));
+      result_type result = result_type(eng() - (eng.min)()) * factor;
+      if (result < result_type(1))
+        return result;
+    }
+  }
+
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os, const new_uniform_01&)
+  {
+    return os;
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is, new_uniform_01&)
+  {
+    return is;
+  }
+#endif
+};
+
+template<class UniformRandomNumberGenerator, class RealType>
+class backward_compatible_uniform_01
+{
+  typedef boost::random::detail::ptr_helper<UniformRandomNumberGenerator> traits;
+  typedef boost::random::detail::pass_through_engine<UniformRandomNumberGenerator> internal_engine_type;
+public:
+  typedef UniformRandomNumberGenerator base_type;
+  typedef RealType result_type;
+
+  BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);
+
+#if !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) && !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300)
+  BOOST_STATIC_ASSERT(!std::numeric_limits<RealType>::is_integer);
+#endif
+
+  explicit backward_compatible_uniform_01(typename traits::rvalue_type rng)
+    : _rng(rng),
+      _factor(result_type(1) /
+              (result_type((_rng.max)()-(_rng.min)()) +
+               result_type(std::numeric_limits<base_result>::is_integer ? 1 : 0)))
+  {
+  }
+  // compiler-generated copy ctor and copy assignment are fine
+
+  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(0); }
+  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(1); }
+  typename traits::value_type& base() { return _rng.base(); }
+  const typename traits::value_type& base() const { return _rng.base(); }
+  void reset() { }
+
+  result_type operator()() {
+    for (;;) {
+      result_type result = result_type(_rng() - (_rng.min)()) * _factor;
+      if (result < result_type(1))
+        return result;
+    }
+  }
+
+#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os, const backward_compatible_uniform_01& u)
+  {
+    os << u._rng;
+    return os;
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is, backward_compatible_uniform_01& u)
+  {
+    is >> u._rng;
+    return is;
+  }
+#endif
+
+private:
+  typedef typename internal_engine_type::result_type base_result;
+  internal_engine_type _rng;
+  result_type _factor;
+};
+
+#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+//  A definition is required even for integral static constants
+template<class UniformRandomNumberGenerator, class RealType>
+const bool backward_compatible_uniform_01<UniformRandomNumberGenerator, RealType>::has_fixed_range;
+#endif
+
+template<class UniformRandomNumberGenerator>
+struct select_uniform_01
+{
+  template<class RealType>
+  struct apply
+  {
+    typedef backward_compatible_uniform_01<UniformRandomNumberGenerator, RealType> type;
+  };
+};
+
+template<>
+struct select_uniform_01<float>
+{
+  template<class RealType>
+  struct apply
+  {
+    typedef new_uniform_01<float> type;
+  };
+};
+
+template<>
+struct select_uniform_01<double>
+{
+  template<class RealType>
+  struct apply
+  {
+    typedef new_uniform_01<double> type;
+  };
+};
+
+template<>
+struct select_uniform_01<long double>
+{
+  template<class RealType>
+  struct apply
+  {
+    typedef new_uniform_01<long double> type;
+  };
+};
+
+}
+
+// Because it is so commonly used: uniform distribution on the real [0..1)
+// range.  This allows for specializations to avoid a costly int -> float
+// conversion plus float multiplication
+template<class UniformRandomNumberGenerator = double, class RealType = double>
+class uniform_01
+  : public detail::select_uniform_01<UniformRandomNumberGenerator>::BOOST_NESTED_TEMPLATE apply<RealType>::type
+{
+  typedef typename detail::select_uniform_01<UniformRandomNumberGenerator>::BOOST_NESTED_TEMPLATE apply<RealType>::type impl_type;
+  typedef boost::random::detail::ptr_helper<UniformRandomNumberGenerator> traits;
+public:
+
+  uniform_01() {}
+
+  explicit uniform_01(typename traits::rvalue_type rng)
+    : impl_type(rng)
+  {
+  }
+
+#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_01& u)
+  {
+    os << static_cast<const impl_type&>(u);
+    return os;
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is, uniform_01& u)
+  {
+    is >> static_cast<impl_type&>(u);
+    return is;
+  }
+#endif
+};
+
+} // namespace boost
+
+#endif // BOOST_RANDOM_UNIFORM_01_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_int.hpp b/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_int.hpp
new file mode 100644 (file)
index 0000000..372a6c7
--- /dev/null
@@ -0,0 +1,264 @@
+/* boost random/uniform_int.hpp header file
+ *
+ * Copyright Jens Maurer 2000-2001
+ * 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)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id: uniform_int.hpp 56814 2009-10-14 04:54:01Z steven_watanabe $
+ *
+ * Revision history
+ *  2001-04-08  added min<max assertion (N. Becker)
+ *  2001-02-18  moved to individual header files
+ */
+
+#ifndef BOOST_RANDOM_UNIFORM_INT_HPP
+#define BOOST_RANDOM_UNIFORM_INT_HPP
+
+#include <cassert>
+#include <iostream>
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/detail/signed_unsigned_tools.hpp>
+#include <boost/type_traits/make_unsigned.hpp>
+
+namespace boost {
+
+// uniform integer distribution on [min, max]
+template<class IntType = int>
+class uniform_int
+{
+public:
+  typedef IntType input_type;
+  typedef IntType result_type;
+  typedef typename make_unsigned<result_type>::type range_type;
+
+  explicit uniform_int(IntType min_arg = 0, IntType max_arg = 9)
+    : _min(min_arg), _max(max_arg)
+  {
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope
+    BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);
+#endif
+    assert(min_arg <= max_arg);
+    init();
+  }
+
+  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
+  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
+  void reset() { }
+  
+  // can't have member function templates out-of-line due to MSVC bugs
+  template<class Engine>
+  result_type operator()(Engine& eng)
+  {
+      return generate(eng, _min, _max, _range);
+  }
+
+  template<class Engine>
+  result_type operator()(Engine& eng, result_type n)
+  {
+      assert(n > 0);
+
+      if (n == 1)
+      {
+        return 0;
+      }
+
+      return generate(eng, 0, n - 1, n - 1);
+  }
+
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_int& ud)
+  {
+    os << ud._min << " " << ud._max;
+    return os;
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is, uniform_int& ud)
+  {
+    is >> std::ws >> ud._min >> std::ws >> ud._max;
+    ud.init();
+    return is;
+  }
+#endif
+
+private:
+  template<class Engine>
+  static result_type generate(Engine& eng, result_type min_value, result_type max_value, range_type range)
+  {
+    typedef typename Engine::result_type base_result;
+    // ranges are always unsigned
+    typedef typename make_unsigned<base_result>::type base_unsigned;
+    const base_result bmin = (eng.min)();
+    const base_unsigned brange =
+      random::detail::subtract<base_result>()((eng.max)(), (eng.min)());
+
+    if(range == 0) {
+      return min_value;    
+    } else if(brange == range) {
+      // this will probably never happen in real life
+      // basically nothing to do; just take care we don't overflow / underflow
+      base_unsigned v = random::detail::subtract<base_result>()(eng(), bmin);
+      return random::detail::add<base_unsigned, result_type>()(v, min_value);
+    } else if(brange < range) {
+      // use rejection method to handle things like 0..3 --> 0..4
+      for(;;) {
+        // concatenate several invocations of the base RNG
+        // take extra care to avoid overflows
+
+        //  limit == floor((range+1)/(brange+1))
+        //  Therefore limit*(brange+1) <= range+1
+        range_type limit;
+        if(range == (std::numeric_limits<range_type>::max)()) {
+          limit = range/(range_type(brange)+1);
+          if(range % (range_type(brange)+1) == range_type(brange))
+            ++limit;
+        } else {
+          limit = (range+1)/(range_type(brange)+1);
+        }
+
+        // We consider "result" as expressed to base (brange+1):
+        // For every power of (brange+1), we determine a random factor
+        range_type result = range_type(0);
+        range_type mult = range_type(1);
+
+        // loop invariants:
+        //  result < mult
+        //  mult <= range
+        while(mult <= limit) {
+          // Postcondition: result <= range, thus no overflow
+          //
+          // limit*(brange+1)<=range+1                   def. of limit       (1)
+          // eng()-bmin<=brange                          eng() post.         (2)
+          // and mult<=limit.                            loop condition      (3)
+          // Therefore mult*(eng()-bmin+1)<=range+1      by (1),(2),(3)      (4)
+          // Therefore mult*(eng()-bmin)+mult<=range+1   rearranging (4)     (5)
+          // result<mult                                 loop invariant      (6)
+          // Therefore result+mult*(eng()-bmin)<range+1  by (5), (6)         (7)
+          //
+          // Postcondition: result < mult*(brange+1)
+          //
+          // result<mult                                 loop invariant      (1)
+          // eng()-bmin<=brange                          eng() post.         (2)
+          // Therefore result+mult*(eng()-bmin) <
+          //           mult+mult*(eng()-bmin)            by (1)              (3)
+          // Therefore result+(eng()-bmin)*mult <
+          //           mult+mult*brange                  by (2), (3)         (4)
+          // Therefore result+(eng()-bmin)*mult <
+          //           mult*(brange+1)                   by (4)
+          result += static_cast<range_type>(random::detail::subtract<base_result>()(eng(), bmin) * mult);
+
+          // equivalent to (mult * (brange+1)) == range+1, but avoids overflow.
+          if(mult * range_type(brange) == range - mult + 1) {
+              // The destination range is an integer power of
+              // the generator's range.
+              return(result);
+          }
+
+          // Postcondition: mult <= range
+          // 
+          // limit*(brange+1)<=range+1                   def. of limit       (1)
+          // mult<=limit                                 loop condition      (2)
+          // Therefore mult*(brange+1)<=range+1          by (1), (2)         (3)
+          // mult*(brange+1)!=range+1                    preceding if        (4)
+          // Therefore mult*(brange+1)<range+1           by (3), (4)         (5)
+          // 
+          // Postcondition: result < mult
+          //
+          // See the second postcondition on the change to result. 
+          mult *= range_type(brange)+range_type(1);
+        }
+        // loop postcondition: range/mult < brange+1
+        //
+        // mult > limit                                  loop condition      (1)
+        // Suppose range/mult >= brange+1                Assumption          (2)
+        // range >= mult*(brange+1)                      by (2)              (3)
+        // range+1 > mult*(brange+1)                     by (3)              (4)
+        // range+1 > (limit+1)*(brange+1)                by (1), (4)         (5)
+        // (range+1)/(brange+1) > limit+1                by (5)              (6)
+        // limit < floor((range+1)/(brange+1))           by (6)              (7)
+        // limit==floor((range+1)/(brange+1))            def. of limit       (8)
+        // not (2)                                       reductio            (9)
+        //
+        // loop postcondition: (range/mult)*mult+(mult-1) >= range
+        //
+        // (range/mult)*mult + range%mult == range       identity            (1)
+        // range%mult < mult                             def. of %           (2)
+        // (range/mult)*mult+mult > range                by (1), (2)         (3)
+        // (range/mult)*mult+(mult-1) >= range           by (3)              (4)
+        //
+        // Note that the maximum value of result at this point is (mult-1),
+        // so after this final step, we generate numbers that can be
+        // at least as large as range.  We have to really careful to avoid
+        // overflow in this final addition and in the rejection.  Anything
+        // that overflows is larger than range and can thus be rejected.
+
+        // range/mult < brange+1  -> no endless loop
+        range_type result_increment = uniform_int<range_type>(0, range/mult)(eng);
+        if((std::numeric_limits<range_type>::max)() / mult < result_increment) {
+          // The multiplcation would overflow.  Reject immediately.
+          continue;
+        }
+        result_increment *= mult;
+        // unsigned integers are guaranteed to wrap on overflow.
+        result += result_increment;
+        if(result < result_increment) {
+          // The addition overflowed.  Reject.
+          continue;
+        }
+        if(result > range) {
+          // Too big.  Reject.
+          continue;
+        }
+        return random::detail::add<range_type, result_type>()(result, min_value);
+      }
+    } else {                   // brange > range
+      base_unsigned bucket_size;
+      // it's safe to add 1 to range, as long as we cast it first,
+      // because we know that it is less than brange.  However,
+      // we do need to be careful not to cause overflow by adding 1
+      // to brange.
+      if(brange == (std::numeric_limits<base_unsigned>::max)()) {
+        bucket_size = brange / (static_cast<base_unsigned>(range)+1);
+        if(brange % (static_cast<base_unsigned>(range)+1) == static_cast<base_unsigned>(range)) {
+          ++bucket_size;
+        }
+      } else {
+        bucket_size = (brange+1) / (static_cast<base_unsigned>(range)+1);
+      }
+      for(;;) {
+        base_unsigned result =
+          random::detail::subtract<base_result>()(eng(), bmin);
+        result /= bucket_size;
+        // result and range are non-negative, and result is possibly larger
+        // than range, so the cast is safe
+        if(result <= static_cast<base_unsigned>(range))
+          return random::detail::add<base_unsigned, result_type>()(result, min_value);
+      }
+    }
+  }
+
+  void init()
+  {
+    _range = random::detail::subtract<result_type>()(_max, _min);
+  }
+
+  // The result_type may be signed or unsigned, but the _range is always
+  // unsigned.
+  result_type _min, _max;
+  range_type _range;
+};
+
+} // namespace boost
+
+#endif // BOOST_RANDOM_UNIFORM_INT_HPP
similarity index 93%
rename from deal.II/contrib/boost/include/boost/random/uniform_on_sphere.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/uniform_on_sphere.hpp
index 13219f244f8f915676d50a31d97081ac5330e3f5..650030ee83a7d57ef0e8f5f1d65280c13f9a9162 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: uniform_on_sphere.hpp 24096 2004-07-27 03:43:34Z dgregor $
+ * $Id: uniform_on_sphere.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
  *
  * Revision history
  *  2001-02-18  moved to individual header files
@@ -19,6 +19,7 @@
 #include <vector>
 #include <algorithm>     // std::transform
 #include <functional>    // std::bind2nd, std::divides
+#include <boost/random/detail/config.hpp>
 #include <boost/random/normal_distribution.hpp>
 
 namespace boost {
@@ -56,7 +57,7 @@ public:
     return _container;
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_on_sphere& sd)
similarity index 79%
rename from deal.II/contrib/boost/include/boost/random/uniform_real.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/uniform_real.hpp
index 6da0a801d61816b49bf9342ba94b357314267317..6a6e90065b5aa63e976bed0e8a3e3bdd81961eab 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: uniform_real.hpp 47233 2008-07-08 16:22:46Z steven_watanabe $
+ * $Id: uniform_real.hpp 56814 2009-10-14 04:54:01Z steven_watanabe $
  *
  * Revision history
  *  2001-04-08  added min<max assertion (N. Becker)
@@ -22,6 +22,7 @@
 #include <boost/config.hpp>
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
 
 namespace boost {
 
@@ -51,12 +52,14 @@ public:
 
   template<class Engine>
   result_type operator()(Engine& eng) {
-    return static_cast<result_type>(eng() - eng.min BOOST_PREVENT_MACRO_SUBSTITUTION())
-           / static_cast<result_type>(eng.max BOOST_PREVENT_MACRO_SUBSTITUTION() - eng.min BOOST_PREVENT_MACRO_SUBSTITUTION())
-           * (_max - _min) + _min;
+    result_type numerator = static_cast<result_type>(eng() - eng.min BOOST_PREVENT_MACRO_SUBSTITUTION());
+    result_type divisor = static_cast<result_type>(eng.max BOOST_PREVENT_MACRO_SUBSTITUTION() - eng.min BOOST_PREVENT_MACRO_SUBSTITUTION());
+    assert(divisor > 0);
+    assert(numerator >= 0 && numerator <= divisor);
+    return numerator / divisor * (_max - _min) + _min;
   }
 
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_real& ud)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_smallint.hpp b/deal.II/contrib/boost-1.41.0/include/boost/random/uniform_smallint.hpp
new file mode 100644 (file)
index 0000000..60ea384
--- /dev/null
@@ -0,0 +1,108 @@
+/* boost random/uniform_smallint.hpp header file
+ *
+ * Copyright Jens Maurer 2000-2001
+ * 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)
+ *
+ * See http://www.boost.org for most recent version including documentation.
+ *
+ * $Id: uniform_smallint.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $
+ *
+ * Revision history
+ *  2001-04-08  added min<max assertion (N. Becker)
+ *  2001-02-18  moved to individual header files
+ */
+
+#ifndef BOOST_RANDOM_UNIFORM_SMALLINT_HPP
+#define BOOST_RANDOM_UNIFORM_SMALLINT_HPP
+
+#include <cassert>
+#include <iostream>
+#include <boost/config.hpp>
+#include <boost/limits.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/random/detail/config.hpp>
+#include <boost/random/uniform_01.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost {
+
+// uniform integer distribution on a small range [min, max]
+
+template<class IntType = int>
+class uniform_smallint
+{
+public:
+  typedef IntType input_type;
+  typedef IntType result_type;
+
+  explicit uniform_smallint(IntType min_arg = 0, IntType max_arg = 9)
+    : _min(min_arg), _max(max_arg)
+  {
+#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
+    // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope
+    BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);
+#endif
+ }
+
+  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
+  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
+  void reset() { }
+
+  template<class Engine>
+  result_type operator()(Engine& eng)
+  {
+    typedef typename Engine::result_type base_result;
+    base_result _range = static_cast<base_result>(_max-_min)+1;
+    base_result _factor = 1;
+    
+    // LCGs get bad when only taking the low bits.
+    // (probably put this logic into a partial template specialization)
+    // Check how many low bits we can ignore before we get too much
+    // quantization error.
+    base_result r_base = (eng.max)() - (eng.min)();
+    if(r_base == (std::numeric_limits<base_result>::max)()) {
+      _factor = 2;
+      r_base /= 2;
+    }
+    r_base += 1;
+    if(r_base % _range == 0) {
+      // No quantization effects, good
+      _factor = r_base / _range;
+    } else {
+      // carefully avoid overflow; pessimizing here
+      for( ; r_base/_range/32 >= _range; _factor *= 2)
+        r_base /= 2;
+    }
+
+    return ((eng() - (eng.min)()) / _factor) % _range + _min;
+  }
+
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_smallint& ud)
+  {
+    os << ud._min << " " << ud._max;
+    return os;
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is, uniform_smallint& ud)
+  {
+    is >> std::ws >> ud._min >> std::ws >> ud._max;
+    return is;
+  }
+#endif
+
+private:
+
+  result_type _min;
+  result_type _max;
+};
+
+} // namespace boost
+
+#endif // BOOST_RANDOM_UNIFORM_SMALLINT_HPP
similarity index 80%
rename from deal.II/contrib/boost/include/boost/random/xor_combine.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/random/xor_combine.hpp
index 10d0855a6bcbe92cf1c59c83e9006f25a0a60fab..02fbfa677099d9653a903f4b3e1d734eef385329 100644 (file)
@@ -7,7 +7,7 @@
  *
  * See http://www.boost.org for most recent version including documentation.
  *
- * $Id: xor_combine.hpp 29116 2005-05-21 15:57:01Z dgregor $
+ * $Id: xor_combine.hpp 53871 2009-06-13 17:54:06Z steven_watanabe $
  *
  */
 
 #include <boost/limits.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/cstdint.hpp>     // uint32_t
+#include <boost/random/detail/config.hpp>
 
 
 namespace boost {
 namespace random {
 
-template<class URNG1, int s1, class URNG2, int s2,
 #ifndef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
-  typename URNG1::result_type 
+  #define BOOST_RANDOM_VAL_TYPE typename URNG1::result_type 
 #else
-  uint32_t
+  #define BOOST_RANDOM_VAL_TYPE uint32_t
 #endif
-  val = 0>
+
+template<class URNG1, int s1, class URNG2, int s2, BOOST_RANDOM_VAL_TYPE val = 0>
 class xor_combine
 {
 public:
@@ -42,15 +43,18 @@ public:
 
   BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);
   BOOST_STATIC_CONSTANT(int, shift1 = s1);
-  BOOST_STATIC_CONSTANT(int, shfit2 = s2);
+  BOOST_STATIC_CONSTANT(int, shift2 = s2);
 
   xor_combine() : _rng1(), _rng2()
   { }
   xor_combine(const base1_type & rng1, const base2_type & rng2)
     : _rng1(rng1), _rng2(rng2) { }
+  xor_combine(const result_type & v)
+    : _rng1(v), _rng2(v) { }
   template<class It> xor_combine(It& first, It last)
     : _rng1(first, last), _rng2( /* advanced by other call */ first, last) { }
   void seed() { _rng1.seed(); _rng2.seed(); }
+  void seed(const result_type & v) { _rng1.seed(v); _rng2.seed(v); }
   template<class It> void seed(It& first, It last)
   {
     _rng1.seed(first, last);
@@ -77,7 +81,7 @@ public:
 
 #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
 
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+#ifndef BOOST_RANDOM_NO_STREAM_OPERATORS
   template<class CharT, class Traits>
   friend std::basic_ostream<CharT,Traits>&
   operator<<(std::basic_ostream<CharT,Traits>& os, const xor_combine& s)
@@ -114,16 +118,16 @@ private:
 
 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
 //  A definition is required even for integral static constants
-template<class URNG1, int s1, class URNG2, int s2,
-#ifndef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS
-  typename URNG1::result_type 
-#else
-  uint32_t
-#endif
-  val>
+template<class URNG1, int s1, class URNG2, int s2, BOOST_RANDOM_VAL_TYPE val>
 const bool xor_combine<URNG1, s1, URNG2, s2, val>::has_fixed_range;
+template<class URNG1, int s1, class URNG2, int s2, BOOST_RANDOM_VAL_TYPE val>
+const int xor_combine<URNG1, s1, URNG2, s2, val>::shift1;
+template<class URNG1, int s1, class URNG2, int s2, BOOST_RANDOM_VAL_TYPE val>
+const int xor_combine<URNG1, s1, URNG2, s2, val>::shift2;
 #endif
 
+#undef BOOST_RANDOM_VAL_TYPE
+
 } // namespace random
 } // namespace boost
 
similarity index 97%
rename from deal.II/contrib/boost/include/boost/range/as_literal.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/range/as_literal.hpp
index 38cc9cf645ecca3a1468d5769aed538005ab9e4a..2f04ca8f0c0a029b8e713a4f8f23deca8d8f0a82 100644 (file)
@@ -38,7 +38,7 @@ namespace boost
             return strlen( s );
         }
 
-#ifndef BOOST_NO_INTRINSIC_WCHAR_T 
+#ifndef BOOST_NO_CWCHAR  
         inline std::size_t length( const wchar_t* s )
         {
             return wcslen( s );
@@ -61,7 +61,7 @@ namespace boost
             return true;
         }
 
-#ifndef BOOST_NO_INTRINSIC_WCHAR_T 
+#ifndef BOOST_NO_CWCHAR  
         inline bool is_char_ptr( wchar_t* )
         {
             return true;
similarity index 98%
rename from deal.II/contrib/boost/include/boost/rational.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/rational.hpp
index d34de680445fcc7ad17091011adedf3b1a96c045..468db79283530ad0801933cd84b88ff05de8125e 100644 (file)
@@ -5,6 +5,10 @@
 //  in all copies. This software is provided "as is" without express or
 //  implied warranty, and with no claim as to its suitability for any purpose.
 
+// boostinspect:nolicense (don't complain about the lack of a Boost license)
+// (Paul Moore hasn't been in contact for years, so there's no way to change the
+// license.)
+
 //  See http://www.boost.org/libs/rational for documentation.
 
 //  Credits:
@@ -51,7 +55,7 @@
 #define BOOST_RATIONAL_HPP
 
 #include <iostream>              // for std::istream and std::ostream
-#include <iomanip>               // for std::noskipws
+#include <ios>                   // for std::noskipws
 #include <stdexcept>             // for std::domain_error
 #include <string>                // for std::string implicit constructor
 #include <boost/operators.hpp>   // for boost::addable etc
@@ -437,11 +441,18 @@ bool rational<IntType>::operator< (const rational<IntType>& r) const
     }
     else
     {
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4800)
+#endif
         // Exactly one of the remainders is zero, so all following c.f.
         // components of that variable are infinity, while the other variable
         // has a finite next c.f. component.  So that other variable has the
         // lesser value (modulo the reversal flag!).
         return ( ts.r != zero ) != static_cast<bool>( reverse );
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
     }
 }
 
similarity index 94%
rename from deal.II/contrib/boost/include/boost/ref.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/ref.hpp
index 330ca6567f65d29b8e9fd892f33398268f026636..6058d6983197a72ab040bbfeb7e0b04006cc3ece 100644 (file)
@@ -173,6 +173,17 @@ class unwrap_reference
 
 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 
+template <class T> inline typename unwrap_reference<T>::type&
+unwrap_ref(T& t)
+{
+    return t;
+}
+
+template<class T> inline T* get_pointer( reference_wrapper<T> const & r )
+{
+    return r.get_pointer();
+}
+
 } // namespace boost
 
 #endif // #ifndef BOOST_REF_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/scoped_array.hpp b/deal.II/contrib/boost-1.41.0/include/boost/scoped_array.hpp
new file mode 100644 (file)
index 0000000..c02fa31
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
+#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
+
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org/libs/smart_ptr/scoped_array.htm
+//
+
+#include <boost/smart_ptr/scoped_array.hpp>
+
+#endif  // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/scoped_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/scoped_ptr.hpp
new file mode 100644 (file)
index 0000000..cb916da
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
+#define BOOST_SCOPED_PTR_HPP_INCLUDED
+
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
+//
+
+#include <boost/smart_ptr/scoped_ptr.hpp>
+
+#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/access.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/access.hpp
new file mode 100644 (file)
index 0000000..990f034
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef BOOST_SERIALIZATION_ACCESS_HPP
+#define BOOST_SERIALIZATION_ACCESS_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// access.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/pfto.hpp>
+
+namespace boost {
+
+namespace archive {
+namespace detail {
+    template<class Archive, class T>
+    class iserializer;
+    template<class Archive, class T>
+    class oserializer;
+} // namespace detail
+} // namespace archive
+
+namespace serialization {
+
+// forward declarations
+template<class Archive, class T>
+inline void serialize_adl(Archive &, T &, const unsigned int);
+namespace detail {
+    template<class Archive, class T>
+    struct member_saver;
+    template<class Archive, class T>
+    struct member_loader;
+} // namespace detail
+
+// use an "accessor class so that we can use: 
+// "friend class boost::serialization::access;" 
+// in any serialized class to permit clean, safe access to private class members
+// by the serialization system
+
+class access {
+public:
+    // grant access to "real" serialization defaults
+#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+public:
+#else
+    template<class Archive, class T>
+    friend struct detail::member_saver;
+    template<class Archive, class T>
+    friend struct detail::member_loader;
+    template<class Archive, class T>
+    friend class archive::detail::iserializer;
+    template<class Archive, class T>
+    friend class archive::detail::oserializer;
+    template<class Archive, class T>
+    friend inline void serialize(
+        Archive & ar, 
+        T & t, 
+        const BOOST_PFTO unsigned int file_version
+    );
+    template<class Archive, class T>
+    friend inline void save_construct_data(
+        Archive & ar, 
+        const T * t, 
+        const BOOST_PFTO unsigned int file_version
+    );
+    template<class Archive, class T>
+    friend inline void load_construct_data(
+        Archive & ar, 
+        T * t, 
+        const BOOST_PFTO unsigned int file_version
+    );
+#endif
+
+    // pass calls to users's class implementation
+    template<class Archive, class T>
+    static void member_save(
+        Archive & ar, 
+        //const T & t,
+        T & t,
+        const unsigned int file_version
+    ){
+        t.save(ar, file_version);
+    }
+    template<class Archive, class T>
+    static void member_load(
+        Archive & ar, 
+        T & t,
+        const unsigned int file_version
+    ){
+        t.load(ar, file_version);
+    }
+    template<class Archive, class T>
+    static void serialize(
+        Archive & ar, 
+        T & t, 
+        const unsigned int file_version
+    ){
+        t.serialize(ar, file_version);
+    }
+    template<class T>
+    static void destroy( const T * t) // const appropriate here?
+    {
+        // the const business is an MSVC 6.0 hack that should be
+        // benign on everything else
+        delete const_cast<T *>(t);
+    }
+    template<class T>
+    static void construct(T * t){
+        // default is inplace invocation of default constructor
+        // Note the :: before the placement new. Required if the
+        // class doesn't have a class-specific placement new defined.
+        ::new(t)T;
+    }
+    template<class T, class U>
+    static T & cast_reference(U & u){
+        return static_cast<T &>(u);
+    }
+    template<class T, class U>
+    static T * cast_pointer(U * u){
+        return static_cast<T *>(u);
+    }
+};
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_ACCESS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/array.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/array.hpp
new file mode 100644 (file)
index 0000000..cdc9b59
--- /dev/null
@@ -0,0 +1,147 @@
+#ifndef BOOST_SERIALIZATION_ARRAY_HPP
+#define BOOST_SERIALIZATION_ARRAY_HPP
+
+// (C) Copyright 2005 Matthias Troyer and Dave Abrahams
+// 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)
+
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/split_member.hpp>
+#include <boost/serialization/wrapper.hpp>
+#include <boost/mpl/always.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/array.hpp>
+#include <iostream>
+
+#include <cstddef> // std::size_t
+#include <cstddef>
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+namespace boost { namespace serialization {
+
+// traits to specify whether to use  an optimized array serialization
+
+#ifdef __BORLANDC__
+// workaround for Borland compiler
+template <class Archive>
+struct use_array_optimization {
+  template <class T> struct apply : boost::mpl::false_ {};
+};
+
+#else
+template <class Archive>
+struct use_array_optimization : boost::mpl::always<boost::mpl::false_> {};
+#endif
+
+template<class T>
+class array
+ : public wrapper_traits<const array<T> >
+{
+public:    
+    typedef T value_type;
+    
+    array(value_type* t, std::size_t s) :
+        m_t(t),
+        m_element_count(s)
+    {}
+    
+    // default implementation
+    template<class Archive>
+    void serialize_optimized(Archive &ar, const unsigned int, mpl::false_ ) const
+    {
+      // default implemention does the loop
+      std::size_t c = count();
+      value_type * t = address();
+      while(0 < c--)
+            ar & boost::serialization::make_nvp("item", *t++);
+    }
+
+    // optimized implementation
+    template<class Archive>
+    void serialize_optimized(Archive &ar, const unsigned int version, mpl::true_ )
+    {
+      boost::serialization::split_member(ar, *this, version);
+    }
+
+    // default implementation
+    template<class Archive>
+    void save(Archive &ar, const unsigned int version) const
+    {
+      ar.save_array(*this,version);
+    }
+
+    // default implementation
+    template<class Archive>
+    void load(Archive &ar, const unsigned int version)
+    {
+      ar.load_array(*this,version);
+    }
+    
+    // default implementation
+    template<class Archive>
+    void serialize(Archive &ar, const unsigned int version)
+    {
+      typedef BOOST_DEDUCED_TYPENAME 
+          boost::serialization::use_array_optimization<Archive>::template apply<
+                    BOOST_DEDUCED_TYPENAME remove_const<T>::type 
+                >::type use_optimized;
+      serialize_optimized(ar,version,use_optimized());
+    }
+    
+    value_type* address() const
+    {
+      return m_t;
+    }
+
+    std::size_t count() const
+    {
+      return m_element_count;
+    }
+    
+private:
+    value_type* m_t;
+    std::size_t const m_element_count;
+};
+
+template<class T>
+inline
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+const
+#endif
+array<T> make_array( T* t, std::size_t s){
+    return array<T>(t, s);
+}
+
+template <class Archive, class T, std::size_t N>
+void serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version */)
+{
+  ar & boost::serialization::make_nvp("elems",a.elems);
+}
+
+
+
+} } // end namespace boost::serialization
+
+#ifdef __BORLANDC__
+// ignore optimizations for Borland
+#define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive)      
+#else
+#define BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(Archive)           \
+namespace boost { namespace serialization {                           \
+template <> struct use_array_optimization<Archive> {                  \
+  template <class ValueType>                                          \
+  struct apply : boost::mpl::apply1<Archive::use_array_optimization   \
+      , BOOST_DEDUCED_TYPENAME boost::remove_const<ValueType>::type   \
+    >::type {};                                                       \
+}; }}
+#endif // __BORLANDC__
+
+#endif //BOOST_SERIALIZATION_ARRAY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/assume_abstract.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/assume_abstract.hpp
new file mode 100644 (file)
index 0000000..a89cc44
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP
+#define BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// assume_abstract_class.hpp:
+
+// (C) Copyright 2008 Robert Ramey
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// this is useful for compilers which don't support the boost::is_abstract
+
+#include <boost/type_traits/is_abstract.hpp>
+
+#ifndef BOOST_NO_IS_ABSTRACT
+
+// if there is an intrinsic is_abstract defined, we don't have to do anything
+#define BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)
+
+// but forward to the "official" is_abstract
+namespace boost {
+namespace serialization {
+    template<class T>
+    struct is_abstract : boost::is_abstract<T> {} ;
+} // namespace serialization
+} // namespace boost
+
+#else
+// we have to "make" one
+
+namespace boost {
+namespace serialization {
+    template<class T>
+    struct is_abstract : boost::false_type {};
+} // namespace serialization
+} // namespace boost
+
+// define a macro to make explicit designation of this more transparent
+#define BOOST_SERIALIZATION_ASSUME_ABSTRACT(T)        \
+namespace boost {                                     \
+namespace serialization {                             \
+template<>                                            \
+struct is_abstract< T > : boost::true_type {};        \
+template<>                                            \
+struct is_abstract< const T > : boost::true_type {};  \
+}}                                                    \
+/**/
+
+#endif // BOOST_NO_IS_ABSTRACT
+
+#endif //BOOST_SERIALIZATION_ASSUME_ABSTRACT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/base_object.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/base_object.hpp
new file mode 100644 (file)
index 0000000..b840d25
--- /dev/null
@@ -0,0 +1,112 @@
+#ifndef BOOST_SERIALIZATION_BASE_OBJECT_HPP
+#define BOOST_SERIALIZATION_BASE_OBJECT_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// base_object.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// if no archive headers have been included this is a no op
+// this is to permit BOOST_EXPORT etc to be included in a 
+// file declaration header
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/force_include.hpp>
+#include <boost/serialization/void_cast_fwd.hpp>
+
+namespace boost {
+namespace serialization {
+
+namespace detail
+{
+    // get the base type for a given derived type
+    // preserving the const-ness
+    template<class B, class D>
+    struct base_cast
+    {
+        typedef BOOST_DEDUCED_TYPENAME
+        mpl::if_<
+            is_const<D>,
+            const B,
+            B
+        >::type type;
+        BOOST_STATIC_ASSERT(is_const<type>::value == is_const<D>::value);
+    };
+
+    // only register void casts if the types are polymorphic
+    template<class Base, class Derived>
+    struct base_register
+    {
+        struct polymorphic {
+            static void const * invoke(){
+                Base const * const b = 0;
+                Derived const * const d = 0;
+                return & void_cast_register(d, b);
+            }
+        };
+        struct non_polymorphic {
+            static void const * invoke(){
+                return 0;
+            }
+        };
+        static void const * invoke(){
+            typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+                is_polymorphic<Base>,
+                mpl::identity<polymorphic>,
+                mpl::identity<non_polymorphic>
+            >::type type;
+            return type::invoke();
+        }
+    };
+
+} // namespace detail
+#if defined(__BORLANDC__) && __BORLANDC__ < 0x610
+template<class Base, class Derived>
+const Base & 
+base_object(const Derived & d)
+{
+    BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);
+    detail::base_register<Base, Derived>::invoke();
+    return access::cast_reference<const Base, Derived>(d);
+}
+#else
+template<class Base, class Derived>
+BOOST_DEDUCED_TYPENAME detail::base_cast<Base, Derived>::type & 
+base_object(Derived &d)
+{
+    BOOST_STATIC_ASSERT(( is_base_and_derived<Base,Derived>::value));
+    BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);
+    typedef BOOST_DEDUCED_TYPENAME detail::base_cast<Base, Derived>::type type;
+    detail::base_register<type, Derived>::invoke();
+    return access::cast_reference<type, Derived>(d);
+}
+#endif
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_BASE_OBJECT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/binary_object.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/binary_object.hpp
new file mode 100644 (file)
index 0000000..2a2d2af
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef BOOST_SERIALIZATION_BINARY_OBJECT_HPP
+#define BOOST_SERIALIZATION_BINARY_OBJECT_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// nvp.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cassert>
+
+#include <cstddef> // std::size_t
+#include <boost/config.hpp>
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/split_member.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/wrapper.hpp>
+
+namespace boost {
+namespace serialization {
+
+struct binary_object :
+    public wrapper_traits<nvp<const binary_object> >
+{
+    /* const */ void * const m_t;
+    const std::size_t m_size;
+    template<class Archive>
+    void save(Archive & ar, const unsigned int /* file_version */) const {
+        ar.save_binary(m_t, m_size);
+    }
+    template<class Archive>
+    void load(Archive & ar, const unsigned int /* file_version */) const {
+        ar.load_binary(const_cast<void *>(m_t), m_size);
+    }
+    BOOST_SERIALIZATION_SPLIT_MEMBER()
+    binary_object(/* const */ void * const t, std::size_t size) :
+        m_t(t),
+        m_size(size)
+    {}
+    binary_object(const binary_object & rhs) :
+        m_t(rhs.m_t),
+        m_size(rhs.m_size)
+    {}
+};
+
+// just a little helper to support the convention that all serialization
+// wrappers follow the naming convention make_xxxxx
+inline 
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+const
+#endif
+binary_object 
+make_binary_object(/* const */ void * t, std::size_t size){
+    return binary_object(t, size);
+}
+
+} // namespace serialization
+} // boost
+
+#endif // BOOST_SERIALIZATION_BINARY_OBJECT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/bitset.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/bitset.hpp
new file mode 100644 (file)
index 0000000..0e109ce
--- /dev/null
@@ -0,0 +1,75 @@
+/*!
+ * \file      bitset.hpp
+ * \brief     Provides Boost.Serialization support for std::bitset
+ * \author    Brian Ravnsgaard Riis
+ * \author    Kenneth Riddile
+ * \date      16.09.2004, updated 04.03.2009
+ * \copyright 2004 Brian Ravnsgaard Riis
+ * \license   Boost Software License 1.0
+ */
+#ifndef BOOST_SERIALIZATION_BITSET_HPP
+#define BOOST_SERIALIZATION_BITSET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <bitset>
+#include <cstddef> // size_t
+
+#include <boost/config.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/nvp.hpp>
+
+namespace boost{
+namespace serialization{
+
+template <class Archive, std::size_t size>
+inline void save(
+    Archive & ar,
+    std::bitset<size> const & t,
+    const unsigned int /* version */
+){
+    const std::string bits = t.template to_string<
+        std::string::value_type,
+        std::string::traits_type,
+        std::string::allocator_type
+    >();
+    ar << BOOST_SERIALIZATION_NVP( bits );
+}
+
+template <class Archive, std::size_t size>
+inline void load(
+    Archive & ar,
+    std::bitset<size> & t,
+    const unsigned int /* version */
+){
+    std::string bits;
+    ar >> BOOST_SERIALIZATION_NVP( bits );
+    t = std::bitset<size>(bits);
+}
+
+template <class Archive, std::size_t size>
+inline void serialize(
+    Archive & ar,
+    std::bitset<size> & t,
+    const unsigned int version
+){
+    boost::serialization::split_free( ar, t, version );
+}
+
+// don't track bitsets since that would trigger tracking
+// all over the program - which probably would be a surprise.
+// also, tracking would be hard to implement since, we're
+// serialization a representation of the data rather than
+// the data itself.
+template <std::size_t size>
+struct tracking_level<std::bitset<size> >
+    : mpl::int_<track_never> {} ;
+
+} //serialization
+} //boost
+
+#endif // BOOST_SERIALIZATION_BITSET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_size_type.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_size_type.hpp
new file mode 100644 (file)
index 0000000..b56f4d7
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP
+#define BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP
+
+// (C) Copyright 2005 Matthias Troyer
+// 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)
+
+#include <boost/serialization/strong_typedef.hpp>
+#include <boost/serialization/level.hpp>
+
+namespace boost { namespace serialization {
+
+BOOST_STRONG_TYPEDEF(std::size_t, collection_size_type)
+
+} } // end namespace boost::serialization
+
+BOOST_CLASS_IMPLEMENTATION(boost::serialization::collection_size_type, primitive_type)
+
+#endif //BOOST_SERIALIZATION_COLLECTION_SIZE_TYPE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/collection_traits.hpp
new file mode 100644 (file)
index 0000000..568b807
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef BOOST_SERIALIZATION_COLLECTION_TRAITS_HPP
+#define BOOST_SERIALIZATION_COLLECTION_TRAITS_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// collection_traits.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// This header assigns a level implemenation trait to a collection type
+// for all primitives.  It is needed so that archives which are meant to be
+// portable don't write class information in the archive.  Since, not all
+// compiles recognize the same set of primitive types, the possibility
+// exists for archives to be non-portable if class information for primitive
+// types is included.  This is addressed by the following macros.
+#include <boost/config.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/cstdint.hpp>
+#include <climits> // ULONG_MAX
+#include <boost/serialization/level.hpp>
+
+#define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(T, C)          \
+template<>                                                          \
+struct implementation_level< C < T > > {                            \
+    typedef mpl::integral_c_tag tag;                                \
+    typedef mpl::int_<object_serializable> type;                    \
+    BOOST_STATIC_CONSTANT(int, value = object_serializable);        \
+};                                                                  \
+/**/
+
+#if defined(BOOST_NO_CWCHAR) || defined(BOOST_NO_INTRINSIC_WCHAR_T)
+    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)
+#else
+    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)   \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(wchar_t, C)        \
+    /**/
+#endif
+
+// determine if its necessary to handle (u)int64_t specifically
+// i.e. that its not a synonym for (unsigned) long
+// if there is no 64 bit int or if its the same as a long
+// we shouldn't define separate functions for int64 data types.
+#if defined(BOOST_NO_INT64_T)  
+     #define BOOST_NO_INTRINSIC_INT64_T  
+#else   
+    #if defined(ULLONG_MAX)  
+        #if(ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #elif defined(ULONG_MAX)  
+        #if(ULONG_MAX != 0xffffffff && ULONG_MAX == 18446744073709551615ul) // 2**64 - 1  
+            #define BOOST_NO_INTRINSIC_INT64_T  
+        #endif  
+    #else   
+        #define BOOST_NO_INTRINSIC_INT64_T  
+    #endif  
+#endif  
+
+#if !defined(BOOST_NO_INTRINSIC_INT64_T)
+    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)    \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(boost::int64_t, C)  \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(boost::uint64_t, C) \
+    /**/
+#else
+    #define BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)
+#endif
+
+#define BOOST_SERIALIZATION_COLLECTION_TRAITS(C)                     \
+    namespace boost { namespace serialization {                      \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(bool, C)            \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(char, C)            \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed char, C)     \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned char, C)   \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed int, C)      \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned int, C)    \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed long, C)     \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned long, C)   \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(float, C)           \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(double, C)          \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(unsigned short, C)  \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER(signed short, C)    \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_INT64(C)            \
+    BOOST_SERIALIZATION_COLLECTION_TRAITS_HELPER_WCHAR(C)            \
+    } }                                                              \
+    /**/
+
+#endif // BOOST_SERIALIZATION_COLLECTION_TRAITS
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_load_imp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_load_imp.hpp
new file mode 100644 (file)
index 0000000..04e5051
--- /dev/null
@@ -0,0 +1,199 @@
+#ifndef  BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
+#define BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1020)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// collections_load_imp.hpp: serialization for loading stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of collections
+
+#include <cassert>
+#include <cstddef> // size_t
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+#include <boost/detail/workaround.hpp>
+
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/detail/stack_constructor.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+
+// sequential container input
+template<class Archive, class Container>
+struct archive_input_seq
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        s.push_back(t.reference());
+        ar.reset_object_address(& s.back() , & t.reference());
+    }
+};
+
+// map input
+template<class Archive, class Container>
+struct archive_input_map
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        std::pair<BOOST_DEDUCED_TYPENAME Container::const_iterator, bool> result = 
+            s.insert(t.reference());
+        // note: the following presumes that the map::value_type was NOT tracked
+        // in the archive.  This is the usual case, but here there is no way
+        // to determine that.  
+        if(result.second){
+            ar.reset_object_address(
+                & (result.first->second),
+                & t.reference().second
+            );
+        }
+    }
+};
+
+// multimap input
+template<class Archive, class Container>
+struct archive_input_multimap
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        BOOST_DEDUCED_TYPENAME Container::const_iterator result 
+            = s.insert(t.reference());
+        // note: the following presumes that the map::value_type was NOT tracked
+        // in the archive.  This is the usual case, but here there is no way
+        // to determine that.  
+        ar.reset_object_address(
+            & result->second,
+            & t.reference()
+        );
+    }
+};
+
+// set input
+template<class Archive, class Container>
+struct archive_input_set
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        std::pair<BOOST_DEDUCED_TYPENAME Container::const_iterator, bool> result = 
+            s.insert(t.reference());
+        if(result.second)
+            ar.reset_object_address(& (* result.first), & t.reference());
+    }
+};
+
+// multiset input
+template<class Archive, class Container>
+struct archive_input_multiset
+{
+    inline void operator()(
+        Archive &ar, 
+        Container &s, 
+        const unsigned int v
+    ){
+        typedef BOOST_DEDUCED_TYPENAME Container::value_type type;
+        detail::stack_construct<Archive, type> t(ar, v);
+        // borland fails silently w/o full namespace
+        ar >> boost::serialization::make_nvp("item", t.reference());
+        BOOST_DEDUCED_TYPENAME Container::const_iterator result 
+            = s.insert(t.reference());
+        ar.reset_object_address(& (* result), & t.reference());
+    }
+};
+
+template<class Container>
+class reserve_imp
+{
+public:
+    void operator()(Container &s, std::size_t count) const {
+        s.reserve(count);
+    }
+};
+
+template<class Container>
+class no_reserve_imp
+{
+public:
+    void operator()(Container & /* s */, std::size_t /* count */) const{}
+};
+
+template<class Archive, class Container, class InputFunction, class R>
+inline void load_collection(Archive & ar, Container &s)
+{
+    s.clear();
+    // retrieve number of elements
+    collection_size_type count;
+    unsigned int item_version;
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    if(3 < ar.get_library_version())
+        ar >> BOOST_SERIALIZATION_NVP(item_version);
+    else
+        item_version = 0;
+    R rx;
+    rx(s, count);
+    std::size_t c = count;
+    InputFunction ifunc;
+    while(c-- > 0){
+        ifunc(ar, s, item_version);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_COLLECTIONS_LOAD_IMP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_save_imp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/collections_save_imp.hpp
new file mode 100644 (file)
index 0000000..60580f6
--- /dev/null
@@ -0,0 +1,68 @@
+#ifndef BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP
+#define BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// collections_save_imp.hpp: serialization for stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of collections
+
+#include <boost/config.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+
+template<class Archive, class Container>
+inline void save_collection(Archive & ar, const Container &s)
+{
+    // record number of elements
+    collection_size_type const count(s.size());
+    ar <<  BOOST_SERIALIZATION_NVP(count);
+    // make sure the target type is registered so we can retrieve
+    // the version when we load
+    if(3 < ar.get_library_version()){
+        const unsigned int item_version = version<
+            BOOST_DEDUCED_TYPENAME Container::value_type
+        >::value;
+        ar << BOOST_SERIALIZATION_NVP(item_version);
+    }
+    BOOST_DEDUCED_TYPENAME Container::const_iterator it = s.begin();
+    std::size_t c=count;
+    while(c-- > 0){
+            // note borland emits a no-op without the explicit namespace
+            boost::serialization::save_construct_data_adl(
+                ar, 
+                &(*it), 
+                boost::serialization::version<
+                    BOOST_DEDUCED_TYPENAME Container::value_type
+                >::value
+            );
+        ar << boost::serialization::make_nvp("item", *it++);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_COLLECTIONS_SAVE_IMP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/complex.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/complex.hpp
new file mode 100644 (file)
index 0000000..125766f
--- /dev/null
@@ -0,0 +1,81 @@
+#ifndef  BOOST_SERIALIZATION_COMPLEX_HPP
+#define BOOST_SERIALIZATION_COMPLEX_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/utility.hpp:
+// serialization for stl utility templates
+
+// (C) Copyright 2007 Matthias Troyer . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <complex>
+#include <boost/config.hpp>
+
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar,
+    std::complex<T> & t,
+    const unsigned int file_version 
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+template<class Archive, class T>
+inline void save(
+    Archive & ar,
+    std::complex<T> const & t,
+    const unsigned int /* file_version */
+){
+    const T re = t.real();
+    const T im = t.imag();
+    ar << boost::serialization::make_nvp("real", re);
+    ar << boost::serialization::make_nvp("imag", im);
+}
+
+template<class Archive, class T>
+inline void load(
+    Archive & ar,
+    std::complex<T>& t,
+    const unsigned int /* file_version */ 
+){
+    T re;
+    T im;
+    ar >> boost::serialization::make_nvp("real", re);
+    ar >> boost::serialization::make_nvp("imag", im);
+    t = std::complex<T>(re,im);
+}
+
+// specialization of serialization traits for complex
+template <class T>
+struct is_bitwise_serializable<std::complex<T> >
+    : public is_bitwise_serializable<T> {};
+
+template <class T>
+struct implementation_level<std::complex<T> >
+    : mpl::int_<object_serializable> {} ;
+
+// treat complex just like builtin arithmetic types for tracking
+template <class T>
+struct tracking_level<std::complex<T> >
+    : mpl::int_<track_never> {} ;
+
+} // serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_COMPLEX_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/config.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/config.hpp
new file mode 100644 (file)
index 0000000..4c4eb68
--- /dev/null
@@ -0,0 +1,82 @@
+// note lack of include guards.  This is intentional
+
+//  config.hpp  ---------------------------------------------//
+
+//  (c) Copyright Robert Ramey 2004
+//  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)
+
+//  See library home page at http://www.boost.org/libs/serialization
+
+//----------------------------------------------------------------------------// 
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+
+// note: this version incorporates the related code into the the 
+// the same library as BOOST_ARCHIVE.  This could change some day in the
+// future
+
+// if BOOST_SERIALIZATION_DECL is defined undefine it now:
+#ifdef BOOST_SERIALIZATION_DECL
+    #undef BOOST_SERIALIZATION_DECL
+#endif
+
+#ifdef BOOST_HAS_DECLSPEC // defined in config system
+// we need to import/export our code only if the user has specifically
+// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+// libraries to be dynamically linked, or BOOST_SERIALIZATION_DYN_LINK
+// if they want just this one to be dynamically liked:
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
+    #if !defined(BOOST_DYN_LINK)
+        #define BOOST_DYN_LINK
+    #endif
+    // export if this is our own source, otherwise import:
+    #if defined(BOOST_SERIALIZATION_SOURCE)
+        #if defined(__BORLANDC__)
+            #define BOOST_SERIALIZATION_DECL(T) T __export
+        #else
+            #define BOOST_SERIALIZATION_DECL(T) __declspec(dllexport) T
+        #endif
+    #else
+        #if defined(__BORLANDC__)
+            #define BOOST_SERIALIZATION_DECL(T) T __import
+        #else
+            #define BOOST_SERIALIZATION_DECL(T) __declspec(dllimport) T
+        #endif
+    #endif // defined(BOOST_SERIALIZATION_SOURCE)
+#endif // defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
+#endif // BOOST_HAS_DECLSPEC
+
+// if BOOST_SERIALIZATION_DECL isn't defined yet define it now:
+#ifndef BOOST_SERIALIZATION_DECL
+    #define BOOST_SERIALIZATION_DECL(T) T
+#endif
+
+//  enable automatic library variant selection  ------------------------------// 
+
+#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SERIALIZATION_NO_LIB) \
+&&  !defined(BOOST_ARCHIVE_SOURCE) && !defined(BOOST_WARCHIVE_SOURCE)  \
+&&  !defined(BOOST_SERIALIZATION_SOURCE)
+    //
+    // Set the name of our library, this will get undef'ed by auto_link.hpp
+    // once it's done with it:
+    //
+    #define BOOST_LIB_NAME boost_serialization
+    //
+    // If we're importing code from a dll, then tell auto_link.hpp about it:
+    //
+    #if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
+    #  define BOOST_DYN_LINK
+    #endif
+    //
+    // And include the header that does the work:
+    //
+    #include <boost/config/auto_link.hpp>
+
+#endif  
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/deque.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/deque.hpp
new file mode 100644 (file)
index 0000000..340d5fe
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef  BOOST_SERIALIZATION_DEQUE_HPP
+#define BOOST_SERIALIZATION_DEQUE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// deque.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <deque>
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::deque<U, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, std::deque<U, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::deque<U, Allocator> &t,
+    const unsigned int /*file_version*/
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::deque<U, Allocator>,
+        boost::serialization::stl::archive_input_seq<
+        Archive, std::deque<U, Allocator> 
+        >,
+        boost::serialization::stl::no_reserve_imp<std::deque<U, Allocator> >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::deque<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::deque)
+
+#endif // BOOST_SERIALIZATION_DEQUE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/get_data.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/get_data.hpp
new file mode 100644 (file)
index 0000000..0e9c190
--- /dev/null
@@ -0,0 +1,55 @@
+// (C) Copyright 2005 Matthias Troyer 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#ifndef BOOST_SERIALIZATION_DETAIL_GET_DATA_HPP
+#define BOOST_SERIALIZATION_DETAIL_GET_DATA_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define STD _STLP_STD
+#else
+#define STD std
+#endif
+
+
+#include <vector>
+#include <valarray>
+
+namespace boost { namespace serialization { namespace detail {
+
+template <class T, class Allocator>
+T* get_data(STD::vector<T,Allocator>& v)
+{
+  return v.empty() ? 0 : &(v[0]);
+}
+
+template <class T, class Allocator>
+T* get_data(STD::vector<T,Allocator> const & v)
+{
+  return get_data(const_cast<STD::vector<T,Allocator>&>(v));
+}
+
+
+template <class T>
+T* get_data(STD::valarray<T>& v)
+{
+  return v.size()==0 ? 0 : &(v[0]);
+}
+
+template <class T>
+const T* get_data(STD::valarray<T> const& v)
+{
+  return get_data(const_cast<STD::valarray<T>&>(v));
+}
+
+} } } //namespace boost::serialization::detail
+
+#endif // BOOST_SERIALIZATION_DETAIL_GET_DATA_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_count_132.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_count_132.hpp
new file mode 100644 (file)
index 0000000..0665e87
--- /dev/null
@@ -0,0 +1,569 @@
+#ifndef BOOST_DETAIL_SHARED_COUNT_132_HPP_INCLUDED
+#define BOOST_DETAIL_SHARED_COUNT_132_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  detail/shared_count.hpp
+//
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
+//
+// 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>
+
+#if defined(BOOST_SP_USE_STD_ALLOCATOR) && defined(BOOST_SP_USE_QUICK_ALLOCATOR)
+# error BOOST_SP_USE_STD_ALLOCATOR and BOOST_SP_USE_QUICK_ALLOCATOR are incompatible.
+#endif
+
+#include <boost/checked_delete.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/detail/lightweight_mutex.hpp>
+
+#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
+#include <boost/detail/quick_allocator.hpp>
+#endif
+
+#include <memory>           // std::auto_ptr, std::allocator
+#include <functional>       // std::less
+#include <exception>        // std::exception
+#include <new>              // std::bad_alloc
+#include <typeinfo>         // std::type_info in get_deleter
+#include <cstddef>          // std::size_t
+
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#ifdef __BORLANDC__
+# pragma warn -8026     // Functions with excep. spec. are not expanded inline
+# pragma warn -8027     // Functions containing try are not expanded inline
+#endif
+
+namespace boost_132 {
+
+// Debug hooks
+
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+
+void sp_scalar_constructor_hook(void * px, std::size_t size, void * pn);
+void sp_array_constructor_hook(void * px);
+void sp_scalar_destructor_hook(void * px, std::size_t size, void * pn);
+void sp_array_destructor_hook(void * px);
+
+#endif
+
+
+// The standard library that comes with Borland C++ 5.5.1
+// defines std::exception and its members as having C calling
+// convention (-pc). When the definition of bad_weak_ptr
+// is compiled with -ps, the compiler issues an error.
+// Hence, the temporary #pragma option -pc below. The version
+// check is deliberately conservative.
+
+#if defined(__BORLANDC__) && __BORLANDC__ == 0x551
+# pragma option push -pc
+#endif
+
+class bad_weak_ptr: public std::exception
+{
+public:
+
+    virtual char const * what() const throw()
+    {
+        return "boost::bad_weak_ptr";
+    }
+};
+
+#if defined(__BORLANDC__) && __BORLANDC__ == 0x551
+# pragma option pop
+#endif
+
+namespace detail{
+
+class sp_counted_base
+{
+//private:
+
+    typedef boost::detail::lightweight_mutex mutex_type;
+
+public:
+
+    sp_counted_base(): use_count_(1), weak_count_(1)
+    {
+    }
+
+    virtual ~sp_counted_base() // nothrow
+    {
+    }
+
+    // dispose() is called when use_count_ drops to zero, to release
+    // the resources managed by *this.
+
+    virtual void dispose() = 0; // nothrow
+
+    // destruct() is called when weak_count_ drops to zero.
+
+    virtual void destruct() // nothrow
+    {
+        delete this;
+    }
+
+    virtual void * get_deleter(std::type_info const & ti) = 0;
+
+    void add_ref_copy()
+    {
+#if defined(BOOST_HAS_THREADS)
+        mutex_type::scoped_lock lock(mtx_);
+#endif
+        ++use_count_;
+    }
+
+    void add_ref_lock()
+    {
+#if defined(BOOST_HAS_THREADS)
+        mutex_type::scoped_lock lock(mtx_);
+#endif
+        if(use_count_ == 0) boost::serialization::throw_exception(bad_weak_ptr());
+        ++use_count_;
+    }
+
+    void release() // nothrow
+    {
+        {
+#if defined(BOOST_HAS_THREADS)
+            mutex_type::scoped_lock lock(mtx_);
+#endif
+            long new_use_count = --use_count_;
+
+            if(new_use_count != 0) return;
+        }
+
+        dispose();
+        weak_release();
+    }
+
+    void weak_add_ref() // nothrow
+    {
+#if defined(BOOST_HAS_THREADS)
+        mutex_type::scoped_lock lock(mtx_);
+#endif
+        ++weak_count_;
+    }
+
+    void weak_release() // nothrow
+    {
+        long new_weak_count;
+
+        {
+#if defined(BOOST_HAS_THREADS)
+            mutex_type::scoped_lock lock(mtx_);
+#endif
+            new_weak_count = --weak_count_;
+        }
+
+        if(new_weak_count == 0)
+        {
+            destruct();
+        }
+    }
+
+    long use_count() const // nothrow
+    {
+#if defined(BOOST_HAS_THREADS)
+        mutex_type::scoped_lock lock(mtx_);
+#endif
+        return use_count_;
+    }
+
+//private:
+public:
+    sp_counted_base(sp_counted_base const &);
+    sp_counted_base & operator= (sp_counted_base const &);
+
+    long use_count_;        // #shared
+    long weak_count_;       // #weak + (#shared != 0)
+
+#if defined(BOOST_HAS_THREADS) || defined(BOOST_LWM_WIN32)
+    mutable mutex_type mtx_;
+#endif
+};
+
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+
+template<class T> void cbi_call_constructor_hook(sp_counted_base * pn, T * px, checked_deleter<T> const &, int)
+{
+    boost::sp_scalar_constructor_hook(px, sizeof(T), pn);
+}
+
+template<class T> void cbi_call_constructor_hook(sp_counted_base *, T * px, checked_array_deleter<T> const &, int)
+{
+    boost::sp_array_constructor_hook(px);
+}
+
+template<class P, class D> void cbi_call_constructor_hook(sp_counted_base *, P const &, D const &, long)
+{
+}
+
+template<class T> void cbi_call_destructor_hook(sp_counted_base * pn, T * px, checked_deleter<T> const &, int)
+{
+    boost::sp_scalar_destructor_hook(px, sizeof(T), pn);
+}
+
+template<class T> void cbi_call_destructor_hook(sp_counted_base *, T * px, checked_array_deleter<T> const &, int)
+{
+    boost::sp_array_destructor_hook(px);
+}
+
+template<class P, class D> void cbi_call_destructor_hook(sp_counted_base *, P const &, D const &, long)
+{
+}
+
+#endif
+
+//
+// Borland's Codeguard trips up over the -Vx- option here:
+//
+#ifdef __CODEGUARD__
+# pragma option push -Vx-
+#endif
+
+template<class P, class D> class sp_counted_base_impl: public sp_counted_base
+{
+//private:
+public:
+    P ptr; // copy constructor must not throw
+    D del; // copy constructor must not throw
+
+    sp_counted_base_impl(sp_counted_base_impl const &);
+    sp_counted_base_impl & operator= (sp_counted_base_impl const &);
+
+    typedef sp_counted_base_impl<P, D> this_type;
+
+public:
+
+    // pre: initial_use_count <= initial_weak_count, d(p) must not throw
+
+    sp_counted_base_impl(P p, D d): ptr(p), del(d)
+    {
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        detail::cbi_call_constructor_hook(this, p, d, 0);
+#endif
+    }
+
+    virtual void dispose() // nothrow
+    {
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        detail::cbi_call_destructor_hook(this, ptr, del, 0);
+#endif
+        del(ptr);
+    }
+
+    virtual void * get_deleter(std::type_info const & ti)
+    {
+        return ti == typeid(D)? &del: 0;
+    }
+
+#if defined(BOOST_SP_USE_STD_ALLOCATOR)
+
+    void * operator new(std::size_t)
+    {
+        return std::allocator<this_type>().allocate(1, static_cast<this_type *>(0));
+    }
+
+    void operator delete(void * p)
+    {
+        std::allocator<this_type>().deallocate(static_cast<this_type *>(p), 1);
+    }
+
+#endif
+
+#if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
+
+    void * operator new(std::size_t)
+    {
+        return boost::detail::quick_allocator<this_type>::alloc();
+    }
+
+    void operator delete(void * p)
+    {
+        boost::detail::quick_allocator<this_type>::dealloc(p);
+    }
+
+#endif
+};
+
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+
+int const shared_count_id = 0x2C35F101;
+int const   weak_count_id = 0x298C38A4;
+
+#endif
+
+class weak_count;
+
+class shared_count
+{
+//private:
+public:
+    sp_counted_base * pi_;
+
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+    int id_;
+#endif
+
+    friend class weak_count;
+
+public:
+
+    shared_count(): pi_(0) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+    }
+
+    template<class P, class D> shared_count(P p, D d): pi_(0)
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+#ifndef BOOST_NO_EXCEPTIONS
+
+        try
+        {
+            pi_ = new sp_counted_base_impl<P, D>(p, d);
+        }
+        catch(...)
+        {
+            d(p); // delete p
+            throw;
+        }
+
+#else
+
+        pi_ = new sp_counted_base_impl<P, D>(p, d);
+
+        if(pi_ == 0)
+        {
+            d(p); // delete p
+            boost::serialization::throw_exception(std::bad_alloc());
+        }
+
+#endif
+    }
+
+#ifndef BOOST_NO_AUTO_PTR
+
+    // auto_ptr<Y> is special cased to provide the strong guarantee
+
+    template<class Y>
+    explicit shared_count(std::auto_ptr<Y> & r): pi_(
+        new sp_counted_base_impl<
+            Y *, 
+            boost::checked_deleter<Y>
+        >(r.get(), boost::checked_deleter<Y>()))
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+        r.release();
+    }
+
+#endif 
+
+    ~shared_count() // nothrow
+    {
+        if(pi_ != 0) pi_->release();
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        id_ = 0;
+#endif
+    }
+
+    shared_count(shared_count const & r): pi_(r.pi_) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+        if(pi_ != 0) pi_->add_ref_copy();
+    }
+
+    explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
+
+    shared_count & operator= (shared_count const & r) // nothrow
+    {
+        sp_counted_base * tmp = r.pi_;
+
+        if(tmp != pi_)
+        {
+            if(tmp != 0) tmp->add_ref_copy();
+            if(pi_ != 0) pi_->release();
+            pi_ = tmp;
+        }
+
+        return *this;
+    }
+
+    void swap(shared_count & r) // nothrow
+    {
+        sp_counted_base * tmp = r.pi_;
+        r.pi_ = pi_;
+        pi_ = tmp;
+    }
+
+    long use_count() const // nothrow
+    {
+        return pi_ != 0? pi_->use_count(): 0;
+    }
+
+    bool unique() const // nothrow
+    {
+        return use_count() == 1;
+    }
+
+    friend inline bool operator==(shared_count const & a, shared_count const & b)
+    {
+        return a.pi_ == b.pi_;
+    }
+
+    friend inline bool operator<(shared_count const & a, shared_count const & b)
+    {
+        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
+    }
+
+    void * get_deleter(std::type_info const & ti) const
+    {
+        return pi_? pi_->get_deleter(ti): 0;
+    }
+};
+
+#ifdef __CODEGUARD__
+# pragma option pop
+#endif
+
+
+class weak_count
+{
+private:
+
+    sp_counted_base * pi_;
+
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+    int id_;
+#endif
+
+    friend class shared_count;
+
+public:
+
+    weak_count(): pi_(0) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(weak_count_id)
+#endif
+    {
+    }
+
+    weak_count(shared_count const & r): pi_(r.pi_) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+        if(pi_ != 0) pi_->weak_add_ref();
+    }
+
+    weak_count(weak_count const & r): pi_(r.pi_) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+        if(pi_ != 0) pi_->weak_add_ref();
+    }
+
+    ~weak_count() // nothrow
+    {
+        if(pi_ != 0) pi_->weak_release();
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        id_ = 0;
+#endif
+    }
+
+    weak_count & operator= (shared_count const & r) // nothrow
+    {
+        sp_counted_base * tmp = r.pi_;
+        if(tmp != 0) tmp->weak_add_ref();
+        if(pi_ != 0) pi_->weak_release();
+        pi_ = tmp;
+
+        return *this;
+    }
+
+    weak_count & operator= (weak_count const & r) // nothrow
+    {
+        sp_counted_base * tmp = r.pi_;
+        if(tmp != 0) tmp->weak_add_ref();
+        if(pi_ != 0) pi_->weak_release();
+        pi_ = tmp;
+
+        return *this;
+    }
+
+    void swap(weak_count & r) // nothrow
+    {
+        sp_counted_base * tmp = r.pi_;
+        r.pi_ = pi_;
+        pi_ = tmp;
+    }
+
+    long use_count() const // nothrow
+    {
+        return pi_ != 0? pi_->use_count(): 0;
+    }
+
+    friend inline bool operator==(weak_count const & a, weak_count const & b)
+    {
+        return a.pi_ == b.pi_;
+    }
+
+    friend inline bool operator<(weak_count const & a, weak_count const & b)
+    {
+        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
+    }
+};
+
+inline shared_count::shared_count(weak_count const & r): pi_(r.pi_)
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+{
+    if(pi_ != 0)
+    {
+        pi_->add_ref_lock();
+    }
+    else
+    {
+        boost::serialization::throw_exception(bad_weak_ptr());
+    }
+}
+
+} // namespace detail
+
+} // namespace boost
+
+BOOST_SERIALIZATION_ASSUME_ABSTRACT(boost_132::detail::sp_counted_base)
+
+#ifdef __BORLANDC__
+# pragma warn .8027     // Functions containing try are not expanded inline
+# pragma warn .8026     // Functions with excep. spec. are not expanded inline
+#endif
+
+#endif  // #ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_132.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_132.hpp
new file mode 100644 (file)
index 0000000..bd5355d
--- /dev/null
@@ -0,0 +1,478 @@
+#ifndef BOOST_SHARED_PTR_132_HPP_INCLUDED
+#define BOOST_SHARED_PTR_132_HPP_INCLUDED
+
+//
+//  shared_ptr.hpp
+//
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
+//
+
+#include <boost/config.hpp>   // for broken compiler workarounds
+
+#if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
+#include <boost/serialization/detail/shared_ptr_nmt_132.hpp>
+#else
+
+#include <boost/assert.hpp>
+#include <boost/checked_delete.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/serialization/access.hpp>
+#include <boost/serialization/detail/shared_count_132.hpp>
+
+#include <memory>               // for std::auto_ptr
+#include <algorithm>            // for std::swap
+#include <functional>           // for std::less
+#include <typeinfo>             // for std::bad_cast
+#include <iosfwd>               // for std::basic_ostream
+
+#ifdef BOOST_MSVC  // moved here to work around VC++ compiler crash
+# pragma warning(push)
+# pragma warning(disable:4284) // odd return type for operator->
+#endif
+
+namespace boost_132 {
+
+template<class T> class weak_ptr;
+template<class T> class enable_shared_from_this;
+
+namespace detail
+{
+
+struct static_cast_tag {};
+struct const_cast_tag {};
+struct dynamic_cast_tag {};
+struct polymorphic_cast_tag {};
+
+template<class T> struct shared_ptr_traits
+{
+    typedef T & reference;
+};
+
+template<> struct shared_ptr_traits<void>
+{
+    typedef void reference;
+};
+
+#if !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)
+
+template<> struct shared_ptr_traits<void const>
+{
+    typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void volatile>
+{
+    typedef void reference;
+};
+
+template<> struct shared_ptr_traits<void const volatile>
+{
+    typedef void reference;
+};
+
+#endif
+
+// enable_shared_from_this support
+
+template<class T, class Y> void sp_enable_shared_from_this( shared_count const & pn, enable_shared_from_this<T> const * pe, Y const * px )
+{
+    if(pe != 0) pe->_internal_weak_this._internal_assign(const_cast<Y*>(px), pn);
+}
+
+inline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... )
+{
+}
+
+} // namespace detail
+
+
+//
+//  shared_ptr
+//
+//  An enhanced relative of scoped_ptr with reference counted copy semantics.
+//  The object pointed to is deleted when the last shared_ptr pointing to it
+//  is destroyed or reset.
+//
+
+template<class T> class shared_ptr
+{
+private:
+    // Borland 5.5.1 specific workaround
+    typedef shared_ptr<T> this_type;
+
+public:
+
+    typedef T element_type;
+    typedef T value_type;
+    typedef T * pointer;
+    typedef BOOST_DEDUCED_TYPENAME detail::shared_ptr_traits<T>::reference reference;
+
+    shared_ptr(): px(0), pn() // never throws in 1.30+
+    {
+    }
+
+#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x564) )
+    template<class Y>
+    explicit shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter<Y>()) // Y must be complete
+#else
+    template<class Y>
+    explicit shared_ptr(Y * p): px(p), pn(p, boost::checked_deleter<Y>()) // Y must be complete
+#endif
+    {
+        detail::sp_enable_shared_from_this( pn, p, p );
+    }
+
+    //
+    // Requirements: D's copy constructor must not throw
+    //
+    // shared_ptr will release p by calling d(p)
+    //
+
+    template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)
+    {
+        detail::sp_enable_shared_from_this( pn, p, p );
+    }
+
+//  generated copy constructor, assignment, destructor are fine...
+
+//  except that Borland C++ has a bug, and g++ with -Wsynth warns
+#if defined(__BORLANDC__) || defined(__GNUC__)
+
+    shared_ptr & operator=(shared_ptr const & r) // never throws
+    {
+        px = r.px;
+        pn = r.pn; // shared_count::op= doesn't throw
+        return *this;
+    }
+
+#endif
+
+    template<class Y>
+    explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
+    {
+        // it is now safe to copy r.px, as pn(r.pn) did not throw
+        px = r.px;
+    }
+
+    template<class Y>
+    shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
+    {
+    }
+
+    template<class Y>
+    shared_ptr(shared_ptr<Y> const & r, detail::static_cast_tag): px(static_cast<element_type *>(r.px)), pn(r.pn)
+    {
+    }
+
+    template<class Y>
+    shared_ptr(shared_ptr<Y> const & r, detail::const_cast_tag): px(const_cast<element_type *>(r.px)), pn(r.pn)
+    {
+    }
+
+    template<class Y>
+    shared_ptr(shared_ptr<Y> const & r, detail::dynamic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
+    {
+        if(px == 0) // need to allocate new counter -- the cast failed
+        {
+            pn = detail::shared_count();
+        }
+    }
+
+    template<class Y>
+    shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
+    {
+        if(px == 0)
+        {
+            boost::serialization::throw_exception(std::bad_cast());
+        }
+    }
+
+#ifndef BOOST_NO_AUTO_PTR
+
+    template<class Y>
+    explicit shared_ptr(std::auto_ptr<Y> & r): px(r.get()), pn()
+    {
+        Y * tmp = r.get();
+        pn = detail::shared_count(r);
+        detail::sp_enable_shared_from_this( pn, tmp, tmp );
+    }
+
+#endif
+
+#if !defined(BOOST_MSVC) || (BOOST_MSVC > 1200)
+
+    template<class Y>
+    shared_ptr & operator=(shared_ptr<Y> const & r) // never throws
+    {
+        px = r.px;
+        pn = r.pn; // shared_count::op= doesn't throw
+        return *this;
+    }
+
+#endif
+
+#ifndef BOOST_NO_AUTO_PTR
+
+    template<class Y>
+    shared_ptr & operator=(std::auto_ptr<Y> & r)
+    {
+        this_type(r).swap(*this);
+        return *this;
+    }
+
+#endif
+
+    void reset() // never throws in 1.30+
+    {
+        this_type().swap(*this);
+    }
+
+    template<class Y> void reset(Y * p) // Y must be complete
+    {
+        BOOST_ASSERT(p == 0 || p != px); // catch self-reset errors
+        this_type(p).swap(*this);
+    }
+
+    template<class Y, class D> void reset(Y * p, D d)
+    {
+        this_type(p, d).swap(*this);
+    }
+
+    reference operator* () const // never throws
+    {
+        BOOST_ASSERT(px != 0);
+        return *px;
+    }
+
+    T * operator-> () const // never throws
+    {
+        BOOST_ASSERT(px != 0);
+        return px;
+    }
+    
+    T * get() const // never throws
+    {
+        return px;
+    }
+
+    // implicit conversion to "bool"
+
+#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
+
+    operator bool () const
+    {
+        return px != 0;
+    }
+
+#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
+    typedef T * (this_type::*unspecified_bool_type)() const;
+    
+    operator unspecified_bool_type() const // never throws
+    {
+        return px == 0? 0: &this_type::get;
+    }
+
+#else 
+
+    typedef T * this_type::*unspecified_bool_type;
+
+    operator unspecified_bool_type() const // never throws
+    {
+        return px == 0? 0: &this_type::px;
+    }
+
+#endif
+
+    // operator! is redundant, but some compilers need it
+
+    bool operator! () const // never throws
+    {
+        return px == 0;
+    }
+
+    bool unique() const // never throws
+    {
+        return pn.unique();
+    }
+
+    long use_count() const // never throws
+    {
+        return pn.use_count();
+    }
+
+    void swap(shared_ptr<T> & other) // never throws
+    {
+        std::swap(px, other.px);
+        pn.swap(other.pn);
+    }
+
+    template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const
+    {
+        return pn < rhs.pn;
+    }
+
+    void * _internal_get_deleter(std::type_info const & ti) const
+    {
+        return pn.get_deleter(ti);
+    }
+
+// Tasteless as this may seem, making all members public allows member templates
+// to work in the absence of member template friends. (Matthew Langston)
+
+#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
+
+private:
+
+    template<class Y> friend class shared_ptr;
+    template<class Y> friend class weak_ptr;
+
+
+#endif
+public: // for serialization
+    T * px;                     // contained pointer
+    detail::shared_count pn;    // reference counter
+
+};  // shared_ptr
+
+template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+    return a.get() == b.get();
+}
+
+template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+    return a.get() != b.get();
+}
+
+#if __GNUC__ == 2 && __GNUC_MINOR__ <= 96
+
+// Resolve the ambiguity between our op!= and the one in rel_ops
+
+template<class T> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<T> const & b)
+{
+    return a.get() != b.get();
+}
+
+#endif
+
+template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+    return a._internal_less(b);
+}
+
+template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b)
+{
+    a.swap(b);
+}
+
+template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::static_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::const_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::dynamic_cast_tag());
+}
+
+// shared_*_cast names are deprecated. Use *_pointer_cast instead.
+
+template<class T, class U> shared_ptr<T> shared_static_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::static_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_dynamic_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::dynamic_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_polymorphic_cast(shared_ptr<U> const & r)
+{
+    return shared_ptr<T>(r, detail::polymorphic_cast_tag());
+}
+
+template<class T, class U> shared_ptr<T> shared_polymorphic_downcast(shared_ptr<U> const & r)
+{
+    BOOST_ASSERT(dynamic_cast<T *>(r.get()) == r.get());
+    return shared_static_cast<T>(r);
+}
+
+// get_pointer() enables boost::mem_fn to recognize shared_ptr
+
+template<class T> inline T * get_pointer(shared_ptr<T> const & p)
+{
+    return p.get();
+}
+
+// operator<<
+
+#if defined(__GNUC__) &&  (__GNUC__ < 3)
+
+template<class Y> std::ostream & operator<< (std::ostream & os, shared_ptr<Y> const & p)
+{
+    os << p.get();
+    return os;
+}
+
+#else
+
+# if defined(BOOST_MSVC) && BOOST_WORKAROUND(BOOST_MSVC, <= 1200 && __SGI_STL_PORT)
+// MSVC6 has problems finding std::basic_ostream through the using declaration in namespace _STL
+using std::basic_ostream;
+template<class E, class T, class Y> basic_ostream<E, T> & operator<< (basic_ostream<E, T> & os, shared_ptr<Y> const & p)
+# else
+template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p)
+# endif 
+{
+    os << p.get();
+    return os;
+}
+
+#endif
+
+// get_deleter (experimental)
+
+#if (defined(__GNUC__) &&  (__GNUC__ < 3)) || (defined(__EDG_VERSION__) && (__EDG_VERSION__ <= 238))
+
+// g++ 2.9x doesn't allow static_cast<X const *>(void *)
+// apparently EDG 2.38 also doesn't accept it
+
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+{
+    void const * q = p._internal_get_deleter(typeid(D));
+    return const_cast<D *>(static_cast<D const *>(q));
+}
+
+#else
+
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
+{
+    return static_cast<D *>(p._internal_get_deleter(typeid(D)));
+}
+
+#endif
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+# pragma warning(pop)
+#endif    
+
+#endif  // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
+
+#endif  // #ifndef BOOST_SHARED_PTR_132_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_nmt_132.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/shared_ptr_nmt_132.hpp
new file mode 100644 (file)
index 0000000..c73e981
--- /dev/null
@@ -0,0 +1,182 @@
+#ifndef BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED
+#define BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED
+
+//
+//  detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates
+//
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
+//
+
+#include <boost/assert.hpp>
+#include <boost/checked_delete.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/detail/atomic_count.hpp>
+
+#ifndef BOOST_NO_AUTO_PTR
+# include <memory>          // for std::auto_ptr
+#endif
+
+#include <algorithm>        // for std::swap
+#include <functional>       // for std::less
+#include <new>              // for std::bad_alloc
+
+namespace boost
+{
+
+template<class T> class shared_ptr
+{
+private:
+
+    typedef detail::atomic_count count_type;
+
+public:
+
+    typedef T element_type;
+    typedef T value_type;
+
+    explicit shared_ptr(T * p = 0): px(p)
+    {
+#ifndef BOOST_NO_EXCEPTIONS
+
+        try  // prevent leak if new throws
+        {
+            pn = new count_type(1);
+        }
+        catch(...)
+        {
+            boost::checked_delete(p);
+            throw;
+        }
+
+#else
+
+        pn = new count_type(1);
+
+        if(pn == 0)
+        {
+            boost::checked_delete(p);
+            boost::serialization::throw_exception(std::bad_alloc());
+        }
+
+#endif
+    }
+
+    ~shared_ptr()
+    {
+        if(--*pn == 0)
+        {
+            boost::checked_delete(px);
+            delete pn;
+        }
+    }
+
+    shared_ptr(shared_ptr const & r): px(r.px)  // never throws
+    {
+        pn = r.pn;
+        ++*pn;
+    }
+
+    shared_ptr & operator=(shared_ptr const & r)
+    {
+        shared_ptr(r).swap(*this);
+        return *this;
+    }
+
+#ifndef BOOST_NO_AUTO_PTR
+
+    explicit shared_ptr(std::auto_ptr<T> & r)
+    { 
+        pn = new count_type(1); // may throw
+        px = r.release(); // fix: moved here to stop leak if new throws
+    } 
+
+    shared_ptr & operator=(std::auto_ptr<T> & r)
+    {
+        shared_ptr(r).swap(*this);
+        return *this;
+    }
+
+#endif
+
+    void reset(T * p = 0)
+    {
+        BOOST_ASSERT(p == 0 || p != px);
+        shared_ptr(p).swap(*this);
+    }
+
+    T & operator*() const  // never throws
+    {
+        BOOST_ASSERT(px != 0);
+        return *px;
+    }
+
+    T * operator->() const  // never throws
+    {
+        BOOST_ASSERT(px != 0);
+        return px;
+    }
+
+    T * get() const  // never throws
+    {
+        return px;
+    }
+
+    long use_count() const  // never throws
+    {
+        return *pn;
+    }
+
+    bool unique() const  // never throws
+    {
+        return *pn == 1;
+    }
+    
+    void swap(shared_ptr<T> & other)  // never throws
+    {
+        std::swap(px, other.px);
+        std::swap(pn, other.pn);
+    }
+
+private:
+
+    T * px;            // contained pointer
+    count_type * pn;   // ptr to reference counter
+};
+
+template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+    return a.get() == b.get();
+}
+
+template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
+{
+    return a.get() != b.get();
+}
+
+template<class T> inline bool operator<(shared_ptr<T> const & a, shared_ptr<T> const & b)
+{
+    return std::less<T*>()(a.get(), b.get());
+}
+
+template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b)
+{
+    a.swap(b);
+}
+
+// get_pointer() enables boost::mem_fn to recognize shared_ptr
+
+template<class T> inline T * get_pointer(shared_ptr<T> const & p)
+{
+    return p.get();
+}
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_DETAIL_SHARED_PTR_NMT_132_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/stack_constructor.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/detail/stack_constructor.hpp
new file mode 100644 (file)
index 0000000..de623b0
--- /dev/null
@@ -0,0 +1,73 @@
+#ifndef  BOOST_SERIALIZATION_DETAIL_STACH_CONSTRUCTOR_HPP
+#define BOOST_SERIALIZATION_DETAIL_STACH_CONSTRUCTOR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1020)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// collections_load_imp.hpp: serialization for loading stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/aligned_storage.hpp>
+
+namespace boost{
+namespace serialization {
+namespace detail {
+
+// reserve space on stack for an object of type T without actually
+// construction such an object
+template<typename T > 
+struct stack_allocate
+{
+    T * address() {
+        return static_cast<T*>(storage_.address()); 
+    }
+    T & reference() {
+        return * address();
+    }
+private:
+    typedef BOOST_DEDUCED_TYPENAME boost::aligned_storage<
+        sizeof(T), 
+        #if BOOST_WORKAROUND(__BORLANDC__,BOOST_TESTED_AT(0x560))
+            8
+        #else
+            boost::alignment_of<T>::value
+        #endif
+    > type;
+    type storage_;
+};
+
+// construct element on the stack
+template<class Archive, class T>
+struct stack_construct : public stack_allocate<T>
+{
+    stack_construct(Archive & ar, const unsigned int version){
+        // note borland emits a no-op without the explicit namespace
+        boost::serialization::load_construct_data_adl(
+            ar, 
+            this->address(), 
+            version
+        );
+    }
+    ~stack_construct(){
+        this->address()->~T(); // undo load_construct_data above
+    }
+};
+
+} // detail
+} // serializaition
+} // boost
+
+#endif //  BOOST_SERIALIZATION_DETAIL_STACH_CONSTRUCTOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/ephemeral.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/ephemeral.hpp
new file mode 100644 (file)
index 0000000..f559bec
--- /dev/null
@@ -0,0 +1,80 @@
+#ifndef BOOST_SERIALIZATION_EPHEMERAL_HPP
+#define BOOST_SERIALIZATION_EPHEMERAL_HPP
+
+// MS compatible compilers support 
+#pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// ephemeral_object.hpp: interface for serialization system.
+
+// (C) Copyright 2007 Matthias Troyer. 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <utility>
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+// supress noise
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+# pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/split_member.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/traits.hpp>
+#include <boost/serialization/wrapper.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<class T>
+struct ephemeral_object : 
+    public wrapper_traits<ephemeral_object<T> >
+{
+    explicit ephemeral_object(T& t) :
+        val(t)
+    {}
+
+    T & value() const {
+        return val;
+    }
+
+    const T & const_value() const {
+        return val;
+    }
+
+    template<class Archive>
+    void serialize(Archive &ar, const unsigned int) const
+    {
+       ar & val;
+    }
+
+private:
+    T & val;
+};
+
+template<class T>
+inline
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+const
+#endif
+ephemeral_object<T> ephemeral(const char * name, T & t){
+    return ephemeral_object<T>(name, t);
+}
+
+} // seralization
+} // boost
+
+#endif // BOOST_SERIALIZATION_EPHEMERAL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/export.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/export.hpp
new file mode 100644 (file)
index 0000000..d163700
--- /dev/null
@@ -0,0 +1,229 @@
+#ifndef BOOST_SERIALIZATION_EXPORT_HPP
+#define BOOST_SERIALIZATION_EXPORT_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// export.hpp: set traits of classes to be serialized
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// (C) Copyright 2006 David Abrahams - http://www.boost.org.
+// implementation of class export functionality.  This is an alternative to
+// "forward declaration" method to provoke instantiation of derived classes
+// that are to be serialized through pointers.
+
+#include <utility>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <boost/serialization/static_warning.hpp>
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/force_include.hpp>
+#include <boost/serialization/singleton.hpp>
+
+#include <boost/archive/detail/register_archive.hpp>
+
+#include <iostream>
+
+namespace boost {
+namespace archive {
+namespace detail {
+
+class basic_pointer_iserializer;
+class basic_pointer_oserializer;
+
+template<class Archive, class T>
+class pointer_iserializer;
+template<class Archive, class T>
+class pointer_oserializer;
+
+template <class Archive, class Serializable>
+struct export_impl
+{
+    static const basic_pointer_iserializer &
+    enable_load(mpl::true_){
+        return boost::serialization::singleton<
+            pointer_iserializer<Archive, Serializable> 
+        >::get_const_instance();
+    }
+
+    static const basic_pointer_oserializer &
+    enable_save(mpl::true_){
+        return boost::serialization::singleton<
+            pointer_oserializer<Archive, Serializable> 
+        >::get_const_instance();
+    }
+    inline static void enable_load(mpl::false_) {}
+    inline static void enable_save(mpl::false_) {}
+};
+
+// On many platforms, naming a specialization of this template is
+// enough to cause its argument to be instantiated.
+template <void(*)()>
+struct instantiate_function {};
+
+template <class Archive, class Serializable>
+struct ptr_serialization_support
+{
+# if defined(BOOST_MSVC) || defined(__SUNPRO_CC)
+    virtual BOOST_DLLEXPORT void instantiate() BOOST_USED;
+# elif defined(__BORLANDC__)   
+    static BOOST_DLLEXPORT void instantiate() BOOST_USED;
+    enum { x = sizeof(instantiate(),3) };
+# else
+    static BOOST_DLLEXPORT void instantiate() BOOST_USED;
+    typedef instantiate_function<
+        &ptr_serialization_support::instantiate
+    > x;
+# endif
+};
+
+template <class Archive, class Serializable>
+BOOST_DLLEXPORT void 
+ptr_serialization_support<Archive,Serializable>::instantiate()
+{
+    export_impl<Archive,Serializable>::enable_save(
+        #if ! defined(__BORLANDC__)
+        BOOST_DEDUCED_TYPENAME 
+        #endif
+        Archive::is_saving()
+    );
+
+    export_impl<Archive,Serializable>::enable_load(
+        #if ! defined(__BORLANDC__)
+        BOOST_DEDUCED_TYPENAME 
+        #endif
+        Archive::is_loading()
+    );
+}
+
+namespace {
+
+template<class T>
+struct guid_initializer
+{  
+    void export_guid(mpl::false_) const {
+        // generates the statically-initialized objects whose constructors
+        // register the information allowing serialization of T objects
+        // through pointers to their base classes.
+        instantiate_ptr_serialization((T*)0, 0, adl_tag());
+    }
+    const void export_guid(mpl::true_) const {
+    }
+    guid_initializer const & export_guid() const {
+        BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value);
+        // note: exporting an abstract base class will have no effect
+        // and cannot be used to instantitiate serialization code
+        // (one might be using this in a DLL to instantiate code)
+        //BOOST_STATIC_WARNING(! boost::serialization::is_abstract<T>::value);
+        export_guid(boost::serialization::is_abstract<T>());
+        return *this;
+    }
+};
+
+template<typename T>
+struct init_guid;
+
+} // anonymous
+} // namespace detail
+} // namespace archive
+} // namespace boost
+
+#define BOOST_CLASS_EXPORT_IMPLEMENT(T)                      \
+    namespace boost {                                        \
+    namespace archive {                                      \
+    namespace detail {                                       \
+    namespace {                                              \
+    template<>                                               \
+    struct init_guid< T > {                                  \
+        static guid_initializer< T > const & g;              \
+    };                                                       \
+    guid_initializer< T > const & init_guid< T >::g =        \
+        ::boost::serialization::singleton<                   \
+            guid_initializer< T >                            \
+        >::get_mutable_instance().export_guid();             \
+    }}}}                                                     \
+/**/
+
+#define BOOST_CLASS_EXPORT_KEY2(T, K)          \
+namespace boost {                              \
+namespace serialization {                      \
+template<>                                     \
+struct guid_defined<T> : boost::mpl::true_ {}; \
+template<>                                     \
+inline const char * guid<T>(){                 \
+    return K;                                  \
+}                                              \
+} /* serialization */                          \
+} /* boost */                                  \
+/**/
+
+#define BOOST_CLASS_EXPORT_KEY(T)                                      \
+    BOOST_CLASS_EXPORT_KEY2(T, BOOST_PP_STRINGIZE(T))                                                                  \
+/**/
+
+#define BOOST_CLASS_EXPORT_GUID(T, K)                                  \
+BOOST_CLASS_EXPORT_KEY2(T, K)                                          \
+BOOST_CLASS_EXPORT_IMPLEMENT(T)                                        \
+/**/
+
+#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
+
+// CodeWarrior fails to construct static members of class templates
+// when they are instantiated from within templates, so on that
+// compiler we ask users to specifically register base/derived class
+// relationships for exported classes.  On all other compilers, use of
+// this macro is entirely optional.
+# define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived)             \
+namespace {                                                                    \
+  static int BOOST_PP_CAT(boost_serialization_mwerks_init_, __LINE__) =        \
+  (::boost::archive::detail::instantiate_ptr_serialization((Derived*)0,0), 3); \
+  static int BOOST_PP_CAT(boost_serialization_mwerks_init2_, __LINE__) = (     \
+      ::boost::serialization::void_cast_register((Derived*)0,(Base*)0)         \
+    , 3);                                                                      \
+}
+
+#else
+
+# define BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(Base,Derived)
+
+#endif 
+
+// check for unnecessary export.  T isn't polymorphic so there is no
+// need to export it.
+#define BOOST_CLASS_EXPORT_CHECK(T)                              \
+    BOOST_STATIC_WARNING(                                        \
+        boost::is_polymorphic<U>::value                          \
+    );                                                           \
+    /**/
+
+// the default exportable class identifier is the class name
+// the default list of archives types for which code id generated
+// are the originally included with this serialization system
+#define BOOST_CLASS_EXPORT(T)                   \
+    BOOST_CLASS_EXPORT_GUID(                    \
+        T,                                      \
+        BOOST_PP_STRINGIZE(T)                   \
+    )                                           \
+    /**/
+
+#endif // BOOST_SERIALIZATION_EXPORT_HPP
+
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info.hpp
new file mode 100644 (file)
index 0000000..ef8f8bc
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP
+#define BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// extended_type_info.hpp: interface for portable version of type_info
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// for now, extended type info is part of the serialization libraries
+// this could change in the future.
+#include <cstdarg>
+#include <cassert>
+#include <cstddef> // NULL
+#include <boost/config.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/config.hpp>
+#include <boost/mpl/bool.hpp>
+
+#include <boost/config/abi_prefix.hpp> // must be the last header
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4251 4231 4660 4275)
+#endif
+
+#define BOOST_SERIALIZATION_MAX_KEY_SIZE 128
+
+namespace boost { 
+namespace serialization {
+
+namespace void_cast_detail{
+    class void_caster;
+}
+
+class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info :
+    private boost::noncopyable
+{
+private:
+    friend class boost::serialization::void_cast_detail::void_caster;
+
+    // used to uniquely identify the type of class derived from this one
+    // so that different derivations of this class can be simultaneously
+    // included in implementation of sets and maps.
+    const unsigned int m_type_info_key;
+    virtual bool is_less_than(const extended_type_info & /*rhs*/) const = 0;
+    virtual bool is_equal(const extended_type_info & /*rhs*/) const = 0;
+    const char * m_key;
+
+protected:
+    void key_unregister() const;
+    void key_register() const;
+    // this class can't be used as is. It's just the 
+    // common functionality for all type_info replacement
+    // systems.  Hence, make these protected
+    extended_type_info(
+       const unsigned int type_info_key,
+       const char * key
+    );
+    // account for bogus gcc warning
+    #if defined(__GNUC__)
+    virtual
+    #endif
+    ~extended_type_info();
+public:
+    const char * get_key() const {
+        return m_key;
+    }
+    virtual const char * get_debug_info() const = 0;
+    bool operator<(const extended_type_info &rhs) const;
+    bool operator==(const extended_type_info &rhs) const;
+    bool operator!=(const extended_type_info &rhs) const {
+        return !(operator==(rhs));
+    }
+    static const extended_type_info * find(const char *key);
+    // for plugins
+    virtual void * construct(unsigned int /*count*/ = 0, ...) const {
+        assert(false); // must be implemented if used
+        return NULL;
+    };
+    virtual void destroy(void const * const /*p*/) const {
+        assert(false); // must be implemented if used
+    }
+};
+
+template<class T>
+struct guid_defined : boost::mpl::false_ {};
+template<class T>
+inline const char * guid(){
+    return NULL;
+}
+
+} // namespace serialization 
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_no_rtti.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_no_rtti.hpp
new file mode 100644 (file)
index 0000000..15254fb
--- /dev/null
@@ -0,0 +1,174 @@
+#ifndef BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP
+#define BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// extended_type_info_no_rtti.hpp: implementation for version that depends
+// on runtime typing (rtti - typeid) but uses a user specified string
+// as the portable class identifier.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+#include <cassert>
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+
+#include <boost/serialization/static_warning.hpp>
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/serialization/factory.hpp>
+#include <boost/serialization/throw_exception.hpp>
+
+#include <boost/config/abi_prefix.hpp> // must be the last header
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4251 4231 4660 4275)
+#endif
+
+namespace boost {
+namespace serialization {
+///////////////////////////////////////////////////////////////////////
+// define a special type_info that doesn't depend on rtti which is not
+// available in all situations.
+
+namespace no_rtti_system {
+
+// common base class to share type_info_key.  This is used to 
+// identify the method used to keep track of the extended type
+class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info_no_rtti_0 : 
+    public extended_type_info
+{
+protected:
+    extended_type_info_no_rtti_0(const char * key);
+    ~extended_type_info_no_rtti_0();
+public:
+    virtual bool
+    is_less_than(const boost::serialization::extended_type_info &rhs) const ;
+    virtual bool
+    is_equal(const boost::serialization::extended_type_info &rhs) const ;
+};
+
+} // no_rtti_system
+
+template<class T>
+class extended_type_info_no_rtti : 
+    public no_rtti_system::extended_type_info_no_rtti_0,
+    public singleton<extended_type_info_no_rtti<T> >
+{
+    template<bool tf>
+    struct action {
+        struct defined {
+            static const char * invoke(){
+                return guid<T>();
+            }
+        };
+        struct undefined {
+            // if your program traps here - you failed to 
+            // export a guid for this type.  the no_rtti
+            // system requires export for types serialized
+            // as pointers.
+            BOOST_STATIC_ASSERT(0 == sizeof(T));
+            static const char * invoke();
+        };
+        static const char * invoke(){
+            typedef 
+                BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
+                    tf,
+                    defined,
+                    undefined
+                >::type type;
+            return type::invoke();
+        }
+    };
+public:
+    extended_type_info_no_rtti() :
+        no_rtti_system::extended_type_info_no_rtti_0(get_key())
+    {
+        key_register();
+    }
+    ~extended_type_info_no_rtti(){
+        key_unregister();
+    }
+    const extended_type_info *
+    get_derived_extended_type_info(const T & t) const {
+        // find the type that corresponds to the most derived type.
+        // this implementation doesn't depend on typeid() but assumes
+        // that the specified type has a function of the following signature.
+        // A common implemention of such a function is to define as a virtual
+        // function. So if the is not a polymporphic type it's likely an error
+        BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value);
+        const char * derived_key = t.get_key();
+        assert(NULL != derived_key);
+        return boost::serialization::extended_type_info::find(derived_key);
+    }
+    const char * get_key() const{
+        return action<guid_defined<T>::value >::invoke();
+    }
+    virtual const char * get_debug_info() const{
+        return action<guid_defined<T>::value >::invoke();
+    }
+    virtual void * construct(unsigned int count, ...) const{
+        // count up the arguments
+        std::va_list ap;
+        va_start(ap, count);
+        switch(count){
+        case 0:
+            return factory<T, 0>(ap);
+        case 1:
+            return factory<T, 1>(ap);
+        case 2:
+            return factory<T, 2>(ap);
+        case 3:
+            return factory<T, 3>(ap);
+        case 4:
+            return factory<T, 4>(ap);
+        default:
+            assert(false); // too many arguments
+            // throw exception here?
+            return NULL;
+        }
+    }
+    virtual void destroy(void const * const p) const{
+        delete static_cast<T const *>(p) ;
+    }
+};
+
+} // namespace serialization
+} // namespace boost
+
+///////////////////////////////////////////////////////////////////////////////
+// If no other implementation has been designated as default, 
+// use this one.  To use this implementation as the default, specify it
+// before any of the other headers.
+
+#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO
+    #define BOOST_SERIALIZATION_DEFAULT_TYPE_INFO
+    namespace boost {
+    namespace serialization {
+    template<class T>
+    struct extended_type_info_impl {
+        typedef BOOST_DEDUCED_TYPENAME 
+            boost::serialization::extended_type_info_no_rtti<T> type;
+    };
+    } // namespace serialization
+    } // namespace boost
+#endif
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_EXTENDED_TYPE_INFO_NO_RTTI_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_typeid.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/extended_type_info_typeid.hpp
new file mode 100644 (file)
index 0000000..eb01753
--- /dev/null
@@ -0,0 +1,164 @@
+#ifndef BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP
+#define BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// extended_type_info_typeid.hpp: implementation for version that depends
+// on runtime typing (rtti - typeid) but uses a user specified string
+// as the portable class identifier.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <typeinfo>
+#include <cstdarg>
+#include <cassert>
+#include <boost/config.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/serialization/static_warning.hpp>
+#include <boost/type_traits/is_polymorphic.hpp>
+#include <boost/type_traits/remove_const.hpp>
+
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/serialization/factory.hpp>
+
+#include <boost/mpl/if.hpp>
+
+#include <boost/config/abi_prefix.hpp> // must be the last header
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4251 4231 4660 4275)
+#endif
+
+namespace boost {
+namespace serialization {
+namespace typeid_system {
+
+class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info_typeid_0 : 
+    public extended_type_info
+{
+    virtual const char * get_debug_info() const {
+        if(static_cast<const std::type_info *>(0) == m_ti)
+            return static_cast<const char *>(0);
+        return m_ti->name();
+    }
+protected:
+    const std::type_info * m_ti;
+    extended_type_info_typeid_0(const char * key);
+    ~extended_type_info_typeid_0();
+    void type_register(const std::type_info & ti);
+    void type_unregister();
+    const extended_type_info *
+    get_extended_type_info(const std::type_info & ti) const;
+public:
+    virtual bool
+    is_less_than(const extended_type_info &rhs) const;
+    virtual bool
+    is_equal(const extended_type_info &rhs) const;
+    const std::type_info & get_typeid() const {
+        return *m_ti;
+    }
+};
+
+} // typeid_system
+
+template<class T>
+class extended_type_info_typeid : 
+    public typeid_system::extended_type_info_typeid_0,
+    public singleton<extended_type_info_typeid<T> >
+{
+public:
+    extended_type_info_typeid() :
+        typeid_system::extended_type_info_typeid_0(get_key())
+    {
+        type_register(typeid(T));
+        key_register();
+    }
+    ~extended_type_info_typeid(){
+        key_unregister();
+        type_unregister();
+    }
+    // get the eti record for the true type of this record
+    // relying upon standard type info implemenation (rtti)
+    const extended_type_info *
+    get_derived_extended_type_info(const T & t) const {
+        // note: this implementation - based on usage of typeid (rtti)
+        // only does something if the class has at least one virtual function.
+        BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value);
+        return 
+            typeid_system::extended_type_info_typeid_0::get_extended_type_info(
+                typeid(t)
+            );
+    }
+    const char * get_key() const {
+        return boost::serialization::guid<T>();
+    }
+    virtual void * construct(unsigned int count, ...) const{
+        // count up the arguments
+        std::va_list ap;
+        va_start(ap, count);
+        switch(count){
+        case 0:
+            return factory<boost::remove_const<T>, 0>(ap);
+        case 1:
+            return factory<boost::remove_const<T>, 1>(ap);
+        case 2:
+            return factory<boost::remove_const<T>, 2>(ap);
+        case 3:
+            return factory<boost::remove_const<T>, 3>(ap);
+        case 4:
+            return factory<boost::remove_const<T>, 4>(ap);
+        default:
+            assert(false); // too many arguments
+            // throw exception here?
+            return NULL;
+        }
+    }
+    virtual void destroy(void const * const /* p */) const {
+        // the only current usage of extended type info is in the
+        // serialization library.  The statement below requires
+        // that destructor of type T be public and this creates
+        // a problem for some users.  So, for now, comment this
+        // out 
+        //delete static_cast<T const *>(p);
+        // and trap any attempt to invoke this function
+        assert(false);
+    }
+};
+
+} // namespace serialization
+} // namespace boost
+
+///////////////////////////////////////////////////////////////////////////////
+// If no other implementation has been designated as default, 
+// use this one.  To use this implementation as the default, specify it
+// before any of the other headers.
+#ifndef BOOST_SERIALIZATION_DEFAULT_TYPE_INFO
+    #define BOOST_SERIALIZATION_DEFAULT_TYPE_INFO
+    namespace boost {
+    namespace serialization {
+    template<class T>
+    struct extended_type_info_impl {
+        typedef BOOST_DEDUCED_TYPENAME 
+            boost::serialization::extended_type_info_typeid<T> type;
+    };
+    } // namespace serialization
+    } // namespace boost
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_EXTENDED_TYPE_INFO_TYPEID_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/factory.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/factory.hpp
new file mode 100644 (file)
index 0000000..c7730cb
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef BOOST_SERIALIZATION_FACTORY_HPP
+#define BOOST_SERIALIZATION_FACTORY_HPP
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// factory.hpp: create an instance from an extended_type_info instance.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstdarg> // valist
+#include <cstddef> // NULL
+
+#include <boost/preprocessor/control/if.hpp> 
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+
+namespace std{
+    #if defined(__LIBCOMO__)
+        using ::va_list;
+    #endif
+} // namespace std
+
+namespace boost {
+namespace serialization {
+
+// default implementation does nothing.
+template<class T, int N>
+T * factory(std::va_list){
+    assert(false);
+    // throw exception here?
+    return NULL;
+}
+
+} // namespace serialization
+} // namespace boost
+
+#define BOOST_SERIALIZATION_FACTORY(N, T, A0, A1, A2, A3) \
+namespace boost {                                         \
+namespace serialization {                                 \
+    template<>                                            \
+    T * factory<T, N>(std::va_list ap){                   \
+        BOOST_PP_IF(BOOST_PP_GREATER(N,0)                 \
+            ,A0 a0 = va_arg(ap, A0);                      \
+        ,BOOST_PP_IF(BOOST_PP_GREATER(N,1)                \
+            ,A1 a1 = va_arg(ap, A1);                      \
+        ,BOOST_PP_IF(BOOST_PP_GREATER(N,2)                \
+            ,A2 a2 = va_arg(ap, A2);                      \
+        ,BOOST_PP_IF(BOOST_PP_GREATER(N,3)                \
+            ,A3 a3 = va_arg(ap, A3);                      \
+            ,BOOST_PP_EMPTY()                             \
+        ))))                                              \
+        return new T(                                     \
+            BOOST_PP_IF(BOOST_PP_GREATER(N,0)             \
+                ,a0                                       \
+            ,BOOST_PP_IF(BOOST_PP_GREATER(N,1)            \
+                ,a1                                       \
+            ,BOOST_PP_IF(BOOST_PP_GREATER(N,2)            \
+                ,a2                                       \
+            ,BOOST_PP_IF(BOOST_PP_GREATER(N,3)            \
+                ,a3                                       \
+                ,BOOST_PP_EMPTY()                         \
+            ))))                                          \
+        );                                                \
+    }                                                     \
+}                                                         \
+}                                                         \
+/**/
+
+#define BOOST_SERIALIZATION_FACTORY_4(T, A0, A1, A2, A3) \
+    BOOST_SERIALIZATION_FACTORY(4, T, A0, A1, A2, A3)
+
+#define BOOST_SERIALIZATION_FACTORY_3(T, A0, A1, A2)     \
+    BOOST_SERIALIZATION_FACTORY(3, T, A0, A1, A2, 0)
+
+#define BOOST_SERIALIZATION_FACTORY_2(T, A0, A1)         \
+    BOOST_SERIALIZATION_FACTORY(2, T, A0, A1, 0, 0)
+
+#define BOOST_SERIALIZATION_FACTORY_1(T, A0)             \
+    BOOST_SERIALIZATION_FACTORY(1, T, A0, 0, 0, 0)
+
+#define BOOST_SERIALIZATION_FACTORY_0(T)                 \
+    BOOST_SERIALIZATION_FACTORY(0, T, 0, 0, 0, 0)
+
+#endif // BOOST_SERIALIZATION_FACTORY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/force_include.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/force_include.hpp
new file mode 100644 (file)
index 0000000..6801eef
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+#define BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// force_include.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+
+// the following help macro is to guarentee that certain coded
+// is not removed by over-eager linker optimiser.  In certain cases
+// we create static objects must be created but are actually never
+// referenced - creation has a side-effect such as global registration
+// which is important to us. We make an effort to refer these objects
+// so that a smart linker won't remove them as being unreferenced.
+// In microsoft compilers, inlining the code that does the referring
+// means the code gets lost and the static object is not included
+// in the library and hence never registered.  This manifests itself
+// in an ungraceful crash at runtime when (and only when) built in
+// release mode.
+
+#if defined(BOOST_HAS_DECLSPEC) && !defined(__COMO__)
+#   if defined(__BORLANDC__)
+#       define BOOST_DLLEXPORT __export
+#   else
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   endif
+#elif ! defined(_WIN32) && ! defined(_WIN64)
+#   if defined(__MWERKS__)
+#       define BOOST_DLLEXPORT __declspec(dllexport)
+#   elif defined(__GNUC__) && (__GNUC__ >= 3)
+#       define BOOST_USED __attribute__ ((used))
+#   elif defined(__INTEL_COMPILER) && (BOOST_INTEL_CXX_VERSION >= 800)
+#       define BOOST_USED __attribute__ ((used))
+#   endif
+#endif
+
+#ifndef BOOST_USED
+#    define BOOST_USED
+#endif
+
+#ifndef BOOST_DLLEXPORT
+#    define BOOST_DLLEXPORT
+#endif
+
+#endif // BOOST_SERIALIZATION_FORCE_INCLUDE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_load_imp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_load_imp.hpp
new file mode 100644 (file)
index 0000000..cd5bea8
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP
+#define BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+# pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// hash_collections_load_imp.hpp: serialization for loading stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of hashed collections
+#include <boost/config.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+template<class Archive, class Container, class InputFunction>
+inline void load_hash_collection(Archive & ar, Container &s)
+{
+    s.clear();
+    // retrieve number of elements
+    unsigned int count;
+    unsigned int item_version(0);
+    unsigned int bucket_count;;
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    if(3 < ar.get_library_version()){
+       ar >> BOOST_SERIALIZATION_NVP(bucket_count);
+       ar >> BOOST_SERIALIZATION_NVP(item_version);
+    }
+    #if ! defined(__MWERKS__)
+    s.resize(bucket_count);
+    #endif
+    InputFunction ifunc;
+    while(count-- > 0){
+        ifunc(ar, s, item_version);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_HASH_COLLECTIONS_LOAD_IMP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_save_imp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_collections_save_imp.hpp
new file mode 100644 (file)
index 0000000..e0dc0a2
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP
+#define BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// hash_collections_save_imp.hpp: serialization for stl collections
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// helper function templates for serialization of collections
+
+#include <boost/config.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/serialization.hpp>
+#include <boost/serialization/version.hpp>
+
+namespace boost{
+namespace serialization {
+namespace stl {
+
+//////////////////////////////////////////////////////////////////////
+// implementation of serialization for STL containers
+//
+
+template<class Archive, class Container>
+inline void save_hash_collection(Archive & ar, const Container &s)
+{
+    // record number of elements
+    unsigned int count = s.size();
+    ar <<  BOOST_SERIALIZATION_NVP(count);
+    // make sure the target type is registered so we can retrieve
+    // the version when we load
+    if(3 < ar.get_library_version()){
+        const unsigned int bucket_count = s.bucket_count();
+        ar << BOOST_SERIALIZATION_NVP(bucket_count);
+        const unsigned int item_version = version<BOOST_DEDUCED_TYPENAME Container::value_type>::value;
+        ar << BOOST_SERIALIZATION_NVP(item_version);
+    }
+    BOOST_DEDUCED_TYPENAME Container::const_iterator it = s.begin();
+    while(count-- > 0){
+        // note borland emits a no-op without the explicit namespace
+        boost::serialization::save_construct_data_adl(
+            ar, 
+            &(*it), 
+            boost::serialization::version<
+                BOOST_DEDUCED_TYPENAME Container::value_type
+            >::value
+        );
+        ar << boost::serialization::make_nvp("item", *it++);
+    }
+}
+
+} // namespace stl 
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_HASH_COLLECTIONS_SAVE_IMP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_map.hpp
new file mode 100644 (file)
index 0000000..06d4c30
--- /dev/null
@@ -0,0 +1,175 @@
+#ifndef  BOOST_SERIALIZATION_HASH_MAP_HPP
+#define BOOST_SERIALIZATION_HASH_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/hash_map.hpp:
+// serialization for stl hash_map templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_HASH
+#include BOOST_HASH_MAP_HEADER
+
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/hash_collections_save_imp.hpp>
+#include <boost/serialization/hash_collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_hash_collection<
+        Archive, 
+        BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+            Key, HashFcn, EqualKey, Allocator
+        >
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::load_hash_collection<
+        Archive,
+        BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_map<
+            Archive, 
+            BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_map<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// hash_multimap
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_hash_collection<
+        Archive, 
+        BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+            Key, HashFcn, EqualKey, Allocator
+        >
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::load_hash_collection<
+        Archive,
+        BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_multimap<
+            Archive, 
+            BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_multimap<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_HAS_HASH
+#endif // BOOST_SERIALIZATION_HASH_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_set.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/hash_set.hpp
new file mode 100644 (file)
index 0000000..62aeea4
--- /dev/null
@@ -0,0 +1,178 @@
+#ifndef  BOOST_SERIALIZATION_HASH_SET_HPP
+#define BOOST_SERIALIZATION_HASH_SET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// hash_set.hpp: serialization for stl hash_set templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#ifdef BOOST_HAS_HASH
+#include BOOST_HASH_SET_HEADER
+
+#include <boost/serialization/hash_collections_save_imp.hpp>
+#include <boost/serialization/hash_collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_hash_collection<
+        Archive, 
+        BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+            Key, HashFcn, EqualKey, Allocator
+        > 
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::load_hash_collection<
+        Archive,
+        BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_set<
+            Archive, 
+            BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+                Key, HashFcn, EqualKey, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_set<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// hash_multiset
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void save(
+    Archive & ar,
+    const BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_hash_collection<
+        Archive, 
+        BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+            Key, HashFcn, EqualKey, Allocator
+        > 
+    >(ar, t);
+}
+
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void load(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::load_hash_collection<
+        Archive,
+        BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+            Key, HashFcn, EqualKey, Allocator
+        >,
+        boost::serialization::stl::archive_input_multiset<
+            Archive,
+            BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+                Key, HashFcn, EqualKey, Allocator
+            > 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<
+    class Archive, 
+    class Key, 
+    class HashFcn, 
+    class EqualKey,
+    class Allocator
+>
+inline void serialize(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::hash_multiset<
+        Key, HashFcn, EqualKey, Allocator
+    > & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::hash_set)
+BOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::hash_multiset)
+
+#endif // BOOST_HAS_HASH
+#endif // BOOST_SERIALIZATION_HASH_SET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/is_bitwise_serializable.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/is_bitwise_serializable.hpp
new file mode 100644 (file)
index 0000000..97d80b9
--- /dev/null
@@ -0,0 +1,46 @@
+// (C) Copyright 2007 Matthias Troyer
+
+// 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)
+
+//  Authors: Matthias Troyer
+
+/** @file is_bitwise_serializable.hpp
+ *
+ *  This header provides a traits class for determining whether a class
+ * can be serialized (in a non-portable way) just by copying the bits.
+ */
+
+
+#ifndef BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP
+#define BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_arithmetic.hpp>
+
+namespace boost {
+namespace serialization {
+    template<class T>
+    struct is_bitwise_serializable
+     : public is_arithmetic<T>
+    {};
+} // namespace serialization
+} // namespace boost
+
+
+// define a macro to make explicit designation of this more transparent
+#define BOOST_IS_BITWISE_SERIALIZABLE(T)              \
+namespace boost {                                     \
+namespace serialization {                             \
+template<>                                            \
+struct is_bitwise_serializable< T > : mpl::true_ {};  \
+}}                                                    \
+/**/
+
+#endif //BOOST_SERIALIZATION_IS_BITWISE_SERIALIZABLE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/level.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/level.hpp
new file mode 100644 (file)
index 0000000..aedbe9f
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef BOOST_SERIALIZATION_LEVEL_HPP
+#define BOOST_SERIALIZATION_LEVEL_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// level.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_array.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+#include <boost/serialization/level_enum.hpp>
+
+namespace boost {
+namespace serialization {
+
+struct basic_traits;
+
+// default serialization implementation level
+template<class T>
+struct implementation_level_impl {
+    template<class U>
+    struct traits_class_level {
+        typedef BOOST_DEDUCED_TYPENAME U::level type;
+    };
+
+    typedef mpl::integral_c_tag tag;
+    // note: at least one compiler complained w/o the full qualification
+    // on basic traits below
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_base_and_derived<boost::serialization::basic_traits, T>,
+            traits_class_level<T>,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_fundamental<T>,
+            mpl::int_<primitive_type>,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_class<T>,
+            mpl::int_<object_class_info>,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_array<T>,
+            #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+                mpl::int_<not_serializable>,
+            #else
+                mpl::int_<object_serializable>,
+            #endif
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_enum<T>,
+            //#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+            //    mpl::int_<not_serializable>,
+            //#else
+                mpl::int_<primitive_type>,
+            //#endif
+        //else
+            mpl::int_<not_serializable>
+        >
+        >
+        >
+        >
+        >::type type;
+        // vc 7.1 doesn't like enums here
+    BOOST_STATIC_CONSTANT(int, value = type::value);
+};
+
+template<class T>
+struct implementation_level : 
+    public implementation_level_impl<const T>
+{
+};
+
+template<class T, BOOST_MPL_AUX_NTTP_DECL(int, L) >
+inline bool operator>=(implementation_level<T> t, enum level_type l)
+{
+    return t.value >= (int)l;
+}
+
+} // namespace serialization
+} // namespace boost
+
+// specify the level of serialization implementation for the class
+// require that class info saved when versioning is used
+#define BOOST_CLASS_IMPLEMENTATION(T, E)                 \
+    namespace boost {                                    \
+    namespace serialization {                            \
+    template <>                                          \
+    struct implementation_level_impl< const T >                     \
+    {                                                    \
+        typedef mpl::integral_c_tag tag;                 \
+        typedef mpl::int_< E > type;                     \
+        BOOST_STATIC_CONSTANT(                           \
+            int,                                         \
+            value = implementation_level_impl::type::value    \
+        );                                               \
+    };                                                   \
+    }                                                    \
+    }
+    /**/
+
+#endif // BOOST_SERIALIZATION_LEVEL_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/level_enum.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/level_enum.hpp
new file mode 100644 (file)
index 0000000..11bd17f
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef BOOST_SERIALIZATION_LEVEL_ENUM_HPP
+#define BOOST_SERIALIZATION_LEVEL_ENUM_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// level_enum.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+namespace boost {
+namespace serialization {
+
+// for each class used in the program, specify which level
+// of serialization should be implemented
+
+// names for each level
+enum level_type
+{
+    // Don't serialize this type. An attempt to do so should
+    // invoke a compile time assertion.
+    not_serializable = 0,
+    // write/read this type directly to the archive. In this case
+    // serialization code won't be called.  This is the default
+    // case for fundamental types.  It presumes a member function or
+    // template in the archive class that can handle this type.
+    // there is no runtime overhead associated reading/writing
+    // instances of this level
+    primitive_type = 1,
+    // Serialize the objects of this type using the objects "serialize"
+    // function or template. This permits values to be written/read
+    // to/from archives but includes no class or version information. 
+    object_serializable = 2,
+    ///////////////////////////////////////////////////////////////////
+    // once an object is serialized at one of the above levels, the
+    // corresponding archives cannot be read if the implementation level
+    // for the archive object is changed.  
+    ///////////////////////////////////////////////////////////////////
+    // Add class information to the archive.  Class information includes
+    // implementation level, class version and class name if available
+    object_class_info = 3
+};
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_LEVEL_ENUM_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/list.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/list.hpp
new file mode 100644 (file)
index 0000000..469bb23
--- /dev/null
@@ -0,0 +1,77 @@
+#ifndef BOOST_SERIALIZATION_LIST_HPP
+#define BOOST_SERIALIZATION_LIST_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// list.hpp: serialization for stl list templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <list>
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::list<U, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, 
+        std::list<U, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::list<U, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::list<U, Allocator>,
+        boost::serialization::stl::archive_input_seq<
+            Archive, 
+            std::list<U, Allocator> 
+        >,
+        boost::serialization::stl::no_reserve_imp<std::list<U, Allocator> >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::list<U, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::list)
+
+#endif // BOOST_SERIALIZATION_LIST_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/map.hpp
new file mode 100644 (file)
index 0000000..6cf965f
--- /dev/null
@@ -0,0 +1,118 @@
+#ifndef  BOOST_SERIALIZATION_MAP_HPP
+#define BOOST_SERIALIZATION_MAP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/map.hpp:
+// serialization for stl map templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/utility.hpp>
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void save(
+    Archive & ar,
+    const std::map<Key, Type, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, 
+        std::map<Key, Type, Compare, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void load(
+    Archive & ar,
+    std::map<Key, Type, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::map<Key, Type, Compare, Allocator>,
+        boost::serialization::stl::archive_input_map<
+            Archive, std::map<Key, Type, Compare, Allocator> >,
+            boost::serialization::stl::no_reserve_imp<std::map<
+                Key, Type, Compare, Allocator
+            >
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void serialize(
+    Archive & ar,
+    std::map<Key, Type, Compare, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// multimap
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void save(
+    Archive & ar,
+    const std::multimap<Key, Type, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, 
+        std::multimap<Key, Type, Compare, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void load(
+    Archive & ar,
+    std::multimap<Key, Type, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::multimap<Key, Type, Compare, Allocator>,
+        boost::serialization::stl::archive_input_multimap<
+            Archive, std::multimap<Key, Type, Compare, Allocator> 
+        >,
+        boost::serialization::stl::no_reserve_imp<
+            std::multimap<Key, Type, Compare, Allocator> 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class Type, class Key, class Compare, class Allocator >
+inline void serialize(
+    Archive & ar,
+    std::multimap<Key, Type, Compare, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_MAP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/nvp.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/nvp.hpp
new file mode 100644 (file)
index 0000000..79a8de0
--- /dev/null
@@ -0,0 +1,144 @@
+#ifndef BOOST_SERIALIZATION_NVP_HPP
+#define BOOST_SERIALIZATION_NVP_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// nvp.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <utility>
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+// supress noise
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
+# pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/split_member.hpp>
+#include <boost/serialization/base_object.hpp>
+#include <boost/serialization/traits.hpp>
+#include <boost/serialization/wrapper.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<class T>
+struct nvp : 
+    public std::pair<const char *, T *>,
+    public wrapper_traits<const nvp<T> >
+{
+    explicit nvp(const char * name_, T & t) :
+        // note: redundant cast works around borland issue
+        // note: added _ to suppress useless gcc warning
+        std::pair<const char *, T *>(name_, (T*)(& t))
+    {}
+    nvp(const nvp & rhs) : 
+        // note: redundant cast works around borland issue
+        std::pair<const char *, T *>(rhs.first, (T*)rhs.second)
+    {}
+
+    const char * name() const {
+        return this->first;
+    }
+    T & value() const {
+        return *(this->second);
+    }
+
+    const T & const_value() const {
+        return *(this->second);
+    }
+
+    // True64 compiler complains with a warning about the use of
+    // the name "Archive" hiding some higher level usage.  I'm sure this
+    // is an error but I want to accomodated as it generates a long warning
+    // listing and might be related to a lot of test failures.
+    // default treatment for name-value pairs. The name is
+    // just discarded and only the value is serialized. 
+    template<class Archivex>
+    void save(
+        Archivex & ar, 
+        const unsigned int /* file_version */
+    ) const {
+        // CodeWarrior 8.x can't seem to resolve the << op for a rhs of "const T *"
+        ar.operator<<(const_value());
+    }
+    template<class Archivex>
+    void load(
+        Archivex & ar, 
+        const unsigned int /* file_version */
+    ){
+        // CodeWarrior 8.x can't seem to resolve the >> op for a rhs of "const T *"
+        ar.operator>>(value());
+    }
+    BOOST_SERIALIZATION_SPLIT_MEMBER()
+};
+
+template<class T>
+inline
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+const
+#endif
+nvp<T> make_nvp(const char * name, T & t){
+    return nvp<T>(name, t);
+}
+
+// to maintain efficiency and portability, we want to assign
+// specific serialization traits to all instances of this wrappers.
+// we can't strait forward method below as it depends upon
+// Partial Template Specialization and doing so would mean that wrappers
+// wouldn't be treated the same on different platforms.  This would
+// break archive portability. Leave this here as reminder not to use it !!!
+#if 0 // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+
+template <class T>
+struct implementation_level<nvp<T> >
+{
+    typedef mpl::integral_c_tag tag;
+    typedef mpl::int_<object_serializable> type;
+    BOOST_STATIC_CONSTANT(int, value = implementation_level::type::value);
+};
+
+// nvp objects are generally created on the stack and are never tracked
+template<class T>
+struct tracking_level<nvp<T> >
+{
+    typedef mpl::integral_c_tag tag;
+    typedef mpl::int_<track_never> type;
+    BOOST_STATIC_CONSTANT(int, value = tracking_level::type::value);
+};
+
+#endif
+
+} // seralization
+} // boost
+
+#include <boost/preprocessor/stringize.hpp>
+
+#define BOOST_SERIALIZATION_NVP(name)                              \
+    boost::serialization::make_nvp(BOOST_PP_STRINGIZE(name), name)
+/**/
+
+#define BOOST_SERIALIZATION_BASE_OBJECT_NVP(name)                  \
+    boost::serialization::make_nvp(                                \
+        BOOST_PP_STRINGIZE(name),                                  \
+        boost::serialization::base_object<name >(*this)            \
+    )
+/**/
+
+#endif // BOOST_SERIALIZATION_NVP_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/optional.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/optional.hpp
new file mode 100644 (file)
index 0000000..68d236b
--- /dev/null
@@ -0,0 +1,113 @@
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+
+// (C) Copyright 2002-4 Pavel Vozenilek . 
+// 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)
+
+// Provides non-intrusive serialization for boost::optional.
+
+#ifndef BOOST_SERIALIZATION_OPTIONAL_HPP_
+#define BOOST_SERIALIZATION_OPTIONAL_HPP_
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#include <boost/config.hpp>
+
+#include <boost/optional.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/detail/stack_constructor.hpp>
+
+// function specializations must be defined in the appropriate
+// namespace - boost::serialization
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class T>
+void save(
+    Archive & ar, 
+    const boost::optional<T> & t, 
+    const unsigned int /*version*/
+){
+    const bool tflag = t.is_initialized();
+    ar << boost::serialization::make_nvp("initialized", tflag);
+    if (tflag){
+        if(3 < ar.get_library_version()){
+            const int v = version<T>::value;
+            ar << boost::serialization::make_nvp("item_version", v);
+        }
+        ar << boost::serialization::make_nvp("value", *t);
+    }
+}
+
+template<class Archive, class T>
+void load(
+    Archive & ar, 
+    boost::optional<T> & t, 
+    const unsigned int /*version*/
+){
+    bool tflag;
+    ar >> boost::serialization::make_nvp("initialized", tflag);
+    if (tflag){
+        unsigned int v = 0;
+        if(3 < ar.get_library_version()){
+            ar >> boost::serialization::make_nvp("item_version", v);
+        }
+        detail::stack_construct<Archive, T> aux(ar, v);
+        ar >> boost::serialization::make_nvp("value", aux.reference());
+        t.reset(aux.reference());
+    }
+    else {
+        t.reset();
+    }
+}
+
+template<class Archive, class T>
+void serialize(
+    Archive & ar, 
+    boost::optional<T> & t, 
+    const unsigned int version
+){
+    boost::serialization::split_free(ar, t, version);
+}
+
+// the following would be slightly more efficient.  But it
+// would mean that archives created with programs that support
+// TPS wouldn't be readable by programs that don't support TPS.
+// Hence we decline to support this otherwise convenient optimization.
+//#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+#if 0
+
+template <class T>
+struct implementation_level<optional<T> >
+{
+    typedef mpl::integral_c_tag tag;
+    typedef mpl::int_<boost::serialization::object_serializable> type;
+    BOOST_STATIC_CONSTANT(
+        int , 
+        value = boost::serialization::implementation_level::type::value
+    );
+};
+
+template<class T>
+struct tracking_level<optional<T> >
+{
+    typedef mpl::integral_c_tag tag;
+    typedef mpl::int_<boost::serialization::track_never> type;
+    BOOST_STATIC_CONSTANT(
+        int , 
+        value = boost::serialization::tracking_level::type::value
+    );
+};
+
+#endif
+
+} // serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_OPTIONAL_HPP_
similarity index 86%
rename from deal.II/contrib/boost/include/boost/pfto.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/serialization/pfto.hpp
index 83117fa55df1df2ca989ad35b9ade12b17812946..109f6d44e8340675659dff2a72b68941284edd0c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_PFTO_HPP
-#define BOOST_PFTO_HPP
+#ifndef BOOST_SERIALIZATION_PFTO_HPP
+#define BOOST_SERIALIZATION_PFTO_HPP
 
 // MS compatible compilers support #pragma once
 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
@@ -41,6 +41,7 @@
 // (and perhaps others) while implementing templated constructors.
 
 namespace boost {
+namespace serialization {
 
 template<class T>
 struct pfto_wrapper {
@@ -61,14 +62,17 @@ pfto_wrapper<T> make_pfto_wrapper(const pfto_wrapper<T> & t, int){
     return t;
 }
 
+} // namespace serialization
 } // namespace boost
 
 #ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
-    #define BOOST_PFTO_WRAPPER(T) boost::pfto_wrapper<T>
-    #define BOOST_MAKE_PFTO_WRAPPER(t) boost::make_pfto_wrapper(t, 0)
+    #define BOOST_PFTO_WRAPPER(T) \
+        boost::serialization::pfto_wrapper<T>
+    #define BOOST_MAKE_PFTO_WRAPPER(t) \
+        boost::serialization::make_pfto_wrapper(t, 0)
 #else
     #define BOOST_PFTO_WRAPPER(T) T
     #define BOOST_MAKE_PFTO_WRAPPER(t) t
 #endif
 
-#endif // BOOST_PFTO_HPP
+#endif // BOOST_SERIALIZATION_PFTO_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/scoped_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/scoped_ptr.hpp
new file mode 100644 (file)
index 0000000..52642c7
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30
+#define BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  Copyright (c) 2003 Vladimir Prus.
+// 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)
+
+// Provides non-intrusive serialization for boost::scoped_ptr
+// Does not allow to serialize scoped_ptr's to builtin types.
+
+#include <boost/config.hpp>
+
+#include <boost/scoped_ptr.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+    
+    template<class Archive, class T>
+    void save(
+        Archive & ar, 
+        const boost::scoped_ptr<T> & t, 
+        const unsigned int /* version */
+    ){
+        T* r = t.get();
+        ar << boost::serialization::make_nvp("scoped_ptr", r);
+    }
+
+    template<class Archive, class T>
+    void load(
+        Archive & ar, 
+        boost::scoped_ptr<T> & t, 
+        const unsigned int /* version */
+    ){
+        T* r;
+        ar >> boost::serialization::make_nvp("scoped_ptr", r);
+        t.reset(r); 
+    }
+
+    template<class Archive, class T>
+    void serialize(
+        Archive& ar, 
+        boost::scoped_ptr<T>& t, 
+        const unsigned int version
+    ){
+        boost::serialization::split_free(ar, t, version);
+    }
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_SCOPED_PTR_HPP_VP_2003_10_30
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/serialization.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/serialization.hpp
new file mode 100644 (file)
index 0000000..0d8ecef
--- /dev/null
@@ -0,0 +1,172 @@
+#ifndef BOOST_SERIALIZATION_SERIALIZATION_HPP
+#define BOOST_SERIALIZATION_SERIALIZATION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1310)
+#  pragma warning (disable : 4675) // suppress ADL warning
+#endif
+
+#include <boost/config.hpp>
+#include <boost/serialization/strong_typedef.hpp>
+#include <boost/serialization/pfto.hpp>
+#include <boost/serialization/throw_exception.hpp>
+#include <boost/serialization/nvp.hpp>
+
+// incremented for each "release"
+#define BOOST_SERIALIZATION_LIBRARY_VERSION 19
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization.hpp: interface for serialization system.
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+//////////////////////////////////////////////////////////////////////
+// public interface to serialization. 
+
+/////////////////////////////////////////////////////////////////////////////
+// layer 0 - intrusive verison
+// declared and implemented for each user defined class to be serialized
+//
+//  template<Archive>
+//  serialize(Archive &ar, const unsigned int file_version){
+//      ar & base_object<base>(*this) & member1 & member2 ... ;
+//  }
+
+/////////////////////////////////////////////////////////////////////////////
+// layer 1 - layer that routes member access through the access class.
+// this is what permits us to grant access to private class member functions
+// by specifying friend class boost::serialization::access
+
+#include <boost/serialization/access.hpp>
+
+/////////////////////////////////////////////////////////////////////////////
+// layer 2 - default implementation of non-intrusive serialization.
+//
+// note the usage of function overloading to compensate that C++ does not
+// currently support Partial Template Specialization for function templates 
+// We have declared the version number as "const unsigned long".  
+// Overriding templates for specific data types should declare the version
+// number as "const unsigned int". Template matching will first be applied
+// to functions with the same version types - that is the overloads.  
+// If there is no declared function prototype that matches, the second argument
+// will be converted to "const unsigned long" and a match will be made with 
+// one of the default template functions below.
+
+namespace boost {
+namespace serialization {
+
+BOOST_STRONG_TYPEDEF(unsigned int, version_type)
+
+// default implementation - call the member function "serialize"
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar, T & t, const BOOST_PFTO unsigned int file_version
+){
+    access::serialize(ar, t, static_cast<unsigned int>(file_version));
+}
+
+// save data required for construction
+template<class Archive, class T>
+inline void save_construct_data(
+    Archive & /*ar*/, 
+    const T * /*t*/, 
+    const BOOST_PFTO unsigned int /*file_version */
+){
+    // default is to save no data because default constructor
+    // requires no arguments.
+}
+
+// load data required for construction and invoke constructor in place
+template<class Archive, class T>
+inline void load_construct_data(
+    Archive & /*ar*/, 
+    T * t, 
+    const BOOST_PFTO unsigned int /*file_version*/
+){
+    // default just uses the default constructor.  going
+    // through access permits usage of otherwise private default
+    // constructor
+    access::construct(t);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// layer 3 - move call into serialization namespace so that ADL will function
+// in the manner we desire.
+//
+// on compilers which don't implement ADL. only the current namespace
+// i.e. boost::serialization will be searched.
+// 
+// on compilers which DO implement ADL
+// serialize overrides can be in any of the following
+// 
+// 1) same namepace as Archive
+// 2) same namespace as T
+// 3) boost::serialization
+//
+// Due to Martin Ecker
+
+template<class Archive, class T>
+inline void serialize_adl(
+    Archive & ar, 
+    T & t, 
+    const unsigned int file_version
+){
+    // note usage of function overloading to delay final resolution
+    // until the point of instantiation.  This works around the two-phase
+    // lookup "feature" which inhibits redefintion of a default function
+    // template implementation. Due to Robert Ramey
+    //
+    // Note that this trick generates problems for compiles which don't support
+    // PFTO, suppress it here.  As far as we know, there are no compilers
+    // which fail to support PFTO while supporting two-phase lookup.
+    #if ! defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+        const version_type v(file_version);
+        serialize(ar, t, v);
+    #else
+        serialize(ar, t, file_version);
+    #endif
+}
+
+template<class Archive, class T>
+inline void save_construct_data_adl(
+    Archive & ar, 
+    const T * t, 
+    const unsigned int file_version
+){
+    // see above
+    #if ! defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+        const version_type v(file_version);
+        save_construct_data(ar, t, v);
+    #else
+        save_construct_data(ar, t, file_version);
+    #endif
+}
+
+template<class Archive, class T>
+inline void load_construct_data_adl(
+    Archive & ar, 
+    T * t, 
+    const unsigned int file_version
+){
+    // see above comment
+    #if ! defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
+        const version_type v(file_version);
+        load_construct_data(ar, t, v);
+    #else
+        load_construct_data(ar, t, file_version);
+    #endif
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_SERIALIZATION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/set.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/set.hpp
new file mode 100644 (file)
index 0000000..c67c27e
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef  BOOST_SERIALIZATION_SET_HPP
+#define BOOST_SERIALIZATION_SET_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// set.hpp: serialization for stl set templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <set>
+
+#include <boost/config.hpp>
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class Key, class Compare, class Allocator >
+inline void save(
+    Archive & ar,
+    const std::set<Key, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, std::set<Key, Compare, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class Key, class Compare, class Allocator >
+inline void load(
+    Archive & ar,
+    std::set<Key, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::set<Key, Compare, Allocator>,
+        boost::serialization::stl::archive_input_set<
+            Archive, std::set<Key, Compare, Allocator> 
+        >,
+        boost::serialization::stl::no_reserve_imp<std::set<
+            Key, Compare, Allocator> 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class Key, class Compare, class Allocator >
+inline void serialize(
+    Archive & ar,
+    std::set<Key, Compare, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+// multiset
+template<class Archive, class Key, class Compare, class Allocator >
+inline void save(
+    Archive & ar,
+    const std::multiset<Key, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::save_collection<
+        Archive, 
+        std::multiset<Key, Compare, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class Key, class Compare, class Allocator >
+inline void load(
+    Archive & ar,
+    std::multiset<Key, Compare, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::multiset<Key, Compare, Allocator>,
+        boost::serialization::stl::archive_input_multiset<
+            Archive, std::multiset<Key, Compare, Allocator> 
+        >,
+        boost::serialization::stl::no_reserve_imp<
+            std::multiset<Key, Compare, Allocator> 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class Key, class Compare, class Allocator >
+inline void serialize(
+    Archive & ar,
+    std::multiset<Key, Compare, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::set)
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::multiset)
+
+#endif // BOOST_SERIALIZATION_SET_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr.hpp
new file mode 100644 (file)
index 0000000..53c0384
--- /dev/null
@@ -0,0 +1,163 @@
+#ifndef BOOST_SERIALIZATION_SHARED_PTR_HPP
+#define BOOST_SERIALIZATION_SHARED_PTR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr.hpp: serialization for boost shared pointer
+
+// (C) Copyright 2004 Robert Ramey and Martin Ecker
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <map>
+#include <cstddef> // NULL
+
+#include <boost/config.hpp>
+#include <boost/mpl/integral_c.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/detail/workaround.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/version.hpp>
+#include <boost/serialization/tracking.hpp>
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr serialization traits
+// version 1 to distinguish from boost 1.32 version. Note: we can only do this
+// for a template when the compiler supports partial template specialization
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+    namespace boost {
+    namespace serialization{
+        template<class T>
+        struct version< ::boost::shared_ptr<T> > {
+            typedef mpl::integral_c_tag tag;
+            #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
+            typedef BOOST_DEDUCED_TYPENAME mpl::int_<1> type;
+            #else
+            typedef mpl::int_<1> type;
+            #endif
+            #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570))
+            BOOST_STATIC_CONSTANT(unsigned int, value = 1);
+            #else
+            BOOST_STATIC_CONSTANT(unsigned int, value = type::value);
+            #endif
+        };
+        // don't track shared pointers
+        template<class T>
+        struct tracking_level< ::boost::shared_ptr<T> > { 
+            typedef mpl::integral_c_tag tag;
+            #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
+            typedef BOOST_DEDUCED_TYPENAME mpl::int_< ::boost::serialization::track_never> type;
+            #else
+            typedef mpl::int_< ::boost::serialization::track_never> type;
+            #endif
+            #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570))
+            BOOST_STATIC_CONSTANT(int, value = ::boost::serialization::track_never);
+            #else
+            BOOST_STATIC_CONSTANT(int, value = type::value);
+            #endif
+        };
+    }}
+    #define BOOST_SERIALIZATION_SHARED_PTR(T)
+#else
+    // define macro to let users of these compilers do this
+    #define BOOST_SERIALIZATION_SHARED_PTR(T)                         \
+    BOOST_CLASS_VERSION(                                              \
+        ::boost::shared_ptr< T >,                                     \
+        1                                                             \
+    )                                                                 \
+    BOOST_CLASS_TRACKING(                                             \
+        ::boost::shared_ptr< T >,                                     \
+        ::boost::serialization::track_never                           \
+    )                                                                 \
+    /**/
+#endif
+
+namespace boost {
+namespace serialization{
+
+struct null_deleter {
+    void operator()(void const *) const {}
+};
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization for shared_ptr
+
+template<class Archive, class T>
+inline void save(
+    Archive & ar,
+    const boost::shared_ptr<T> &t,
+    const unsigned int /* file_version */
+){
+    // The most common cause of trapping here would be serializing
+    // something like shared_ptr<int>.  This occurs because int
+    // is never tracked by default.  Wrap int in a trackable type
+    BOOST_STATIC_ASSERT((tracking_level<T>::value != track_never));
+    const T * t_ptr = t.get();
+    ar << boost::serialization::make_nvp("px", t_ptr);
+}
+
+template<class Archive, class T>
+inline void load(
+    Archive & ar,
+    boost::shared_ptr<T> &t,
+    const unsigned int file_version
+){
+    // The most common cause of trapping here would be serializing
+    // something like shared_ptr<int>.  This occurs because int
+    // is never tracked by default.  Wrap int in a trackable type
+    BOOST_STATIC_ASSERT((tracking_level<T>::value != track_never));
+    T* r;
+    #ifdef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+    if(file_version < 1){
+        //ar.register_type(static_cast<
+        //    boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter<T> > *
+        //>(NULL));
+        ar.register_type(static_cast<
+            boost_132::detail::sp_counted_base_impl<T *, null_deleter > *
+        >(NULL));
+        boost_132::shared_ptr<T> sp;
+        ar >> boost::serialization::make_nvp("px", sp.px);
+        ar >> boost::serialization::make_nvp("pn", sp.pn);
+        // got to keep the sps around so the sp.pns don't disappear
+        ar.append(sp);
+        r = sp.get();
+    }
+    else    
+    #endif
+    {
+        ar >> boost::serialization::make_nvp("px", r);
+    }
+    ar.reset(t,r);
+}
+
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar,
+    boost::shared_ptr<T> &t,
+    const unsigned int file_version
+){
+    // correct shared_ptr serialization depends upon object tracking
+    // being used.
+    BOOST_STATIC_ASSERT(
+        boost::serialization::tracking_level<T>::value
+        != boost::serialization::track_never
+    );
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_SHARED_PTR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr_132.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/shared_ptr_132.hpp
new file mode 100644 (file)
index 0000000..f0c3113
--- /dev/null
@@ -0,0 +1,222 @@
+#ifndef BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+#define BOOST_SERIALIZATION_SHARED_PTR_132_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr.hpp: serialization for boost shared pointer
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// note: totally unadvised hack to gain access to private variables
+// in shared_ptr and shared_count. Unfortunately its the only way to
+// do this without changing shared_ptr and shared_count
+// the best we can do is to detect a conflict here
+#include <boost/config.hpp>
+
+#include <list>
+#include <cstddef> // NULL
+
+#include <boost/serialization/assume_abstract.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/tracking.hpp>
+#include <boost/serialization/void_cast.hpp>
+
+// mark base class as an (uncreatable) base class
+#include <boost/serialization/detail/shared_ptr_132.hpp>
+
+/////////////////////////////////////////////////////////////
+// Maintain a couple of lists of loaded shared pointers of the old previous
+// version (1.32)
+
+namespace boost_132 { 
+namespace serialization {
+namespace detail {
+
+struct null_deleter {
+    void operator()(void const *) const {}
+};
+
+} // namespace detail
+} // namespace serialization
+} // namespace boost_132
+
+/////////////////////////////////////////////////////////////
+// sp_counted_base_impl serialization
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class P, class D>
+inline void serialize(
+    Archive & /* ar */,
+    boost_132::detail::sp_counted_base_impl<P, D> & /* t */,
+    const unsigned int /*file_version*/
+){
+    // register the relationship between each derived class
+    // its polymorphic base
+    boost::serialization::void_cast_register<
+        boost_132::detail::sp_counted_base_impl<P, D>,
+        boost_132::detail::sp_counted_base 
+    >(
+        static_cast<boost_132::detail::sp_counted_base_impl<P, D> *>(NULL),
+        static_cast<boost_132::detail::sp_counted_base *>(NULL)
+    );
+}
+
+template<class Archive, class P, class D>
+inline void save_construct_data(
+    Archive & ar,
+    const 
+    boost_132::detail::sp_counted_base_impl<P, D> *t, 
+    const BOOST_PFTO unsigned int /* file_version */
+){
+    // variables used for construction
+    ar << boost::serialization::make_nvp("ptr", t->ptr);
+}
+
+template<class Archive, class P, class D>
+inline void load_construct_data(
+    Archive & ar,
+    boost_132::detail::sp_counted_base_impl<P, D> * t, 
+    const unsigned int /* file_version */
+){
+    P ptr_;
+    ar >> boost::serialization::make_nvp("ptr", ptr_);
+    // ::new(t)boost_132::detail::sp_counted_base_impl<P, D>(ptr_,  D()); 
+    // placement
+    // note: the original ::new... above is replaced by the one here.  This one
+    // creates all new objects with a null_deleter so that after the archive
+    // is finished loading and the shared_ptrs are destroyed - the underlying
+    // raw pointers are NOT deleted.  This is necessary as they are used by the 
+    // new system as well.
+    ::new(t)boost_132::detail::sp_counted_base_impl<
+        P, 
+        boost_132::serialization::detail::null_deleter
+    >(
+        ptr_,  boost_132::serialization::detail::null_deleter()
+    ); // placement new
+    // compensate for that fact that a new shared count always is 
+    // initialized with one. the add_ref_copy below will increment it
+    // every time its serialized so without this adjustment
+    // the use and weak counts will be off by one.
+    t->use_count_ = 0;
+}
+
+} // serialization
+} // namespace boost
+
+/////////////////////////////////////////////////////////////
+// shared_count serialization
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive>
+inline void save(
+    Archive & ar,
+    const boost_132::detail::shared_count &t,
+    const unsigned int /* file_version */
+){
+    ar << boost::serialization::make_nvp("pi", t.pi_);
+}
+
+template<class Archive>
+inline void load(
+    Archive & ar,
+    boost_132::detail::shared_count &t,
+    const unsigned int /* file_version */
+){
+    ar >> boost::serialization::make_nvp("pi", t.pi_);
+    if(NULL != t.pi_)
+        t.pi_->add_ref_copy();
+}
+
+} // serialization
+} // namespace boost
+
+BOOST_SERIALIZATION_SPLIT_FREE(boost_132::detail::shared_count)
+
+/////////////////////////////////////////////////////////////
+// implement serialization for shared_ptr<T>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class T>
+inline void save(
+    Archive & ar,
+    const boost_132::shared_ptr<T> &t,
+    const unsigned int /* file_version */
+){
+    // only the raw pointer has to be saved
+    // the ref count is maintained automatically as shared pointers are loaded
+    ar.register_type(static_cast<
+        boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter<T> > *
+    >(NULL));
+    ar << boost::serialization::make_nvp("px", t.px);
+    ar << boost::serialization::make_nvp("pn", t.pn);
+}
+
+template<class Archive, class T>
+inline void load(
+    Archive & ar,
+    boost_132::shared_ptr<T> &t,
+    const unsigned int /* file_version */
+){
+    // only the raw pointer has to be saved
+    // the ref count is maintained automatically as shared pointers are loaded
+    ar.register_type(static_cast<
+        boost_132::detail::sp_counted_base_impl<T *, boost::checked_deleter<T> > *
+    >(NULL));
+    ar >> boost::serialization::make_nvp("px", t.px);
+    ar >> boost::serialization::make_nvp("pn", t.pn);
+}
+
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar,
+    boost_132::shared_ptr<T> &t,
+    const unsigned int file_version
+){
+    // correct shared_ptr serialization depends upon object tracking
+    // being used.
+    BOOST_STATIC_ASSERT(
+        boost::serialization::tracking_level<T>::value
+        != boost::serialization::track_never
+    );
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+// note: change below uses null_deleter 
+// This macro is used to export GUIDS for shared pointers to allow
+// the serialization system to export them properly. David Tonge
+#define BOOST_SHARED_POINTER_EXPORT_GUID(T, K)                     \
+    typedef boost_132::detail::sp_counted_base_impl<               \
+        T *,                                                       \
+        boost::checked_deleter< T >                                \
+    > __shared_ptr_ ## T;                                          \
+    BOOST_CLASS_EXPORT_GUID(__shared_ptr_ ## T, "__shared_ptr_" K) \
+    BOOST_CLASS_EXPORT_GUID(T, K)                                  \
+    /**/
+
+#define BOOST_SHARED_POINTER_EXPORT(T)                             \
+    BOOST_SHARED_POINTER_EXPORT_GUID(                              \
+        T,                                                         \
+        BOOST_PP_STRINGIZE(T)                                      \
+    )                                                              \
+    /**/
+
+#endif // BOOST_SERIALIZATION_SHARED_PTR_132_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/singleton.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/singleton.hpp
new file mode 100644 (file)
index 0000000..cca3b3e
--- /dev/null
@@ -0,0 +1,147 @@
+#ifndef BOOST_SERIALIZATION_SINGLETON_HPP
+#define BOOST_SERIALIZATION_SINGLETON_HPP
+
+/////////1/////////2///////// 3/////////4/////////5/////////6/////////7/////////8
+//  singleton.hpp
+//
+// Copyright David Abrahams 2006. Original version
+//
+// Copyright Robert Ramey 2007.  Changes made to permit
+// application throughout the serialization library.
+//
+// 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)
+//
+// The intention here is to define a template which will convert
+// any class into a singleton with the following features:
+//
+// a) initialized before first use.
+// b) thread-safe for const access to the class
+// c) non-locking
+//
+// In order to do this,
+// a) Initialize dynamically when used.
+// b) Require that all singletons be initialized before main
+// is called or any entry point into the shared library is invoked.
+// This guarentees no race condition for initialization.
+// In debug mode, we assert that no non-const functions are called
+// after main is invoked.
+//
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif 
+
+#include <cassert>
+#include <boost/noncopyable.hpp>
+#include <boost/serialization/force_include.hpp>
+
+namespace boost { 
+namespace serialization { 
+
+//////////////////////////////////////////////////////////////////////
+// Provides a dynamically-initialized (singleton) instance of T in a
+// way that avoids LNK1179 on vc6.  See http://tinyurl.com/ljdp8 or
+// http://lists.boost.org/Archives/boost/2006/05/105286.php for
+// details.
+//
+
+// singletons created by this code are guarenteed to be unique
+// within the executable or shared library which creates them.
+// This is sufficient and in fact ideal for the serialization library.
+// The singleton is created when the module is loaded and destroyed
+// when the module is unloaded.
+
+// This base class has two functions.
+
+// First it provides a module handle for each singleton indicating
+// the executable or shared library in which it was created. This
+// turns out to be necessary and sufficient to implement the tables
+// used by serialization library.
+
+// Second, it provides a mechanism to detect when a non-const function
+// is called after initialization.
+
+// make a singleton to lock/unlock all singletons for alteration.
+// The intent is that all singletons created/used by this code
+// are to be initialized before main is called. A test program
+// can lock all the singletons when main is entereed.  This any
+// attempt to retieve a mutable instances while locked will
+// generate a assertion if compiled for debug.
+
+class singleton_module  : public boost::noncopyable
+{
+private:
+    static bool & get_lock(){
+        static bool lock = false;
+        return lock;
+    }
+public:
+//    static const void * get_module_handle(){
+//        return static_cast<const void *>(get_module_handle);
+//    }
+    static void lock(){
+        get_lock() = true;
+    }
+    static void unlock(){
+        get_lock() = false;
+    }
+    static bool is_locked() {
+        return get_lock();
+    }
+};
+
+namespace detail {
+
+template<class T>
+class singleton_wrapper : public T
+{
+public:
+    static bool m_is_destroyed;
+    ~singleton_wrapper(){
+        m_is_destroyed = true;
+    }
+};
+
+template<class T>
+bool detail::singleton_wrapper<T>::m_is_destroyed = false;
+
+} // detail
+
+template <class T>
+class singleton : public singleton_module
+{
+private:
+    BOOST_DLLEXPORT static T & instance;
+    // include this to provoke instantiation at pre-execution time
+    static void use(T const &) {}
+    BOOST_DLLEXPORT static T & get_instance() {
+        static detail::singleton_wrapper<T> t;
+        // refer to instance, causing it to be instantiated (and
+        // initialized at startup on working compilers)
+        assert(! detail::singleton_wrapper<T>::m_is_destroyed);
+        use(instance);
+        return static_cast<T &>(t);
+    }
+public:
+    BOOST_DLLEXPORT static T & get_mutable_instance(){
+        assert(! is_locked());
+        return get_instance();
+    }
+    BOOST_DLLEXPORT static const T & get_const_instance(){
+        return get_instance();
+    }
+    BOOST_DLLEXPORT static bool is_destroyed(){
+        return detail::singleton_wrapper<T>::m_is_destroyed;
+    }
+};
+
+template<class T>
+BOOST_DLLEXPORT T & singleton<T>::instance = singleton<T>::get_instance();
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_SINGLETON_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/slist.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/slist.hpp
new file mode 100644 (file)
index 0000000..0a03acf
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef BOOST_SERIALIZATION_SLIST_HPP
+#define BOOST_SERIALIZATION_SLIST_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// slist.hpp
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // size_t
+#include <boost/config.hpp> // msvc 6.0 needs this for warning suppression
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{ 
+    using ::size_t; 
+} // namespace std
+#endif
+
+#ifdef BOOST_HAS_SLIST
+#include BOOST_SLIST_HEADER
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/nvp.hpp>
+
+namespace boost { 
+namespace serialization {
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_collection<
+        Archive,
+        BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,
+    const unsigned int file_version
+){
+    // retrieve number of elements
+    t.clear();
+    // retrieve number of elements
+    collection_size_type count;
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    if(std::size_t(0) == count)
+        return;
+    unsigned int v;
+    if(3 < ar.get_library_version()){
+        ar >> boost::serialization::make_nvp("item_version", v);
+    }
+    boost::serialization::detail::stack_construct<Archive, U> u(ar, v);
+    ar >> boost::serialization::make_nvp("item", u.reference());
+    t.push_front(u.reference());
+    BOOST_DEDUCED_TYPENAME BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator>::iterator last;
+    last = t.begin();
+    std::size_t c = count;
+    while(--c > 0){
+        boost::serialization::detail::stack_construct<Archive, U> 
+            u(ar, file_version);
+        ar >> boost::serialization::make_nvp("item", u.reference());
+        last = t.insert_after(last, u.reference());
+        ar.reset_object_address(& (*last), & u.reference());
+    }
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    BOOST_STD_EXTENSION_NAMESPACE::slist<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(BOOST_STD_EXTENSION_NAMESPACE::slist)
+
+#endif  // BOOST_HAS_SLIST
+#endif  // BOOST_SERIALIZATION_SLIST_HPP
similarity index 97%
rename from deal.II/contrib/boost/include/boost/smart_cast.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/serialization/smart_cast.hpp
index 9313ab4a7eb4a0cdeb2fcfa9fc89cb9cabf014f2..89a79c4068b6e42dfa1808275ecdea3e2b9acef1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_SMART_CAST_HPP
-#define BOOST_SMART_CAST_HPP
+#ifndef BOOST_SERIALIZATION_SMART_CAST_HPP
+#define BOOST_SERIALIZATION_SMART_CAST_HPP
 
 // MS compatible compilers support #pragma once
 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
@@ -36,6 +36,7 @@
 
 #include <exception>
 #include <typeinfo>
+#include <cstddef> // NULL
 
 #include <boost/config.hpp>
 #include <boost/static_assert.hpp>
@@ -56,6 +57,7 @@
 #include <boost/mpl/identity.hpp>
 
 namespace boost {
+namespace serialization {
 namespace smart_cast_impl {
 
     template<class T>
@@ -293,6 +295,7 @@ T smart_cast_reference(U & u) {
     return smart_cast_impl::reference<T>::cast(u);
 }
 
+} // namespace serialization
 } // namespace boost
 
-#endif // BOOST_SMART_CAST_HPP
+#endif // BOOST_SERIALIZATION_SMART_CAST_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/split_free.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/split_free.hpp
new file mode 100644 (file)
index 0000000..9dbcd2f
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef BOOST_SERIALIZATION_SPLIT_FREE_HPP
+#define BOOST_SERIALIZATION_SPLIT_FREE_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// split_free.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/serialization/serialization.hpp>
+
+namespace boost {
+namespace archive {
+    namespace detail {
+        template<class Archive> class interface_oarchive;
+        template<class Archive> class interface_iarchive;
+    } // namespace detail
+} // namespace archive
+
+namespace serialization {
+
+//namespace detail {
+template<class Archive, class T>
+struct free_saver {
+    static void invoke(
+        Archive & ar, 
+        const  T & t, 
+        const unsigned int file_version
+    ){
+        // use function overload (version_type) to workaround
+        // two-phase lookup issue
+        const version_type v(file_version);
+        save(ar, t, v);
+    }
+};
+template<class Archive, class T>
+struct free_loader {
+    static void invoke(
+        Archive & ar, 
+        T & t, 
+        const unsigned int file_version
+    ){
+        // use function overload (version_type) to workaround
+        // two-phase lookup issue
+        const version_type v(file_version);
+        load(ar, t, v);
+    }
+};
+//} // namespace detail
+
+template<class Archive, class T>
+inline void split_free(
+    Archive & ar, 
+    T & t, 
+    const unsigned int file_version
+){
+    typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+        BOOST_DEDUCED_TYPENAME Archive::is_saving,
+        mpl::identity</* detail:: */ free_saver<Archive, T> >, 
+        mpl::identity</* detail:: */ free_loader<Archive, T> >
+    >::type typex;
+    typex::invoke(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#define BOOST_SERIALIZATION_SPLIT_FREE(T)       \
+namespace boost { namespace serialization {     \
+template<class Archive>                         \
+inline void serialize(                          \
+        Archive & ar,                               \
+        T & t,                                      \
+        const unsigned int file_version             \
+){                                              \
+        split_free(ar, t, file_version);            \
+}                                               \
+}}
+/**/
+
+#endif // BOOST_SERIALIZATION_SPLIT_FREE_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/split_member.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/split_member.hpp
new file mode 100644 (file)
index 0000000..6987945
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef BOOST_SERIALIZATION_SPLIT_MEMBER_HPP
+#define BOOST_SERIALIZATION_SPLIT_MEMBER_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// split_member.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+
+#include <boost/serialization/access.hpp>
+
+namespace boost {
+namespace archive {
+    namespace detail {
+        template<class Archive> class interface_oarchive;
+        template<class Archive> class interface_iarchive;
+    } // namespace detail
+} // namespace archive
+
+namespace serialization {
+namespace detail {
+
+    template<class Archive, class T>
+    struct member_saver {
+        static void invoke(
+            Archive & ar, 
+            const T & t,
+            const unsigned int file_version
+        ){
+            access::member_save(ar, t, file_version);
+        }
+    };
+
+    template<class Archive, class T>
+    struct member_loader {
+        static void invoke(
+            Archive & ar, 
+            T & t,
+            const unsigned int file_version
+        ){
+            access::member_load(ar, t, file_version);
+        }
+    };
+
+} // detail
+
+template<class Archive, class T>
+inline void split_member(
+    Archive & ar, T & t, const unsigned int file_version
+){
+    typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<
+        BOOST_DEDUCED_TYPENAME Archive::is_saving,
+        mpl::identity<detail::member_saver<Archive, T> >, 
+        mpl::identity<detail::member_loader<Archive, T> >
+    >::type typex;
+    typex::invoke(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+// split member function serialize funcition into save/load
+#define BOOST_SERIALIZATION_SPLIT_MEMBER()                       \
+template<class Archive>                                          \
+void serialize(                                                  \
+    Archive &ar,                                                 \
+    const unsigned int file_version                              \
+){                                                               \
+    boost::serialization::split_member(ar, *this, file_version); \
+}                                                                \
+/**/
+
+#endif // BOOST_SERIALIZATION_SPLIT_MEMBER_HPP
similarity index 93%
rename from deal.II/contrib/boost/include/boost/state_saver.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/serialization/state_saver.hpp
index 3fb0f194b1f3cf5b7a37469e39846ba47aa33a13..76bb4d6a50eaa312646fb72212f0b12e2c8cf5aa 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_STATE_SAVER_HPP
-#define BOOST_STATE_SAVER_HPP
+#ifndef BOOST_SERIALIZATION_STATE_SAVER_HPP
+#define BOOST_SERIALIZATION_STATE_SAVER_HPP
 
 // MS compatible compilers support #pragma once
 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
@@ -36,6 +36,7 @@
 #include <boost/mpl/identity.hpp>
 
 namespace boost {
+namespace serialization {
 
 template<class T>
 // T requirements:
@@ -89,6 +90,7 @@ public:
 
 }; // state_saver<>
 
+} // serialization
 } // boost
 
-#endif //BOOST_STATE_SAVER_HPP
+#endif //BOOST_SERIALIZATION_STATE_SAVER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/static_warning.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/static_warning.hpp
new file mode 100644 (file)
index 0000000..280598e
--- /dev/null
@@ -0,0 +1,108 @@
+#ifndef BOOST_SERIALIZATION_STATIC_WARNING_HPP
+#define BOOST_SERIALIZATION_STATIC_WARNING_HPP
+
+//  (C) Copyright Robert Ramey 2003. Jonathan Turkanis 2004.
+// Use, modification and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+// http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/static_assert for documentation.
+
+/*
+ Revision history:
+   15 June  2003 - Initial version.
+   31 March 2004 - improved diagnostic messages and portability 
+                   (Jonathan Turkanis)
+   03 April 2004 - works on VC6 at class and namespace scope
+                 - ported to DigitalMars
+                 - static warnings disabled by default; when enabled,
+                   uses pragmas to enable required compiler warnings
+                   on MSVC, Intel, Metrowerks and Borland 5.x.
+                   (Jonathan Turkanis)
+   30 May 2004   - tweaked for msvc 7.1 and gcc 3.3
+                 - static warnings ENabled by default; when enabled,
+                   (Robert Ramey)
+*/
+
+#include <boost/config.hpp>
+
+//
+// Implementation
+// Makes use of the following warnings:
+//  1. GCC prior to 3.3: division by zero.
+//  2. BCC 6.0 preview: unreferenced local variable.
+//  3. DigitalMars: returning address of local automatic variable.
+//  4. VC6: class previously seen as struct (as in 'boost/mpl/print.hpp')
+//  5. All others: deletion of pointer to incomplete type.
+//
+// The trick is to find code which produces warnings containing the name of
+// a structure or variable. Details, with same numbering as above:
+// 1. static_warning_impl<B>::value is zero iff B is false, so diving an int
+//    by this value generates a warning iff B is false.
+// 2. static_warning_impl<B>::type has a constructor iff B is true, so an
+//    unreferenced variable of this type generates a warning iff B is false.
+// 3. static_warning_impl<B>::type overloads operator& to return a dynamically
+//    allocated int pointer only is B is true, so  returning the address of an
+//    automatic variable of this type generates a warning iff B is fasle.
+// 4. static_warning_impl<B>::STATIC_WARNING is decalred as a struct iff B is 
+//    false. 
+// 5. static_warning_impl<B>::type is incomplete iff B is false, so deleting a
+//    pointer to this type generates a warning iff B is false.
+//
+
+//------------------Enable selected warnings----------------------------------//
+
+// Enable the warnings relied on by BOOST_STATIC_WARNING, where possible. The 
+// only pragma which is absolutely necessary here is for Borland 5.x, since 
+// W8073 is disabled by default. If enabling selected warnings is considered 
+// unacceptable, this section can be replaced with:
+//   #if defined(__BORLANDC__) && (__BORLANDC__ <= 0x600)
+//    pragma warn +st
+//   #endif
+
+// 6. replaced implementation with one which depends solely on
+//    mpl::print<>.  The previous one was found to fail for functions
+//    under recent versions of gcc and intel compilers - Robert Ramey
+
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/print.hpp>
+#include <boost/mpl/eval_if.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<int L> 
+struct STATIC_WARNING_LINE{};
+
+template<bool B, int L>
+struct static_warning_test{
+    typename boost::mpl::eval_if_c<
+        B,
+        boost::mpl::true_,
+        typename boost::mpl::identity<
+            boost::mpl::print<
+                STATIC_WARNING_LINE<L>
+            >
+        >
+    >::type type;
+};
+
+template<int i>
+struct SS {};
+
+} // serialization
+} // boost
+
+#define BSW(B, L) \
+    typedef boost::serialization::SS< \
+        sizeof( boost::serialization::static_warning_test< B, L > ) \
+    > BOOST_JOIN(STATIC_WARNING_LINE, L);
+
+#define BOOST_STATIC_WARNING(B) BSW(B, __LINE__)
+
+#endif // BOOST_SERIALIZATION_STATIC_WARNING_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/string.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/string.hpp
new file mode 100644 (file)
index 0000000..36d1594
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef  BOOST_SERIALIZATION_STRING_HPP
+#define BOOST_SERIALIZATION_STRING_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/string.hpp:
+// serialization for stl string templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <string>
+
+#include <boost/config.hpp>
+#include <boost/serialization/level.hpp>
+
+BOOST_CLASS_IMPLEMENTATION(std::string, boost::serialization::primitive_type)
+#ifndef BOOST_NO_STD_WSTRING
+BOOST_CLASS_IMPLEMENTATION(std::wstring, boost::serialization::primitive_type)
+#endif
+
+// left over from a previous incarnation - strings are now always primitive types
+#if 0 
+#include <string>
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+
+namespace boost { 
+namespace serialization {
+
+// basic_string - general case
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::basic_string<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::save_collection<
+        Archive, std::basic_string<U, Allocator> 
+    >(ar, t);
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::basic_string<U, Allocator> &t,
+    const unsigned int file_version
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::basic_string<U, Allocator>,
+        boost::serialization::stl::archive_input_seq<
+            Archive, 
+            std::basic_string<U, Allocator> 
+        >,
+        boost::serialization::stl::reserve_imp<
+            std::basic_string<U, Allocator> 
+        >
+    >(ar, t);
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::basic_string<U, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::vector)
+
+#endif
+
+#endif // BOOST_SERIALIZATION_STRING_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/strong_typedef.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/strong_typedef.hpp
new file mode 100644 (file)
index 0000000..647c302
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP
+#define BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// strong_typedef.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org/libs/serialization for updates, documentation, and revision history.
+
+// macro used to implement a strong typedef.  strong typedef
+// guarentees that two types are distinguised even though the
+// share the same underlying implementation.  typedef does not create
+// a new type.  BOOST_STRONG_TYPEDEF(T, D) creates a new type named D
+// that operates as a type T.
+
+#include <boost/config.hpp>
+#include <boost/operators.hpp>
+
+#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x590
+    #define BOOST_STRONG_TYPEDEF(T, D)                              \
+    struct D                                                        \
+        : boost::totally_ordered1< D                                \
+        , boost::totally_ordered2< D, T                             \
+        > >                                                         \
+    {                                                               \
+        T t;                                                        \
+        explicit D(const T t_) : t(t_) {};                          \
+        D(){};                                                      \
+        D(const D & t_) : t(t_.t){}                                 \
+        D & operator=(const D & rhs) { t = rhs.t; return *this;}    \
+        D & operator=(const T & rhs) { t = rhs; return *this;}      \
+        operator const T & () const {return t; }                    \
+        operator T & () { return t; }                               \
+        bool operator==(const D & rhs) const { return t == rhs.t; } \
+        bool operator<(const D & rhs) const { return t < rhs.t; }   \
+    };
+#else
+    #define BOOST_STRONG_TYPEDEF(T, D)                              \
+    struct D                                                        \
+        : boost::totally_ordered1< D                                \
+        , boost::totally_ordered2< D, T                             \
+        > >                                                         \
+    {                                                               \
+        T t;                                                        \
+        explicit D(const T t_) : t(t_) {};                          \
+        D(){};                                                      \
+        D(const D & t_) : t(t_.t){}                                 \
+        D & operator=(const D & rhs) { t = rhs.t; return *this;}    \
+        D & operator=(const T & rhs) { t = rhs; return *this;}      \
+        /*operator const T & () const {return t; }*/                \
+        operator T & () { return t; }                               \
+        bool operator==(const D & rhs) const { return t == rhs.t; } \
+        bool operator<(const D & rhs) const { return t < rhs.t; }   \
+    };
+#endif // !defined(__BORLANDC) || __BORLANDC__ >= 0x590
+
+#endif // BOOST_SERIALIZATION_STRONG_TYPEDEF_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/throw_exception.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/throw_exception.hpp
new file mode 100644 (file)
index 0000000..dad0efe
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED
+#define BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//  boost/throw_exception.hpp
+//
+//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
+//
+// 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>
+
+#ifndef BOOST_NO_EXCEPTIONS
+#include <exception>
+#endif
+
+namespace boost {
+namespace serialization {
+
+#ifdef BOOST_NO_EXCEPTIONS
+
+void inline throw_exception(std::exception const & e) {
+    ::boost::throw_exception(e);
+}
+
+#else
+
+template<class E> inline void throw_exception(E const & e){
+    throw e;
+}
+
+#endif
+
+} // namespace serialization
+} // namespace boost
+
+#endif // #ifndef BOOST_SERIALIZATION_THROW_EXCEPTION_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking.hpp
new file mode 100644 (file)
index 0000000..5ed2910
--- /dev/null
@@ -0,0 +1,118 @@
+#ifndef BOOST_SERIALIZATION_TRACKING_HPP
+#define BOOST_SERIALIZATION_TRACKING_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// tracking.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/greater.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/serialization/level.hpp>
+#include <boost/serialization/tracking_enum.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+
+namespace boost {
+namespace serialization {
+
+struct basic_traits;
+
+// default tracking level
+template<class T>
+struct tracking_level_impl {
+    template<class U>
+    struct traits_class_tracking {
+        typedef BOOST_DEDUCED_TYPENAME U::tracking type;
+    };
+    typedef mpl::integral_c_tag tag;
+    // note: at least one compiler complained w/o the full qualification
+    // on basic traits below
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_base_and_derived<boost::serialization::basic_traits, T>,
+            traits_class_tracking<T>,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_pointer<T>,
+            // pointers are not tracked by default
+            mpl::int_<track_never>,
+        //else
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            // for primitives
+            BOOST_DEDUCED_TYPENAME mpl::equal_to<
+                implementation_level<T>,
+                mpl::int_<primitive_type> 
+            >,
+            // is never
+            mpl::int_<track_never>,
+            // otherwise its selective
+            mpl::int_<track_selectively>
+    >  > >::type type;
+    BOOST_STATIC_CONSTANT(int, value = type::value);
+};
+
+template<class T>
+struct tracking_level : 
+    public tracking_level_impl<const T>
+{
+};
+
+template<class T, enum tracking_type L>
+inline bool operator>=(tracking_level<T> t, enum tracking_type l)
+{
+    return t.value >= (int)l;
+}
+
+} // namespace serialization
+} // namespace boost
+
+
+// The STATIC_ASSERT is prevents one from setting tracking for a primitive type.  
+// This almost HAS to be an error.  Doing this will effect serialization of all 
+// char's in your program which is almost certainly what you don't want to do.  
+// If you want to track all instances of a given primitive type, You'll have to 
+// wrap it in your own type so its not a primitive anymore.  Then it will compile
+// without problem.
+#define BOOST_CLASS_TRACKING(T, E)           \
+namespace boost {                            \
+namespace serialization {                    \
+template<>                                   \
+struct tracking_level< T >                   \
+{                                            \
+    typedef mpl::integral_c_tag tag;         \
+    typedef mpl::int_< E> type;              \
+    BOOST_STATIC_CONSTANT(                   \
+        int,                                 \
+        value = tracking_level::type::value  \
+    );                                       \
+    /* tracking for a class  */              \
+    BOOST_STATIC_ASSERT((                    \
+        mpl::greater<                        \
+            /* that is a prmitive */         \
+            implementation_level< T >,       \
+            mpl::int_<primitive_type>        \
+        >::value                             \
+    ));                                      \
+};                                           \
+}}
+
+#endif // BOOST_SERIALIZATION_TRACKING_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking_enum.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/tracking_enum.hpp
new file mode 100644 (file)
index 0000000..e4e4e21
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef BOOST_SERIALIZATION_TRACKING_ENUM_HPP
+#define BOOST_SERIALIZATION_TRACKING_ENUM_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// tracking_enum.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+namespace boost {
+namespace serialization {
+
+// addresses of serialized objects may be tracked to avoid saving/loading
+// redundant copies.  This header defines a class trait that can be used
+// to specify when objects should be tracked
+
+// names for each tracking level
+enum tracking_type
+{
+    // never track this type
+    track_never = 0,
+    // track objects of this type if the object is serialized through a 
+    // pointer.
+    track_selectively = 1,
+    // always track this type
+    track_always = 2
+};
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_TRACKING_ENUM_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/traits.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/traits.hpp
new file mode 100644 (file)
index 0000000..da80009
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef BOOST_SERIALIZATION_TRAITS_HPP
+#define BOOST_SERIALIZATION_TRAITS_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// traits.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+// This header is used to apply serialization traits to templates.  The
+// standard system can't be used for platforms which don't support
+// Partial Templlate Specialization.  
+
+// The motivation for this is the Name-Value Pair (NVP) template.
+// it has to work the same on all platforms in order for archives
+// to be portable accross platforms.
+
+#include <boost/config.hpp>
+#include <boost/static_assert.hpp>
+
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/serialization/level_enum.hpp>
+#include <boost/serialization/tracking_enum.hpp>
+
+namespace boost {
+namespace serialization {
+
+// common base class used to detect appended traits class
+struct basic_traits {};
+
+template <class T>
+struct extended_type_info_impl;
+
+template<
+    class T, 
+    int Level, 
+    int Tracking,
+    unsigned int Version = 0,
+    class ETII = extended_type_info_impl< T >,
+    class Wrapper = mpl::false_
+>
+struct traits : public basic_traits {
+    BOOST_STATIC_ASSERT(Version == 0 || Level >= object_class_info);
+    BOOST_STATIC_ASSERT(Tracking == track_never || Level >= object_serializable);
+    typedef BOOST_DEDUCED_TYPENAME mpl::int_<Level> level;
+    typedef BOOST_DEDUCED_TYPENAME mpl::int_<Tracking> tracking;
+    typedef BOOST_DEDUCED_TYPENAME mpl::int_<Version> version;
+    typedef ETII type_info_implementation;
+    typedef Wrapper is_wrapper;
+};
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_TRAITS_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/type_info_implementation.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/type_info_implementation.hpp
new file mode 100644 (file)
index 0000000..0dbdcd5
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP
+#define BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// type_info_implementation.hpp: interface for portable version of type_info
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/serialization/traits.hpp>
+
+namespace boost {
+namespace serialization {
+
+// note that T and const T are folded into const T so that
+// there is only one table entry per type
+template<class T>
+struct type_info_implementation {
+    template<class U>
+    struct traits_class_typeinfo_implementation {
+      typedef BOOST_DEDUCED_TYPENAME U::type_info_implementation::type type;
+    };
+    // note: at least one compiler complained w/o the full qualification
+    // on basic traits below
+    typedef 
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_base_and_derived<boost::serialization::basic_traits, T>,
+            traits_class_typeinfo_implementation<T>,
+        //else
+            mpl::identity<
+                BOOST_DEDUCED_TYPENAME extended_type_info_impl<T>::type
+            >
+        >::type type;
+};
+
+} // namespace serialization
+} // namespace boost
+
+// define a macro to assign a particular derivation of extended_type_info
+// to a specified a class. 
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x560))
+#define BOOST_CLASS_TYPE_INFO(T, ETI)              \
+namespace boost {                                  \
+namespace serialization {                          \
+template<>                                         \
+struct type_info_implementation< T > {             \
+    typedef const ETI type;                        \
+};                                                 \
+}                                                  \
+}                                                  \
+/**/
+#else
+#define BOOST_CLASS_TYPE_INFO(T, ETI)              \
+namespace boost {                                  \
+namespace serialization {                          \
+template<>                                         \
+struct type_info_implementation< T > {             \
+    typedef ETI type;                              \
+};                                                 \
+template<>                                         \
+struct type_info_implementation< const T > {       \
+    typedef ETI type;                              \
+};                                                 \
+}                                                  \
+}                                                  \
+/**/
+#endif
+
+#endif /// BOOST_SERIALIZATION_TYPE_INFO_IMPLEMENTATION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/utility.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/utility.hpp
new file mode 100644 (file)
index 0000000..f36b50f
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef  BOOST_SERIALIZATION_UTILITY_HPP
+#define BOOST_SERIALIZATION_UTILITY_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// serialization/utility.hpp:
+// serialization for stl utility templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <utility>
+#include <boost/config.hpp>
+
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/serialization/nvp.hpp>
+#include <boost/serialization/is_bitwise_serializable.hpp>
+#include <boost/mpl/and.hpp>
+
+namespace boost { 
+namespace serialization {
+
+// pair
+template<class Archive, class F, class S>
+inline void serialize(
+    Archive & ar,
+    std::pair<F, S> & p,
+    const unsigned int /* file_version */
+){
+    // note: we remove any const-ness on the first argument.  The reason is that 
+    // for stl maps, the type saved is pair<const key, T).  We remove
+    // the const-ness in order to be able to load it.
+    typedef BOOST_DEDUCED_TYPENAME boost::remove_const<F>::type typef;
+    ar & boost::serialization::make_nvp("first", const_cast<typef &>(p.first));
+    ar & boost::serialization::make_nvp("second", p.second);
+}
+
+/// specialization of is_bitwise_serializable for pairs
+template <class T, class U>
+struct is_bitwise_serializable<std::pair<T,U> >
+ : public mpl::and_<is_bitwise_serializable<T>,is_bitwise_serializable<U> >
+{
+};
+
+} // serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_UTILITY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/valarray.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/valarray.hpp
new file mode 100644 (file)
index 0000000..7a81e1d
--- /dev/null
@@ -0,0 +1,74 @@
+#ifndef BOOST_SERIALIZATION_VALARAY_HPP
+#define BOOST_SERIALIZATION_VALARAY_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// valarray.hpp: serialization for stl vector templates
+
+// (C) Copyright 2005 Matthias Troyer . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <valarray>
+#include <boost/config.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/collection_size_type.hpp>
+#include <boost/serialization/detail/get_data.hpp>
+
+// function specializations must be defined in the appropriate
+// namespace - boost::serialization
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#define STD _STLP_STD
+#else
+#define STD std
+#endif
+
+namespace boost { namespace serialization {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// valarray<T>
+
+template<class Archive, class U>
+void save( Archive & ar, const STD::valarray<U> &t, const unsigned int /*file_version*/ )
+{
+  const collection_size_type count(t.size());
+  ar << BOOST_SERIALIZATION_NVP(count);
+  if (t.size())
+    ar << make_array(detail::get_data(t), t.size());
+}
+
+
+template<class Archive, class U>
+void load( Archive & ar, STD::valarray<U> &t,  const unsigned int /*file_version*/ )
+{
+  collection_size_type count;
+  ar >> BOOST_SERIALIZATION_NVP(count);
+  t.resize(count);
+  if (t.size())
+    ar >> make_array(detail::get_data(t), t.size());
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U>
+inline void serialize( Archive & ar, STD::valarray<U> & t, const unsigned int file_version)
+{
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} } // end namespace boost::serialization
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(STD::valarray)
+#undef STD
+
+#endif // BOOST_SERIALIZATION_VALARAY_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/variant.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/variant.hpp
new file mode 100644 (file)
index 0000000..fef5095
--- /dev/null
@@ -0,0 +1,160 @@
+#ifndef BOOST_SERIALIZATION_VARIANT_HPP
+#define BOOST_SERIALIZATION_VARIANT_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1020)
+#  pragma warning (disable : 4786) // too long name, harmless warning
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// variant.hpp - non-intrusive serialization of variant types
+//
+// copyright (c) 2005   
+// troy d. straszheim <troy@resophonic.com>
+// http://www.resophonic.com
+//
+// 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)
+//
+// See http://www.boost.org for updates, documentation, and revision history.
+//
+// thanks to Robert Ramey, Peter Dimov, and Richard Crossley.
+//
+
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/pop_front.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/empty.hpp>
+
+#include <boost/serialization/throw_exception.hpp>
+
+#include <boost/variant.hpp>
+
+#include <boost/archive/archive_exception.hpp>
+
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/serialization.hpp>
+
+namespace boost {
+namespace serialization {
+
+template<class Archive>
+struct variant_save_visitor : boost::static_visitor<> {
+    variant_save_visitor(Archive& ar) :
+        m_ar(ar)
+    {}
+    template<class T>
+    void operator()(T const & value) const
+    {
+        m_ar << BOOST_SERIALIZATION_NVP(value);
+    }
+private:
+    Archive & m_ar;
+};
+
+template<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
+void save(
+    Archive & ar,
+    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const & v,
+    unsigned int /*version*/
+){
+    int which = v.which();
+    ar << BOOST_SERIALIZATION_NVP(which);
+    typedef BOOST_DEDUCED_TYPENAME  boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
+    variant_save_visitor<Archive> visitor(ar);
+    v.apply_visitor(visitor);
+}
+
+template<class S>
+struct variant_impl {
+
+    struct load_null {
+        template<class Archive, class V>
+        static void invoke(
+            Archive & /*ar*/,
+            int /*which*/,
+            V & /*v*/,
+            const unsigned int /*version*/
+        ){}
+    };
+
+    struct load_impl {
+        template<class Archive, class V>
+        static void invoke(
+            Archive & ar,
+            int which,
+            V & v,
+            const unsigned int version
+        ){
+            if(which == 0){
+                // note: A non-intrusive implementation (such as this one)
+                // necessary has to copy the value.  This wouldn't be necessary
+                // with an implementation that de-serialized to the address of the
+                // aligned storage included in the variant.
+                typedef BOOST_DEDUCED_TYPENAME mpl::front<S>::type head_type;
+                head_type value;
+                ar >> BOOST_SERIALIZATION_NVP(value);
+                v = value;
+                ar.reset_object_address(& boost::get<head_type>(v), & value);
+                return;
+            }
+            typedef BOOST_DEDUCED_TYPENAME mpl::pop_front<S>::type type;
+            variant_impl<type>::load(ar, which - 1, v, version);
+        }
+    };
+
+    template<class Archive, class V>
+    static void load(
+        Archive & ar,
+        int which,
+        V & v,
+        const unsigned int version
+    ){
+        typedef BOOST_DEDUCED_TYPENAME mpl::eval_if<mpl::empty<S>,
+            mpl::identity<load_null>,
+            mpl::identity<load_impl>
+        >::type typex;
+        typex::invoke(ar, which, v, version);
+    }
+
+};
+
+template<class Archive, BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
+void load(
+    Archive & ar, 
+    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>& v,
+    const unsigned int version
+){
+    int which;
+    typedef BOOST_DEDUCED_TYPENAME boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>::types types;
+    ar >> BOOST_SERIALIZATION_NVP(which);
+    if(which >=  mpl::size<types>::value)
+        // this might happen if a type was removed from the list of variant types
+        boost::serialization::throw_exception(
+            boost::archive::archive_exception(
+                boost::archive::archive_exception::unsupported_version
+            )
+        );
+    variant_impl<types>::load(ar, which, v, version);
+}
+
+template<class Archive,BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
+inline void serialize(
+    Archive & ar,
+    boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> & v,
+    const unsigned int file_version
+){
+    split_free(ar,v,file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif //BOOST_SERIALIZATION_VARIANT_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/vector.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/vector.hpp
new file mode 100644 (file)
index 0000000..c7f8407
--- /dev/null
@@ -0,0 +1,211 @@
+#ifndef  BOOST_SERIALIZATION_VECTOR_HPP
+#define BOOST_SERIALIZATION_VECTOR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// vector.hpp: serialization for stl vector templates
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// fast array serialization (C) Copyright 2005 Matthias Troyer 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <vector>
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/type_traits/is_arithmetic.hpp> 
+
+#include <boost/serialization/collections_save_imp.hpp>
+#include <boost/serialization/collections_load_imp.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/array.hpp>
+#include <boost/serialization/detail/get_data.hpp>
+#include <boost/mpl/bool.hpp>
+
+// default is being compatible with version 1.34.1 files, not 1.35 files
+#ifndef BOOST_SERIALIZATION_VECTOR_VERSIONED
+#define BOOST_SERIALIZATION_VECTOR_VERSIONED(V) (V==4 || V==5)
+#endif
+
+namespace boost { 
+namespace serialization {
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// vector<T>
+
+// the default versions
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::vector<U, Allocator> &t,
+    const unsigned int /* file_version */,
+    mpl::false_
+){
+    boost::serialization::stl::save_collection<Archive, STD::vector<U, Allocator> >(
+        ar, t
+    );
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::vector<U, Allocator> &t,
+    const unsigned int /* file_version */,
+    mpl::false_
+){
+    boost::serialization::stl::load_collection<
+        Archive,
+        std::vector<U, Allocator>,
+        boost::serialization::stl::archive_input_seq<
+            Archive, STD::vector<U, Allocator> 
+        >,
+        boost::serialization::stl::reserve_imp<STD::vector<U, Allocator> >
+    >(ar, t);
+}
+
+// the optimized versions
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::vector<U, Allocator> &t,
+    const unsigned int /* file_version */,
+    mpl::true_
+){
+    const collection_size_type count(t.size());
+    ar << BOOST_SERIALIZATION_NVP(count);
+    if (!t.empty())
+        ar << make_array(detail::get_data(t),t.size());
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::vector<U, Allocator> &t,
+    const unsigned int /* file_version */,
+    mpl::true_
+){
+    collection_size_type count(t.size());
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    t.resize(count);
+    unsigned int item_version=0;
+    if(BOOST_SERIALIZATION_VECTOR_VERSIONED(ar.get_library_version())) {
+        ar >> BOOST_SERIALIZATION_NVP(item_version);
+    }
+    if (!t.empty())
+        ar >> make_array(detail::get_data(t),t.size());
+  }
+
+// dispatch to either default or optimized versions
+
+template<class Archive, class U, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::vector<U, Allocator> &t,
+    const unsigned int file_version
+){
+    typedef BOOST_DEDUCED_TYPENAME 
+    boost::serialization::use_array_optimization<Archive>::template apply<
+        BOOST_DEDUCED_TYPENAME remove_const<U>::type 
+    >::type use_optimized;
+    save(ar,t,file_version, use_optimized());
+}
+
+template<class Archive, class U, class Allocator>
+inline void load(
+    Archive & ar,
+    std::vector<U, Allocator> &t,
+    const unsigned int file_version
+){
+#ifdef BOOST_SERIALIZATION_VECTOR_135_HPP
+    if (ar.get_library_version()==5)
+    {
+      load(ar,t,file_version, boost::is_arithmetic<U>());
+      return;
+    }
+#endif
+    typedef BOOST_DEDUCED_TYPENAME 
+    boost::serialization::use_array_optimization<Archive>::template apply<
+        BOOST_DEDUCED_TYPENAME remove_const<U>::type 
+    >::type use_optimized;
+    load(ar,t,file_version, use_optimized());
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class U, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::vector<U, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+#if ! BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// vector<bool>
+template<class Archive, class Allocator>
+inline void save(
+    Archive & ar,
+    const std::vector<bool, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    // record number of elements
+    collection_size_type count (t.size());
+    ar << BOOST_SERIALIZATION_NVP(count);
+    std::vector<bool>::const_iterator it = t.begin();
+    while(count-- > 0){
+        bool tb = *it++;
+        ar << boost::serialization::make_nvp("item", tb);
+    }
+}
+
+template<class Archive, class Allocator>
+inline void load(
+    Archive & ar,
+    std::vector<bool, Allocator> &t,
+    const unsigned int /* file_version */
+){
+    // retrieve number of elements
+    collection_size_type count;
+    ar >> BOOST_SERIALIZATION_NVP(count);
+    t.clear();
+    while(count-- > 0){
+        bool i;
+        ar >> boost::serialization::make_nvp("item", i);
+        t.push_back(i);
+    }
+}
+
+// split non-intrusive serialization function member into separate
+// non intrusive save/load member functions
+template<class Archive, class Allocator>
+inline void serialize(
+    Archive & ar,
+    std::vector<bool, Allocator> & t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+#endif // BOOST_WORKAROUND
+
+} // serialization
+} // namespace boost
+
+#include <boost/serialization/collection_traits.hpp>
+
+BOOST_SERIALIZATION_COLLECTION_TRAITS(std::vector)
+
+#endif // BOOST_SERIALIZATION_VECTOR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/vector_135.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/vector_135.hpp
new file mode 100644 (file)
index 0000000..3554a24
--- /dev/null
@@ -0,0 +1,26 @@
+////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// vector_135.hpp: serialization for stl vector templates for compatibility
+//                 with release 1.35, which had a bug
+
+// (C) Copyright 2008 Matthias Troyer
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+
+#ifndef  BOOST_SERIALIZATION_VECTOR_135_HPP
+#define BOOST_SERIALIZATION_VECTOR_135_HPP
+
+#ifdef BOOST_SERIALIZATION_VECTOR_VERSIONED
+#if BOOST_SERIALIZATION_VECTOR_VERSION != 4
+#error Boost.Serialization cannot be compatible with both 1.35 and 1.36-1.40 files
+#endif
+#else
+#define BOOST_SERIALIZATION_VECTOR_VERSIONED(V) (V==4)
+#endif
+
+#include <boost/serialization/vector.hpp>
+
+#endif // BOOST_SERIALIZATION_VECTOR_135_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/version.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/version.hpp
new file mode 100644 (file)
index 0000000..54c72fc
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef BOOST_SERIALIZATION_VERSION_HPP
+#define BOOST_SERIALIZATION_VERSION_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// version.hpp:
+
+// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/config.hpp>
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/integral_c_tag.hpp>
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+//#include <boost/serialization/traits.hpp>
+
+namespace boost { 
+namespace serialization {
+
+struct basic_traits;
+
+// default version number is 0. Override with higher version
+// when class definition changes.
+template<class T>
+struct version
+{
+    template<class U>
+    struct traits_class_version {
+        typedef BOOST_DEDUCED_TYPENAME U::version type;
+    };
+
+    typedef mpl::integral_c_tag tag;
+    // note: at least one compiler complained w/o the full qualification
+    // on basic traits below
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<
+            is_base_and_derived<boost::serialization::basic_traits,T>,
+            traits_class_version<T>,
+            mpl::int_<0>
+        >::type type;
+    BOOST_STATIC_CONSTANT(int, value = version::type::value);
+};
+
+} // namespace serialization
+} // namespace boost
+
+/* note: at first it seemed that this would be a good place to trap
+ * as an error an attempt to set a version # for a class which doesn't
+ * save its class information (including version #) in the archive.
+ * However, this imposes a requirement that the version be set after
+ * the implemention level which would be pretty confusing.  If this
+ * is to be done, do this check in the input or output operators when
+ * ALL the serialization traits are available.  Included the implementation
+ * here with this comment as a reminder not to do this!
+ */
+//#include <boost/serialization/level.hpp>
+//#include <boost/mpl/equal_to.hpp>
+
+// specify the current version number for the class
+#define BOOST_CLASS_VERSION(T, N)                                      \
+namespace boost {                                                      \
+namespace serialization {                                              \
+template<>                                                             \
+struct version<T >                                                     \
+{                                                                      \
+    typedef mpl::int_<N> type;                                         \
+    typedef mpl::integral_c_tag tag;                                   \
+    BOOST_STATIC_CONSTANT(unsigned int, value = version::type::value); \
+    /*                                                                 \
+    BOOST_STATIC_ASSERT((                                              \
+        mpl::equal_to<                                                 \
+            :implementation_level<T >,                                 \
+            mpl::int_<object_class_info>                               \
+        >::value                                                       \
+    ));                                                                \
+    */                                                                 \
+};                                                                     \
+}                                                                      \
+}
+
+#endif // BOOST_SERIALIZATION_VERSION_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast.hpp
new file mode 100644 (file)
index 0000000..183a471
--- /dev/null
@@ -0,0 +1,281 @@
+#ifndef  BOOST_SERIALIZATION_VOID_CAST_HPP
+#define BOOST_SERIALIZATION_VOID_CAST_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// void_cast.hpp:   interface for run-time casting of void pointers.
+
+// (C) Copyright 2002-2009 Robert Ramey - http://www.rrsd.com . 
+// 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)
+// gennadiy.rozental@tfn.com
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // for ptrdiff_t
+#include <boost/noncopyable.hpp>
+
+#include <boost/serialization/config.hpp>
+#include <boost/serialization/smart_cast.hpp>
+#include <boost/serialization/singleton.hpp>
+#include <boost/serialization/force_include.hpp>
+#include <boost/serialization/type_info_implementation.hpp>
+#include <boost/serialization/extended_type_info.hpp>
+#include <boost/type_traits/is_virtual_base_of.hpp>
+#include <boost/serialization/void_cast_fwd.hpp>
+
+#include <boost/config/abi_prefix.hpp> // must be the last header
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable : 4251 4231 4660 4275)
+#endif
+
+namespace boost { 
+namespace serialization { 
+
+class extended_type_info;
+
+// Given a void *, assume that it really points to an instance of one type
+// and alter it so that it would point to an instance of a related type.
+// Return the altered pointer. If there exists no sequence of casts that
+// can transform from_type to to_type, return a NULL.  
+
+BOOST_SERIALIZATION_DECL(void const *)
+void_upcast(
+    extended_type_info const & derived,  
+    extended_type_info const & base, 
+    void const * const t
+);
+
+inline void *
+void_upcast(
+    extended_type_info const & derived,
+    extended_type_info const & base,
+    void * const t 
+){
+    return const_cast<void*>(void_upcast(
+        derived, 
+        base, 
+        const_cast<void const *>(t)
+    ));
+}
+
+BOOST_SERIALIZATION_DECL(void const *)
+void_downcast(
+    extended_type_info const & derived,  
+    extended_type_info const & base, 
+    void const * const t
+);
+
+inline void *
+void_downcast(
+    extended_type_info const & derived,
+    extended_type_info const & base,
+    void * const t 
+){
+    return const_cast<void*>(void_downcast(
+        derived, 
+        base, 
+        const_cast<void const *>(t)
+    ));
+}
+
+namespace void_cast_detail {
+
+class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) void_caster :
+    private boost::noncopyable
+{
+    friend 
+    BOOST_SERIALIZATION_DECL(void const *)
+    boost::serialization::void_upcast(
+        extended_type_info const & derived,
+        extended_type_info const & base,
+        void const * const
+    );
+    friend 
+    BOOST_SERIALIZATION_DECL(void const *)  
+    boost::serialization::void_downcast(
+        extended_type_info const & derived,
+        extended_type_info const & base,
+        void const * const
+    );
+protected:
+    void recursive_register(bool includes_virtual_base = false) const;
+    void recursive_unregister() const;
+public:
+    // Data members
+    const extended_type_info * m_derived;
+    const extended_type_info * m_base;
+    /*const*/ std::ptrdiff_t m_difference;
+    void_caster const * const m_parent;
+
+    // note that void_casters are keyed on value of
+    // member extended type info records - NOT their
+    // addresses.  This is necessary in order for the
+    // void cast operations to work across dll and exe
+    // module boundries.
+    bool operator<(const void_caster & rhs) const;
+
+    const void_caster & operator*(){
+        return *this;
+    }
+    // each derived class must re-implement these;
+    virtual void const * upcast(void const * const t) const = 0;
+    virtual void const * downcast(void const * const t) const = 0;
+    // Constructor
+    void_caster(
+        extended_type_info const * derived,
+        extended_type_info const * base,
+        std::ptrdiff_t difference = 0,
+        void_caster const * const parent = 0
+    ) :
+        m_derived(derived),
+        m_base(base),
+        m_difference(difference),
+        m_parent(parent)
+    {}
+    virtual ~void_caster(){}
+};
+
+template <class Derived, class Base>
+class void_caster_primitive : 
+    public void_caster
+{
+    virtual void const * downcast(void const * const t) const {
+        const Derived * d = 
+            boost::serialization::smart_cast<const Derived *, const Base *>(
+                static_cast<const Base *>(t)
+            );
+        return d;
+    }
+    virtual void const * upcast(void const * const t) const {
+        const Base * b = 
+            boost::serialization::smart_cast<const Base *, const Derived *>(
+                static_cast<const Derived *>(t)
+            );
+        return b;
+    }
+public:
+    void_caster_primitive();
+    ~void_caster_primitive();
+};
+
+template <class Derived, class Base>
+void_caster_primitive<Derived, Base>::void_caster_primitive() :
+    void_caster( 
+        & type_info_implementation<Derived>::type::get_const_instance(), 
+        & type_info_implementation<Base>::type::get_const_instance(),
+        // note:I wanted to display from 0 here, but at least one compiler
+        // treated 0 by not shifting it at all.
+        reinterpret_cast<std::ptrdiff_t>(
+            static_cast<Derived *>(
+                reinterpret_cast<Base *>(1)
+            )
+        ) - 1
+    )
+{
+    recursive_register();
+}
+
+template <class Derived, class Base>
+void_caster_primitive<Derived, Base>::~void_caster_primitive(){
+    recursive_unregister();
+}
+
+template <class Derived, class Base>
+class void_caster_virtual_base : 
+    public void_caster
+{
+public:
+    virtual void const * downcast(void const * const t) const {
+        const Derived * d = 
+            dynamic_cast<const Derived *>(
+                static_cast<const Base *>(t)
+            );
+        return d;
+    }
+    virtual void const * upcast(void const * const t) const {
+        const Base * b = 
+            dynamic_cast<const Base *>(
+                static_cast<const Derived *>(t)
+            );
+        return b;
+    }
+    void_caster_virtual_base();
+    ~void_caster_virtual_base();
+};
+
+template <class Derived, class Base>
+void_caster_virtual_base<Derived,Base>::void_caster_virtual_base() :
+    void_caster( 
+        & (type_info_implementation<Derived>::type::get_const_instance()), 
+        & (type_info_implementation<Base>::type::get_const_instance())
+    )
+{
+    recursive_register(true);
+}
+
+template <class Derived, class Base>
+void_caster_virtual_base<Derived,Base>::~void_caster_virtual_base(){
+    recursive_unregister();
+}
+
+template <class Derived, class Base>
+struct void_caster_base :
+    public void_caster
+{
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<boost::is_virtual_base_of<Base,Derived>,
+            mpl::identity<
+                void_cast_detail::void_caster_virtual_base<Derived, Base>
+            >
+        ,// else
+            mpl::identity<
+                void_cast_detail::void_caster_primitive<Derived, Base>
+            >
+        >::type type;
+};
+
+} // void_cast_detail 
+
+template<class Derived, class Base>
+BOOST_DLLEXPORT 
+inline const void_cast_detail::void_caster & void_cast_register(
+    Derived const * /* dnull = NULL */, 
+    Base const * /* bnull = NULL */
+){
+    typedef
+        BOOST_DEDUCED_TYPENAME mpl::eval_if<boost::is_virtual_base_of<Base,Derived>,
+            mpl::identity<
+                void_cast_detail::void_caster_virtual_base<Derived, Base>
+            >
+        ,// else
+            mpl::identity<
+                void_cast_detail::void_caster_primitive<Derived, Base>
+            >
+        >::type typex;
+    return singleton<typex>::get_const_instance();
+}
+
+template<class Derived, class Base>
+class void_caster :
+    public void_cast_detail::void_caster_base<Derived, Base>::type
+{
+};
+
+} // namespace serialization
+} // namespace boost
+
+#ifdef BOOST_MSVC  
+#  pragma warning(pop)  
+#endif
+
+#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
+
+#endif // BOOST_SERIALIZATION_VOID_CAST_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast_fwd.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/void_cast_fwd.hpp
new file mode 100644 (file)
index 0000000..c94adb2
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef  BOOST_SERIALIZATION_VOID_CAST_FWD_HPP
+#define BOOST_SERIALIZATION_VOID_CAST_FWD_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// void_cast_fwd.hpp:   interface for run-time casting of void pointers.
+
+// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com . 
+// 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)
+// gennadiy.rozental@tfn.com
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <cstddef> // NULL
+#include <boost/serialization/force_include.hpp>
+
+namespace boost {
+namespace serialization {
+namespace void_cast_detail{
+class void_caster;
+} // namespace void_cast_detail
+template<class Derived, class Base>
+BOOST_DLLEXPORT 
+inline const void_cast_detail::void_caster & void_cast_register(
+    const Derived * dnull = NULL, 
+    const Base * bnull = NULL
+) BOOST_USED;
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_VOID_CAST_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/weak_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/weak_ptr.hpp
new file mode 100644 (file)
index 0000000..a0db064
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef BOOST_SERIALIZATION_WEAK_PTR_HPP
+#define BOOST_SERIALIZATION_WEAK_PTR_HPP
+
+// MS compatible compilers support #pragma once
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
+// shared_ptr.hpp: serialization for boost shared pointer
+
+// (C) Copyright 2004 Robert Ramey and Martin Ecker
+// 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)
+
+//  See http://www.boost.org for updates, documentation, and revision history.
+
+#include <boost/weak_ptr.hpp>
+#include <boost/serialization/shared_ptr.hpp>
+
+namespace boost {
+namespace serialization{
+
+template<class Archive, class T>
+inline void save(
+    Archive & ar,
+    const boost::weak_ptr<T> &t,
+    const unsigned int /* file_version */
+){
+    const boost::shared_ptr<T> sp = t.lock();
+        ar << boost::serialization::make_nvp("shared_ptr", sp);
+}
+
+template<class Archive, class T>
+inline void load(
+    Archive & ar,
+    boost::weak_ptr<T> &t,
+    const unsigned int /* file_version */
+){
+    boost::shared_ptr<T> sp;
+        ar >> boost::serialization::make_nvp("shared_ptr", sp);
+    t = sp;
+}
+
+template<class Archive, class T>
+inline void serialize(
+    Archive & ar,
+    boost::weak_ptr<T> &t,
+    const unsigned int file_version
+){
+    boost::serialization::split_free(ar, t, file_version);
+}
+
+} // namespace serialization
+} // namespace boost
+
+#endif // BOOST_SERIALIZATION_WEAK_PTR_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/serialization/wrapper.hpp b/deal.II/contrib/boost-1.41.0/include/boost/serialization/wrapper.hpp
new file mode 100644 (file)
index 0000000..eeb4333
--- /dev/null
@@ -0,0 +1,60 @@
+#ifndef BOOST_SERIALIZATION_WRAPPER_HPP
+#define BOOST_SERIALIZATION_WRAPPER_HPP
+
+// (C) Copyright 2005-2006 Matthias Troyer
+// 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)
+
+#include <boost/serialization/traits.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/bool.hpp>
+
+namespace boost { namespace serialization {
+
+/// the base class for serialization wrappers
+///
+/// wrappers need to be treated differently at various places in the serialization library,
+/// e.g. saving of non-const wrappers has to be possible. Since partial specialization
+// is not supported by all compilers, we derive all wrappers from wrapper_traits. 
+
+template<
+    class T, 
+    int Level = object_serializable, 
+    int Tracking = track_never,
+    unsigned int Version = 0,
+    class ETII = extended_type_info_impl< T >
+>
+struct wrapper_traits : 
+    public traits<T,Level,Tracking,Version,ETII,mpl::true_> 
+{};
+
+template<class T>
+struct is_wrapper_impl :
+    boost::mpl::eval_if<
+      boost::is_base_and_derived<basic_traits,T>,
+      boost::mpl::true_,
+      boost::mpl::false_
+    >::type
+{};
+
+template<class T>
+struct is_wrapper {
+    typedef BOOST_DEDUCED_TYPENAME is_wrapper_impl<const T>::type type;
+};
+
+} // serialization
+} // boost
+
+// A macro to define that a class is a wrapper
+#define BOOST_CLASS_IS_WRAPPER(T)                       \
+namespace boost {                                       \
+namespace serialization {                               \
+template<>                                              \
+struct is_wrapper_impl<const T> : boost::mpl::true_ {}; \
+}                                                       \
+}                                                       \
+/**/
+
+#endif //BOOST_SERIALIZATION_WRAPPER_HPP
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/shared_array.hpp b/deal.II/contrib/boost-1.41.0/include/boost/shared_array.hpp
new file mode 100644 (file)
index 0000000..0700ce4
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
+#define BOOST_SHARED_ARRAY_HPP_INCLUDED
+
+//
+//  shared_array.hpp
+//
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
+//
+
+#include <boost/smart_ptr/shared_array.hpp>
+
+#endif  // #ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/shared_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/shared_ptr.hpp
new file mode 100644 (file)
index 0000000..d31978c
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
+#define BOOST_SHARED_PTR_HPP_INCLUDED
+
+//
+//  shared_ptr.hpp
+//
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001-2008 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
+//
+
+#include <boost/smart_ptr/shared_ptr.hpp>
+
+#endif  // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
similarity index 86%
rename from deal.II/contrib/boost/include/boost/detail/bad_weak_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/bad_weak_ptr.hpp
index 93ecec9b69ed9605874d7fcef43b13249db19f0c..3e0a1b728677d0da025967f735db4e54c9f4fb83 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_BAD_WEAK_PTR_HPP_INCLUDED
-#define BOOST_BAD_WEAK_PTR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
+#define BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -8,7 +8,7 @@
 #endif
 
 //
-//  detail/bad_weak_ptr.hpp
+//  boost/smart_ptr/bad_weak_ptr.hpp
 //
 //  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
 //
@@ -56,4 +56,4 @@ public:
 # pragma warn .8026     // Functions with excep. spec. are not expanded inline
 #endif
 
-#endif  // #ifndef BOOST_BAD_WEAK_PTR_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_BAD_WEAK_PTR_HPP_INCLUDED
similarity index 75%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count.hpp
index c53a63bc24aa22b62d3b24c6f21a58f25c83fd20..cc44ac2f96d815a0581b93115f71e22c0d8dfa7d 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
 //  ++a;
 //
 //    Effects: Atomically increments the value of a
-//    Returns: nothing
+//    Returns: (long) the new value of a
 //
 //  --a;
 //
 //    Effects: Atomically decrements the value of a
-//    Returns: (long) zero if the new value of a is zero,
-//      unspecified non-zero value otherwise (usually the new value)
+//    Returns: (long) the new value of a
 //
 //    Important note: when --a returns zero, it must act as a
 //      read memory barrier (RMB); i.e. the calling thread must
@@ -74,6 +73,7 @@
 //
 
 #include <boost/config.hpp>
+#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 
 #ifndef BOOST_HAS_THREADS
 
@@ -90,24 +90,24 @@ typedef long atomic_count;
 }
 
 #elif defined(BOOST_AC_USE_PTHREADS)
-#  include <boost/detail/atomic_count_pthreads.hpp>
+#  include <boost/smart_ptr/detail/atomic_count_pthreads.hpp>
 
 #elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
-# include <boost/detail/atomic_count_gcc_x86.hpp>
+#  include <boost/smart_ptr/detail/atomic_count_gcc_x86.hpp>
 
-#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
-#  include <boost/detail/atomic_count_win32.hpp>
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  include <boost/smart_ptr/detail/atomic_count_win32.hpp>
 
-#elif defined( __GNUC__ ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( __arm__ ) && !defined( __hppa ) && ( !defined( __INTEL_COMPILER ) || defined( __ia64__ ) )
-#  include <boost/detail/atomic_count_sync.hpp>
+#elif defined( BOOST_SP_HAS_SYNC )
+#  include <boost/smart_ptr/detail/atomic_count_sync.hpp>
 
 #elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
-#  include <boost/detail/atomic_count_gcc.hpp>
+#  include <boost/smart_ptr/detail/atomic_count_gcc.hpp>
 
 #elif defined(BOOST_HAS_PTHREADS)
 
 #  define BOOST_AC_USE_PTHREADS
-#  include <boost/detail/atomic_count_pthreads.hpp>
+#  include <boost/smart_ptr/detail/atomic_count_pthreads.hpp>
 
 #else
 
@@ -116,4 +116,4 @@ typedef long atomic_count;
 
 #endif
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_HPP_INCLUDED
similarity index 63%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_gcc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_gcc.hpp
index 1160e44dff0e14812bfaa25d8027fe75003b1f9b..54807e944e22e4f60ca2fe407caf54bcedfedd2e 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
 
 //
 //  boost/detail/atomic_count_gcc.hpp
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#include <bits/atomicity.h>
+#if __GNUC__ * 100 + __GNUC_MINOR__ >= 402
+# include <ext/atomicity.h> 
+#else 
+# include <bits/atomicity.h>
+#endif
 
 namespace boost
 {
@@ -36,21 +40,21 @@ class atomic_count
 {
 public:
 
-    explicit atomic_count(long v) : value_(v) {}
+    explicit atomic_count( long v ) : value_( v ) {}
 
-    void operator++()
+    long operator++()
     {
-        __atomic_add(&value_, 1);
+        return __exchange_and_add( &value_, +1 ) + 1;
     }
 
     long operator--()
     {
-        return __exchange_and_add(&value_, -1) - 1;
+        return __exchange_and_add( &value_, -1 ) - 1;
     }
 
     operator long() const
     {
-        return __exchange_and_add(&value_, 0);
+        return __exchange_and_add( &value_, 0 );
     }
 
 private:
@@ -65,4 +69,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_HPP_INCLUDED
similarity index 76%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_gcc_x86.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp
index 1312e8ce8f5905933dc615f952f120f20d834786..5c44d7c1efaa22ae8f01435099c71582ffabd352 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
 
 //
 //  boost/detail/atomic_count_gcc_x86.hpp
@@ -25,16 +25,9 @@ public:
 
     explicit atomic_count( long v ) : value_( static_cast< int >( v ) ) {}
 
-    void operator++()
+    long operator++()
     {
-        __asm__
-        (
-            "lock\n\t"
-            "incl %0":
-            "+m"( value_ ): // output (%0)
-            : // inputs
-            "cc" // clobbers
-        );
+        return atomic_exchange_and_add( &value_, +1 ) + 1;
     }
 
     long operator--()
@@ -81,4 +74,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_GCC_X86_HPP_INCLUDED
similarity index 85%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_pthreads.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_pthreads.hpp
index 7ed055f7d696b4d7f0f767d4eaf3056bb4904405..05f78673c68e842084dd9197b470fa0d1024e3fc 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
 
 //
 //  boost/detail/atomic_count_pthreads.hpp
@@ -62,10 +62,10 @@ public:
         pthread_mutex_destroy(&mutex_);
     }
 
-    void operator++()
+    long operator++()
     {
         scoped_lock lock(mutex_);
-        ++value_;
+        return ++value_;
     }
 
     long operator--()
@@ -93,4 +93,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_PTHREADS_HPP_INCLUDED
similarity index 82%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_solaris.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_solaris.hpp
index 8e2907fc76c4c212fda08c9717191fc3f82b19db..a13bcfb42302c4427a9c00caa6afca9a6b7b5b37 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
 
 //
 //  boost/detail/atomic_count_solaris.hpp
@@ -56,4 +56,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SOLARIS_HPP_INCLUDED
similarity index 77%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_sync.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_sync.hpp
index 676d3f98e48b5f3a377d8d675499c613a6815660..b6359b5bcf06f6013ba15e6f2a6d13c019e1aa70 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
 
 //
 //  boost/detail/atomic_count_sync.hpp
@@ -31,9 +31,9 @@ public:
 
     explicit atomic_count( long v ) : value_( v ) {}
 
-    void operator++()
+    long operator++()
     {
-        __sync_add_and_fetch( &value_, 1 );
+        return __sync_add_and_fetch( &value_, 1 );
     }
 
     long operator--()
@@ -58,4 +58,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_SYNC_HPP_INCLUDED
similarity index 83%
rename from deal.II/contrib/boost/include/boost/detail/atomic_count_win32.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/atomic_count_win32.hpp
index 0de25377fa5e6ad42d2740dd5a26efc22fa4601b..60a056943b6646f3e910f81336919464e8423cf6 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
-#define BOOST_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -60,4 +60,4 @@ private:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_ATOMIC_COUNT_WIN32_HPP_INCLUDED
similarity index 67%
rename from deal.II/contrib/boost/include/boost/detail/lightweight_mutex.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lightweight_mutex.hpp
index e740d7f69f725aff578c65d69d8a00d7ad94e13a..d46b1932c2b862ea597d4228a758d75470d64ba2 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
-#define BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
 #include <boost/config.hpp>
 
 #if !defined(BOOST_HAS_THREADS)
-# include <boost/detail/lwm_nop.hpp>
+#  include <boost/smart_ptr/detail/lwm_nop.hpp>
 #elif defined(BOOST_HAS_PTHREADS)
-#  include <boost/detail/lwm_pthreads.hpp>
-#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
-#  include <boost/detail/lwm_win32_cs.hpp>
+#  include <boost/smart_ptr/detail/lwm_pthreads.hpp>
+#elif defined(BOOST_HAS_WINTHREADS) || defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  include <boost/smart_ptr/detail/lwm_win32_cs.hpp>
 #else
 // Use #define BOOST_DISABLE_THREADS to avoid the error
 #  error Unrecognized threading platform
 #endif
 
-#endif // #ifndef BOOST_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_LIGHTWEIGHT_MUTEX_HPP_INCLUDED
similarity index 76%
rename from deal.II/contrib/boost/include/boost/detail/lwm_nop.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_nop.hpp
index c73ab68f5eeba9655b89e6e7c3a8722eddf53684..521a88ec1cdba0a44c8187b4603f8658442db9cc 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_LWM_NOP_HPP_INCLUDED
-#define BOOST_DETAIL_LWM_NOP_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -34,4 +34,4 @@ public:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_LWM_NOP_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_NOP_HPP_INCLUDED
similarity index 88%
rename from deal.II/contrib/boost/include/boost/detail/lwm_pthreads.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_pthreads.hpp
index a5bf75bde7326b015b14e046bf2d00837659d36b..fc20dbb14515f6bb1f7ac3e54aca73ad63864571 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
-#define BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -83,4 +83,4 @@ public:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_LWM_PTHREADS_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_PTHREADS_HPP_INCLUDED
similarity index 91%
rename from deal.II/contrib/boost/include/boost/detail/lwm_win32_cs.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/lwm_win32_cs.hpp
index 8142069e67b3aef720208e3d131fad588e7a3c5b..00477e49f8fec71ecc19e85c6e3646b7a3a049a9 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
-#define BOOST_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -105,4 +105,4 @@ public:
 
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_LWM_WIN32_CS_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/operator_bool.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/operator_bool.hpp
new file mode 100644 (file)
index 0000000..842a05d
--- /dev/null
@@ -0,0 +1,56 @@
+//  This header intentionally has no include guards.
+//
+//  Copyright (c) 2001-2009 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+
+#if ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__)
+
+    operator bool () const
+    {
+        return px != 0;
+    }
+
+#elif defined( _MANAGED )
+
+    static void unspecified_bool( this_type*** )
+    {
+    }
+
+    typedef void (*unspecified_bool_type)( this_type*** );
+
+    operator unspecified_bool_type() const // never throws
+    {
+        return px == 0? 0: unspecified_bool;
+    }
+
+#elif \
+    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
+    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \
+    ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) )
+
+    typedef T * (this_type::*unspecified_bool_type)() const;
+
+    operator unspecified_bool_type() const // never throws
+    {
+        return px == 0? 0: &this_type::get;
+    }
+
+#else
+
+    typedef T * this_type::*unspecified_bool_type;
+
+    operator unspecified_bool_type() const // never throws
+    {
+        return px == 0? 0: &this_type::px;
+    }
+
+#endif
+
+    // operator! is redundant, but some compilers need it
+    bool operator! () const // never throws
+    {
+        return px == 0;
+    }
similarity index 95%
rename from deal.II/contrib/boost/include/boost/detail/quick_allocator.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/quick_allocator.hpp
index ddb0a7616c0a46bb56e0501efb769c32a3874f35..6d136f82d73f2dbb25561260ecd9d0aa6c1978c3 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
-#define BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -20,7 +20,7 @@
 
 #include <boost/config.hpp>
 
-#include <boost/detail/lightweight_mutex.hpp>
+#include <boost/smart_ptr/detail/lightweight_mutex.hpp>
 #include <boost/type_traits/type_with_alignment.hpp>
 #include <boost/type_traits/alignment_of.hpp>
 
@@ -195,4 +195,4 @@ struct quick_allocator: public allocator_impl< sizeof(T), boost::alignment_of<T>
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_QUICK_ALLOCATOR_HPP_INCLUDED
similarity index 92%
rename from deal.II/contrib/boost/include/boost/detail/shared_array_nmt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_array_nmt.hpp
index 13ca6aca1513e77aef552646ebcdad6638ad99b2..450c9bcf595a6c818a34d934624f8be99cef95a1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
-#define BOOST_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
 
 //
 //  detail/shared_array_nmt.hpp - shared_array.hpp without member templates
@@ -17,7 +17,7 @@
 #include <boost/assert.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/throw_exception.hpp>
-#include <boost/detail/atomic_count.hpp>
+#include <boost/smart_ptr/detail/atomic_count.hpp>
 
 #include <cstddef>          // for std::ptrdiff_t
 #include <algorithm>        // for std::swap
@@ -148,4 +148,4 @@ template<class T> void swap(shared_array<T> & a, shared_array<T> & b)
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
similarity index 90%
rename from deal.II/contrib/boost/include/boost/detail/shared_count.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_count.hpp
index 8f1377701e6ebe2f803441c007d0c472a82a918a..4943e37643fc5ed7399128f27303774eca2a22e0 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
-#define BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
 #include <boost/config.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/throw_exception.hpp>
-#include <boost/detail/bad_weak_ptr.hpp>
-#include <boost/detail/sp_counted_base.hpp>
-#include <boost/detail/sp_counted_impl.hpp>
+#include <boost/smart_ptr/bad_weak_ptr.hpp>
+#include <boost/smart_ptr/detail/sp_counted_base.hpp>
+#include <boost/smart_ptr/detail/sp_counted_impl.hpp>
+#include <boost/detail/workaround.hpp>
 // In order to avoid circular dependencies with Boost.TR1
 // we make sure that our include of <memory> doesn't try to
 // pull in the TR1 headers: that's why we use this header 
@@ -227,6 +228,18 @@ public:
         if( pi_ != 0 ) pi_->add_ref_copy();
     }
 
+#if defined( BOOST_HAS_RVALUE_REFS )
+
+    shared_count(shared_count && r): pi_(r.pi_) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(shared_count_id)
+#endif
+    {
+        r.pi_ = 0;
+    }
+
+#endif
+
     explicit shared_count(weak_count const & r); // throws bad_weak_ptr when r.use_count() == 0
     shared_count( weak_count const & r, sp_nothrow_tag ); // constructs an empty *this when r.use_count() == 0
 
@@ -306,7 +319,7 @@ public:
 
     weak_count(shared_count const & r): pi_(r.pi_) // nothrow
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        , id_(shared_count_id)
+        , id_(weak_count_id)
 #endif
     {
         if(pi_ != 0) pi_->weak_add_ref();
@@ -314,12 +327,26 @@ public:
 
     weak_count(weak_count const & r): pi_(r.pi_) // nothrow
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        , id_(shared_count_id)
+        , id_(weak_count_id)
 #endif
     {
         if(pi_ != 0) pi_->weak_add_ref();
     }
 
+// Move support
+
+#if defined( BOOST_HAS_RVALUE_REFS )
+
+    weak_count(weak_count && r): pi_(r.pi_) // nothrow
+#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
+        , id_(weak_count_id)
+#endif
+    {
+        r.pi_ = 0;
+    }
+
+#endif
+
     ~weak_count() // nothrow
     {
         if(pi_ != 0) pi_->weak_release();
@@ -368,6 +395,11 @@ public:
         return pi_ != 0? pi_->use_count(): 0;
     }
 
+    bool empty() const // nothrow
+    {
+        return pi_ == 0;
+    }
+
     friend inline bool operator==(weak_count const & a, weak_count const & b)
     {
         return a.pi_ == b.pi_;
@@ -409,4 +441,4 @@ inline shared_count::shared_count( weak_count const & r, sp_nothrow_tag ): pi_(
 # pragma warn .8027     // Functions containing try are not expanded inline
 #endif
 
-#endif  // #ifndef BOOST_DETAIL_SHARED_COUNT_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_COUNT_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/shared_ptr_nmt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/shared_ptr_nmt.hpp
index 0780e305b599040249aa77b8462c1de1a177ef81..afc1ec03f1b569a55dcb00d2248088511d788400 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
-#define BOOST_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
 
 //
 //  detail/shared_ptr_nmt.hpp - shared_ptr.hpp without member templates
@@ -17,7 +17,7 @@
 #include <boost/assert.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/throw_exception.hpp>
-#include <boost/detail/atomic_count.hpp>
+#include <boost/smart_ptr/detail/atomic_count.hpp>
 
 #ifndef BOOST_NO_AUTO_PTR
 # include <memory>          // for std::auto_ptr
@@ -179,4 +179,4 @@ template<class T> inline T * get_pointer(shared_ptr<T> const & p)
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_PTR_NMT_HPP_INCLUDED
similarity index 85%
rename from deal.II/contrib/boost/include/boost/detail/sp_convertible.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_convertible.hpp
index 2c1539bd770a9d3b044c886c12dd00a0b528ad6a..66e5ec7338aeb326f1fb0b24a0e6d7257bafae91 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
-#define BOOST_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -45,7 +45,7 @@ template< class Y, class T > struct sp_convertible
     static yes f( T* );
     static no  f( ... );
 
-    enum _vt { value = sizeof( f( (Y*)0 ) ) == sizeof(yes) };
+    enum _vt { value = sizeof( f( static_cast<Y*>(0) ) ) == sizeof(yes) };
 };
 
 struct sp_empty
@@ -73,4 +73,4 @@ template< class Y, class T > struct sp_enable_if_convertible: public sp_enable_i
 
 #endif // !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 
-#endif  // #ifndef BOOST_DETAIL_SP_TYPEINFO_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_CONVERTIBLE_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base.hpp
new file mode 100644 (file)
index 0000000..cab45cc
--- /dev/null
@@ -0,0 +1,70 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  detail/sp_counted_base.hpp
+//
+//  Copyright 2005, 2006 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#include <boost/config.hpp>
+#include <boost/smart_ptr/detail/sp_has_sync.hpp>
+
+#if defined( BOOST_SP_DISABLE_THREADS )
+# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
+
+#elif defined( BOOST_SP_USE_SPINLOCK )
+# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
+
+#elif defined( BOOST_SP_USE_PTHREADS )
+# include <boost/smart_ptr/detail/sp_counted_base_pt.hpp>
+
+#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
+# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
+
+#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
+# include <boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp>
+
+#elif defined( __GNUC__ ) && defined( __ia64__ ) && !defined( __INTEL_COMPILER )
+# include <boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp>
+
+#elif defined(__HP_aCC) && defined(__ia64)
+# include <boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp>
+
+#elif defined( __MWERKS__ ) && defined( __POWERPC__ )
+# include <boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp>
+
+#elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) )
+# include <boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp>
+
+#elif defined( __GNUC__ ) && ( defined( __mips__ ) || defined( _mips ) )
+# include <boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp>
+
+#elif defined( BOOST_SP_HAS_SYNC )
+# include <boost/smart_ptr/detail/sp_counted_base_sync.hpp>
+
+#elif defined(__GNUC__) && ( defined( __sparcv9 ) || ( defined( __sparcv8 ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 402 ) ) )
+# include <boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp>
+
+#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined(__CYGWIN__)
+# include <boost/smart_ptr/detail/sp_counted_base_w32.hpp>
+
+#elif !defined( BOOST_HAS_THREADS )
+# include <boost/smart_ptr/detail/sp_counted_base_nt.hpp>
+
+#else
+# include <boost/smart_ptr/detail/sp_counted_base_spin.hpp>
+
+#endif
+
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
similarity index 92%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_acc_ia64.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp
index c956b8e01d1fd77bfdb1928b45a84687f9ef386c..dffd995b16e6fecfd282124d75f4c72170a60655 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
 
 //
 //  detail/sp_counted_base_acc_ia64.hpp - aC++ on HP-UX IA64
@@ -147,4 +147,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_ACC_IA64_HPP_INCLUDED
similarity index 92%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_cw_ppc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp
index 3f432528635f2e74507756ee80d531de7ee22cb9..51ac56a943835ad95fffb8e068d6ff612808a9f2 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -167,4 +167,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_PPC_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_cw_x86.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp
index b2e3f9bbd14cd8ad9f431e93b265f82c4d6310db..1234e78a6b487c31d97bff845589eef73dc4dff4 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -155,4 +155,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_CW_X86_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_ia64.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp
index 7535295d2b88cf55a326137969474de4d1da6fdd..d122a49bdb2dd879de958b3bca97839901d994b4 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
 
 //
 //  detail/sp_counted_base_gcc_ia64.hpp - g++ on IA64
@@ -154,4 +154,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_IA64_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp
new file mode 100644 (file)
index 0000000..0c69b0b
--- /dev/null
@@ -0,0 +1,172 @@
+#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
+#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  detail/sp_counted_base_gcc_mips.hpp - g++ on MIPS
+//
+//  Copyright (c) 2009, Spirent Communications, Inc.
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//
+//  Lock-free algorithm by Alexander Terekhov
+//
+
+#include <boost/detail/sp_typeinfo.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+inline void atomic_increment( int * pw )
+{
+    // ++*pw;
+
+    int tmp;
+
+    __asm__ __volatile__
+    (
+        "0:\n\t"
+        "ll %0, %1\n\t"
+        "addiu %0, 1\n\t"
+        "sc %0, %1\n\t"
+        "beqz %0, 0b":
+        "=&r"( tmp ), "=m"( *pw ):
+        "m"( *pw )
+    );
+}
+
+inline int atomic_decrement( int * pw )
+{
+    // return --*pw;
+
+    int rv, tmp;
+
+    __asm__ __volatile__
+    (
+        "0:\n\t"
+        "ll %1, %2\n\t"
+        "addiu %0, %1, -1\n\t"
+        "sc %0, %2\n\t"
+        "beqz %0, 0b\n\t"
+        "addiu %0, %1, -1":
+        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
+        "m"( *pw ):
+        "memory"
+    );
+
+    return rv;
+}
+
+inline int atomic_conditional_increment( int * pw )
+{
+    // if( *pw != 0 ) ++*pw;
+    // return *pw;
+
+    int rv, tmp;
+
+    __asm__ __volatile__
+    (
+        "0:\n\t"
+        "ll %0, %2\n\t"
+        "beqz %0, 1f\n\t"
+        "addiu %1, %0, 1\n\t"
+        "sc %1, %2\n\t"
+        "beqz %1, 0b\n\t"
+        "addiu %0, %0, 1\n\t"
+        "1:":
+        "=&r"( rv ), "=&r"( tmp ), "=m"( *pw ):
+        "m"( *pw ):
+        "memory"
+    );
+
+    return rv;
+}
+
+class sp_counted_base
+{
+private:
+
+    sp_counted_base( sp_counted_base const & );
+    sp_counted_base & operator= ( sp_counted_base const & );
+
+    int use_count_;        // #shared
+    int weak_count_;       // #weak + (#shared != 0)
+
+public:
+
+    sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
+    {
+    }
+
+    virtual ~sp_counted_base() // nothrow
+    {
+    }
+
+    // dispose() is called when use_count_ drops to zero, to release
+    // the resources managed by *this.
+
+    virtual void dispose() = 0; // nothrow
+
+    // destroy() is called when weak_count_ drops to zero.
+
+    virtual void destroy() // nothrow
+    {
+        delete this;
+    }
+
+    virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
+
+    void add_ref_copy()
+    {
+        atomic_increment( &use_count_ );
+    }
+
+    bool add_ref_lock() // true on success
+    {
+        return atomic_conditional_increment( &use_count_ ) != 0;
+    }
+
+    void release() // nothrow
+    {
+        if( atomic_decrement( &use_count_ ) == 0 )
+        {
+            dispose();
+            weak_release();
+        }
+    }
+
+    void weak_add_ref() // nothrow
+    {
+        atomic_increment( &weak_count_ );
+    }
+
+    void weak_release() // nothrow
+    {
+        if( atomic_decrement( &weak_count_ ) == 0 )
+        {
+            destroy();
+        }
+    }
+
+    long use_count() const // nothrow
+    {
+        return static_cast<int const volatile &>( use_count_ );
+    }
+};
+
+} // namespace detail
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_MIPS_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_ppc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp
index cea2740bcab62ddc30f9e74b317b7ce2630a6d12..7f5c414f17fa518c3a98495136a26d84134b4330 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -178,4 +178,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_sparc.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp
index 2afca168d458f44c41c518cbad183855b1278546..8af6f0a972ab11f1157573e5c6e5a4e496ab84fb 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -163,4 +163,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_SPARC_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_gcc_x86.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp
index 8bf3171f33e3f54fc47e281468eff2a7fa6ac0b4..4d7fa8d4ab3ea0c03405388819bc6ddb6e330cb1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -170,4 +170,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_X86_HPP_INCLUDED
similarity index 90%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_nt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_nt.hpp
index dc7a04231bb1715b157e80527418058f08c0d016..dfd70e7d7e0bd24214b13c346a88aca0dee8aca6 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -104,4 +104,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_pt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_pt.hpp
index cd30de950d3c36ac09a93c9bf61669459db83644..3c56fecfc362c56c45fd170db28487dbb1205541 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -132,4 +132,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_PT_HPP_INCLUDED
similarity index 91%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_solaris.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_solaris.hpp
index a747b391e8e9a2c77f00b268798c92b75ab357a9..d1b6beceb1832c1319a59e595be499f14a85c98f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
 
 //
 //  detail/sp_counted_base_solaris.hpp
@@ -110,4 +110,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SOLARIS_HPP_INCLUDED
similarity index 90%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_spin.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_spin.hpp
index 610a468c7eacb4b4c5ad2052f8eab0a118abf5ed..bbd11e60e905bdf1a2e74122aab4b073f01a14c5 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -19,7 +19,7 @@
 //
 
 #include <boost/detail/sp_typeinfo.hpp>
-#include <boost/detail/spinlock_pool.hpp>
+#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 
 namespace boost
 {
@@ -128,4 +128,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SPIN_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_sync.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_sync.hpp
index d72dac2bc59a4797843afd9f3fd84a88289979c3..41f654e19b19c87381019c6809c6444d897b1f1e 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -152,4 +152,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_SYNC_HPP_INCLUDED
similarity index 93%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_base_w32.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_base_w32.hpp
index f9903935d8911723e5e1c8a697e0568f85999ad7..06aa4565712e240a220c2440298cb6d032f5b6d1 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -127,4 +127,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_W32_HPP_INCLUDED
similarity index 94%
rename from deal.II/contrib/boost/include/boost/detail/sp_counted_impl.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_counted_impl.hpp
index 81f92da249dfb3616fce3247063fb94784d07aaf..397421ae9fae05e5efa6d081333a86ed5f6e1dcf 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
 #endif
 
 #include <boost/checked_delete.hpp>
-#include <boost/detail/sp_counted_base.hpp>
+#include <boost/smart_ptr/detail/sp_counted_base.hpp>
 
 #if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
-#include <boost/detail/quick_allocator.hpp>
+#include <boost/smart_ptr/detail/quick_allocator.hpp>
 #endif
 
 #if defined(BOOST_SP_USE_STD_ALLOCATOR)
@@ -228,4 +228,4 @@ public:
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_has_sync.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/sp_has_sync.hpp
new file mode 100644 (file)
index 0000000..cb0282d
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
+
+// MS compatible compilers support #pragma once
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+# pragma once
+#endif
+
+//
+//  boost/smart_ptr/detail/sp_has_sync.hpp
+//
+//  Copyright (c) 2008, 2009 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  Defines the BOOST_SP_HAS_SYNC macro if the __sync_* intrinsics
+//  are available.
+//
+
+#if defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 )
+
+#define BOOST_SP_HAS_SYNC
+
+#if defined( __arm__ )  || defined( __armel__ )
+#undef BOOST_SP_HAS_SYNC
+#endif
+
+#if defined( __hppa ) || defined( __hppa__ )
+#undef BOOST_SP_HAS_SYNC
+#endif
+
+#if defined( __m68k__ )
+#undef BOOST_SP_HAS_SYNC
+#endif
+
+#if defined( __sparc__ )
+#undef BOOST_SP_HAS_SYNC
+#endif
+
+#if defined( __INTEL_COMPILER ) && !defined( __ia64__ )
+#undef BOOST_SP_HAS_SYNC
+#endif
+
+#endif // __GNUC__ * 100 + __GNUC_MINOR__ >= 401
+
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_HAS_SYNC_HPP_INCLUDED
similarity index 61%
rename from deal.II/contrib/boost/include/boost/detail/spinlock.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock.hpp
index 346fb3c61fc82e26e7e3055da5258a14af8cc232..1640a38d4944a72f5b65252a4d3341917b642553 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
 //
 
 #include <boost/config.hpp>
+#include <boost/smart_ptr/detail/sp_has_sync.hpp>
 
 #if defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )
-#  include <boost/detail/spinlock_gcc_arm.hpp>
-#elif defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( __arm__ ) && !defined( __hppa ) && ( !defined( __INTEL_COMPILER ) || defined( __ia64__ ) )
-#  include <boost/detail/spinlock_sync.hpp>
+#  include <boost/smart_ptr/detail/spinlock_gcc_arm.hpp>
+
+#elif defined( BOOST_SP_HAS_SYNC )
+#  include <boost/smart_ptr/detail/spinlock_sync.hpp>
+
 #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
-#  include <boost/detail/spinlock_w32.hpp>
+#  include <boost/smart_ptr/detail/spinlock_w32.hpp>
+
 #elif defined(BOOST_HAS_PTHREADS)
-#  include <boost/detail/spinlock_pt.hpp>
+#  include <boost/smart_ptr/detail/spinlock_pt.hpp>
+
 #elif !defined(BOOST_HAS_THREADS)
-#  include <boost/detail/spinlock_nt.hpp>
+#  include <boost/smart_ptr/detail/spinlock_nt.hpp>
+
 #else
 #  error Unrecognized threading platform
 #endif
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_HPP_INCLUDED
similarity index 84%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_gcc_arm.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_gcc_arm.hpp
index c21163bdd1bfd9b7cd1a3a3cbbef7d63293c166d..ba6c511e28015409229a4ef1ec82428a909bc3ee 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
 
 //
 //  Copyright (c) 2008 Peter Dimov
@@ -9,7 +9,7 @@
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#include <boost/detail/yield_k.hpp>
+#include <boost/smart_ptr/detail/yield_k.hpp>
 
 namespace boost
 {
@@ -82,4 +82,4 @@ public:
 
 #define BOOST_DETAIL_SPINLOCK_INIT {0}
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_GCC_ARM_HPP_INCLUDED
similarity index 87%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_nt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_nt.hpp
index f03ba08a45c62fae7ddcca8075fd3332a06a0eb3..1f399d0dd4162551b369ac35f27f28bb02275cba 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -86,4 +86,4 @@ public:
 
 #define BOOST_DETAIL_SPINLOCK_INIT { false }
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_NT_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_NT_HPP_INCLUDED
similarity index 91%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_pool.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_pool.hpp
index a264b1a3313662d1d53531cfd9f451c2c9d1931f..0e2e08ac80a8cc985bcf49a7a01d5cabf616ac2a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -22,7 +22,7 @@
 //
 
 #include <boost/config.hpp>
-#include <boost/detail/spinlock.hpp>
+#include <boost/smart_ptr/detail/spinlock.hpp>
 #include <cstddef>
 
 namespace boost
@@ -84,4 +84,4 @@ template< int I > spinlock spinlock_pool< I >::pool_[ 41 ] =
 } // namespace detail
 } // namespace boost
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_POOL_HPP_INCLUDED
similarity index 86%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_pt.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_pt.hpp
index dfb2d6f45b4385c84153dc2b5b104b69acc5db30..f9cabfc3a7c599b2dfedf28458ef33d4734cfd1f 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_PT_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_PT_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -76,4 +76,4 @@ public:
 
 #define BOOST_DETAIL_SPINLOCK_INIT { PTHREAD_MUTEX_INITIALIZER }
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_PT_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_PT_HPP_INCLUDED
similarity index 84%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_sync.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_sync.hpp
index a7523967f016acda746295923a8433b451a0317e..a7145c5ac2782e7051a75db82e2f524334ce8443 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -15,7 +15,7 @@
 //  http://www.boost.org/LICENSE_1_0.txt)
 //
 
-#include <boost/detail/yield_k.hpp>
+#include <boost/smart_ptr/detail/yield_k.hpp>
 
 #if defined( __ia64__ ) && defined( __INTEL_COMPILER )
 # include <ia64intrin.h>
@@ -84,4 +84,4 @@ public:
 
 #define BOOST_DETAIL_SPINLOCK_INIT {0}
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_SYNC_HPP_INCLUDED
similarity index 88%
rename from deal.II/contrib/boost/include/boost/detail/spinlock_w32.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/spinlock_w32.hpp
index aa416c34e470a3025c2cdff855926fdd2edd2a9d..fb97629c7cdb811fbe0f2997a9b8118c87113cfd 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_SPINLOCK_W32_HPP_INCLUDED
-#define BOOST_DETAIL_SPINLOCK_W32_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -16,7 +16,7 @@
 //
 
 #include <boost/detail/interlocked.hpp>
-#include <boost/detail/yield_k.hpp>
+#include <boost/smart_ptr/detail/yield_k.hpp>
 
 // BOOST_COMPILER_FENCE
 
@@ -110,4 +110,4 @@ public:
 
 #define BOOST_DETAIL_SPINLOCK_INIT {0}
 
-#endif // #ifndef BOOST_DETAIL_SPINLOCK_W32_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_SPINLOCK_W32_HPP_INCLUDED
similarity index 92%
rename from deal.II/contrib/boost/include/boost/detail/yield_k.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/detail/yield_k.hpp
index d97542d02edaeefd49310125d5a665bb8993d07d..a956cc0c974168883d99badc46961e076b983493 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_DETAIL_YIELD_K_HPP_INCLUDED
-#define BOOST_DETAIL_YIELD_K_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
 
 // MS compatible compilers support #pragma once
 
@@ -8,7 +8,7 @@
 #endif
 
 //
-//  boost/detail/yield_k.hpp
+//  yield_k.hpp
 //
 //  Copyright (c) 2008 Peter Dimov
 //
@@ -146,4 +146,4 @@ inline void yield( unsigned )
 
 #endif
 
-#endif // #ifndef BOOST_DETAIL_YIELD_K_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_DETAIL_YIELD_K_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this.hpp
new file mode 100644 (file)
index 0000000..f7b1445
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+#define BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+
+//
+//  enable_shared_from_this.hpp
+//
+//  Copyright 2002, 2009 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
+//
+
+#include <boost/smart_ptr/weak_ptr.hpp>
+#include <boost/smart_ptr/shared_ptr.hpp>
+#include <boost/assert.hpp>
+#include <boost/config.hpp>
+
+namespace boost
+{
+
+template<class T> class enable_shared_from_this
+{
+protected:
+
+    enable_shared_from_this()
+    {
+    }
+
+    enable_shared_from_this(enable_shared_from_this const &)
+    {
+    }
+
+    enable_shared_from_this & operator=(enable_shared_from_this const &)
+    {
+        return *this;
+    }
+
+    ~enable_shared_from_this()
+    {
+    }
+
+public:
+
+    shared_ptr<T> shared_from_this()
+    {
+        shared_ptr<T> p( weak_this_ );
+        BOOST_ASSERT( p.get() == this );
+        return p;
+    }
+
+    shared_ptr<T const> shared_from_this() const
+    {
+        shared_ptr<T const> p( weak_this_ );
+        BOOST_ASSERT( p.get() == this );
+        return p;
+    }
+
+public: // actually private, but avoids compiler template friendship issues
+
+    // Note: invoked automatically by shared_ptr; do not call
+    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
+    {
+        if( weak_this_.expired() )
+        {
+            weak_this_ = shared_ptr<T>( *ppx, py );
+        }
+    }
+
+private:
+
+    mutable weak_ptr<T> weak_this_;
+};
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_SMART_PTR_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this2.hpp b/deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/enable_shared_from_this2.hpp
new file mode 100644 (file)
index 0000000..a5bfcff
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED
+#define BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED
+
+//
+//  enable_shared_from_this2.hpp
+//
+//  Copyright 2002, 2009 Peter Dimov
+//  Copyright 2008 Frank Mori Hess
+//
+//  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/shared_ptr.hpp>
+#include <boost/assert.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace boost
+{
+
+namespace detail
+{
+
+class esft2_deleter_wrapper
+{
+private:
+
+    shared_ptr<void> deleter_;
+
+public:
+
+    esft2_deleter_wrapper()
+    {
+    }
+
+    template< class T > void set_deleter( shared_ptr<T> const & deleter )
+    {
+        deleter_ = deleter;
+    }
+
+    template< class T> void operator()( T* )
+    {
+        BOOST_ASSERT( deleter_.use_count() <= 1 );
+        deleter_.reset();
+    }
+};
+
+} // namespace detail
+
+template< class T > class enable_shared_from_this2
+{
+protected:
+
+    enable_shared_from_this2()
+    {
+    }
+
+    enable_shared_from_this2( enable_shared_from_this2 const & )
+    {
+    }
+
+    enable_shared_from_this2 & operator=( enable_shared_from_this2 const & )
+    {
+        return *this;
+    }
+
+    ~enable_shared_from_this2()
+    {
+        BOOST_ASSERT( shared_this_.use_count() <= 1 ); // make sure no dangling shared_ptr objects exist
+    }
+
+private:
+
+    mutable weak_ptr<T> weak_this_;
+    mutable shared_ptr<T> shared_this_;
+
+public:
+
+    shared_ptr<T> shared_from_this()
+    {
+        init_weak_once();
+        return shared_ptr<T>( weak_this_ );
+    }
+
+    shared_ptr<T const> shared_from_this() const
+    {
+        init_weak_once();
+        return shared_ptr<T>( weak_this_ );
+    }
+
+private:
+
+    void init_weak_once() const
+    {
+        if( weak_this_._empty() )
+        {
+            shared_this_.reset( static_cast< T* >( 0 ), detail::esft2_deleter_wrapper() );
+            weak_this_ = shared_this_;
+        }
+    }
+
+public: // actually private, but avoids compiler template friendship issues
+
+    // Note: invoked automatically by shared_ptr; do not call
+    template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const
+    {
+        BOOST_ASSERT( ppx != 0 );
+
+        if( weak_this_.use_count() == 0 )
+        {
+            weak_this_ = shared_ptr<T>( *ppx, py );
+        }
+        else if( shared_this_.use_count() != 0 )
+        {
+            BOOST_ASSERT( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that
+
+            detail::esft2_deleter_wrapper * pd = boost::get_deleter<detail::esft2_deleter_wrapper>( shared_this_ );
+            BOOST_ASSERT( pd != 0 );
+
+            pd->set_deleter( *ppx );
+
+            ppx->reset( shared_this_, ppx->get() );
+            shared_this_.reset();
+        }
+    }
+};
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS2_HPP_INCLUDED
similarity index 79%
rename from deal.II/contrib/boost/include/boost/intrusive_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/intrusive_ptr.hpp
index 338e672f1e8671d2fb4136eea3b5fd8e6772a1f9..6927a591850fac6197616a0342279c1488ccf68c 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
-#define BOOST_INTRUSIVE_PTR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
+#define BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
 
 //
 //  intrusive_ptr.hpp
@@ -22,7 +22,7 @@
 
 #include <boost/assert.hpp>
 #include <boost/detail/workaround.hpp>
-#include <boost/detail/sp_convertible.hpp>
+#include <boost/smart_ptr/detail/sp_convertible.hpp>
 
 #include <boost/config/no_tr1/functional.hpp>           // for std::less
 
@@ -63,13 +63,13 @@ public:
 
     typedef T element_type;
 
-    intrusive_ptr(): p_(0)
+    intrusive_ptr(): px( 0 )
     {
     }
 
-    intrusive_ptr(T * p, bool add_ref = true): p_(p)
+    intrusive_ptr( T * p, bool add_ref = true ): px( p )
     {
-        if(p_ != 0 && add_ref) intrusive_ptr_add_ref(p_);
+        if( px != 0 && add_ref ) intrusive_ptr_add_ref( px );
     }
 
 #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
@@ -84,21 +84,21 @@ public:
     intrusive_ptr( intrusive_ptr<U> const & rhs )
 
 #endif
-    : p_( rhs.get() )
+    : px( rhs.get() )
     {
-        if( p_ != 0 ) intrusive_ptr_add_ref( p_ );
+        if( px != 0 ) intrusive_ptr_add_ref( px );
     }
 
 #endif
 
-    intrusive_ptr(intrusive_ptr const & rhs): p_(rhs.p_)
+    intrusive_ptr(intrusive_ptr const & rhs): px( rhs.px )
     {
-        if(p_ != 0) intrusive_ptr_add_ref(p_);
+        if( px != 0 ) intrusive_ptr_add_ref( px );
     }
 
     ~intrusive_ptr()
     {
-        if(p_ != 0) intrusive_ptr_release(p_);
+        if( px != 0 ) intrusive_ptr_release( px );
     }
 
 #if !defined(BOOST_NO_MEMBER_TEMPLATES) || defined(BOOST_MSVC6_MEMBER_TEMPLATES)
@@ -109,6 +109,23 @@ public:
         return *this;
     }
 
+#endif
+
+// Move support
+
+#if defined( BOOST_HAS_RVALUE_REFS )
+
+    intrusive_ptr(intrusive_ptr && rhs): px( rhs.px )
+    {
+        rhs.px = 0;
+    }
+
+    intrusive_ptr & operator=(intrusive_ptr && rhs)
+    {
+        this_type(std::move(rhs)).swap(*this);
+        return *this;
+    }
+
 #endif
 
     intrusive_ptr & operator=(intrusive_ptr const & rhs)
@@ -135,63 +152,34 @@ public:
 
     T * get() const
     {
-        return p_;
+        return px;
     }
 
     T & operator*() const
     {
-        BOOST_ASSERT( p_ != 0 );
-        return *p_;
+        BOOST_ASSERT( px != 0 );
+        return *px;
     }
 
     T * operator->() const
     {
-        BOOST_ASSERT( p_ != 0 );
-        return p_;
+        BOOST_ASSERT( px != 0 );
+        return px;
     }
 
-#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
-
-    operator bool () const
-    {
-        return p_ != 0;
-    }
-
-#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
-    typedef T * (this_type::*unspecified_bool_type)() const;
-    
-    operator unspecified_bool_type() const // never throws
-    {
-        return p_ == 0? 0: &this_type::get;
-    }
-
-#else 
-
-    typedef T * this_type::*unspecified_bool_type;
-
-    operator unspecified_bool_type () const
-    {
-        return p_ == 0? 0: &this_type::p_;
-    }
-
-#endif
-
-    // operator! is a Borland-specific workaround
-    bool operator! () const
-    {
-        return p_ == 0;
-    }
+// implicit conversion to "bool"
+#include <boost/smart_ptr/detail/operator_bool.hpp>
 
     void swap(intrusive_ptr & rhs)
     {
-        T * tmp = p_;
-        p_ = rhs.p_;
-        rhs.p_ = tmp;
+        T * tmp = px;
+        px = rhs.px;
+        rhs.px = tmp;
     }
 
 private:
 
-    T * p_;
+    T * px;
 };
 
 template<class T, class U> inline bool operator==(intrusive_ptr<T> const & a, intrusive_ptr<U> const & b)
@@ -308,4 +296,4 @@ template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::
 # pragma warning(pop)
 #endif    
 
-#endif  // #ifndef BOOST_INTRUSIVE_PTR_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED
similarity index 71%
rename from deal.II/contrib/boost/include/boost/make_shared.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/make_shared.hpp
index cc3685b5ab90ebb28704eb6fe558a2730436a1b4..7e1e793e1934d4a31cc2efb160bce68a9403c90a 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
-#define BOOST_MAKE_SHARED_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
+#define BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
 
 //  make_shared.hpp
 //
@@ -13,7 +13,7 @@
 //  for documentation.
 
 #include <boost/config.hpp>
-#include <boost/shared_ptr.hpp>
+#include <boost/smart_ptr/shared_ptr.hpp>
 #include <boost/type_traits/type_with_alignment.hpp>
 #include <boost/type_traits/alignment_of.hpp>
 #include <cstddef>
@@ -60,6 +60,11 @@ public:
     {
     }
 
+    // optimization: do not copy storage_
+    sp_ms_deleter( sp_ms_deleter const & ): initialized_( false )
+    {
+    }
+
     ~sp_ms_deleter()
     {
         destroy();
@@ -100,10 +105,13 @@ template< class T > boost::shared_ptr< T > make_shared()
 
     void * pv = pd->address();
 
-    new( pv ) T();
+    ::new( pv ) T();
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
@@ -114,10 +122,13 @@ template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a
 
     void * pv = pd->address();
 
-    new( pv ) T();
+    ::new( pv ) T();
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
@@ -132,10 +143,13 @@ template< class T, class... Args > boost::shared_ptr< T > make_shared( Args && .
 
     void * pv = pd->address();
 
-    new( pv ) T( detail::forward<Args>( args )... );
+    ::new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ... args )
@@ -146,10 +160,13 @@ template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shar
 
     void * pv = pd->address();
 
-    new( pv ) T( detail::forward<Args>( args )... );
+    ::new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #else
@@ -165,10 +182,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1 )
 
     void * pv = pd->address();
 
-    new( pv ) T( a1 );
+    ::new( pv ) T( a1 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1 >
@@ -180,10 +200,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1 )
 
     void * pv = pd->address();
 
-    new( pv ) T( a1 );
+    ::new( pv ) T( a1 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2 >
@@ -195,10 +218,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2 )
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2 );
+    ::new( pv ) T( a1, a2 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2 >
@@ -210,10 +236,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2 );
+    ::new( pv ) T( a1, a2 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3 >
@@ -225,10 +254,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3 );
+    ::new( pv ) T( a1, a2, a3 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3 >
@@ -240,10 +272,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3 );
+    ::new( pv ) T( a1, a2, a3 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4 >
@@ -255,10 +290,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4 );
+    ::new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4 >
@@ -270,10 +308,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4 );
+    ::new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5 >
@@ -285,10 +326,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5 );
+    ::new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
@@ -300,10 +344,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5 );
+    ::new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -315,10 +362,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -330,10 +380,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -345,10 +398,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -360,10 +416,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -375,10 +434,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -390,10 +452,13 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
@@ -405,10 +470,13 @@ boost::shared_ptr< T > make_shared( A1 const & a1, A2 const & a2, A3 const & a3,
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
@@ -420,14 +488,17 @@ boost::shared_ptr< T > allocate_shared( A const & a, A1 const & a1, A2 const & a
 
     void * pv = pd->address();
 
-    new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
+    ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();
 
-    return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+    T * pt2 = static_cast< T* >( pv );
+
+    boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+    return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #endif
 
 } // namespace boost
 
-#endif // #ifndef BOOST_MAKE_SHARED_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_MAKE_SHARED_HPP_INCLUDED
similarity index 59%
rename from deal.II/contrib/boost/include/boost/scoped_array.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/scoped_array.hpp
index fcb80f6cade635937630aa234ccb2c8479e9a293..483460fa06bb372a7a1edf7040f2c23fef60fb5b 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
-#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
+#define BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
 
 //  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 //  Copyright (c) 2001, 2002 Peter Dimov
@@ -39,7 +39,7 @@ template<class T> class scoped_array // noncopyable
 {
 private:
 
-    T * ptr;
+    T * px;
 
     scoped_array(scoped_array const &);
     scoped_array & operator=(scoped_array const &);
@@ -53,79 +53,48 @@ public:
 
     typedef T element_type;
 
-    explicit scoped_array(T * p = 0) : ptr(p) // never throws
+    explicit scoped_array( T * p = 0 ) : px( p ) // never throws
     {
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        boost::sp_array_constructor_hook(ptr);
+        boost::sp_array_constructor_hook( px );
 #endif
     }
 
     ~scoped_array() // never throws
     {
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        boost::sp_array_destructor_hook(ptr);
+        boost::sp_array_destructor_hook( px );
 #endif
-        boost::checked_array_delete(ptr);
+        boost::checked_array_delete( px );
     }
 
     void reset(T * p = 0) // never throws
     {
-        BOOST_ASSERT(p == 0 || p != ptr); // catch self-reset errors
+        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
         this_type(p).swap(*this);
     }
 
     T & operator[](std::ptrdiff_t i) const // never throws
     {
-        BOOST_ASSERT(ptr != 0);
-        BOOST_ASSERT(i >= 0);
-        return ptr[i];
+        BOOST_ASSERT( px != 0 );
+        BOOST_ASSERT( i >= 0 );
+        return px[i];
     }
 
     T * get() const // never throws
     {
-        return ptr;
+        return px;
     }
 
-    // implicit conversion to "bool"
-
-#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
-
-    operator bool () const
-    {
-        return ptr != 0;
-    }
-
-#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
-    typedef T * (this_type::*unspecified_bool_type)() const;
-    
-    operator unspecified_bool_type() const // never throws
-    {
-        return ptr == 0? 0: &this_type::get;
-    }
-
-#else 
-
-    typedef T * this_type::*unspecified_bool_type;
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return ptr == 0? 0: &this_type::ptr;
-    }
-
-#endif
-
-    bool operator! () const // never throws
-    {
-        return ptr == 0;
-    }
+// implicit conversion to "bool"
+#include <boost/smart_ptr/detail/operator_bool.hpp>
 
     void swap(scoped_array & b) // never throws
     {
-        T * tmp = b.ptr;
-        b.ptr = ptr;
-        ptr = tmp;
+        T * tmp = b.px;
+        b.px = px;
+        px = tmp;
     }
-
 };
 
 template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) // never throws
@@ -135,4 +104,4 @@ template<class T> inline void swap(scoped_array<T> & a, scoped_array<T> & b) //
 
 } // namespace boost
 
-#endif  // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_SCOPED_ARRAY_HPP_INCLUDED
similarity index 60%
rename from deal.II/contrib/boost/include/boost/scoped_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/scoped_ptr.hpp
index 279cec3da6ac1dc9999270391be7d4429213f134..df479e57279bdbccc55970aa41d616737c1f5b32 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
-#define BOOST_SCOPED_PTR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
+#define BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
 
 //  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
 //  Copyright (c) 2001, 2002 Peter Dimov
@@ -40,7 +40,7 @@ template<class T> class scoped_ptr // noncopyable
 {
 private:
 
-    T * ptr;
+    T * px;
 
     scoped_ptr(scoped_ptr const &);
     scoped_ptr & operator=(scoped_ptr const &);
@@ -54,19 +54,19 @@ public:
 
     typedef T element_type;
 
-    explicit scoped_ptr(T * p = 0): ptr(p) // never throws
+    explicit scoped_ptr( T * p = 0 ): px( p ) // never throws
     {
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        boost::sp_scalar_constructor_hook(ptr);
+        boost::sp_scalar_constructor_hook( px );
 #endif
     }
 
 #ifndef BOOST_NO_AUTO_PTR
 
-    explicit scoped_ptr(std::auto_ptr<T> p): ptr(p.release()) // never throws
+    explicit scoped_ptr( std::auto_ptr<T> p ): px( p.release() ) // never throws
     {
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        boost::sp_scalar_constructor_hook(ptr);
+        boost::sp_scalar_constructor_hook( px );
 #endif
     }
 
@@ -75,71 +75,42 @@ public:
     ~scoped_ptr() // never throws
     {
 #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
-        boost::sp_scalar_destructor_hook(ptr);
+        boost::sp_scalar_destructor_hook( px );
 #endif
-        boost::checked_delete(ptr);
+        boost::checked_delete( px );
     }
 
     void reset(T * p = 0) // never throws
     {
-        BOOST_ASSERT(p == 0 || p != ptr); // catch self-reset errors
+        BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors
         this_type(p).swap(*this);
     }
 
     T & operator*() const // never throws
     {
-        BOOST_ASSERT(ptr != 0);
-        return *ptr;
+        BOOST_ASSERT( px != 0 );
+        return *px;
     }
 
     T * operator->() const // never throws
     {
-        BOOST_ASSERT(ptr != 0);
-        return ptr;
+        BOOST_ASSERT( px != 0 );
+        return px;
     }
 
     T * get() const // never throws
     {
-        return ptr;
+        return px;
     }
 
-    // implicit conversion to "bool"
-
-#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
-
-    operator bool () const
-    {
-        return ptr != 0;
-    }
-
-#elif defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
-    typedef T * (this_type::*unspecified_bool_type)() const;
-    
-    operator unspecified_bool_type() const // never throws
-    {
-        return ptr == 0? 0: &this_type::get;
-    }
-
-#else 
-    typedef T * this_type::*unspecified_bool_type;
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return ptr == 0? 0: &this_type::ptr;
-    }
-
-#endif
-
-    bool operator! () const // never throws
-    {
-        return ptr == 0;
-    }
+// implicit conversion to "bool"
+#include <boost/smart_ptr/detail/operator_bool.hpp>
 
     void swap(scoped_ptr & b) // never throws
     {
-        T * tmp = b.ptr;
-        b.ptr = ptr;
-        ptr = tmp;
+        T * tmp = b.px;
+        b.px = px;
+        px = tmp;
     }
 };
 
@@ -157,4 +128,4 @@ template<class T> inline T * get_pointer(scoped_ptr<T> const & p)
 
 } // namespace boost
 
-#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
+#endif // #ifndef BOOST_SMART_PTR_SCOPED_PTR_HPP_INCLUDED
similarity index 71%
rename from deal.II/contrib/boost/include/boost/shared_array.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/shared_array.hpp
index 3b82f35559d781a0290ea8da39e830e1e936512e..1f50403a3825b3fe5a60b89b7cdd0e85f4669b93 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
-#define BOOST_SHARED_ARRAY_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
+#define BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
 
 //
 //  shared_array.hpp
@@ -17,7 +17,7 @@
 #include <boost/config.hpp>   // for broken compiler workarounds
 
 #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
-#include <boost/detail/shared_array_nmt.hpp>
+#include <boost/smart_ptr/detail/shared_array_nmt.hpp>
 #else
 
 #include <memory>             // TR1 cyclic inclusion fix
@@ -25,7 +25,7 @@
 #include <boost/assert.hpp>
 #include <boost/checked_delete.hpp>
 
-#include <boost/detail/shared_count.hpp>
+#include <boost/smart_ptr/detail/shared_count.hpp>
 #include <boost/detail/workaround.hpp>
 
 #include <cstddef>            // for std::ptrdiff_t
@@ -94,54 +94,8 @@ public:
         return px;
     }
 
-    // implicit conversion to "bool"
-
-#if defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x530)
-
-    operator bool () const
-    {
-        return px != 0;
-    }
-
-#elif defined( _MANAGED )
-
-    static void unspecified_bool( this_type*** )
-    {
-    }
-
-    typedef void (*unspecified_bool_type)( this_type*** );
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: unspecified_bool;
-    }
-
-#elif \
-    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
-    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) )
-
-    typedef T * (this_type::*unspecified_bool_type)() const;
-    
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: &this_type::get;
-    }
-
-#else 
-
-    typedef T * this_type::*unspecified_bool_type;
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: &this_type::px;
-    }
-
-#endif
-
-    bool operator! () const // never throws
-    {
-        return px == 0;
-    }
+// implicit conversion to "bool"
+#include <boost/smart_ptr/detail/operator_bool.hpp>
 
     bool unique() const // never throws
     {
@@ -190,4 +144,4 @@ template<class T> void swap(shared_array<T> & a, shared_array<T> & b) // never t
 
 #endif  // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 
-#endif  // #ifndef BOOST_SHARED_ARRAY_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_SHARED_ARRAY_HPP_INCLUDED
similarity index 83%
rename from deal.II/contrib/boost/include/boost/shared_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/shared_ptr.hpp
index ad2bc17bcc920705221aa936aa1420c775115885..1b367f0f4da8da05719b8df75b52cea3f1299db8 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
-#define BOOST_SHARED_PTR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
+#define BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
 
 //
 //  shared_ptr.hpp
@@ -17,7 +17,7 @@
 #include <boost/config.hpp>   // for broken compiler workarounds
 
 #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
-#include <boost/detail/shared_ptr_nmt.hpp>
+#include <boost/smart_ptr/detail/shared_ptr_nmt.hpp>
 #else
 
 // In order to avoid circular dependencies with Boost.TR1
 #include <boost/assert.hpp>
 #include <boost/checked_delete.hpp>
 #include <boost/throw_exception.hpp>
-#include <boost/detail/shared_count.hpp>
+#include <boost/smart_ptr/detail/shared_count.hpp>
 #include <boost/detail/workaround.hpp>
-#include <boost/detail/sp_convertible.hpp>
+#include <boost/smart_ptr/detail/sp_convertible.hpp>
 
 #if !defined(BOOST_SP_NO_ATOMIC_ACCESS)
-#include <boost/detail/spinlock_pool.hpp>
+#include <boost/smart_ptr/detail/spinlock_pool.hpp>
 #include <boost/memory_order.hpp>
 #endif
 
 namespace boost
 {
 
+template<class T> class shared_ptr;
 template<class T> class weak_ptr;
 template<class T> class enable_shared_from_this;
+template<class T> class enable_shared_from_this2;
 
 namespace detail
 {
@@ -100,9 +102,20 @@ template<> struct shared_ptr_traits<void const volatile>
 
 // enable_shared_from_this support
 
-template<class T, class Y> void sp_enable_shared_from_this( shared_count const & pn, boost::enable_shared_from_this<T> const * pe, Y const * px )
+template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe )
 {
-    if(pe != 0) pe->_internal_weak_this._internal_assign(const_cast<Y*>(px), pn);
+    if( pe != 0 )
+    {
+        pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
+    }
+}
+
+template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> * ppx, Y const * py, boost::enable_shared_from_this2< T > const * pe )
+{
+    if( pe != 0 )
+    {
+        pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
+    }
 }
 
 #ifdef _MANAGED
@@ -114,25 +127,16 @@ struct sp_any_pointer
     template<class T> sp_any_pointer( T* ) {}
 };
 
-inline void sp_enable_shared_from_this( shared_count const & /*pn*/, sp_any_pointer, sp_any_pointer )
+inline void sp_enable_shared_from_this( sp_any_pointer, sp_any_pointer, sp_any_pointer )
 {
 }
 
 #else // _MANAGED
 
-#ifdef sgi
-// Turn off: the last argument of the varargs function "sp_enable_shared_from_this" is unnamed
-# pragma set woff 3506
-#endif
-
-inline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... )
+inline void sp_enable_shared_from_this( ... )
 {
 }
 
-#ifdef sgi
-# pragma reset woff 3506
-#endif
-
 #endif // _MANAGED
 
 #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_AUTO_PTR )
@@ -182,7 +186,7 @@ public:
     template<class Y>
     explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
     {
-        boost::detail::sp_enable_shared_from_this( pn, p, p );
+        boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
     //
@@ -193,29 +197,17 @@ public:
 
     template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)
     {
-        boost::detail::sp_enable_shared_from_this( pn, p, p );
+        boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
     // As above, but with allocator. A's copy constructor shall not throw.
 
     template<class Y, class D, class A> shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a )
     {
-        boost::detail::sp_enable_shared_from_this( pn, p, p );
-    }
-
-//  generated copy constructor, assignment, destructor are fine...
-
-//  except that Borland C++ has a bug, and g++ with -Wsynth warns
-#if defined(__BORLANDC__) || defined(__GNUC__)
-
-    shared_ptr & operator=(shared_ptr const & r) // never throws
-    {
-        px = r.px;
-        pn = r.pn; // shared_count::op= doesn't throw
-        return *this;
+        boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
-#endif
+//  generated copy constructor, destructor are fine
 
     template<class Y>
     explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn) // may throw
@@ -288,17 +280,17 @@ public:
     {
         Y * tmp = r.get();
         pn = boost::detail::shared_count(r);
-        boost::detail::sp_enable_shared_from_this( pn, tmp, tmp );
+        boost::detail::sp_enable_shared_from_this( this, tmp, tmp );
     }
 
 #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
 
     template<class Ap>
-    shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr<Ap, int>::type = 0 ): px( r.get() ), pn()
+    explicit shared_ptr( Ap r, typename boost::detail::sp_enable_if_auto_ptr<Ap, int>::type = 0 ): px( r.get() ), pn()
     {
         typename Ap::element_type * tmp = r.get();
         pn = boost::detail::shared_count( r );
-        boost::detail::sp_enable_shared_from_this( pn, tmp, tmp );
+        boost::detail::sp_enable_shared_from_this( this, tmp, tmp );
     }
 
 
@@ -306,13 +298,20 @@ public:
 
 #endif // BOOST_NO_AUTO_PTR
 
-#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1300)
+    // assignment
+
+    shared_ptr & operator=( shared_ptr const & r ) // never throws
+    {
+        this_type(r).swap(*this);
+        return *this;
+    }
+
+#if !defined(BOOST_MSVC) || (BOOST_MSVC >= 1400)
 
     template<class Y>
     shared_ptr & operator=(shared_ptr<Y> const & r) // never throws
     {
-        px = r.px;
-        pn = r.pn; // shared_count::op= doesn't throw
+        this_type(r).swap(*this);
         return *this;
     }
 
@@ -369,14 +368,14 @@ public:
 
     shared_ptr & operator=( shared_ptr && r ) // never throws
     {
-        this_type( static_cast< shared_ptr && >( r ) ).swap( *this );
+        this_type( std::move( r ) ).swap( *this );
         return *this;
     }
 
     template<class Y>
     shared_ptr & operator=( shared_ptr<Y> && r ) // never throws
     {
-        this_type( static_cast< shared_ptr<Y> && >( r ) ).swap( *this );
+        this_type( std::move( r ) ).swap( *this );
         return *this;
     }
 
@@ -425,57 +424,8 @@ public:
         return px;
     }
 
-    // implicit conversion to "bool"
-
-#if ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, < 0x570) ) || defined(__CINT__)
-
-    operator bool () const
-    {
-        return px != 0;
-    }
-
-#elif defined( _MANAGED )
-
-    static void unspecified_bool( this_type*** )
-    {
-    }
-
-    typedef void (*unspecified_bool_type)( this_type*** );
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: unspecified_bool;
-    }
-
-#elif \
-    ( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, < 0x3200) ) || \
-    ( defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 304) ) || \
-    ( defined(__SUNPRO_CC) && BOOST_WORKAROUND(__SUNPRO_CC, <= 0x590) )
-
-    typedef T * (this_type::*unspecified_bool_type)() const;
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: &this_type::get;
-    }
-
-#else
-
-    typedef T * this_type::*unspecified_bool_type;
-
-    operator unspecified_bool_type() const // never throws
-    {
-        return px == 0? 0: &this_type::px;
-    }
-
-#endif
-
-    // operator! is redundant, but some compilers need it
-
-    bool operator! () const // never throws
-    {
-        return px == 0;
-    }
+// implicit conversion to "bool"
+#include <boost/smart_ptr/detail/operator_bool.hpp>
 
     bool unique() const // never throws
     {
@@ -748,4 +698,4 @@ template<class T> inline bool atomic_compare_exchange_explicit( shared_ptr<T> *
 
 #endif  // #if defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)
 
-#endif  // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_SHARED_PTR_HPP_INCLUDED
similarity index 74%
rename from deal.II/contrib/boost/include/boost/weak_ptr.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/smart_ptr/weak_ptr.hpp
index b300813643a7a7a3ab727b619f730923a8eabdb8..621c433a0356c37ef46cb6a8f55cd0c49bddb6f8 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BOOST_WEAK_PTR_HPP_INCLUDED
-#define BOOST_WEAK_PTR_HPP_INCLUDED
+#ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
+#define BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
 
 //
 //  weak_ptr.hpp
@@ -14,8 +14,8 @@
 //
 
 #include <memory> // boost.TR1 include order fix
-#include <boost/detail/shared_count.hpp>
-#include <boost/shared_ptr.hpp>
+#include <boost/smart_ptr/detail/shared_count.hpp>
+#include <boost/smart_ptr/shared_ptr.hpp>
 
 #ifdef BOOST_MSVC  // moved here to work around VC++ compiler crash
 # pragma warning(push)
@@ -70,11 +70,43 @@ public:
     weak_ptr( weak_ptr<Y> const & r )
 
 #endif
-    : pn(r.pn) // never throws
+    : px(r.lock().get()), pn(r.pn) // never throws
     {
-        px = r.lock().get();
     }
 
+#if defined( BOOST_HAS_RVALUE_REFS )
+
+    template<class Y>
+#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
+
+    weak_ptr( weak_ptr<Y> && r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
+
+#else
+
+    weak_ptr( weak_ptr<Y> && r )
+
+#endif
+    : px(r.lock().get()), pn(std::move(r.pn)) // never throws
+    {
+        r.px = 0;
+    }
+
+    // for better efficiency in the T == Y case
+    weak_ptr( weak_ptr && r ): px( r.px ), pn(std::move(r.pn)) // never throws
+    {
+        r.px = 0;
+    }
+
+    // for better efficiency in the T == Y case
+    weak_ptr & operator=( weak_ptr && r ) // never throws
+    {
+        this_type( std::move( r ) ).swap( *this );
+        return *this;
+    }
+
+
+#endif
+
     template<class Y>
 #if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
 
@@ -99,6 +131,17 @@ public:
         return *this;
     }
 
+#if defined( BOOST_HAS_RVALUE_REFS )
+
+    template<class Y>
+    weak_ptr & operator=(weak_ptr<Y> && r)
+    {
+        this_type( std::move( r ) ).swap( *this );
+        return *this;
+    }
+
+#endif
+
     template<class Y>
     weak_ptr & operator=(shared_ptr<Y> const & r) // never throws
     {
@@ -124,6 +167,11 @@ public:
         return pn.use_count() == 0;
     }
 
+    bool _empty() const // extension, not in std::weak_ptr
+    {
+        return pn.empty();
+    }
+
     void reset() // never throws in 1.30+
     {
         this_type().swap(*this);
@@ -179,4 +227,4 @@ template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b)
 # pragma warning(pop)
 #endif    
 
-#endif  // #ifndef BOOST_WEAK_PTR_HPP_INCLUDED
+#endif  // #ifndef BOOST_SMART_PTR_WEAK_PTR_HPP_INCLUDED
similarity index 96%
rename from deal.II/contrib/boost/include/boost/spirit.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/spirit.hpp
index 7250ec15891732c01956e423aa72c8b6bc20e40d..7de49e68b35d122f8ac86d4db246bd0ff3654228 100644 (file)
@@ -1,6 +1,6 @@
 /*=============================================================================
   Copyright (c) 2001-2008 Joel de Guzman
-  Copyright (c) 2001-2008 Hartmut Kaiser
+  Copyright (c) 2001-2009 Hartmut Kaiser
   http://spirit.sourceforge.net/
 
   Distributed under the Boost Software License, Version 1.0. (See accompanying
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/swap.hpp b/deal.II/contrib/boost-1.41.0/include/boost/swap.hpp
new file mode 100644 (file)
index 0000000..dfc11f0
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright (C) 2007 Joseph Gauterin
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_SWAP_HPP
+#define BOOST_SWAP_HPP
+
+#include "boost/utility/swap.hpp"
+
+#endif
similarity index 90%
rename from deal.II/contrib/boost/include/boost/thread.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread.hpp
index f0a39c3b579839526ce1889bf3cfd84091145c8d..892bbb853bd7e72687a2f27ef639df470946bdd9 100644 (file)
@@ -1,6 +1,6 @@
 // Copyright (C) 2001-2003
 // William E. Kempf
-// (C) Copyright 2008 Anthony Williams
+// (C) Copyright 2008-9 Anthony Williams
 //
 // Distributed under the Boost Software License, Version 1.0. (See accompanying 
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -21,5 +21,6 @@
 #include <boost/thread/locks.hpp>
 #include <boost/thread/shared_mutex.hpp>
 #include <boost/thread/barrier.hpp>
+#include <boost/thread/future.hpp>
 
 #endif
similarity index 92%
rename from deal.II/contrib/boost/include/boost/thread/detail/move.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/detail/move.hpp
index 044ecda6c7995af49bd3833833983a43e9293dee..eb21107f908a44fc366eb9c4603291f8ff89082b 100644 (file)
@@ -41,9 +41,9 @@ namespace boost
 
 #ifndef BOOST_NO_SFINAE
     template<typename T>
-    typename enable_if<boost::is_convertible<T&,detail::thread_move_t<T> >, T >::type move(T& t)
+    typename enable_if<boost::is_convertible<T&,detail::thread_move_t<T> >, detail::thread_move_t<T> >::type move(T& t)
     {
-        return T(detail::thread_move_t<T>(t));
+        return detail::thread_move_t<T>(t);
     }
 #endif
     
similarity index 81%
rename from deal.II/contrib/boost/include/boost/thread/detail/thread.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread.hpp
index fbb895d17062c7ffa22af5a87452578b30844a53..170801b61d52ac017f41873578646075ea59c64f 100644 (file)
@@ -144,6 +144,9 @@ namespace boost
         struct dummy;
 #endif
     public:
+#ifdef __SUNPRO_CC 
+        thread(const volatile thread&); 
+#endif 
         thread();
         ~thread();
 
@@ -201,14 +204,21 @@ namespace boost
             thread_info=x->thread_info;
             x->thread_info.reset();
         }
-        
+       
+#ifdef __SUNPRO_CC 
+        thread& operator=(thread x) 
+        { 
+            swap(x); 
+            return *this; 
+        } 
+#else
         thread& operator=(detail::thread_move_t<thread> x)
         {
             thread new_thread(x);
             swap(new_thread);
             return *this;
         }
-        
+#endif   
         operator detail::thread_move_t<thread>()
         {
             return move();
@@ -339,35 +349,14 @@ namespace boost
         return t;
     }
 #else
-    inline thread move(detail::thread_move_t<thread> t)
+    inline detail::thread_move_t<thread> move(detail::thread_move_t<thread> t)
     {
-        return thread(t);
+        return t;
     }
 #endif
 
     namespace this_thread
     {
-        class BOOST_THREAD_DECL disable_interruption
-        {
-            disable_interruption(const disable_interruption&);
-            disable_interruption& operator=(const disable_interruption&);
-            
-            bool interruption_was_enabled;
-            friend class restore_interruption;
-        public:
-            disable_interruption();
-            ~disable_interruption();
-        };
-
-        class BOOST_THREAD_DECL restore_interruption
-        {
-            restore_interruption(const restore_interruption&);
-            restore_interruption& operator=(const restore_interruption&);
-        public:
-            explicit restore_interruption(disable_interruption& d);
-            ~restore_interruption();
-        };
-
         thread::id BOOST_THREAD_DECL get_id();
 
         void BOOST_THREAD_DECL interruption_point();
@@ -487,83 +476,6 @@ namespace boost
             detail::add_thread_exit_function(thread_exit_func);
         }
     }
-
-    class thread_group:
-        private noncopyable
-    {
-    public:
-        ~thread_group()
-        {
-            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
-                it!=end;
-                ++it)
-            {
-                delete *it;
-            }
-        }
-
-        template<typename F>
-        thread* create_thread(F threadfunc)
-        {
-            boost::lock_guard<mutex> guard(m);
-            std::auto_ptr<thread> new_thread(new thread(threadfunc));
-            threads.push_back(new_thread.get());
-            return new_thread.release();
-        }
-        
-        void add_thread(thread* thrd)
-        {
-            if(thrd)
-            {
-                boost::lock_guard<mutex> guard(m);
-                threads.push_back(thrd);
-            }
-        }
-            
-        void remove_thread(thread* thrd)
-        {
-            boost::lock_guard<mutex> guard(m);
-            std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd);
-            if(it!=threads.end())
-            {
-                threads.erase(it);
-            }
-        }
-        
-        void join_all()
-        {
-            boost::lock_guard<mutex> guard(m);
-            
-            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
-                it!=end;
-                ++it)
-            {
-                (*it)->join();
-            }
-        }
-        
-        void interrupt_all()
-        {
-            boost::lock_guard<mutex> guard(m);
-            
-            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
-                it!=end;
-                ++it)
-            {
-                (*it)->interrupt();
-            }
-        }
-        
-        size_t size() const
-        {
-            boost::lock_guard<mutex> guard(m);
-            return threads.size();
-        }
-        
-    private:
-        std::list<thread*> threads;
-        mutable mutex m;
-    };
 }
 
 #ifdef BOOST_MSVC
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_group.hpp b/deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_group.hpp
new file mode 100644 (file)
index 0000000..823b92e
--- /dev/null
@@ -0,0 +1,105 @@
+#ifndef BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
+#define BOOST_THREAD_DETAIL_THREAD_GROUP_HPP
+// 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)
+// (C) Copyright 2007-9 Anthony Williams
+
+#include <list>
+#include <boost/thread/shared_mutex.hpp>
+#include <boost/thread/mutex.hpp>
+
+#include <boost/config/abi_prefix.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4251)
+#endif
+
+namespace boost
+{
+    class thread_group:
+        private noncopyable
+    {
+    public:
+        ~thread_group()
+        {
+            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
+                it!=end;
+                ++it)
+            {
+                delete *it;
+            }
+        }
+
+        template<typename F>
+        thread* create_thread(F threadfunc)
+        {
+            boost::lock_guard<shared_mutex> guard(m);
+            std::auto_ptr<thread> new_thread(new thread(threadfunc));
+            threads.push_back(new_thread.get());
+            return new_thread.release();
+        }
+        
+        void add_thread(thread* thrd)
+        {
+            if(thrd)
+            {
+                boost::lock_guard<shared_mutex> guard(m);
+                threads.push_back(thrd);
+            }
+        }
+            
+        void remove_thread(thread* thrd)
+        {
+            boost::lock_guard<shared_mutex> guard(m);
+            std::list<thread*>::iterator const it=std::find(threads.begin(),threads.end(),thrd);
+            if(it!=threads.end())
+            {
+                threads.erase(it);
+            }
+        }
+        
+        void join_all()
+        {
+            boost::shared_lock<shared_mutex> guard(m);
+            
+            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
+                it!=end;
+                ++it)
+            {
+                (*it)->join();
+            }
+        }
+        
+        void interrupt_all()
+        {
+            boost::shared_lock<shared_mutex> guard(m);
+            
+            for(std::list<thread*>::iterator it=threads.begin(),end=threads.end();
+                it!=end;
+                ++it)
+            {
+                (*it)->interrupt();
+            }
+        }
+        
+        size_t size() const
+        {
+            boost::shared_lock<shared_mutex> guard(m);
+            return threads.size();
+        }
+        
+    private:
+        std::list<thread*> threads;
+        mutable shared_mutex m;
+    };
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_interruption.hpp b/deal.II/contrib/boost-1.41.0/include/boost/thread/detail/thread_interruption.hpp
new file mode 100644 (file)
index 0000000..60c0e65
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef BOOST_THREAD_DETAIL_THREAD_INTERRUPTION_HPP
+#define BOOST_THREAD_DETAIL_THREAD_INTERRUPTION_HPP
+// 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)
+// (C) Copyright 2007-9 Anthony Williams
+
+namespace boost
+{
+    namespace this_thread
+    {
+        class BOOST_THREAD_DECL disable_interruption
+        {
+            disable_interruption(const disable_interruption&);
+            disable_interruption& operator=(const disable_interruption&);
+            
+            bool interruption_was_enabled;
+            friend class restore_interruption;
+        public:
+            disable_interruption();
+            ~disable_interruption();
+        };
+
+        class BOOST_THREAD_DECL restore_interruption
+        {
+            restore_interruption(const restore_interruption&);
+            restore_interruption& operator=(const restore_interruption&);
+        public:
+            explicit restore_interruption(disable_interruption& d);
+            ~restore_interruption();
+        };
+    }
+}
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/thread/exceptions.hpp b/deal.II/contrib/boost-1.41.0/include/boost/thread/exceptions.hpp
new file mode 100644 (file)
index 0000000..2a05b50
--- /dev/null
@@ -0,0 +1,182 @@
+// Copyright (C) 2001-2003
+// William E. Kempf
+// Copyright (C) 2007-9 Anthony Williams
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_EXCEPTIONS_PDM070801_H
+#define BOOST_THREAD_EXCEPTIONS_PDM070801_H
+
+#include <boost/thread/detail/config.hpp>
+
+//  pdm: Sorry, but this class is used all over the place & I end up
+//       with recursive headers if I don't separate it
+//  wek: Not sure why recursive headers would cause compilation problems
+//       given the include guards, but regardless it makes sense to
+//       seperate this out any way.
+
+#include <string>
+#include <stdexcept>
+
+#include <boost/config/abi_prefix.hpp>
+
+namespace boost
+{
+
+    class thread_interrupted
+    {};
+
+    class thread_exception:
+        public std::exception
+    {
+    protected:
+        thread_exception():
+            m_sys_err(0)
+        {}
+    
+        thread_exception(int sys_err_code):
+            m_sys_err(sys_err_code)
+        {}
+    
+
+    public:
+        ~thread_exception() throw()
+        {}
+    
+
+        int native_error() const
+        {
+            return m_sys_err;
+        }
+    
+
+    private:
+        int m_sys_err;
+    };
+
+    class condition_error:
+        public std::exception
+    {
+    public:
+        const char* what() const throw()
+        {
+            return "Condition error";
+        }
+    };
+    
+
+    class lock_error:
+        public thread_exception
+    {
+    public:
+        lock_error()
+        {}
+    
+        lock_error(int sys_err_code):
+            thread_exception(sys_err_code)
+        {}
+    
+        ~lock_error() throw()
+        {}
+    
+
+        virtual const char* what() const throw()
+        {
+            return "boost::lock_error";
+        }
+    };
+
+    class thread_resource_error:
+        public thread_exception
+    {
+    public:
+        thread_resource_error()
+        {}
+    
+        thread_resource_error(int sys_err_code):
+            thread_exception(sys_err_code)
+        {}
+    
+        ~thread_resource_error() throw()
+        {}
+    
+
+        virtual const char* what() const throw()
+        {
+            return "boost::thread_resource_error";
+        }
+    
+    };
+
+    class unsupported_thread_option:
+        public thread_exception
+    {
+    public:
+        unsupported_thread_option()
+        {}
+    
+        unsupported_thread_option(int sys_err_code):
+            thread_exception(sys_err_code)
+        {}
+    
+        ~unsupported_thread_option() throw()
+        {}
+    
+
+        virtual const char* what() const throw()
+        {
+            return "boost::unsupported_thread_option";
+        }
+    
+    };
+
+    class invalid_thread_argument:
+        public thread_exception
+    {
+    public:
+        invalid_thread_argument()
+        {}
+    
+        invalid_thread_argument(int sys_err_code):
+            thread_exception(sys_err_code)
+        {}
+    
+        ~invalid_thread_argument() throw()
+        {}
+    
+
+        virtual const char* what() const throw()
+        {
+            return "boost::invalid_thread_argument";
+        }
+    
+    };
+
+    class thread_permission_error:
+        public thread_exception
+    {
+    public:
+        thread_permission_error()
+        {}
+    
+        thread_permission_error(int sys_err_code):
+            thread_exception(sys_err_code)
+        {}
+    
+        ~thread_permission_error() throw()
+        {}
+    
+
+        virtual const char* what() const throw()
+        {
+            return "boost::thread_permission_error";
+        }
+    
+    };
+
+} // namespace boost
+
+#include <boost/config/abi_suffix.hpp>
+
+#endif
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/thread/future.hpp b/deal.II/contrib/boost-1.41.0/include/boost/thread/future.hpp
new file mode 100644 (file)
index 0000000..3d694eb
--- /dev/null
@@ -0,0 +1,1364 @@
+//  (C) Copyright 2008-9 Anthony Williams 
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_THREAD_FUTURE_HPP
+#define BOOST_THREAD_FUTURE_HPP
+#include <stdexcept>
+#include <boost/thread/detail/move.hpp>
+#include <boost/thread/thread_time.hpp>
+#include <boost/exception_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/ref.hpp>
+#include <boost/scoped_array.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <list>
+#include <boost/next_prior.hpp>
+#include <vector>
+
+namespace boost
+{
+    class future_uninitialized:
+        public std::logic_error
+    {
+    public:
+        future_uninitialized():
+            std::logic_error("Future Uninitialized")
+        {}
+    };
+    class broken_promise:
+        public std::logic_error
+    {
+    public:
+        broken_promise():
+            std::logic_error("Broken promise")
+        {}
+    };
+    class future_already_retrieved:
+        public std::logic_error
+    {
+    public:
+        future_already_retrieved():
+            std::logic_error("Future already retrieved")
+        {}
+    };
+    class promise_already_satisfied:
+        public std::logic_error
+    {
+    public:
+        promise_already_satisfied():
+            std::logic_error("Promise already satisfied")
+        {}
+    };
+
+    class task_already_started:
+        public std::logic_error
+    {
+    public:
+        task_already_started():
+            std::logic_error("Task already started")
+        {}
+    };
+
+    class task_moved:
+        public std::logic_error
+    {
+    public:
+        task_moved():
+            std::logic_error("Task moved")
+        {}
+    };
+
+    namespace future_state
+    {
+        enum state { uninitialized, waiting, ready, moved };
+    }
+
+    namespace detail
+    {
+        struct future_object_base
+        {
+            boost::exception_ptr exception;
+            bool done;
+            boost::mutex mutex;
+            boost::condition_variable waiters;
+            typedef std::list<boost::condition_variable_any*> waiter_list;
+            waiter_list external_waiters;
+            boost::function<void()> callback;
+
+            future_object_base():
+                done(false)
+            {}
+            virtual ~future_object_base()
+            {}
+
+            waiter_list::iterator register_external_waiter(boost::condition_variable_any& cv)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                return external_waiters.insert(external_waiters.end(),&cv);
+            }
+            
+            void remove_external_waiter(waiter_list::iterator it)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                external_waiters.erase(it);
+            }
+
+            void mark_finished_internal()
+            {
+                done=true;
+                waiters.notify_all();
+                for(waiter_list::const_iterator it=external_waiters.begin(),
+                        end=external_waiters.end();it!=end;++it)
+                {
+                    (*it)->notify_all();
+                }
+            }
+
+            struct relocker
+            {
+                boost::unique_lock<boost::mutex>& lock;
+                
+                relocker(boost::unique_lock<boost::mutex>& lock_):
+                    lock(lock_)
+                {
+                    lock.unlock();
+                }
+                ~relocker()
+                {
+                    lock.lock();
+                }
+            };
+
+            void do_callback(boost::unique_lock<boost::mutex>& lock)
+            {
+                if(callback && !done)
+                {
+                    boost::function<void()> local_callback=callback;
+                    relocker relock(lock);
+                    local_callback();
+                }
+            }
+            
+
+            void wait(bool rethrow=true)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                while(!done)
+                {
+                    waiters.wait(lock);
+                }
+                if(rethrow && exception)
+                {
+                    boost::rethrow_exception(exception);
+                }
+            }
+
+            bool timed_wait_until(boost::system_time const& target_time)
+            {
+                boost::unique_lock<boost::mutex> lock(mutex);
+                do_callback(lock);
+                while(!done)
+                {
+                    bool const success=waiters.timed_wait(lock,target_time);
+                    if(!success && !done)
+                    {
+                        return false;
+                    }
+                }
+                return true;
+            }
+            
+            void mark_exceptional_finish_internal(boost::exception_ptr const& e)
+            {
+                exception=e;
+                mark_finished_internal();
+            }
+            void mark_exceptional_finish()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_exceptional_finish_internal(boost::current_exception());
+            }
+
+            bool has_value()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                return done && !exception;
+            }
+            bool has_exception()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                return done && exception;
+            }
+
+            template<typename F,typename U>
+            void set_wait_callback(F f,U* u)
+            {
+                callback=boost::bind(f,boost::ref(*u));
+            }
+            
+        private:
+            future_object_base(future_object_base const&);
+            future_object_base& operator=(future_object_base const&);
+        };
+
+        template<typename T>
+        struct future_traits
+        {
+            typedef boost::scoped_ptr<T> storage_type;
+#ifdef BOOST_HAS_RVALUE_REFS
+            typedef T const& source_reference_type;
+            struct dummy;
+            typedef typename boost::mpl::if_<boost::is_fundamental<T>,dummy&,T&&>::type rvalue_source_type;
+            typedef typename boost::mpl::if_<boost::is_fundamental<T>,T,T&&>::type move_dest_type;
+#else
+            typedef T& source_reference_type;
+            typedef typename boost::mpl::if_<boost::is_convertible<T&,boost::detail::thread_move_t<T> >,boost::detail::thread_move_t<T>,T const&>::type rvalue_source_type;
+            typedef typename boost::mpl::if_<boost::is_convertible<T&,boost::detail::thread_move_t<T> >,boost::detail::thread_move_t<T>,T>::type move_dest_type;
+#endif
+
+            static void init(storage_type& storage,source_reference_type t)
+            {
+                storage.reset(new T(t));
+            }
+            
+            static void init(storage_type& storage,rvalue_source_type t)
+            {
+                storage.reset(new T(static_cast<rvalue_source_type>(t)));
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage.reset();
+            }
+        };
+        
+        template<typename T>
+        struct future_traits<T&>
+        {
+            typedef T* storage_type;
+            typedef T& source_reference_type;
+            struct rvalue_source_type
+            {};
+            typedef T& move_dest_type;
+
+            static void init(storage_type& storage,T& t)
+            {
+                storage=&t;
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage=0;
+            }
+        };
+
+        template<>
+        struct future_traits<void>
+        {
+            typedef bool storage_type;
+            typedef void move_dest_type;
+
+            static void init(storage_type& storage)
+            {
+                storage=true;
+            }
+
+            static void cleanup(storage_type& storage)
+            {
+                storage=false;
+            }
+
+        };
+
+        template<typename T>
+        struct future_object:
+            detail::future_object_base
+        {
+            typedef typename future_traits<T>::storage_type storage_type;
+            typedef typename future_traits<T>::source_reference_type source_reference_type;
+            typedef typename future_traits<T>::rvalue_source_type rvalue_source_type;
+            typedef typename future_traits<T>::move_dest_type move_dest_type;
+            
+            storage_type result;
+
+            future_object():
+                result(0)
+            {}
+
+            void mark_finished_with_result_internal(source_reference_type result_)
+            {
+                future_traits<T>::init(result,result_);
+                mark_finished_internal();
+            }
+            void mark_finished_with_result_internal(rvalue_source_type result_)
+            {
+                future_traits<T>::init(result,static_cast<rvalue_source_type>(result_));
+                mark_finished_internal();
+            }
+
+            void mark_finished_with_result(source_reference_type result_)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal(result_);
+            }
+            void mark_finished_with_result(rvalue_source_type result_)
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal(result_);
+            }
+
+            move_dest_type get()
+            {
+                wait();
+                return *result;
+            }
+
+            future_state::state get_state()
+            {
+                boost::lock_guard<boost::mutex> guard(mutex);
+                if(!done)
+                {
+                    return future_state::waiting;
+                }
+                else
+                {
+                    return future_state::ready;
+                }
+            }
+
+        private:
+            future_object(future_object const&);
+            future_object& operator=(future_object const&);
+        };
+
+        template<>
+        struct future_object<void>:
+            detail::future_object_base
+        {
+            future_object()
+            {}
+
+            void mark_finished_with_result_internal()
+            {
+                mark_finished_internal();
+            }
+
+            void mark_finished_with_result()
+            {
+                boost::lock_guard<boost::mutex> lock(mutex);
+                mark_finished_with_result_internal();
+            }
+
+            void get()
+            {
+                wait();
+            }
+            
+            future_state::state get_state()
+            {
+                boost::lock_guard<boost::mutex> guard(mutex);
+                if(!done)
+                {
+                    return future_state::waiting;
+                }
+                else
+                {
+                    return future_state::ready;
+                }
+            }
+
+        private:
+            future_object(future_object const&);
+            future_object& operator=(future_object const&);
+        };
+
+        class future_waiter
+        {
+            struct registered_waiter
+            {
+                boost::shared_ptr<detail::future_object_base> future;
+                detail::future_object_base::waiter_list::iterator wait_iterator;
+                unsigned index;
+
+                registered_waiter(boost::shared_ptr<detail::future_object_base> const& future_,
+                                  detail::future_object_base::waiter_list::iterator wait_iterator_,
+                                  unsigned index_):
+                    future(future_),wait_iterator(wait_iterator_),index(index_)
+                {}
+
+            };
+            
+            struct all_futures_lock
+            {
+                unsigned count;
+                boost::scoped_array<boost::unique_lock<boost::mutex> > locks;
+                
+                all_futures_lock(std::vector<registered_waiter>& futures):
+                    count(futures.size()),locks(new boost::unique_lock<boost::mutex>[count])
+                {
+                    for(unsigned i=0;i<count;++i)
+                    {
+                        locks[i]=boost::unique_lock<boost::mutex>(futures[i].future->mutex);
+                    }
+                }
+                
+                void lock()
+                {
+                    boost::lock(locks.get(),locks.get()+count);
+                }
+                
+                void unlock()
+                {
+                    for(unsigned i=0;i<count;++i)
+                    {
+                        locks[i].unlock();
+                    }
+                }
+            };
+            
+            boost::condition_variable_any cv;
+            std::vector<registered_waiter> futures;
+            unsigned future_count;
+            
+        public:
+            future_waiter():
+                future_count(0)
+            {}
+            
+            template<typename F>
+            void add(F& f)
+            {
+                if(f.future)
+                {
+                    futures.push_back(registered_waiter(f.future,f.future->register_external_waiter(cv),future_count));
+                }
+                ++future_count;
+            }
+
+            unsigned wait()
+            {
+                all_futures_lock lk(futures);
+                for(;;)
+                {
+                    for(unsigned i=0;i<futures.size();++i)
+                    {
+                        if(futures[i].future->done)
+                        {
+                            return futures[i].index;
+                        }
+                    }
+                    cv.wait(lk);
+                }
+            }
+            
+            ~future_waiter()
+            {
+                for(unsigned i=0;i<futures.size();++i)
+                {
+                    futures[i].future->remove_external_waiter(futures[i].wait_iterator);
+                }
+            }
+            
+        };
+        
+    }
+
+    template <typename R>
+    class unique_future;
+
+    template <typename R>
+    class shared_future;
+
+    template<typename T>
+    struct is_future_type
+    {
+        BOOST_STATIC_CONSTANT(bool, value=false);
+    };
+    
+    template<typename T>
+    struct is_future_type<unique_future<T> >
+    {
+        BOOST_STATIC_CONSTANT(bool, value=true);
+    };
+    
+    template<typename T>
+    struct is_future_type<shared_future<T> >
+    {
+        BOOST_STATIC_CONSTANT(bool, value=true);
+    };
+
+    template<typename Iterator>
+    typename boost::disable_if<is_future_type<Iterator>,void>::type wait_for_all(Iterator begin,Iterator end)
+    {
+        for(Iterator current=begin;current!=end;++current)
+        {
+            current->wait();
+        }
+    }
+
+    template<typename F1,typename F2>
+    typename boost::enable_if<is_future_type<F1>,void>::type wait_for_all(F1& f1,F2& f2)
+    {
+        f1.wait();
+        f2.wait();
+    }
+
+    template<typename F1,typename F2,typename F3>
+    void wait_for_all(F1& f1,F2& f2,F3& f3)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+    }
+    
+    template<typename F1,typename F2,typename F3,typename F4>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+    {
+        f1.wait();
+        f2.wait();
+        f3.wait();
+        f4.wait();
+        f5.wait();
+    }
+
+    template<typename Iterator>
+    typename boost::disable_if<is_future_type<Iterator>,Iterator>::type wait_for_any(Iterator begin,Iterator end)
+    {
+        detail::future_waiter waiter;
+        for(Iterator current=begin;current!=end;++current)
+        {
+            waiter.add(*current);
+        }
+        return boost::next(begin,waiter.wait());
+    }
+
+    template<typename F1,typename F2>
+    typename boost::enable_if<is_future_type<F1>,unsigned>::type wait_for_any(F1& f1,F2& f2)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        return waiter.wait();
+    }
+
+    template<typename F1,typename F2,typename F3>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        return waiter.wait();
+    }
+    
+    template<typename F1,typename F2,typename F3,typename F4>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        waiter.add(f4);
+        return waiter.wait();
+    }
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5)
+    {
+        detail::future_waiter waiter;
+        waiter.add(f1);
+        waiter.add(f2);
+        waiter.add(f3);
+        waiter.add(f4);
+        waiter.add(f5);
+        return waiter.wait();
+    }
+    
+    template <typename R>
+    class promise;
+
+    template <typename R>
+    class packaged_task;
+
+    template <typename R>
+    class unique_future
+    {
+        unique_future(unique_future & rhs);// = delete;
+        unique_future& operator=(unique_future& rhs);// = delete;
+
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+        
+        future_ptr future;
+
+        friend class shared_future<R>;
+        friend class promise<R>;
+        friend class packaged_task<R>;
+        friend class detail::future_waiter;
+
+        typedef typename detail::future_traits<R>::move_dest_type move_dest_type;
+
+        unique_future(future_ptr future_):
+            future(future_)
+        {}
+
+    public:
+        typedef future_state::state state;
+
+        unique_future()
+        {}
+       
+        ~unique_future()
+        {}
+
+#ifdef BOOST_HAS_RVALUE_REFS
+        unique_future(unique_future && other)
+        {
+            future.swap(other.future);
+        }
+        unique_future& operator=(unique_future && other)
+        {
+            future=other.future;
+            other.future.reset();
+            return *this;
+        }
+#else
+        unique_future(boost::detail::thread_move_t<unique_future> other):
+            future(other->future)
+        {
+            other->future.reset();
+        }
+
+        unique_future& operator=(boost::detail::thread_move_t<unique_future> other)
+        {
+            future=other->future;
+            other->future.reset();
+            return *this;
+        }
+
+        operator boost::detail::thread_move_t<unique_future>()
+        {
+            return boost::detail::thread_move_t<unique_future>(*this);
+        }
+#endif
+
+        void swap(unique_future& other)
+        {
+            future.swap(other.future);
+        }
+
+        // retrieving the value
+        move_dest_type get()
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+
+            return future->get();
+        }
+        
+        // functions to check state, and wait for ready
+        state get_state() const
+        {
+            if(!future)
+            {
+                return future_state::uninitialized;
+            }
+            return future->get_state();
+        }
+        
+
+        bool is_ready() const
+        {
+            return get_state()==future_state::ready;
+        }
+        
+        bool has_exception() const
+        {
+            return future && future->has_exception();
+        }
+        
+        bool has_value() const
+        {
+            return future && future->has_value();
+        }
+        
+        void wait() const
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+            future->wait(false);
+        }
+        
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const
+        {
+            return timed_wait_until(boost::get_system_time()+rel_time);
+        }
+        
+        bool timed_wait_until(boost::system_time const& abs_time) const
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+            return future->timed_wait_until(abs_time);
+        }
+        
+    };
+
+    template <typename R>
+    class shared_future
+    {
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+        
+        future_ptr future;
+
+//         shared_future(const unique_future<R>& other);
+//         shared_future& operator=(const unique_future<R>& other);
+
+        friend class detail::future_waiter;
+        friend class promise<R>;
+        friend class packaged_task<R>;
+        
+        shared_future(future_ptr future_):
+            future(future_)
+        {}
+
+    public:
+        shared_future(shared_future const& other):
+            future(other.future)
+        {}
+
+        typedef future_state::state state;
+
+        shared_future()
+        {}
+
+        ~shared_future()
+        {}
+
+        shared_future& operator=(shared_future const& other)
+        {
+            future=other.future;
+            return *this;
+        }
+#ifdef BOOST_HAS_RVALUE_REFS
+        shared_future(shared_future && other)
+        {
+            future.swap(other.future);
+        }
+        shared_future(unique_future<R> && other)
+        {
+            future.swap(other.future);
+        }
+        shared_future& operator=(shared_future && other)
+        {
+            future.swap(other.future);
+            other.future.reset();
+            return *this;
+        }
+        shared_future& operator=(unique_future<R> && other)
+        {
+            future.swap(other.future);
+            other.future.reset();
+            return *this;
+        }
+#else            
+        shared_future(boost::detail::thread_move_t<shared_future> other):
+            future(other->future)
+        {
+            other->future.reset();
+        }
+//         shared_future(const unique_future<R> &) = delete;
+        shared_future(boost::detail::thread_move_t<unique_future<R> > other):
+            future(other->future)
+        {
+            other->future.reset();
+        }
+        shared_future& operator=(boost::detail::thread_move_t<shared_future> other)
+        {
+            future.swap(other->future);
+            other->future.reset();
+            return *this;
+        }
+        shared_future& operator=(boost::detail::thread_move_t<unique_future<R> > other)
+        {
+            future.swap(other->future);
+            other->future.reset();
+            return *this;
+        }
+
+        operator boost::detail::thread_move_t<shared_future>()
+        {
+            return boost::detail::thread_move_t<shared_future>(*this);
+        }
+
+#endif
+
+        void swap(shared_future& other)
+        {
+            future.swap(other.future);
+        }
+
+        // retrieving the value
+        R get()
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+
+            return future->get();
+        }
+        
+        // functions to check state, and wait for ready
+        state get_state() const
+        {
+            if(!future)
+            {
+                return future_state::uninitialized;
+            }
+            return future->get_state();
+        }
+        
+
+        bool is_ready() const
+        {
+            return get_state()==future_state::ready;
+        }
+        
+        bool has_exception() const
+        {
+            return future && future->has_exception();
+        }
+        
+        bool has_value() const
+        {
+            return future && future->has_value();
+        }
+
+        void wait() const
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+            future->wait(false);
+        }
+        
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const
+        {
+            return timed_wait_until(boost::get_system_time()+rel_time);
+        }
+        
+        bool timed_wait_until(boost::system_time const& abs_time) const
+        {
+            if(!future)
+            {
+                throw future_uninitialized();
+            }
+            return future->timed_wait_until(abs_time);
+        }
+        
+    };
+
+    template <typename R>
+    class promise
+    {
+        typedef boost::shared_ptr<detail::future_object<R> > future_ptr;
+        
+        future_ptr future;
+        bool future_obtained;
+        
+        promise(promise & rhs);// = delete;
+        promise & operator=(promise & rhs);// = delete;
+
+        void lazy_init()
+        {
+            if(!future)
+            {
+                future_obtained=false;
+                future.reset(new detail::future_object<R>);
+            }
+        }
+        
+    public:
+//         template <class Allocator> explicit promise(Allocator a);
+
+        promise():
+            future(),future_obtained(false)
+        {}
+        
+        ~promise()
+        {
+            if(future)
+            {
+                boost::lock_guard<boost::mutex> lock(future->mutex);
+
+                if(!future->done)
+                {
+                    future->mark_exceptional_finish_internal(boost::copy_exception(broken_promise()));
+                }
+            }
+        }
+
+        // Assignment
+#ifdef BOOST_HAS_RVALUE_REFS
+        promise(promise && rhs):
+            future_obtained(rhs.future_obtained)
+        {
+            future.swap(rhs.future);
+        }
+        promise & operator=(promise&& rhs)
+        {
+            future.swap(rhs.future);
+            future_obtained=rhs.future_obtained;
+            rhs.future.reset();
+            return *this;
+        }
+#else
+        promise(boost::detail::thread_move_t<promise> rhs):
+            future(rhs->future),future_obtained(rhs->future_obtained)
+        {
+            rhs->future.reset();
+        }
+        promise & operator=(boost::detail::thread_move_t<promise> rhs)
+        {
+            future=rhs->future;
+            future_obtained=rhs->future_obtained;
+            rhs->future.reset();
+            return *this;
+        }
+
+        operator boost::detail::thread_move_t<promise>()
+        {
+            return boost::detail::thread_move_t<promise>(*this);
+        }
+#endif   
+        
+        void swap(promise& other)
+        {
+            future.swap(other.future);
+            std::swap(future_obtained,other.future_obtained);
+        }
+
+        // Result retrieval
+        unique_future<R> get_future()
+        {
+            lazy_init();
+            if(future_obtained)
+            {
+                throw future_already_retrieved();
+            }
+            future_obtained=true;
+            return unique_future<R>(future);
+        }
+
+        void set_value(typename detail::future_traits<R>::source_reference_type r)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future->mutex);
+            if(future->done)
+            {
+                throw promise_already_satisfied();
+            }
+            future->mark_finished_with_result_internal(r);
+        }
+
+//         void set_value(R && r);
+        void set_value(typename detail::future_traits<R>::rvalue_source_type r)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future->mutex);
+            if(future->done)
+            {
+                throw promise_already_satisfied();
+            }
+            future->mark_finished_with_result_internal(static_cast<typename detail::future_traits<R>::rvalue_source_type>(r));
+        }
+
+        void set_exception(boost::exception_ptr p)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future->mutex);
+            if(future->done)
+            {
+                throw promise_already_satisfied();
+            }
+            future->mark_exceptional_finish_internal(p);
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            lazy_init();
+            future->set_wait_callback(f,this);
+        }
+        
+    };
+
+    template <>
+    class promise<void>
+    {
+        typedef boost::shared_ptr<detail::future_object<void> > future_ptr;
+        
+        future_ptr future;
+        bool future_obtained;
+        
+        promise(promise & rhs);// = delete;
+        promise & operator=(promise & rhs);// = delete;
+
+        void lazy_init()
+        {
+            if(!future)
+            {
+                future_obtained=false;
+                future.reset(new detail::future_object<void>);
+            }
+        }
+    public:
+//         template <class Allocator> explicit promise(Allocator a);
+
+        promise():
+            future(),future_obtained(false)
+        {}
+        
+        ~promise()
+        {
+            if(future)
+            {
+                boost::lock_guard<boost::mutex> lock(future->mutex);
+
+                if(!future->done)
+                {
+                    future->mark_exceptional_finish_internal(boost::copy_exception(broken_promise()));
+                }
+            }
+        }
+
+        // Assignment
+#ifdef BOOST_HAS_RVALUE_REFS
+        promise(promise && rhs):
+            future_obtained(rhs.future_obtained)
+        {
+            future.swap(rhs.future);
+        }
+        promise & operator=(promise&& rhs)
+        {
+            future.swap(rhs.future);
+            future_obtained=rhs.future_obtained;
+            rhs.future.reset();
+            return *this;
+        }
+#else
+        promise(boost::detail::thread_move_t<promise> rhs):
+            future(rhs->future),future_obtained(rhs->future_obtained)
+        {
+            rhs->future.reset();
+        }
+        promise & operator=(boost::detail::thread_move_t<promise> rhs)
+        {
+            future=rhs->future;
+            future_obtained=rhs->future_obtained;
+            rhs->future.reset();
+            return *this;
+        }
+
+        operator boost::detail::thread_move_t<promise>()
+        {
+            return boost::detail::thread_move_t<promise>(*this);
+        }
+#endif
+        
+        void swap(promise& other)
+        {
+            future.swap(other.future);
+            std::swap(future_obtained,other.future_obtained);
+        }
+
+        // Result retrieval
+        unique_future<void> get_future()
+        {
+            lazy_init();
+            
+            if(future_obtained)
+            {
+                throw future_already_retrieved();
+            }
+            future_obtained=true;
+            return unique_future<void>(future);
+        }
+
+        void set_value()
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future->mutex);
+            if(future->done)
+            {
+                throw promise_already_satisfied();
+            }
+            future->mark_finished_with_result_internal();
+        }
+
+        void set_exception(boost::exception_ptr p)
+        {
+            lazy_init();
+            boost::lock_guard<boost::mutex> lock(future->mutex);
+            if(future->done)
+            {
+                throw promise_already_satisfied();
+            }
+            future->mark_exceptional_finish_internal(p);
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            lazy_init();
+            future->set_wait_callback(f,this);
+        }
+        
+    };
+
+    namespace detail
+    {
+        template<typename R>
+        struct task_base:
+            detail::future_object<R>
+        {
+            bool started;
+
+            task_base():
+                started(false)
+            {}
+
+            void run()
+            {
+                {
+                    boost::lock_guard<boost::mutex> lk(this->mutex);
+                    if(started)
+                    {
+                        throw task_already_started();
+                    }
+                    started=true;
+                }
+                do_run();
+            }
+
+            void owner_destroyed()
+            {
+                boost::lock_guard<boost::mutex> lk(this->mutex);
+                if(!started)
+                {
+                    started=true;
+                    this->mark_exceptional_finish_internal(boost::copy_exception(boost::broken_promise()));
+                }
+            }
+            
+            
+            virtual void do_run()=0;
+        };
+        
+        
+        template<typename R,typename F>
+        struct task_object:
+            task_base<R>
+        {
+            F f;
+            task_object(F const& f_):
+                f(f_)
+            {}
+            task_object(boost::detail::thread_move_t<F> f_):
+                f(f_)
+            {}
+            
+            void do_run()
+            {
+                try
+                {
+                    this->mark_finished_with_result(f());
+                }
+                catch(...)
+                {
+                    this->mark_exceptional_finish();
+                }
+            }
+        };
+
+        template<typename F>
+        struct task_object<void,F>:
+            task_base<void>
+        {
+            F f;
+            task_object(F const& f_):
+                f(f_)
+            {}
+            task_object(boost::detail::thread_move_t<F> f_):
+                f(f_)
+            {}
+            
+            void do_run()
+            {
+                try
+                {
+                    f();
+                    this->mark_finished_with_result();
+                }
+                catch(...)
+                {
+                    this->mark_exceptional_finish();
+                }
+            }
+        };
+
+    }
+    
+
+    template<typename R>
+    class packaged_task
+    {
+        boost::shared_ptr<detail::task_base<R> > task;
+        bool future_obtained;
+
+        packaged_task(packaged_task&);// = delete;
+        packaged_task& operator=(packaged_task&);// = delete;
+        
+    public:
+        packaged_task():
+            future_obtained(false)
+        {}
+        
+        // construction and destruction
+        template <class F>
+        explicit packaged_task(F const& f):
+            task(new detail::task_object<R,F>(f)),future_obtained(false)
+        {}
+        explicit packaged_task(R(*f)()):
+            task(new detail::task_object<R,R(*)()>(f)),future_obtained(false)
+        {}
+        
+        template <class F>
+        explicit packaged_task(boost::detail::thread_move_t<F> f):
+            task(new detail::task_object<R,F>(f)),future_obtained(false)
+        {}
+
+//         template <class F, class Allocator>
+//         explicit packaged_task(F const& f, Allocator a);
+//         template <class F, class Allocator>
+//         explicit packaged_task(F&& f, Allocator a);
+
+
+        ~packaged_task()
+        {
+            if(task)
+            {
+                task->owner_destroyed();
+            }
+        }
+
+        // assignment
+#ifdef BOOST_HAS_RVALUE_REFS
+        packaged_task(packaged_task&& other):
+            future_obtained(other.future_obtained)
+        {
+            task.swap(other.task);
+            other.future_obtained=false;
+        }
+        packaged_task& operator=(packaged_task&& other)
+        {
+            packaged_task temp(static_cast<packaged_task&&>(other));
+            swap(temp);
+            return *this;
+        }
+#else
+        packaged_task(boost::detail::thread_move_t<packaged_task> other):
+            future_obtained(other->future_obtained)
+        {
+            task.swap(other->task);
+            other->future_obtained=false;
+        }
+        packaged_task& operator=(boost::detail::thread_move_t<packaged_task> other)
+        {
+            packaged_task temp(other);
+            swap(temp);
+            return *this;
+        }
+        operator boost::detail::thread_move_t<packaged_task>()
+        {
+            return boost::detail::thread_move_t<packaged_task>(*this);
+        }
+#endif
+
+        void swap(packaged_task& other)
+        {
+            task.swap(other.task);
+            std::swap(future_obtained,other.future_obtained);
+        }
+
+        // result retrieval
+        unique_future<R> get_future()
+        {
+            if(!task)
+            {
+                throw task_moved();
+            }
+            else if(!future_obtained)
+            {
+                future_obtained=true;
+                return unique_future<R>(task);
+            }
+            else
+            {
+                throw future_already_retrieved();
+            }
+        }
+        
+
+        // execution
+        void operator()()
+        {
+            if(!task)
+            {
+                throw task_moved();
+            }
+            task->run();
+        }
+
+        template<typename F>
+        void set_wait_callback(F f)
+        {
+            task->set_wait_callback(f,this);
+        }
+        
+    };
+
+}
+
+
+#endif
similarity index 97%
rename from deal.II/contrib/boost/include/boost/thread/locks.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/locks.hpp
index abbfd75b4eb8d354e2414e40a543f7dbc993b1cf..82394a595c0bab9e51ba927668bf3e2e61e02431 100644 (file)
@@ -214,6 +214,9 @@ namespace boost
         unique_lock& operator=(unique_lock&);
         unique_lock& operator=(upgrade_lock<Mutex>& other);
     public:
+#ifdef __SUNPRO_CC 
+        unique_lock(const volatile unique_lock&); 
+#endif
         unique_lock():
             m(0),is_locked(false)
         {}
@@ -260,16 +263,16 @@ namespace boost
         }
 
 
-        unique_lock& operator=(unique_lock<Mutex>&& other)
+        unique_lock& operator=(unique_lock&& other)
         {
-            unique_lock temp(other);
+            unique_lock temp(other.move());
             swap(temp);
             return *this;
         }
 
         unique_lock& operator=(upgrade_lock<Mutex>&& other)
         {
-            unique_lock temp(other);
+            unique_lock temp(other.move());
             swap(temp);
             return *this;
         }
@@ -297,12 +300,20 @@ namespace boost
             return detail::thread_move_t<unique_lock<Mutex> >(*this);
         }
 
+#ifdef __SUNPRO_CC
+        unique_lock& operator=(unique_lock<Mutex> other) 
+        { 
+            swap(other); 
+            return *this; 
+        } 
+#else
         unique_lock& operator=(detail::thread_move_t<unique_lock<Mutex> > other)
         {
             unique_lock temp(other);
             swap(temp);
             return *this;
         }
+#endif
 
         unique_lock& operator=(detail::thread_move_t<upgrade_lock<Mutex> > other)
         {
@@ -772,7 +783,7 @@ namespace boost
         other.is_locked=false;
         if(is_locked)
         {
-            m.unlock_upgrade_and_lock();
+            m->unlock_upgrade_and_lock();
         }
     }
 #else
@@ -864,6 +875,28 @@ namespace boost
             try_lock_wrapper(Mutex& m_,try_to_lock_t):
                 base(m_,try_to_lock)
             {}
+#ifdef BOOST_HAS_RVALUE_REFS
+            try_lock_wrapper(try_lock_wrapper&& other):
+                base(other.move())
+            {}
+
+            try_lock_wrapper&& move()
+            {
+                return static_cast<try_lock_wrapper&&>(*this);
+            }
+
+            try_lock_wrapper& operator=(try_lock_wrapper<Mutex>&& other)
+            {
+                try_lock_wrapper temp(other.move());
+                swap(temp);
+                return *this;
+            }
+
+            void swap(try_lock_wrapper&& other)
+            {
+                base::swap(other);
+            }
+#else
             try_lock_wrapper(detail::thread_move_t<try_lock_wrapper<Mutex> > other):
                 base(detail::thread_move_t<base>(*other))
             {}
@@ -885,12 +918,6 @@ namespace boost
                 return *this;
             }
 
-#ifdef BOOST_HAS_RVALUE_REFS
-            void swap(try_lock_wrapper&& other)
-            {
-                base::swap(other);
-            }
-#else
             void swap(try_lock_wrapper& other)
             {
                 base::swap(other);
@@ -900,7 +927,6 @@ namespace boost
                 base::swap(*other);
             }
 #endif
-
             void lock()
             {
                 base::lock();
similarity index 99%
rename from deal.II/contrib/boost/include/boost/thread/pthread/shared_mutex.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/shared_mutex.hpp
index 3ce4e233643bcba214636307243d60f1520c71cc..30440ebbc89afcf476f610d9d022d94f03c4c5b2 100644 (file)
@@ -10,8 +10,8 @@
 #include <boost/assert.hpp>
 #include <boost/static_assert.hpp>
 #include <boost/thread/mutex.hpp>
-#include <boost/thread/thread.hpp>
 #include <boost/thread/condition_variable.hpp>
+#include <boost/thread/detail/thread_interruption.hpp>
 
 #include <boost/config/abi_prefix.hpp>
 
similarity index 87%
rename from deal.II/contrib/boost/include/boost/thread/pthread/thread_data.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/pthread/thread_data.hpp
index 244035b4aeede99099a0f22e7db788078d800dc8..730c77cadf74033a25a1de6bec42e0a30fc21a7f 100644 (file)
@@ -13,6 +13,7 @@
 #include <boost/optional.hpp>
 #include <pthread.h>
 #include "condition_variable_fwd.hpp"
+#include <map>
 
 #include <boost/config/abi_prefix.hpp>
 
@@ -22,8 +23,18 @@ namespace boost
     
     namespace detail
     {
+        struct tss_cleanup_function;
         struct thread_exit_callback_node;
-        struct tss_data_node;
+        struct tss_data_node
+        {
+            boost::shared_ptr<boost::detail::tss_cleanup_function> func;
+            void* value;
+
+            tss_data_node(boost::shared_ptr<boost::detail::tss_cleanup_function> func_,
+                          void* value_):
+                func(func_),value(value_)
+            {}
+        };
 
         struct thread_data_base;
         typedef boost::shared_ptr<thread_data_base> thread_data_ptr;
@@ -41,14 +52,14 @@ namespace boost
             bool join_started;
             bool joined;
             boost::detail::thread_exit_callback_node* thread_exit_callbacks;
-            boost::detail::tss_data_node* tss_data;
+            std::map<void const*,boost::detail::tss_data_node> tss_data;
             bool interrupt_enabled;
             bool interrupt_requested;
             pthread_cond_t* current_cond;
 
             thread_data_base():
                 done(false),join_started(false),joined(false),
-                thread_exit_callbacks(0),tss_data(0),
+                thread_exit_callbacks(0),
                 interrupt_enabled(true),
                 interrupt_requested(false),
                 current_cond(0)
similarity index 85%
rename from deal.II/contrib/boost/include/boost/thread/thread.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/thread.hpp
index 6146132b773c3fe2a7a59e09d9549df9f9e9e72d..fdfdadcc3edf2c9b7cde27265c1fcfd66c675802 100644 (file)
@@ -20,6 +20,8 @@
 #endif
 
 #include <boost/thread/detail/thread.hpp>
+#include <boost/thread/detail/thread_interruption.hpp>
+#include <boost/thread/detail/thread_group.hpp>
 
 
 #endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/thread/tss.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/thread/tss.hpp
index 76380aa66b91f00988a955af39bf9e7c57751056..e38e3e968bf98d1f0b2ad59b117610b5b88ebcf6 100644 (file)
@@ -74,7 +74,7 @@ namespace boost
         }
         ~thread_specific_ptr()
         {
-            reset();
+            detail::set_tss_data(this,boost::shared_ptr<detail::tss_cleanup_function>(),0,true);
         }
 
         T* get() const
similarity index 84%
rename from deal.II/contrib/boost/include/boost/throw_exception.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/throw_exception.hpp
index 69cdad0ccc54c21d25952fc1b3ff2b5b4080aa0c..a5a5f9ea0bf96d9999a1bd32882293b16525e4a2 100644 (file)
@@ -11,7 +11,7 @@
 //  boost/throw_exception.hpp
 //
 //  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
-//  Copyright (c) 2008 Emil Dotchevski and Reverge Studios, Inc.
+//  Copyright (c) 2008-2009 Emil Dotchevski and Reverge Studios, Inc.
 //
 //  Distributed under the Boost Software License, Version 1.0. (See
 //  accompanying file LICENSE_1_0.txt or copy at
@@ -20,7 +20,7 @@
 //  http://www.boost.org/libs/utility/throw_exception.html
 //
 
-#include <boost/config.hpp>
+#include <boost/exception/detail/attribute_noreturn.hpp>
 #include <boost/detail/workaround.hpp>
 #include <exception>
 
@@ -32,7 +32,7 @@
 # define BOOST_EXCEPTION_DISABLE
 #endif
 
-#if !defined( BOOST_NO_EXCEPTIONS ) && !defined( BOOST_EXCEPTION_DISABLE )
+#if !defined( BOOST_EXCEPTION_DISABLE )
 # include <boost/exception/exception.hpp>
 # include <boost/current_function.hpp>
 # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(::boost::enable_error_info(x) <<\
@@ -54,9 +54,9 @@ void throw_exception( std::exception const & e ); // user defined
 
 inline void throw_exception_assert_compatibility( std::exception const & ) { }
 
-template<class E> inline void throw_exception( E const & e )
+template<class E> BOOST_ATTRIBUTE_NORETURN inline void throw_exception( E const & e )
 {
-    //All boost exceptions are required to derive std::exception,
+    //All boost exceptions are required to derive from std::exception,
     //to ensure compatibility with BOOST_NO_EXCEPTIONS.
     throw_exception_assert_compatibility(e);
 
similarity index 98%
rename from deal.II/contrib/boost/include/boost/tr1/detail/config.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/config.hpp
index e96a537fbd6eb39fa5535d2a6eebaca7fb0c3c5d..ad0cbca10a614e17acfec5130c4ab480b3870de8 100644 (file)
@@ -21,7 +21,7 @@
 #     define BOOST_TR1_NO_RECURSION
 #     define BOOST_TR1_NO_CONFIG_RECURSION
 #  endif
-#  ifdef BOOST_HAS_INCLUDE_NEXT
+#  if defined(BOOST_HAS_INCLUDE_NEXT) && !defined(BOOST_TR1_DISABLE_INCLUDE_NEXT)
 #     include_next <utility>
 #  else
 #     include BOOST_TR1_STD_HEADER(utility)
similarity index 79%
rename from deal.II/contrib/boost/include/boost/tr1/detail/config_all.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tr1/detail/config_all.hpp
index d96bb1fe73e464af85729140264cda7c5b62dbb2..c6cf29e2197b5abc5f28e6fdba726d1976ce1459 100644 (file)
 //
 #include <cstddef>
 
+// Including <cstdlib> allows us to use __GLIBCXX__ to
+// determine the version of the stdc++ library in use
+// under Darwin.
+#include <cstdlib>
+
+#  if defined(_RWSTD_VER) && _RWSTD_VER >= 0x04010200
+#     if !defined (__SUNPRO_CC) && !defined (__DECCXX)
+#        define BOOST_TR1_STD_CHEADER(name) <../include/ansi/name>
+#     endif
+#  endif
+
+
 #  if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && !defined(__BORLANDC__)
 #     ifdef __SUNPRO_CC
          // can't use <../stlport/name> since some compilers put stlport in a different directory:
 #  elif defined(__GNUC__) && __GNUC__ >= 3
 #    if defined(BOOST_TR1_GCC_INCLUDE_PATH)
 #      define BOOST_TR1_STD_HEADER(name) <../BOOST_TR1_GCC_INCLUDE_PATH/name>
-#      ifndef BOOST_TR1_DISABLE_INCLUDE_NEXT
-#        define BOOST_TR1_DISABLE_INCLUDE_NEXT
-#      endif
 #    elif ( (__GNUC__ == 3 ) && ((__GNUC_MINOR__ == 0) || ((__GNUC_MINOR__ < 3) && defined(__APPLE_CC__))))
 #      define BOOST_TR1_STD_HEADER(name) <../g++-v3/name>
 #    else
-#      if ( ((__GNUC__ == 4 ) || (__GNUC_MINOR__ >= 3)) && defined(__APPLE_CC__))
+#      if ( ((__GNUC__ == 3 ) && (__GNUC_MINOR__ >= 3)) && (defined(__APPLE_CC__) || defined(__CYGWIN__)))
 #        define BOOST_TR1_STD_HEADER(name) <../c++/name>
+#      elif ((__GLIBCXX__ == 20050421) && defined(__APPLE_CC__))
+         // Some Darwin tools fix libstdc++ at 4.0.0 irrespective of the actual
+         // compiler version:
+#        define BOOST_TR1_STD_HEADER(name) <../4.0.0/name>
          /*
           *  Before version 3.4.0 the 0 patch level was not part of the include path:
           */
 #      endif
 #    endif
 
+#      if !defined(BOOST_TR1_DISABLE_INCLUDE_NEXT) && !defined(__ICC) \
+            && (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__))
+         // Disable use of #include_next on Linux as typically we are installed in a directory that is searched
+         // *after* the std lib include path:
+#        define BOOST_TR1_DISABLE_INCLUDE_NEXT
+#      endif
+
 #  else
 #     define BOOST_TR1_STD_HEADER(name) <../include/name>
 #  endif
 
+#if !defined(BOOST_TR1_STD_CHEADER)
+#  define BOOST_TR1_STD_CHEADER(name) BOOST_TR1_STD_HEADER(name)
+#endif
+
 #if defined(__GNUC__) && !defined(BOOST_HAS_INCLUDE_NEXT)
 #  define BOOST_HAS_INCLUDE_NEXT
 #endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/tr1/tr1/array
rename to deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/array
index ac4cb4def8cf3cb6b46ae74eb3027b42ab0c901c..83cd7e77de01337cc8293363007a552ac5fdf98c 100644 (file)
@@ -1,34 +1,34 @@
-//  (C) Copyright John Maddock 2005.\r
-//  Use, modification and distribution are subject to the\r
-//  Boost Software License, Version 1.0. (See accompanying file\r
-//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
-\r
-\r
-#if !defined(BOOST_TR1_ARRAY_INCLUDED)\r
-#  define BOOST_TR1_ARRAY_INCLUDED\r
-#  include <boost/tr1/detail/config_all.hpp>\r
-\r
-#  ifdef BOOST_HAS_CPP_0X\r
-#     ifdef BOOST_HAS_INCLUDE_NEXT\r
-#        include_next <array>\r
-#     else\r
-#        include BOOST_TR1_STD_HEADER(array)\r
-#     endif\r
-#  endif\r
-\r
-#  if !defined(BOOST_TR1_NO_RECURSION)\r
-#  define BOOST_TR1_NO_RECURSION\r
-#  ifdef BOOST_HAS_TR1_ARRAY\r
-#     ifdef BOOST_HAS_INCLUDE_NEXT\r
-#        include_next BOOST_TR1_HEADER(array)\r
-#     else\r
-#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(array))\r
-#     endif\r
-#  else\r
-#     include <boost/tr1/array.hpp>\r
-#  endif\r
-#  undef BOOST_TR1_NO_RECURSION\r
-#endif\r
-#endif\r
-\r
-\r
+//  (C) Copyright John Maddock 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)
+
+
+#if !defined(BOOST_TR1_ARRAY_INCLUDED)
+#  define BOOST_TR1_ARRAY_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <array>
+#     else
+#        include BOOST_TR1_STD_HEADER(array)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_ARRAY
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(array)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(array))
+#     endif
+#  else
+#     include <boost/tr1/array.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+#endif
+
+
similarity index 96%
rename from deal.II/contrib/boost/include/boost/tr1/tr1/cmath
rename to deal.II/contrib/boost-1.41.0/include/boost/tr1/tr1/cmath
index d468911dbe81e0671fb32fefe56f19569b866c63..0bb58f871bd6326b9ebc939658377c9e7e085607 100644 (file)
@@ -20,7 +20,7 @@
 #  ifdef BOOST_HAS_INCLUDE_NEXT
 #     include_next <cmath>
 #  else
-#     include BOOST_TR1_STD_HEADER(cmath)
+#     include BOOST_TR1_STD_CHEADER(cmath)
 #  endif
 #ifdef BOOST_TR1_NO_CMATH_RECURSION3
 #  undef BOOST_TR1_NO_CMATH_RECURSION3
similarity index 96%
rename from deal.II/contrib/boost/include/boost/tr1/type_traits.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tr1/type_traits.hpp
index 7c91b9a211d4e9ab18e99fd1e22aa92076bcb0e9..b2c7d6910dce979fefd16558f0373fd0245b92ce 100644 (file)
@@ -19,6 +19,7 @@
 #else
 // Boost Type Traits:
 #include <boost/type_traits.hpp>
+#include <boost/type_traits/is_base_of_tr1.hpp>
 
 namespace std { namespace tr1{
 
@@ -63,7 +64,7 @@ namespace std { namespace tr1{
    using ::boost::rank;
    using ::boost::extent;
    using ::boost::is_same;
-   using ::boost::is_base_of;
+   using ::boost::tr1::is_base_of;
    using ::boost::is_convertible;
    using ::boost::remove_const;
    using ::boost::remove_volatile;
similarity index 99%
rename from deal.II/contrib/boost/include/boost/tuple/detail/tuple_basic.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tuple/detail/tuple_basic.hpp
index ba59441f274e45834a74e38fd5b0753c7dc1837b..348fd80894edd5d05ea602a0a9aa0e9f09f89920 100644 (file)
@@ -213,7 +213,7 @@ struct element_impl<0, T, true /* IsConst */>
 
 
 template<int N, class T>
-struct element: 
+struct element:
   public detail::element_impl<N, T, ::boost::is_const<T>::value>
 {
 };
@@ -488,11 +488,20 @@ struct length<tuple<> > {
   BOOST_STATIC_CONSTANT(int, value = 0);
 };
 
+template<>
+struct length<tuple<> const> {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
+
 template<>
 struct length<null_type> {
   BOOST_STATIC_CONSTANT(int, value = 0);
 };
 
+template<>
+struct length<null_type const> {
+  BOOST_STATIC_CONSTANT(int, value = 0);
+};
 
 namespace detail {
 
similarity index 96%
rename from deal.II/contrib/boost/include/boost/tuple/tuple_comparison.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tuple/tuple_comparison.hpp
index 178bbb9d0f7e23e80a3fe7cff0592c852bc38ea1..73723a15bc9b0a1c8da3f5b0718c8289e5a643d4 100644 (file)
@@ -69,8 +69,8 @@ inline bool neq<null_type,null_type>(const null_type&, const null_type&) { retur
 template<class T1, class T2>
 inline bool lt(const T1& lhs, const T2& rhs) {
   return lhs.get_head() < rhs.get_head()  ||
-            !(rhs.get_head() < lhs.get_head()) &&
-            lt(lhs.get_tail(), rhs.get_tail());
+          ( !(rhs.get_head() < lhs.get_head()) &&
+            lt(lhs.get_tail(), rhs.get_tail()));
 }
 template<>
 inline bool lt<null_type,null_type>(const null_type&, const null_type&) { return false; }
@@ -78,8 +78,8 @@ inline bool lt<null_type,null_type>(const null_type&, const null_type&) { return
 template<class T1, class T2>
 inline bool gt(const T1& lhs, const T2& rhs) {
   return lhs.get_head() > rhs.get_head()  ||
-            !(rhs.get_head() > lhs.get_head()) &&
-            gt(lhs.get_tail(), rhs.get_tail());
+          ( !(rhs.get_head() > lhs.get_head()) &&
+            gt(lhs.get_tail(), rhs.get_tail()));
 }
 template<>
 inline bool gt<null_type,null_type>(const null_type&, const null_type&) { return false; }
similarity index 94%
rename from deal.II/contrib/boost/include/boost/tuple/tuple_io.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/tuple/tuple_io.hpp
index b355e56dc06a00f4c3f3b6ba269d60b57ad66f65..10cdb1cc26394b020c11121f5f85e72322800dfb 100644 (file)
@@ -285,6 +285,21 @@ print(std::basic_ostream<CharType, CharTrait>& o, const cons<T1, T2>& t) {
 } // namespace detail
 
 #if defined (BOOST_NO_TEMPLATED_STREAMS)
+
+inline std::ostream& operator<<(std::ostream& o, const null_type& t) {
+  if (!o.good() ) return o;
+  const char l = 
+    detail::format_info::get_manipulator(o, detail::format_info::open);
+  const char r = 
+    detail::format_info::get_manipulator(o, detail::format_info::close);
+   
+  o << l;
+  o << r;
+
+  return o;
+}
+
 template<class T1, class T2>
 inline std::ostream& operator<<(std::ostream& o, const cons<T1, T2>& t) {
   if (!o.good() ) return o;
@@ -305,6 +320,23 @@ inline std::ostream& operator<<(std::ostream& o, const cons<T1, T2>& t) {
 
 #else
 
+template<class CharType, class CharTrait>
+inline std::basic_ostream<CharType, CharTrait>& 
+operator<<(std::basic_ostream<CharType, CharTrait>& o, 
+           const null_type& t) {
+  if (!o.good() ) return o;
+  const CharType l = 
+    detail::format_info::get_manipulator(o, detail::format_info::open);
+  const CharType r = 
+    detail::format_info::get_manipulator(o, detail::format_info::close);
+   
+  o << l;
+  o << r;
+
+  return o;
+}
+
 template<class CharType, class CharTrait, class T1, class T2>
 inline std::basic_ostream<CharType, CharTrait>& 
 operator<<(std::basic_ostream<CharType, CharTrait>& o, 
similarity index 86%
rename from deal.II/contrib/boost/include/boost/type_traits/alignment_of.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/alignment_of.hpp
index 9739f140fe13388cc29d7edd344477d44778d80e..51357ce5608211e1d43d1e5c4e385ec530302a86 100644 (file)
@@ -56,7 +56,18 @@ struct alignment_logic
 template< typename T >
 struct alignment_of_impl
 {
-#ifndef BOOST_ALIGNMENT_OF
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1400)
+    //
+    // With MSVC both the native __alignof operator
+    // and our own logic gets things wrong from time to time :-(
+    // Using a combination of the two seems to make the most of a bad job:
+    //
+    BOOST_STATIC_CONSTANT(std::size_t, value =
+        (::boost::detail::alignment_logic<
+            sizeof(::boost::detail::alignment_of_hack<T>) - sizeof(T),
+            __alignof(T)
+        >::value));
+#elif !defined(BOOST_ALIGNMENT_OF)
     BOOST_STATIC_CONSTANT(std::size_t, value =
         (::boost::detail::alignment_logic<
             sizeof(::boost::detail::alignment_of_hack<T>) - sizeof(T),
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_new_operator.hpp b/deal.II/contrib/boost-1.41.0/include/boost/type_traits/has_new_operator.hpp
new file mode 100644 (file)
index 0000000..6d5351e
--- /dev/null
@@ -0,0 +1,115 @@
+
+//  (C) Copyright Runar Undheim, Robert Ramey & John Maddock 2008.
+//  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).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+
+#ifndef BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
+#define BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
+
+#include <new> // std::nothrow_t
+#include <cstddef> // std::size_t
+#include <boost/type_traits/config.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+namespace detail {
+    template <class U, U x> 
+    struct test;
+
+    template <typename T>
+    struct has_new_operator_impl {
+        template<class U>
+        static type_traits::yes_type check_sig(
+            U*, 
+            test<
+            void *(*)(std::size_t),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::yes_type check_sig(
+            U*, 
+            test<
+            void *(*)(std::size_t, const std::nothrow_t&),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::yes_type check_sig(
+            U*, 
+            test<
+            void *(*)(std::size_t, void*),
+                &U::operator new
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig(...);
+
+        template<class U>
+        static type_traits::yes_type check_sig2(
+            U*, 
+            test<
+            void *(*)(std::size_t),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::yes_type check_sig2(
+            U*, 
+            test<
+            void *(*)(std::size_t, const std::nothrow_t&),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::yes_type check_sig2(
+            U*, 
+            test<
+            void *(*)(std::size_t, void*),
+                &U::operator new[]
+            >* = NULL
+        );
+        template<class U>
+        static type_traits::no_type check_sig2(...);
+
+        // GCC2 won't even parse this template if we embed the computation
+        // of s1 in the computation of value.
+        #ifdef __GNUC__
+            BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(has_new_operator_impl<T>::template check_sig<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(has_new_operator_impl<T>::template check_sig2<T>(0)));
+        #else
+            #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+                #pragma warning(push)
+                #pragma warning(disable:6334)
+            #endif
+
+            BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig<T>(0)));
+            BOOST_STATIC_CONSTANT(unsigned, s2 = sizeof(check_sig2<T>(0)));
+
+            #if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
+                #pragma warning(pop)
+            #endif
+        #endif
+        BOOST_STATIC_CONSTANT(bool, value = 
+           (::boost::type_traits::ice_or<
+            (s1 == sizeof(type_traits::yes_type)),
+            (s2 == sizeof(type_traits::yes_type))
+           >::value)
+        );
+    };
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(has_new_operator,T,::boost::detail::has_new_operator_impl<T>::value)
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_HAS_NEW_OPERATOR_HPP_INCLUDED
similarity index 95%
rename from deal.II/contrib/boost/include/boost/type_traits/intrinsics.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/intrinsics.hpp
index 3458b9f2f38c8d75e97885d93a8b9441b1caa9db..74b64a7d43df3d7c9c200c092bb79a809ccb1997 100644 (file)
@@ -82,7 +82,7 @@
 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
 #endif
 
-#if defined(BOOST_MSVC) && defined(_MSC_FULL_VER) && (_MSC_FULL_VER >=140050215)
+#if defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215)
 #   include <boost/type_traits/is_same.hpp>
 
 #   define BOOST_IS_UNION(T) __is_union(T)
 #   define BOOST_IS_ENUM(T) __is_enum(T)
 //  This one doesn't quite always do the right thing:
 //  #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
-#   define BOOST_ALIGNMENT_OF(T) __alignof(T)
+//  This one fails if the default alignment has been changed with /Zp:
+//  #   define BOOST_ALIGNMENT_OF(T) __alignof(T)
 
 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
 #endif
 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
 #endif
 
-#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))
+#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__)))
 #   include <boost/type_traits/is_same.hpp>
 #   include <boost/type_traits/is_reference.hpp>
 #   include <boost/type_traits/is_volatile.hpp>
 #   define BOOST_IS_CLASS(T) __is_class(T)
 #   define BOOST_IS_ENUM(T) __is_enum(T)
 #   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)
-#   define BOOST_ALIGNMENT_OF(T) __alignof__(T)
+#   if !defined(unix) || defined(__LP64__)
+      // GCC sometimes lies about alignment requirements
+      // of type double on 32-bit unix platforms, use the
+      // old implementation instead in that case:
+#     define BOOST_ALIGNMENT_OF(T) __alignof__(T)
+#   endif
 
 #   define BOOST_HAS_TYPE_TRAITS_INTRINSICS
 #endif
similarity index 93%
rename from deal.II/contrib/boost/include/boost/type_traits/is_abstract.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_abstract.hpp
index 15d4afeedae57022fa013288fdc032f2cbe47b79..09fdf33c457500934e310b05f0e056ff09848016 100644 (file)
@@ -92,14 +92,14 @@ struct is_abstract_imp2
    // GCC2 won't even parse this template if we embed the computation
    // of s1 in the computation of value.
 #ifdef __GNUC__
-   BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(is_abstract_imp2<T>::template check_sig<T>(0)));
+   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(is_abstract_imp2<T>::template check_sig<T>(0)));
 #else
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(push)
 #pragma warning(disable:6334)
 #endif
-   BOOST_STATIC_CONSTANT(unsigned, s1 = sizeof(check_sig<T>(0)));
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(check_sig<T>(0)));
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(pop)
 #endif
 #endif
similarity index 95%
rename from deal.II/contrib/boost/include/boost/type_traits/is_base_and_derived.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_and_derived.hpp
index 8367b761d7c3b629a2b7b2641e2cb46b80836338..d6a99911823d36d992f2434dd74febe4ff2ff762 100644 (file)
 #include <boost/type_traits/is_same.hpp>
 #include <boost/type_traits/is_convertible.hpp>
 #include <boost/type_traits/detail/ice_and.hpp>
-#include <boost/type_traits/remove_cv.hpp>
 #include <boost/config.hpp>
 #include <boost/static_assert.hpp>
 #endif
+#include <boost/type_traits/remove_cv.hpp>
 
 // should be the last #include
 #include <boost/type_traits/detail/bool_trait_def.hpp>
@@ -133,7 +133,7 @@ struct bd_helper
 template<typename B, typename D>
 struct is_base_and_derived_impl2
 {
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(push)
 #pragma warning(disable:6334)
 #endif
@@ -156,7 +156,7 @@ struct is_base_and_derived_impl2
 
     BOOST_STATIC_CONSTANT(bool, value =
         sizeof(bd_helper<B,D>::check_sig(Host(), 0)) == sizeof(type_traits::yes_type));
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(pop)
 #endif
 };
@@ -212,7 +212,7 @@ struct is_base_and_derived_impl
     typedef is_base_and_derived_select<
        ::boost::is_class<B>::value,
        ::boost::is_class<D>::value,
-       ::boost::is_same<B,D>::value> selector;
+       ::boost::is_same<ncvB,ncvD>::value> selector;
     typedef typename selector::template rebind<ncvB,ncvD> binder;
     typedef typename binder::type bound_type;
 
@@ -222,7 +222,10 @@ struct is_base_and_derived_impl
 template <typename B, typename D>
 struct is_base_and_derived_impl
 {
-    BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_BASE_OF(B,D));
+    typedef typename remove_cv<B>::type ncvB;
+    typedef typename remove_cv<D>::type ncvD;
+
+    BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && ! ::boost::is_same<ncvB,ncvD>::value));
 };
 #endif
 } // namespace detail
similarity index 66%
rename from deal.II/contrib/boost/include/boost/type_traits/is_base_of.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_of.hpp
index bf46da38e38cc4fb4d61338980e6d08ae6475194..0cc7a32fc97819350f5811e747ad58f82263cec0 100644 (file)
 
 #include <boost/type_traits/is_base_and_derived.hpp>
 #include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_class.hpp>
 #include <boost/type_traits/detail/ice_or.hpp>
+#include <boost/type_traits/detail/ice_and.hpp>
 
 // should be the last #include
 #include <boost/type_traits/detail/bool_trait_def.hpp>
 
 namespace boost {
 
+   namespace detail{
+      template <class B, class D>
+      struct is_base_of_imp
+      {
+          typedef typename remove_cv<B>::type ncvB;
+          typedef typename remove_cv<D>::type ncvD;
+          BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<      
+            (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
+            (::boost::type_traits::ice_and< ::boost::is_same<ncvB,ncvD>::value, ::boost::is_class<ncvB>::value>::value)>::value));
+      };
+   }
+
 BOOST_TT_AUX_BOOL_TRAIT_DEF2(
       is_base_of
     , Base
     , Derived
-    , (::boost::type_traits::ice_or<      
-         (::boost::detail::is_base_and_derived_impl<Base,Derived>::value),
-         (::boost::is_same<Base,Derived>::value)>::value)
-    )
+    , (::boost::detail::is_base_of_imp<Base, Derived>::value))
 
 #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_of_tr1.hpp b/deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_base_of_tr1.hpp
new file mode 100644 (file)
index 0000000..177e62b
--- /dev/null
@@ -0,0 +1,50 @@
+
+//  (C) Copyright Rani Sharoni 2003-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).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+#ifndef BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
+#define BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
+
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/detail/ice_or.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost { namespace tr1{
+
+   namespace detail{
+      template <class B, class D>
+      struct is_base_of_imp
+      {
+          typedef typename remove_cv<B>::type ncvB;
+          typedef typename remove_cv<D>::type ncvD;
+          BOOST_STATIC_CONSTANT(bool, value = (::boost::type_traits::ice_or<      
+            (::boost::detail::is_base_and_derived_impl<ncvB,ncvD>::value),
+            (::boost::is_same<ncvB,ncvD>::value)>::value));
+      };
+   }
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_base_of
+    , Base
+    , Derived
+    , (::boost::tr1::detail::is_base_of_imp<Base, Derived>::value))
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_base_of,Base&,Derived&,false)
+#endif
+
+} } // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // BOOST_TT_IS_BASE_OF_TR1_HPP_INCLUDED
similarity index 99%
rename from deal.II/contrib/boost/include/boost/type_traits/is_class.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_class.hpp
index 63a0c6a5fb214ac008bae1ef7d729653f468a477..1a2cd20157c254de641247e527a3af58cb3941ae 100644 (file)
 #   include <boost/type_traits/is_function.hpp>
 #endif
 
+#endif // BOOST_IS_CLASS
+
 #ifdef __EDG_VERSION__
 #   include <boost/type_traits/remove_cv.hpp>
 #endif
-#endif // BOOST_IS_CLASS
 
 // should be the last #include
 #include <boost/type_traits/detail/bool_trait_def.hpp>
similarity index 99%
rename from deal.II/contrib/boost/include/boost/type_traits/is_convertible.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_convertible.hpp
index ce522a08429fa6fec1faa2819048061a8e8eadd5..a31a930faed4d5186934f34feee064d41328ef08 100644 (file)
@@ -256,7 +256,7 @@ struct is_convertible_basic_impl
 #ifdef BOOST_MSVC
 #pragma warning(push)
 #pragma warning(disable:4244)
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(disable:6334)
 #endif
 #endif
similarity index 96%
rename from deal.II/contrib/boost/include/boost/type_traits/is_function.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_function.hpp
index 1fba1bdff30480362c9a43deede6bf0edc1f50ef..95dba0dab05d001a96b0697b653a2502930b2ae7 100644 (file)
@@ -65,7 +65,7 @@ struct is_function_impl
 template <typename T>
 struct is_function_impl
 {
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(push)
 #pragma warning(disable:6334)
 #endif
@@ -74,7 +74,7 @@ struct is_function_impl
         bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t))
         == sizeof(::boost::type_traits::yes_type)
         );
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(pop)
 #endif
 };
similarity index 97%
rename from deal.II/contrib/boost/include/boost/type_traits/is_member_function_pointer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_member_function_pointer.hpp
index 3fff063326b26a57ea6b51a9e55da1a1613b3171..81f1eacc9cdd1f632a2a19a8f35babfbaecc30f9 100644 (file)
@@ -64,7 +64,7 @@ struct is_mem_fun_pointer_select<false>
 {
     template <typename T> struct result_
     {
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(push)
 #pragma warning(disable:6334)
 #endif
@@ -75,7 +75,7 @@ struct is_mem_fun_pointer_select<false>
             bool, value = (
                 1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(self_type::make_t))
             ));
-#if BOOST_WORKAROUND(_MSC_FULL_VER, >= 140050000)
+#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)
 #pragma warning(pop)
 #endif
     };
similarity index 98%
rename from deal.II/contrib/boost/include/boost/type_traits/is_member_pointer.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_member_pointer.hpp
index cdf3d6ab93f9421b247eab937fc43687a7331351..ba02b89ba27ef1ec64c8ac9f2de408d5a1691d80 100644 (file)
@@ -50,7 +50,7 @@ BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,
 BOOST_TT_AUX_BOOL_TRAIT_DEF1(is_member_pointer,T,::boost::is_member_function_pointer<T>::value)
 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*,true)
 
-#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003)
+#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003) && !BOOST_WORKAROUND(__IBMCPP__, <=600)
 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const,true)
 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*volatile,true)
 BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC1_2(typename T,typename U,is_member_pointer,U T::*const volatile,true)
similarity index 98%
rename from deal.II/contrib/boost/include/boost/type_traits/is_signed.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_signed.hpp
index 73389a1026e61fcc9b5f883b2d0b3344eb000c13..e06b47cc85aa9ed2660015fb99324a5c9e4cb7b8 100644 (file)
@@ -30,7 +30,7 @@ template <class T>
 struct is_signed_helper
 {
    typedef typename remove_cv<T>::type no_cv_t;
-   BOOST_STATIC_CONSTANT(bool, value = (static_cast<no_cv_t>(-1) < 0));
+   BOOST_STATIC_CONSTANT(bool, value = (!(static_cast<no_cv_t>(-1) > 0)));
 };
 
 template <bool integral_type>
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_virtual_base_of.hpp b/deal.II/contrib/boost-1.41.0/include/boost/type_traits/is_virtual_base_of.hpp
new file mode 100644 (file)
index 0000000..30b34f6
--- /dev/null
@@ -0,0 +1,104 @@
+//  (C) Copyright Daniel Frey and Robert Ramey 2009.
+//  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).
+//
+//  See http://www.boost.org/libs/type_traits for most recent version including documentation.
+#ifndef BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED
+#define BOOST_TT_IS_VIRTUAL_BASE_OF_HPP_INCLUDED
+
+#include <boost/type_traits/is_base_of.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/mpl/not.hpp>
+
+// should be the last #include
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+
+namespace boost {
+namespace detail {
+
+
+#ifdef BOOST_MSVC
+#pragma warning( push )
+#pragma warning( disable : 4584 )
+#elif defined __GNUC__
+#pragma GCC system_header
+#endif
+
+template<typename Base, typename Derived, typename tag>
+struct is_virtual_base_of_impl
+{
+    BOOST_STATIC_CONSTANT(bool, value = false);
+};
+
+template<typename Base, typename Derived>
+struct is_virtual_base_of_impl<Base, Derived, mpl::true_>
+{
+#ifdef __BORLANDC__
+    struct X : public virtual Derived, public virtual Base 
+    {
+       X();
+       X(const X&);
+       X& operator=(const X&);
+       ~X()throw();
+    };
+    struct Y : public virtual Derived 
+    {
+       Y();
+       Y(const Y&);
+       Y& operator=(const Y&);
+       ~Y()throw();
+    };
+#else
+    struct X : Derived, virtual Base 
+    {
+       X();
+       X(const X&);
+       X& operator=(const X&);
+       ~X()throw();
+    };
+    struct Y : Derived 
+    {
+       Y();
+       Y(const Y&);
+       Y& operator=(const Y&);
+       ~Y()throw();
+    };
+#endif
+    BOOST_STATIC_CONSTANT(bool, value = (sizeof(X)==sizeof(Y)));
+};
+
+template<typename Base, typename Derived>
+struct is_virtual_base_of_impl2
+{
+   typedef typename mpl::and_<is_base_of<Base, Derived>, mpl::not_<is_same<Base, Derived> > >::type tag_type;
+   typedef is_virtual_base_of_impl<Base, Derived, tag_type> imp;
+   BOOST_STATIC_CONSTANT(bool, value = imp::value);
+};
+
+#ifdef BOOST_MSVC
+#pragma warning( pop )
+#endif
+
+} // namespace detail
+
+BOOST_TT_AUX_BOOL_TRAIT_DEF2(
+      is_virtual_base_of
+       , Base
+       , Derived
+       , (::boost::detail::is_virtual_base_of_impl2<Base,Derived>::value) 
+)
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base,Derived&,false)
+BOOST_TT_AUX_BOOL_TRAIT_PARTIAL_SPEC2_2(typename Base,typename Derived,is_virtual_base_of,Base&,Derived&,false)
+#endif
+
+} // namespace boost
+
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif
similarity index 62%
rename from deal.II/contrib/boost/include/boost/utility/addressof.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/utility/addressof.hpp
index 8e0a586880ec53de60565f422ef6d4677aa4db2d..95cd92fca9bb940ae0f9a289268a0fe4a9305b68 100644 (file)
@@ -21,6 +21,17 @@ namespace boost
 namespace detail
 {
 
+template<class T> struct addr_impl_ref
+{
+    T & v_;
+
+    inline addr_impl_ref( T & v ): v_( v ) {}
+    inline operator T& () const { return v_; }
+
+private:
+    addr_impl_ref & operator=(const addr_impl_ref &);
+};
+
 template<class T> struct addressof_impl
 {
     static inline T * f( T & v, long )
@@ -39,12 +50,40 @@ template<class T> struct addressof_impl
 
 template<class T> T * addressof( T & v )
 {
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x610 ) )
+
     return boost::detail::addressof_impl<T>::f( v, 0 );
+
+#else
+
+    return boost::detail::addressof_impl<T>::f( boost::detail::addr_impl_ref<T>( v ), 0 );
+
+#endif
+}
+
+#if defined( __SUNPRO_CC ) && BOOST_WORKAROUND( __SUNPRO_CC, BOOST_TESTED_AT( 0x590 ) )
+
+namespace detail
+{
+
+template<class T> struct addressof_addp
+{
+    typedef T * type;
+};
+
+} // namespace detail
+
+template< class T, std::size_t N >
+typename detail::addressof_addp< T[N] >::type addressof( T (&t)[N] )
+{
+    return &t;
 }
 
+#endif
+
 // Borland doesn't like casting an array reference to a char reference
 // but these overloads work around the problem.
-# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+#if defined( __BORLANDC__ ) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
 template<typename T,std::size_t N>
 T (*addressof(T (&t)[N]))[N]
 {
@@ -56,7 +95,7 @@ const T (*addressof(const T (&t)[N]))[N]
 {
    return reinterpret_cast<const T(*)[N]>(&t);
 }
-# endif
+#endif
 
 } // namespace boost
 
similarity index 95%
rename from deal.II/contrib/boost/include/boost/utility/result_of.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/utility/result_of.hpp
index cdcac347ea51c2dc561a032ba5352fa521bb04bc..e35e0980bb1ea6ddb4d4b9d5b79564650a9c2b66 100644 (file)
@@ -70,8 +70,8 @@ struct result_of_nested_result : F::template result<FArgs>
 template<typename F, typename FArgs>
 struct result_of_impl<F, FArgs, false>
   : mpl::if_<is_function_with_no_args<FArgs>,
-            result_of_void_impl<F>,
-            result_of_nested_result<F, FArgs> >::type
+             result_of_void_impl<F>,
+             result_of_nested_result<F, FArgs> >::type
 {};
 
 } // end namespace detail
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/utility/swap.hpp b/deal.II/contrib/boost-1.41.0/include/boost/utility/swap.hpp
new file mode 100644 (file)
index 0000000..6845e79
--- /dev/null
@@ -0,0 +1,55 @@
+// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker
+//
+// 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)
+// For more information, see http://www.boost.org
+
+
+#ifndef BOOST_UTILITY_SWAP_HPP
+#define BOOST_UTILITY_SWAP_HPP
+
+// Note: the implementation of this utility contains various workarounds:
+// - swap_impl is put outside the boost namespace, to avoid infinite
+// recursion (causing stack overflow) when swapping objects of a primitive
+// type.
+// - swap_impl has a using-directive, rather than a using-declaration,
+// because some compilers (including MSVC 7.1, Borland 5.9.3, and
+// Intel 8.1) don't do argument-dependent lookup when it has a
+// using-declaration instead.
+// - boost::swap has two template arguments, instead of one, to
+// avoid ambiguity when swapping objects of a Boost type that does
+// not have its own boost::swap overload.
+
+#include <algorithm> //for std::swap
+#include <cstddef> //for std::size_t
+
+namespace boost_swap_impl
+{
+  template<class T>
+  void swap_impl(T& left, T& right)
+  {
+    using namespace std;//use std::swap if argument dependent lookup fails
+    swap(left,right);
+  }
+
+  template<class T, std::size_t N>
+  void swap_impl(T (& left)[N], T (& right)[N])
+  {
+    for (std::size_t i = 0; i < N; ++i)
+    {
+      ::boost_swap_impl::swap_impl(left[i], right[i]);
+    }
+  }
+}
+
+namespace boost
+{
+  template<class T1, class T2>
+  void swap(T1& left, T2& right)
+  {
+    ::boost_swap_impl::swap_impl(left, right);
+  }
+}
+
+#endif
similarity index 85%
rename from deal.II/contrib/boost/include/boost/utility/value_init.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/utility/value_init.hpp
index 67127c09bf8f7818e0856400b0703be1e82ddbfc..177fe743450c2135ba873a239bf2e14b0b9592bb 100644 (file)
@@ -7,6 +7,8 @@
 // 21 Ago 2002 (Created) Fernando Cacciola
 // 24 Dec 2007 (Refactored and worked around various compiler bugs) Fernando Cacciola, Niels Dekker
 // 23 May 2008 (Fixed operator= const issue, added initialized_value) Niels Dekker, Fernando Cacciola
+// 21 Ago 2008 (Added swap) Niels Dekker, Fernando Cacciola
+// 20 Feb 2009 (Fixed logical const-ness issues) Niels Dekker, Fernando Cacciola
 //
 #ifndef BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
 #define BOOST_UTILITY_VALUE_INIT_21AGO2002_HPP
@@ -22,6 +24,7 @@
 #include <boost/static_assert.hpp>
 #include <boost/type_traits/cv_traits.hpp>
 #include <boost/type_traits/alignment_of.hpp>
+#include <boost/swap.hpp>
 #include <cstring>
 #include <new>
 
@@ -88,17 +91,31 @@ class value_initialized
       wrapper_address()->wrapper::~wrapper();
     }
 
-    T& data() const
+    T const & data() const
     {
       return wrapper_address()->data;
     }
 
-    operator T&() const { return this->data(); }
+    T& data()
+    {
+      return wrapper_address()->data;
+    }
+
+    void swap(value_initialized & arg)
+    {
+      ::boost::swap( this->data(), arg.data() );
+    }
+
+    operator T const &() const { return this->data(); }
+
+    operator T&() { return this->data(); }
 
 } ;
 
 
 
+
+
 template<class T>
 T const& get ( value_initialized<T> const& x )
 {
@@ -110,6 +127,12 @@ T& get ( value_initialized<T>& x )
   return x.data() ;
 }
 
+template<class T>
+void swap ( value_initialized<T> & lhs, value_initialized<T> & rhs )
+{
+  lhs.swap(rhs) ;
+}
+
 
 class initialized_value_t
 {
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/vector_property_map.hpp b/deal.II/contrib/boost-1.41.0/include/boost/vector_property_map.hpp
new file mode 100644 (file)
index 0000000..2b30568
--- /dev/null
@@ -0,0 +1,19 @@
+/*=============================================================================
+Copyright (c) 2009 Trustees of Indiana University
+
+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)
+=============================================================================*/
+// Redirect/warning header, adapted from the version in Spirit
+
+#include <boost/version.hpp>
+
+#if BOOST_VERSION >= 103800
+#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
+#  pragma message ("Warning: This header is deprecated. Please use: boost/property_map/vector_property_map.hpp")
+#elif defined(__GNUC__) || defined(__HP_aCC) || defined(__SUNPRO_CC) || defined(__IBMCPP__)
+#  warning "This header is deprecated. Please use: boost/property_map/vector_property_map.hpp"
+#endif
+#endif
+
+#include <boost/property_map/vector_property_map.hpp>
similarity index 94%
rename from deal.II/contrib/boost/include/boost/version.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/version.hpp
index a07d638d97775574d186e514272c96d60c575553..ad3435917b9986dd57b6947f66b0cf33f1418e44 100644 (file)
@@ -19,7 +19,7 @@
 //  BOOST_VERSION / 100 % 1000 is the minor version
 //  BOOST_VERSION / 100000 is the major version
 
-#define BOOST_VERSION 103700
+#define BOOST_VERSION 104100
 
 //
 //  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
@@ -27,7 +27,7 @@
 //  number, y is the minor version number, and z is the patch level if not 0.
 //  This is used by <config/auto_link.hpp> to select which library version to link to.
 
-#define BOOST_LIB_VERSION "1_37"
+#define BOOST_LIB_VERSION "1_41"
 
 #endif
 
similarity index 93%
rename from deal.II/contrib/boost/include/boost/wave.hpp
rename to deal.II/contrib/boost-1.41.0/include/boost/wave.hpp
index 40e0e08809d24da7b2660cf8314272adfa06eff3..7605ab8533b539b5aaa5bd1c5d7346f6a5266500 100644 (file)
@@ -5,7 +5,7 @@
 
     See http://www.boost.org/libs/wave for documentation
 
-    Copyright (c) 2001-2008 Hartmut Kaiser. Distributed under the Boost
+    Copyright (c) 2001-2009 Hartmut Kaiser. Distributed under the Boost
     Software License, Version 1.0. (See accompanying file
     LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 =============================================================================*/
diff --git a/deal.II/contrib/boost-1.41.0/include/boost/weak_ptr.hpp b/deal.II/contrib/boost-1.41.0/include/boost/weak_ptr.hpp
new file mode 100644 (file)
index 0000000..dd26869
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef BOOST_WEAK_PTR_HPP_INCLUDED
+#define BOOST_WEAK_PTR_HPP_INCLUDED
+
+//
+//  weak_ptr.hpp
+//
+//  Copyright (c) 2001, 2002, 2003 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  See http://www.boost.org/libs/smart_ptr/weak_ptr.htm for documentation.
+//
+
+#include <boost/smart_ptr/weak_ptr.hpp>
+
+#endif  // #ifndef BOOST_WEAK_PTR_HPP_INCLUDED
similarity index 98%
rename from deal.II/contrib/boost/libs/thread/build/Jamfile.v2
rename to deal.II/contrib/boost-1.41.0/libs/thread/build/Jamfile.v2
index e69ff9019f17b35b63fc6bc48a5885b630455028..08d24f48ab9195f2bd796feced040ada582ee5eb 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Jamfile.v2 42230 2007-12-21 11:51:05Z anthonyw $
+# $Id: Jamfile.v2 56992 2009-10-19 09:18:13Z anthonyw $
 # Copyright 2006-2007 Roland Schwarz.
 # Copyright 2007 Anthony Williams
 # Distributed under the Boost Software License, Version 1.0. (See
@@ -180,7 +180,6 @@ rule requirements ( properties * )
 alias thread_sources
     : ## win32 sources ##
       win32/thread.cpp
-      win32/exceptions.cpp
       win32/tss_dll.cpp
       win32/tss_pe.cpp
     : ## requirements ##
@@ -190,7 +189,6 @@ alias thread_sources
 alias thread_sources
     : ## pthread sources ##
       pthread/thread.cpp
-      pthread/exceptions.cpp
       pthread/once.cpp
     : ## requirements ##
       <threadapi>pthread
similarity index 57%
rename from deal.II/contrib/boost/libs/thread/doc/Jamfile.v2
rename to deal.II/contrib/boost-1.41.0/libs/thread/doc/Jamfile.v2
index dc68fc392e35a0d3e7387d63f5c273b974c307d6..229f2d04a3080fa54da150d637bb012c44d33fc0 100644 (file)
@@ -31,25 +31,6 @@ boostbook standalone
         # Use the main Boost stylesheet:
         <xsl:param>html.stylesheet=../../../../doc/html/boostbook.css
         
-        # PDF Options:
-        # TOC Generation: this is needed for FOP-0.9 and later:
-        #<xsl:param>fop1.extensions=1
-        # Or enable this if you're using XEP:
-        <xsl:param>xep.extensions=1
-        # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9!
-        <xsl:param>fop.extensions=0
-        # No indent on body text:
-        <xsl:param>body.start.indent=0pt
-        # Margin size:
-        <xsl:param>page.margin.inner=0.5in
-        # Margin size:
-        <xsl:param>page.margin.outer=0.5in
-        # Yes, we want graphics for admonishments:
-        <xsl:param>admon.graphics=1
-        # Set this one for PDF generation *only*:
-        # default pnd graphics are awful in PDF form,
-        # better use SVG's instead:
-        <format>pdf:<xsl:param>admon.graphics.extension=".svg"
-        <format>pdf:<xsl:param>admon.graphics.path=$(boost-images)/
     ;
 
+
similarity index 96%
rename from deal.II/contrib/boost/libs/thread/doc/changes.qbk
rename to deal.II/contrib/boost-1.41.0/libs/thread/doc/changes.qbk
index 25ae1472f29a27d0c8fac0e6a65d2dfa7e9d722f..fcb110f9e110b22a871d89bd55152cdd6aef9bbf 100644 (file)
@@ -5,7 +5,11 @@
   http://www.boost.org/LICENSE_1_0.txt).
 ]
 
-[section:changes Changes since boost 1.35]
+[section:changes Changes since boost 1.40]
+
+The 1.41.0 release of Boost adds futures to the thread library. There are also a few minor changes.
+
+[heading Changes since boost 1.35]
 
 The 1.36.0 release of Boost includes a few new features in the thread library:
 
diff --git a/deal.II/contrib/boost-1.41.0/libs/thread/doc/future_ref.qbk b/deal.II/contrib/boost-1.41.0/libs/thread/doc/future_ref.qbk
new file mode 100644 (file)
index 0000000..f80bf22
--- /dev/null
@@ -0,0 +1,968 @@
+[/
+  (C) Copyright 2008-9 Anthony Williams.
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or copy at
+  http://www.boost.org/LICENSE_1_0.txt).
+]
+
+[section:reference Futures Reference]
+
+[section:future_state `state` enum]
+
+    namespace future_state
+    {
+        enum state {uninitialized, waiting, ready};
+    }
+
+[endsect]
+
+[section:unique_future `unique_future` class template]
+
+    template <typename R>
+    class unique_future
+    {
+        unique_future(unique_future & rhs);// = delete;
+        unique_future& operator=(unique_future& rhs);// = delete;
+
+    public:
+        typedef future_state::state state;
+
+        unique_future();
+        ~unique_future();
+
+        // move support
+        unique_future(unique_future && other);
+        unique_future& operator=(unique_future && other);
+
+        void swap(unique_future& other);
+
+        // retrieving the value
+        R&& get();        
+
+        // functions to check state
+        state get_state() const;
+        bool is_ready() const;        
+        bool has_exception() const;        
+        bool has_value() const;        
+
+        // waiting for the result to be ready
+        void wait() const;        
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const;
+        bool timed_wait_until(boost::system_time const& abs_time) const;
+    };
+
+[section:default_constructor Default Constructor]
+
+    unique_future();
+
+[variablelist
+
+[[Effects:] [Constructs an uninitialized future.]]
+
+[[Postconditions:] [[unique_future_is_ready_link `this->is_ready`] returns `false`. [unique_future_get_state_link
+`this->get_state()`] returns __uninitialized__.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:destructor Destructor]
+
+    ~unique_future();
+
+[variablelist
+
+[[Effects:] [Destroys `*this`.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:move_constructor Move Constructor]
+
+    unique_future(unique_future && other);
+
+[variablelist
+
+[[Effects:] [Constructs a new future, and transfers ownership of the asynchronous result associated with `other` to `*this`.]]
+
+[[Postconditions:] [[unique_future_get_state_link `this->get_state()`] returns the value of `other->get_state()` prior to the
+call. `other->get_state()` returns __uninitialized__. If `other` was associated with an asynchronous result, that result is now
+associated with `*this`. `other` is not associated with any asynchronous result.]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:move_assignment Move Assignment Operator]
+
+    unique_future& operator=(unique_future && other);
+
+[variablelist
+
+[[Effects:] [Transfers ownership of the asynchronous result associated with `other` to `*this`.]]
+
+[[Postconditions:] [[unique_future_get_state_link `this->get_state()`] returns the value of `other->get_state()` prior to the
+call. `other->get_state()` returns __uninitialized__. If `other` was associated with an asynchronous result, that result is now
+associated with `*this`. `other` is not associated with any asynchronous result. If `*this` was associated with an asynchronous
+result prior to the call, that result no longer has an associated __unique_future__ instance.]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:swap Member function `swap()`]
+
+    void swap(unique_future & other);
+
+[variablelist
+
+[[Effects:] [Swaps ownership of the asynchronous results associated with `other` and `*this`.]]
+
+[[Postconditions:] [[unique_future_get_state_link `this->get_state()`] returns the value of `other->get_state()` prior to the
+call. `other->get_state()` returns the value of `this->get_state()` prior to the call. If `other` was associated with an
+asynchronous result, that result is now associated with `*this`, otherwise `*this` has no associated result. If `*this` was
+associated with an asynchronous result, that result is now associated with `other`, otherwise `other` has no associated result.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+
+[section:get Member function `get()`]
+
+    R&& get();
+    R& unique_future<R&>::get();
+    void unique_future<void>::get();
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready as-if by a call to
+__unique_future_wait__, and retrieves the result (whether that is a value or an exception).]]
+
+[[Returns:] [If the result type `R` is a reference, returns the stored reference. If `R` is `void`, there is no return
+value. Otherwise, returns an rvalue-reference to the value stored in the asynchronous result.]]
+
+[[Postconditions:] [[unique_future_is_ready_link `this->is_ready()`] returns `true`. [unique_future_get_state_link
+`this->get_state()`] returns __ready__.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception stored in the
+asynchronous result in place of a value.]]
+
+[[Notes:] [`get()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+[section:wait Member function `wait()`]
+
+    void wait();
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready. If the result is not ready on
+entry, and the result has a ['wait callback] set, that callback is invoked prior to waiting.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [[unique_future_is_ready_link `this->is_ready()`] returns `true`. [unique_future_get_state_link
+`this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`wait()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+[section:timed_wait_duration Member function `timed_wait()`]
+
+    template<typename Duration>
+    bool timed_wait(Duration const& wait_duration);
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready, or the time specified by
+`wait_duration` has elapsed. If the result is not ready on entry, and the result has a ['wait callback] set, that callback is
+invoked prior to waiting.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready before the specified time has
+elapsed, `false` otherwise.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [If this call returned `true`, then [unique_future_is_ready_link `this->is_ready()`] returns `true` and
+[unique_future_get_state_link `this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`timed_wait()` is an ['interruption point]. `Duration` must be a type that meets the Boost.DateTime time duration requirements.]]
+
+]
+
+[endsect]
+
+[section:timed_wait_absolute Member function `timed_wait()`]
+
+    bool timed_wait(boost::system_time const& wait_timeout);
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready, or the time point specified by
+`wait_timeout` has passed. If the result is not ready on entry, and the result has a ['wait callback] set, that callback is invoked
+prior to waiting.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready before the specified time has
+passed, `false` otherwise.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [If this call returned `true`, then [unique_future_is_ready_link `this->is_ready()`] returns `true` and
+[unique_future_get_state_link `this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`timed_wait()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+
+[section:is_ready Member function `is_ready()`]
+
+    bool is_ready();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready for retrieval, `false`
+otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:has_value Member function `has_value()`]
+
+    bool has_value();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set with a value rather than an exception.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, that result is ready for retrieval, and the result is a
+stored value, `false` otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:has_exception Member function `has_exception()`]
+
+    bool has_exception();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set with an exception rather than a value.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, that result is ready for retrieval, and the result is a
+stored exception, `false` otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:get_state Member function `get_state()`]
+
+    future_state::state get_state();
+
+[variablelist
+
+[[Effects:] [Determine the state of the asynchronous result associated with `*this`, if any.]]
+
+[[Returns:] [__uninitialized__ if `*this` is not associated with an asynchronous result. __ready__ if the asynchronous result
+associated with `*this` is ready for retrieval, __waiting__ otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+
+[endsect]
+
+[section:shared_future `shared_future` class template]
+
+    template <typename R>
+    class shared_future
+    {
+    public:
+        typedef future_state::state state;
+
+        shared_future();
+        ~shared_future();
+
+        // copy support
+        shared_future(shared_future const& other);
+        shared_future& operator=(shared_future const& other);
+
+        // move support
+        shared_future(shared_future && other);
+        shared_future(unique_future<R> && other);
+        shared_future& operator=(shared_future && other);
+        shared_future& operator=(unique_future<R> && other);
+
+        void swap(shared_future& other);
+
+        // retrieving the value
+        R get();
+        
+        // functions to check state, and wait for ready
+        state get_state() const;
+        bool is_ready() const;
+        bool has_exception() const;
+        bool has_value() const;
+
+        // waiting for the result to be ready
+        void wait() const;        
+        template<typename Duration>
+        bool timed_wait(Duration const& rel_time) const;
+        bool timed_wait_until(boost::system_time const& abs_time) const;        
+    };
+
+[section:default_constructor Default Constructor]
+
+    shared_future();
+
+[variablelist
+
+[[Effects:] [Constructs an uninitialized future.]]
+
+[[Postconditions:] [[shared_future_is_ready_link `this->is_ready`] returns `false`. [shared_future_get_state_link
+`this->get_state()`] returns __uninitialized__.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:get Member function `get()`]
+
+    const R& get();
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready as-if by a call to
+__shared_future_wait__, and returns a `const` reference to the result.]]
+
+[[Returns:] [If the result type `R` is a reference, returns the stored reference. If `R` is `void`, there is no return
+value. Otherwise, returns a `const` reference to the value stored in the asynchronous result.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the
+result associated with `*this` is not ready at the point of the call, and the current thread is interrupted.]]
+
+[[Notes:] [`get()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+[section:wait Member function `wait()`]
+
+    void wait();
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready. If the result is not ready on
+entry, and the result has a ['wait callback] set, that callback is invoked prior to waiting.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [[shared_future_is_ready_link `this->is_ready()`] returns `true`. [shared_future_get_state_link
+`this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`wait()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+[section:timed_wait_duration Member function `timed_wait()`]
+
+    template<typename Duration>
+    bool timed_wait(Duration const& wait_duration);
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready, or the time specified by
+`wait_duration` has elapsed. If the result is not ready on entry, and the result has a ['wait callback] set, that callback is
+invoked prior to waiting.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready before the specified time has
+elapsed, `false` otherwise.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [If this call returned `true`, then [shared_future_is_ready_link `this->is_ready()`] returns `true` and
+[shared_future_get_state_link `this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`timed_wait()` is an ['interruption point]. `Duration` must be a type that meets the Boost.DateTime time duration requirements.]]
+
+]
+
+[endsect]
+
+[section:timed_wait_absolute Member function `timed_wait()`]
+
+    bool timed_wait(boost::system_time const& wait_timeout);
+
+[variablelist
+
+[[Effects:] [If `*this` is associated with an asynchronous result, waits until the result is ready, or the time point specified by
+`wait_timeout` has passed. If the result is not ready on entry, and the result has a ['wait callback] set, that callback is invoked
+prior to waiting.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready before the specified time has
+passed, `false` otherwise.]]
+
+[[Throws:] [__future_uninitialized__ if `*this` is not associated with an asynchronous result. __thread_interrupted__ if the result
+associated with `*this` is not ready at the point of the call, and the current thread is interrupted. Any exception thrown by the
+['wait callback] if such a callback is called.]]
+
+[[Postconditions:] [If this call returned `true`, then [shared_future_is_ready_link `this->is_ready()`] returns `true` and
+[shared_future_get_state_link `this->get_state()`] returns __ready__.]]
+
+[[Notes:] [`timed_wait()` is an ['interruption point].]]
+
+]
+
+[endsect]
+
+[section:is_ready Member function `is_ready()`]
+
+    bool is_ready();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, and that result is ready for retrieval, `false`
+otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:has_value Member function `has_value()`]
+
+    bool has_value();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set with a value rather than an exception.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, that result is ready for retrieval, and the result is a
+stored value, `false` otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:has_exception Member function `has_exception()`]
+
+    bool has_exception();
+
+[variablelist
+
+[[Effects:] [Checks to see if the asynchronous result associated with `*this` is set with an exception rather than a value.]]
+
+[[Returns:] [`true` if `*this` is associated with an asynchronous result, that result is ready for retrieval, and the result is a
+stored exception, `false` otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:get_state Member function `get_state()`]
+
+    future_state::state get_state();
+
+[variablelist
+
+[[Effects:] [Determine the state of the asynchronous result associated with `*this`, if any.]]
+
+[[Returns:] [__uninitialized__ if `*this` is not associated with an asynchronous result. __ready__ if the asynchronous result
+associated with `*this` is ready for retrieval, __waiting__ otherwise.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+
+[endsect]
+
+[section:promise `promise` class template]
+
+    template <typename R>
+    class promise
+    {
+        promise(promise & rhs);// = delete;
+        promise & operator=(promise & rhs);// = delete;
+    public:
+        // template <class Allocator> explicit promise(Allocator a);
+
+        promise();
+        ~promise();
+
+        // Move support
+        promise(promise && rhs);
+        promise & operator=(promise&& rhs);
+        
+        void swap(promise& other);
+        // Result retrieval
+        unique_future<R> get_future();
+
+        // Set the value
+        void set_value(R& r);
+        void set_value(R&& r);
+        void set_exception(boost::exception_ptr e);
+
+        template<typename F>
+        void set_wait_callback(F f);        
+    };
+
+[section:default_constructor Default Constructor]
+
+    promise();
+
+[variablelist
+
+[[Effects:] [Constructs a new __promise__ with no associated result.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:move_constructor Move Constructor]
+
+    promise(promise && other);
+
+[variablelist
+
+[[Effects:] [Constructs a new __promise__, and transfers ownership of the result associated with `other` to `*this`, leaving `other`
+with no associated result.]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:move_assignment Move Assignment Operator]
+
+    promise& operator=(promise && other);
+
+[variablelist
+
+[[Effects:] [Transfers ownership of the result associated with `other` to `*this`, leaving `other` with no associated result. If there
+was already a result associated with `*this`, and that result was not ['ready], sets any futures associated with that result to
+['ready] with a __broken_promise__ exception as the result. ]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:destructor Destructor]
+
+    ~promise();
+
+[variablelist
+
+[[Effects:] [Destroys `*this`. If there was a result associated with `*this`, and that result is not ['ready], sets any futures
+associated with that task to ['ready] with a __broken_promise__ exception as the result.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:get_future Member Function `get_future()`]
+
+    unique_future<R> get_future();
+
+[variablelist
+
+[[Effects:] [If `*this` was not associated with a result, allocate storage for a new asynchronous result and associate it with
+`*this`. Returns a __unique_future__ associated with the result associated with `*this`. ]]
+
+[[Throws:] [__future_already_retrieved__ if the future associated with the task has already been retrieved. `std::bad_alloc` if any
+memory necessary could not be allocated.]]
+
+]
+
+[endsect]
+
+[section:set_value Member Function `set_value()`]
+
+    void set_value(R&& r);
+    void set_value(const R& r);
+    void promise<R&>::set_value(R& r);
+    void promise<void>::set_value();
+
+[variablelist
+
+[[Effects:] [If `*this` was not associated with a result, allocate storage for a new asynchronous result and associate it with
+`*this`. Store the value `r` in the asynchronous result associated with `*this`. Any threads blocked waiting for the asynchronous
+result are woken.]]
+
+[[Postconditions:] [All futures waiting on the asynchronous result are ['ready] and __unique_future_has_value__ or
+__shared_future_has_value__ for those futures shall return `true`.]]
+
+[[Throws:] [__promise_already_satisfied__ if the result associated with `*this` is already ['ready]. `std::bad_alloc` if the memory
+required for storage of the result cannot be allocated. Any exception thrown by the copy or move-constructor of `R`.]]
+
+]
+
+[endsect]
+
+[section:set_exception Member Function `set_exception()`]
+
+    void set_exception(boost::exception_ptr e);
+
+[variablelist
+
+[[Effects:] [If `*this` was not associated with a result, allocate storage for a new asynchronous result and associate it with
+`*this`. Store the exception `e` in the asynchronous result associated with `*this`. Any threads blocked waiting for the asynchronous
+result are woken.]]
+
+[[Postconditions:] [All futures waiting on the asynchronous result are ['ready] and __unique_future_has_exception__ or
+__shared_future_has_exception__ for those futures shall return `true`.]]
+
+[[Throws:] [__promise_already_satisfied__ if the result associated with `*this` is already ['ready]. `std::bad_alloc` if the memory
+required for storage of the result cannot be allocated.]]
+
+]
+
+[endsect]
+
+[section:set_wait_callback Member Function `set_wait_callback()`]
+
+    template<typename F>
+    void set_wait_callback(F f);
+
+[variablelist
+
+[[Preconditions:] [The expression `f(t)` where `t` is a lvalue of type __packaged_task__ shall be well-formed. Invoking a copy of
+`f` shall have the same effect as invoking `f`]]
+
+[[Effects:] [Store a copy of `f` with the asynchronous result associated with `*this` as a ['wait callback]. This will replace any
+existing wait callback store alongside that result. If a thread subsequently calls one of the wait functions on a __unique_future__
+or __shared_future__ associated with this result, and the result is not ['ready], `f(*this)` shall be invoked.]]
+
+[[Throws:] [`std::bad_alloc` if memory cannot be allocated for the required storage.]]
+
+]
+
+[endsect]
+
+[endsect]
+
+[section:packaged_task `packaged_task` class template]
+
+    template<typename R>
+    class packaged_task
+    {
+        packaged_task(packaged_task&);// = delete;
+        packaged_task& operator=(packaged_task&);// = delete;
+        
+    public:
+        // construction and destruction
+        template <class F>
+        explicit packaged_task(F const& f);
+
+        explicit packaged_task(R(*f)());
+        
+        template <class F>
+        explicit packaged_task(F&& f);
+
+        // template <class F, class Allocator>
+        // explicit packaged_task(F const& f, Allocator a);
+        // template <class F, class Allocator>
+        // explicit packaged_task(F&& f, Allocator a);
+
+        ~packaged_task()
+        {}
+
+        // move support
+        packaged_task(packaged_task&& other);
+        packaged_task& operator=(packaged_task&& other);
+
+        void swap(packaged_task& other);
+        // result retrieval
+        unique_future<R> get_future();        
+
+        // execution
+        void operator()();
+
+        template<typename F>
+        void set_wait_callback(F f);        
+    };
+
+[section:task_constructor Task Constructor]
+
+    template<typename F>
+    packaged_task(F const &f);
+
+    packaged_task(R(*f)());
+
+    template<typename F>
+    packaged_task(F&&f);
+
+[variablelist
+
+[[Preconditions:] [`f()` is a valid expression with a return type convertible to `R`. Invoking a copy of `f` shall behave the same
+as invoking `f`.]]
+
+[[Effects:] [Constructs a new __packaged_task__ with a copy of `f` stored as the associated task.]]
+
+[[Throws:] [Any exceptions thrown by the copy (or move) constructor of `f`. `std::bad_alloc` if memory for the internal data
+structures could not be allocated.]]
+
+]
+
+[endsect]
+
+[section:move_constructor Move Constructor]
+
+    packaged_task(packaged_task && other);
+
+[variablelist
+
+[[Effects:] [Constructs a new __packaged_task__, and transfers ownership of the task associated with `other` to `*this`, leaving `other`
+with no associated task.]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:move_assignment Move Assignment Operator]
+
+    packaged_task& operator=(packaged_task && other);
+
+[variablelist
+
+[[Effects:] [Transfers ownership of the task associated with `other` to `*this`, leaving `other` with no associated task. If there
+was already a task associated with `*this`, and that task has not been invoked, sets any futures associated with that task to
+['ready] with a __broken_promise__ exception as the result. ]]
+
+[[Throws:] [Nothing.]]
+
+[[Notes:] [If the compiler does not support rvalue-references, this is implemented using the boost.thread move emulation.]]
+
+]
+
+[endsect]
+
+[section:destructor Destructor]
+
+    ~packaged_task();
+
+[variablelist
+
+[[Effects:] [Destroys `*this`. If there was a task associated with `*this`, and that task has not been invoked, sets any futures
+associated with that task to ['ready] with a __broken_promise__ exception as the result.]]
+
+[[Throws:] [Nothing.]]
+
+]
+
+[endsect]
+
+[section:get_future Member Function `get_future()`]
+
+    unique_future<R> get_future();
+
+[variablelist
+
+[[Effects:] [Returns a __unique_future__ associated with the result of the task associated with `*this`. ]]
+
+[[Throws:] [__task_moved__ if ownership of the task associated with `*this` has been moved to another instance of
+__packaged_task__. __future_already_retrieved__ if the future associated with the task has already been retrieved.]]
+
+]
+
+[endsect]
+
+[section:call_operator Member Function `operator()()`]
+
+    void operator()();
+
+[variablelist
+
+[[Effects:] [Invoke the task associated with `*this` and store the result in the corresponding future. If the task returns normally,
+the return value is stored as the asynchronous result, otherwise the exception thrown is stored. Any threads blocked waiting for the
+asynchronous result associated with this task are woken.]]
+
+[[Postconditions:] [All futures waiting on the asynchronous result are ['ready]]]
+
+[[Throws:] [__task_moved__ if ownership of the task associated with `*this` has been moved to another instance of
+__packaged_task__. __task_already_started__ if the task has already been invoked.]]
+
+]
+
+[endsect]
+
+[section:set_wait_callback Member Function `set_wait_callback()`]
+
+    template<typename F>
+    void set_wait_callback(F f);
+
+[variablelist
+
+[[Preconditions:] [The expression `f(t)` where `t` is a lvalue of type __packaged_task__ shall be well-formed. Invoking a copy of
+`f` shall have the same effect as invoking `f`]]
+
+[[Effects:] [Store a copy of `f` with the task associated with `*this` as a ['wait callback]. This will replace any existing wait
+callback store alongside that task. If a thread subsequently calls one of the wait functions on a __unique_future__ or
+__shared_future__ associated with this task, and the result of the task is not ['ready], `f(*this)` shall be invoked.]]
+
+[[Throws:] [__task_moved__ if ownership of the task associated with `*this` has been moved to another instance of
+__packaged_task__.]]
+
+]
+
+[endsect]
+
+
+[endsect]
+
+[section:wait_for_any Non-member function `wait_for_any()`]
+
+    template<typename Iterator>
+    Iterator wait_for_any(Iterator begin,Iterator end);
+
+    template<typename F1,typename F2>
+    unsigned wait_for_any(F1& f1,F2& f2);
+
+    template<typename F1,typename F2,typename F3>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3);
+
+    template<typename F1,typename F2,typename F3,typename F4>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4);
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    unsigned wait_for_any(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5);
+
+[variablelist
+
+[[Preconditions:] [The types `Fn` shall be specializations of
+__unique_future__ or __shared_future__, and `Iterator` shall be a
+forward iterator with a `value_type` which is a specialization of
+__unique_future__ or __shared_future__.]]
+
+[[Effects:] [Waits until at least one of the specified futures is ['ready].]]
+
+[[Returns:] [The range-based overload returns an `Iterator` identifying the first future in the range that was detected as
+['ready]. The remaining overloads return the zero-based index of the first future that was detected as ['ready] (first parameter =>
+0, second parameter => 1, etc.).]]
+
+[[Throws:] [__thread_interrupted__ if the current thread is interrupted. Any exception thrown by the ['wait callback] associated
+with any of the futures being waited for.  `std::bad_alloc` if memory could not be allocated for the internal wait structures.]]
+
+[[Notes:] [`wait_for_any()` is an ['interruption point].]]
+
+]
+
+
+[endsect]
+
+[section:wait_for_all Non-member function `wait_for_all()`]
+
+    template<typename Iterator>
+    void wait_for_all(Iterator begin,Iterator end);
+
+    template<typename F1,typename F2>
+    void wait_for_all(F1& f1,F2& f2);
+
+    template<typename F1,typename F2,typename F3>
+    void wait_for_all(F1& f1,F2& f2,F3& f3);
+
+    template<typename F1,typename F2,typename F3,typename F4>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4);
+
+    template<typename F1,typename F2,typename F3,typename F4,typename F5>
+    void wait_for_all(F1& f1,F2& f2,F3& f3,F4& f4,F5& f5);
+
+[variablelist
+
+[[Preconditions:] [The types `Fn` shall be specializations of
+__unique_future__ or __shared_future__, and `Iterator` shall be a
+forward iterator with a `value_type` which is a specialization of
+__unique_future__ or __shared_future__.]]
+
+[[Effects:] [Waits until all of the specified futures are ['ready].]]
+
+[[Throws:] [Any exceptions thrown by a call to `wait()` on the specified futures.]]
+
+[[Notes:] [`wait_for_all()` is an ['interruption point].]]
+
+]
+
+
+[endsect]
+
+
+[endsect]
diff --git a/deal.II/contrib/boost-1.41.0/libs/thread/doc/futures.qbk b/deal.II/contrib/boost-1.41.0/libs/thread/doc/futures.qbk
new file mode 100755 (executable)
index 0000000..a4e123f
--- /dev/null
@@ -0,0 +1,187 @@
+[/
+  (C) Copyright 2008-9 Anthony Williams.
+  Distributed under the Boost Software License, Version 1.0.
+  (See accompanying file LICENSE_1_0.txt or copy at
+  http://www.boost.org/LICENSE_1_0.txt).
+]
+
+[section:futures Futures]
+
+[template future_state_link[link_text] [link thread.synchronization.futures.reference.future_state [link_text]]]
+[def __uninitialized__ [future_state_link `boost::future_state::uninitialized`]]
+[def __ready__ [future_state_link `boost::future_state::ready`]]
+[def __waiting__ [future_state_link `boost::future_state::waiting`]]
+
+[def __future_uninitialized__ `boost::future_uninitialized`]
+[def __broken_promise__ `boost::broken_promise`]
+[def __future_already_retrieved__ `boost::future_already_retrieved`]
+[def __task_moved__ `boost::task_moved`]
+[def __task_already_started__ `boost::task_already_started`]
+[def __promise_already_satisfied__ `boost::promise_already_satisfied`]
+
+[def __thread_interrupted__ `boost::thread_interrupted`]
+
+
+[template unique_future_link[link_text] [link thread.synchronization.futures.reference.unique_future [link_text]]]
+[def __unique_future__ [unique_future_link `boost::unique_future`]]
+
+[template unique_future_get_link[link_text] [link thread.synchronization.futures.reference.unique_future.get [link_text]]]
+[def __unique_future_get__ [unique_future_get_link `boost::unique_future<R>::get()`]]
+
+[template unique_future_wait_link[link_text] [link thread.synchronization.futures.reference.unique_future.wait [link_text]]]
+[def __unique_future_wait__ [unique_future_wait_link `boost::unique_future<R>::wait()`]]
+
+[template unique_future_is_ready_link[link_text] [link thread.synchronization.futures.reference.unique_future.is_ready [link_text]]]
+[def __unique_future_is_ready__ [unique_future_is_ready_link `boost::unique_future<R>::is_ready()`]]
+
+[template unique_future_has_value_link[link_text] [link thread.synchronization.futures.reference.unique_future.has_value [link_text]]]
+[def __unique_future_has_value__ [unique_future_has_value_link `boost::unique_future<R>::has_value()`]]
+
+[template unique_future_has_exception_link[link_text] [link thread.synchronization.futures.reference.unique_future.has_exception [link_text]]]
+[def __unique_future_has_exception__ [unique_future_has_exception_link `boost::unique_future<R>::has_exception()`]]
+
+[template unique_future_get_state_link[link_text] [link thread.synchronization.futures.reference.unique_future.get_state [link_text]]]
+[def __unique_future_get_state__ [unique_future_get_state_link `boost::unique_future<R>::get_state()`]]
+
+[template shared_future_link[link_text] [link thread.synchronization.futures.reference.shared_future [link_text]]]
+[def __shared_future__ [shared_future_link `boost::shared_future`]]
+
+[template shared_future_get_link[link_text] [link thread.synchronization.futures.reference.shared_future.get [link_text]]]
+[def __shared_future_get__ [shared_future_get_link `boost::shared_future<R>::get()`]]
+
+[template shared_future_wait_link[link_text] [link thread.synchronization.futures.reference.shared_future.wait [link_text]]]
+[def __shared_future_wait__ [shared_future_wait_link `boost::shared_future<R>::wait()`]]
+
+[template shared_future_is_ready_link[link_text] [link thread.synchronization.futures.reference.shared_future.is_ready [link_text]]]
+[def __shared_future_is_ready__ [shared_future_is_ready_link `boost::shared_future<R>::is_ready()`]]
+
+[template shared_future_has_value_link[link_text] [link thread.synchronization.futures.reference.shared_future.has_value [link_text]]]
+[def __shared_future_has_value__ [shared_future_has_value_link `boost::shared_future<R>::has_value()`]]
+
+[template shared_future_has_exception_link[link_text] [link thread.synchronization.futures.reference.shared_future.has_exception [link_text]]]
+[def __shared_future_has_exception__ [shared_future_has_exception_link `boost::shared_future<R>::has_exception()`]]
+
+[template shared_future_get_state_link[link_text] [link thread.synchronization.futures.reference.shared_future.get_state [link_text]]]
+[def __shared_future_get_state__ [shared_future_get_state_link `boost::shared_future<R>::get_state()`]]
+
+[template promise_link[link_text] [link thread.synchronization.futures.reference.promise [link_text]]]
+[def __promise__ [promise_link `boost::promise`]]
+
+[template packaged_task_link[link_text] [link thread.synchronization.futures.reference.packaged_task [link_text]]]
+[def __packaged_task__ [packaged_task_link `boost::packaged_task`]]
+
+[template wait_for_any_link[link_text] [link thread.synchronization.futures.reference.wait_for_any [link_text]]]
+[def __wait_for_any__ [wait_for_any_link `boost::wait_for_any()`]]
+
+[template wait_for_all_link[link_text] [link thread.synchronization.futures.reference.wait_for_all [link_text]]]
+[def __wait_for_all__ [wait_for_all_link `boost::wait_for_all()`]]
+
+
+[section:overview Overview]
+
+The futures library provides a means of handling synchronous future values, whether those values are generated by another thread, or
+on a single thread in response to external stimuli, or on-demand.
+
+This is done through the provision of four class templates: __unique_future__ and __shared_future__ which are used to retrieve the
+asynchronous results, and __promise__ and __packaged_task__ which are used to generate the asynchronous results.
+
+An instance of __unique_future__ holds the one and only reference to a result. Ownership can be transferred between instances using
+the move constructor or move-assignment operator, but at most one instance holds a reference to a given asynchronous result. When
+the result is ready, it is returned from __unique_future_get__ by rvalue-reference to allow the result to be moved or copied as
+appropriate for the type.
+
+On the other hand, many instances of __shared_future__ may reference the same result. Instances can be freely copied and assigned,
+and __shared_future_get__ returns a `const` reference so that multiple calls to __shared_future_get__ are safe. You can move an
+instance of __unique_future__ into an instance of __shared_future__, thus transferring ownership of the associated asynchronous
+result, but not vice-versa.
+
+You can wait for futures either individually or with one of the __wait_for_any__ and __wait_for_all__ functions.
+
+[endsect]
+
+[section:creating Creating asynchronous values]
+
+You can set the value in a future with either a __promise__ or a __packaged_task__. A __packaged_task__ is a callable object that
+wraps a function or callable object. When the packaged task is invoked, it invokes the contained function in turn, and populates a
+future with the return value. This is an answer to the perennial question: "how do I return a value from a thread?": package the
+function you wish to run as a __packaged_task__ and pass the packaged task to the thread constructor. The future retrieved from the
+packaged task can then be used to obtain the return value. If the function throws an exception, that is stored in the future in
+place of the return value.
+
+    int calculate_the_answer_to_life_the_universe_and_everything()
+    {
+        return 42;
+    }
+
+    boost::packaged_task<int> pt(calculate_the_answer_to_life_the_universe_and_everything);
+    boost::unique_future<int> fi=pt.get_future();
+
+    boost::thread task(boost::move(pt)); // launch task on a thread
+
+    fi.wait(); // wait for it to finish
+        
+    assert(fi.is_ready());
+    assert(fi.has_value());
+    assert(!fi.has_exception());
+    assert(fi.get_state()==boost::future_state::ready);
+    assert(fi.get()==42);
+
+
+A __promise__ is a bit more low level: it just provides explicit functions to store a value or an exception in the associated
+future. A promise can therefore be used where the value may come from more than one possible source, or where a single operation may
+produce multiple values.
+
+    boost::promise<int> pi;
+    boost::unique_future<int> fi;
+    fi=pi.get_future();
+
+    pi.set_value(42);
+    
+    assert(fi.is_ready());
+    assert(fi.has_value());
+    assert(!fi.has_exception());
+    assert(fi.get_state()==boost::future_state::ready);
+    assert(fi.get()==42);
+
+[endsect]
+
+[section:lazy_futures Wait Callbacks and Lazy Futures]
+
+Both __promise__ and __packaged_task__ support ['wait callbacks] that are invoked when a thread blocks in a call to `wait()` or
+`timed_wait()` on a future that is waiting for the result from the __promise__ or __packaged_task__, in the thread that is doing the
+waiting. These can be set using the `set_wait_callback()` member function on the __promise__ or __packaged_task__ in question.
+
+This allows ['lazy futures] where the result is not actually computed until it is needed by some thread. In the example below, the
+call to `f.get()` invokes the callback `invoke_lazy_task`, which runs the task to set the value. If you remove the call to
+`f.get()`, the task is not ever run.
+
+    int calculate_the_answer_to_life_the_universe_and_everything()
+    {
+        return 42;
+    }
+
+    void invoke_lazy_task(boost::packaged_task<int>& task)
+    {
+        try
+        {
+            task();
+        }
+        catch(boost::task_already_started&)
+        {}
+    }
+
+    int main()
+    {
+        boost::packaged_task<int> task(calculate_the_answer_to_life_the_universe_and_everything);
+        task.set_wait_callback(invoke_lazy_task);
+        boost::unique_future<int> f(task.get_future());
+
+        assert(f.get()==42);
+    }
+
+
+[endsect]
+
+[include future_ref.qbk]
+
+[endsect]
\ No newline at end of file
similarity index 99%
rename from deal.II/contrib/boost/libs/thread/doc/thread.qbk
rename to deal.II/contrib/boost-1.41.0/libs/thread/doc/thread.qbk
index e6346db6ec0dad3deb8d7891dc3063f4a4bc8417..eca953ec2f86bbcc310dec17c23368ca104d3daa 100644 (file)
 [include condition_variables.qbk]
 [include once.qbk]
 [include barrier.qbk]
+[include futures.qbk]
 [endsect]
 
 [include tss.qbk]
similarity index 98%
rename from deal.II/contrib/boost/libs/thread/doc/thread_ref.qbk
rename to deal.II/contrib/boost-1.41.0/libs/thread/doc/thread_ref.qbk
index 43e62ea13fc713607a1e23dafbd0b5bdfc601ce4..d522522157a3721e897374ea072167a1b2fc89c5 100644 (file)
@@ -916,6 +916,13 @@ exits (even if the thread has been interrupted).]]
 [[Throws:] [`std::bad_alloc` if memory cannot be allocated for the copy of the function, __thread_resource_error__ if any other
 error occurs within the thread library. Any exception thrown whilst copying `func` into internal storage.]]
 
+[[Note:] [This function is *not* called if the thread was terminated
+forcefully using platform-specific APIs, or if the thread is
+terminated due to a call to `exit()`, `abort()` or
+`std::terminate()`. In particular, returning from `main()` is
+equivalent to call to `exit()`, so will not call any functions
+registered with `at_thread_exit()`]]
+
 ]
 
 [endsect]
similarity index 90%
rename from deal.II/contrib/boost/libs/thread/example/condition.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/example/condition.cpp
index 096c35d8af545104604a9f32ee46ad07620cd547..7430e4621dc06f91e43323733afc0542224434f2 100644 (file)
@@ -50,8 +50,9 @@ boost::mutex io_mutex;
 
 void sender() {
     int n = 0;
-    while (n < 100) {
+    while (n < 1000000) {
         buf.send(n);
+        if(!(n%10000))
         {
             boost::mutex::scoped_lock io_lock(io_mutex);
             std::cout << "sent: " << n << std::endl;
@@ -65,18 +66,24 @@ void receiver() {
     int n;
     do {
         n = buf.receive();
+        if(!(n%10000))
         {
             boost::mutex::scoped_lock io_lock(io_mutex);
             std::cout << "received: " << n << std::endl;
         }
     } while (n != -1); // -1 indicates end of buffer
+    buf.send(-1);
 }
 
 int main(int, char*[])
 {
     boost::thread thrd1(&sender);
     boost::thread thrd2(&receiver);
+    boost::thread thrd3(&receiver);
+    boost::thread thrd4(&receiver);
     thrd1.join();
     thrd2.join();
+    thrd3.join();
+    thrd4.join();
     return 0;
 }
similarity index 98%
rename from deal.II/contrib/boost/libs/thread/example/tennis.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/example/tennis.cpp
index e222871719a92adde6fe1eb4a2cff4a001e48e65..798f55e5d8bb08a0ec9c306570bd21b81bc9a8d5 100644 (file)
@@ -112,7 +112,7 @@ int main(int argc, char* argv[])
         std::cout << "---Noise ON..." << std::endl;
     }
 
-    for (int i = 0; i < 1000000; ++i)
+    for (int i = 0; i < 1000000000; ++i)
         cond.notify_all();
 
     {
similarity index 78%
rename from deal.II/contrib/boost/libs/thread/src/pthread/thread.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/src/pthread/thread.cpp
index 83f053e6070e3496c649d0a0352580c55cdb2988..3a5ce7cdfbc87cefe0aa1a86287a154d5316f864 100644 (file)
@@ -42,19 +42,6 @@ namespace boost
             {}
         };
 
-        struct tss_data_node
-        {
-            void const* key;
-            boost::shared_ptr<boost::detail::tss_cleanup_function> func;
-            void* value;
-            tss_data_node* next;
-
-            tss_data_node(void const* key_,boost::shared_ptr<boost::detail::tss_cleanup_function> func_,void* value_,
-                          tss_data_node* next_):
-                key(key_),func(func_),value(value_),next(next_)
-            {}
-        };
-
         namespace
         {
             boost::once_flag current_thread_tls_init_flag=BOOST_ONCE_INIT;
@@ -67,7 +54,7 @@ namespace boost
                     boost::detail::thread_data_base* thread_info=static_cast<boost::detail::thread_data_base*>(data);
                     if(thread_info)
                     {
-                        while(thread_info->tss_data || thread_info->thread_exit_callbacks)
+                        while(!thread_info->tss_data.empty() || thread_info->thread_exit_callbacks)
                         {
                             while(thread_info->thread_exit_callbacks)
                             {
@@ -80,15 +67,18 @@ namespace boost
                                 }
                                 delete current_node;
                             }
-                            while(thread_info->tss_data)
+                            for(std::map<void const*,tss_data_node>::iterator next=thread_info->tss_data.begin(),
+                                    current,
+                                    end=thread_info->tss_data.end();
+                                next!=end;)
                             {
-                                detail::tss_data_node* const current_node=thread_info->tss_data;
-                                thread_info->tss_data=current_node->next;
-                                if(current_node->func)
+                                current=next;
+                                ++next;
+                                if(current->second.func && current->second.value)
                                 {
-                                    (*current_node->func)(current_node->value);
+                                    (*current->second.func)(current->second.value);
                                 }
-                                delete current_node;
+                                thread_info->tss_data.erase(current);
                             }
                         }
                         thread_info->self.reset();
@@ -132,10 +122,12 @@ namespace boost
                 catch(thread_interrupted const&)
                 {
                 }
-                catch(...)
-                {
-                    std::terminate();
-                }
+// Removed as it stops the debugger identifying the cause of the exception
+// Unhandled exceptions still cause the application to terminate
+//                 catch(...)
+//                 {
+//                     std::terminate();
+//                 }
 
                 detail::tls_destructor(thread_info.get());
                 detail::set_current_thread_data(0);
@@ -337,8 +329,7 @@ namespace boost
             if(thread_info)
             {
                 unique_lock<mutex> lk(thread_info->sleep_mutex);
-                while(thread_info->sleep_condition.timed_wait(lk,st))
-                 ;
+                while(thread_info->sleep_condition.timed_wait(lk,st));
             }
             else
             {
@@ -389,7 +380,7 @@ namespace boost
     {
 #if defined(PTW32_VERSION) || defined(__hpux)
         return pthread_num_processors_np();
-#elif defined(__linux__)
+#elif defined(_GNU_SOURCE)
         return get_nprocs();
 #elif defined(__APPLE__) || defined(__FreeBSD__)
         int count;
@@ -551,14 +542,11 @@ namespace boost
             detail::thread_data_base* const current_thread_data(get_current_thread_data());
             if(current_thread_data)
             {
-                detail::tss_data_node* current_node=current_thread_data->tss_data;
-                while(current_node)
+                std::map<void const*,tss_data_node>::iterator current_node=
+                    current_thread_data->tss_data.find(key);
+                if(current_node!=current_thread_data->tss_data.end())
                 {
-                    if(current_node->key==key)
-                    {
-                        return current_node;
-                    }
-                    current_node=current_node->next;
+                    return &current_node->second;
                 }
             }
             return NULL;
@@ -572,106 +560,47 @@ namespace boost
             }
             return NULL;
         }
+
+        void add_new_tss_node(void const* key,
+                              boost::shared_ptr<tss_cleanup_function> func,
+                              void* tss_data)
+        {
+            detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
+            current_thread_data->tss_data.insert(std::make_pair(key,tss_data_node(func,tss_data)));
+        }
+
+        void erase_tss_node(void const* key)
+        {
+            detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
+            current_thread_data->tss_data.erase(key);
+        }
         
-        void set_tss_data(void const* key,boost::shared_ptr<tss_cleanup_function> func,void* tss_data,bool cleanup_existing)
+        void set_tss_data(void const* key,
+                          boost::shared_ptr<tss_cleanup_function> func,
+                          void* tss_data,bool cleanup_existing)
         {
             if(tss_data_node* const current_node=find_tss_data(key))
             {
-                if(cleanup_existing && current_node->func)
+                if(cleanup_existing && current_node->func && current_node->value)
                 {
                     (*current_node->func)(current_node->value);
                 }
-                current_node->func=func;
-                current_node->value=tss_data;
+                if(func || tss_data)
+                {
+                    current_node->func=func;
+                    current_node->value=tss_data;
+                }
+                else
+                {
+                    erase_tss_node(key);
+                }
             }
             else
             {
-                detail::thread_data_base* const current_thread_data(get_or_make_current_thread_data());
-                tss_data_node* const new_node=new tss_data_node(key,func,tss_data,current_thread_data->tss_data);
-                current_thread_data->tss_data=new_node;
+                add_new_tss_node(key,func,tss_data);
             }
         }
     }
 
-//     thread_group::thread_group()
-//     {
-//     }
-
-//     thread_group::~thread_group()
-//     {
-//         // We shouldn't have to scoped_lock here, since referencing this object
-//         // from another thread while we're deleting it in the current thread is
-//         // going to lead to undefined behavior any way.
-//         for (std::list<thread*>::iterator it = m_threads.begin();
-//              it != m_threads.end(); ++it)
-//         {
-//             delete (*it);
-//         }
-//     }
-
-//     thread* thread_group::create_thread(const function0<void>& threadfunc)
-//     {
-//         // No scoped_lock required here since the only "shared data" that's
-//         // modified here occurs inside add_thread which does scoped_lock.
-//         std::auto_ptr<thread> thrd(new thread(threadfunc));
-//         add_thread(thrd.get());
-//         return thrd.release();
-//     }
-
-//     void thread_group::add_thread(thread* thrd)
-//     {
-//         mutex::scoped_lock scoped_lock(m_mutex);
-
-//         // For now we'll simply ignore requests to add a thread object multiple
-//         // times. Should we consider this an error and either throw or return an
-//         // error value?
-//         std::list<thread*>::iterator it = std::find(m_threads.begin(),
-//                                                     m_threads.end(), thrd);
-//         BOOST_ASSERT(it == m_threads.end());
-//         if (it == m_threads.end())
-//             m_threads.push_back(thrd);
-//     }
-
-//     void thread_group::remove_thread(thread* thrd)
-//     {
-//         mutex::scoped_lock scoped_lock(m_mutex);
-
-//         // For now we'll simply ignore requests to remove a thread object that's
-//         // not in the group. Should we consider this an error and either throw or
-//         // return an error value?
-//         std::list<thread*>::iterator it = std::find(m_threads.begin(),
-//                                                     m_threads.end(), thrd);
-//         BOOST_ASSERT(it != m_threads.end());
-//         if (it != m_threads.end())
-//             m_threads.erase(it);
-//     }
-
-//     void thread_group::join_all()
-//     {
-//         mutex::scoped_lock scoped_lock(m_mutex);
-//         for (std::list<thread*>::iterator it = m_threads.begin();
-//              it != m_threads.end(); ++it)
-//         {
-//             (*it)->join();
-//         }
-//     }
-
-//     void thread_group::interrupt_all()
-//     {
-//         boost::lock_guard<mutex> guard(m_mutex);
-            
-//         for(std::list<thread*>::iterator it=m_threads.begin(),end=m_threads.end();
-//             it!=end;
-//             ++it)
-//         {
-//             (*it)->interrupt();
-//         }
-//     }
-        
-
-//     size_t thread_group::size() const
-//     {
-//         return m_threads.size();
-//     }
 
 }
similarity index 98%
rename from deal.II/contrib/boost/libs/thread/src/win32/thread.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/src/win32/thread.cpp
index 9c4f82b011474bd01a8125264cac19d19feaf257..46af8600a7d8a40526ba9ec570a5b5d4ae14b89a 100644 (file)
@@ -169,10 +169,12 @@ namespace boost
             catch(thread_interrupted const&)
             {
             }
-            catch(...)
-            {
-                std::terminate();
-            }
+// Removed as it stops the debugger identifying the cause of the exception
+// Unhandled exceptions still cause the application to terminate
+//             catch(...)
+//             {
+//                 std::terminate();
+//             }
             run_thread_exit_callbacks();
             return 0;
         }
@@ -559,7 +561,7 @@ namespace boost
         {
             if(tss_data_node* const current_node=find_tss_data(key))
             {
-                if(cleanup_existing && current_node->func.get())
+                if(cleanup_existing && current_node->func.get() && current_node->value)
                 {
                     (*current_node->func)(current_node->value);
                 }
similarity index 94%
rename from deal.II/contrib/boost/libs/thread/test/Jamfile.v2
rename to deal.II/contrib/boost-1.41.0/libs/thread/test/Jamfile.v2
index a6a769cb438274a65c7256369beccccd0b1df35a..3e43ddf478282891e31bbe2026453ee6ae0b7525 100644 (file)
@@ -38,6 +38,8 @@ rule thread-run ( sources )
           [ thread-run test_thread_id.cpp ]
           [ thread-run test_hardware_concurrency.cpp ]
           [ thread-run test_thread_move.cpp ]
+          [ thread-run test_thread_return_local.cpp ]
+          [ thread-run test_thread_move_return.cpp ]
           [ thread-run test_thread_launching.cpp ]
           [ thread-run test_thread_mf.cpp ]
           [ thread-run test_move_function.cpp ]
@@ -55,6 +57,7 @@ rule thread-run ( sources )
           [ thread-run test_shared_mutex_timed_locks.cpp ]
           [ thread-run test_lock_concept.cpp ]
           [ thread-run test_generic_locks.cpp ]
+          [ thread-run test_futures.cpp ]
           [ compile-fail no_implicit_move_from_lvalue_thread.cpp ]
           [ compile-fail no_implicit_assign_from_lvalue_thread.cpp ]
     ;
diff --git a/deal.II/contrib/boost-1.41.0/libs/thread/test/test_futures.cpp b/deal.II/contrib/boost-1.41.0/libs/thread/test/test_futures.cpp
new file mode 100644 (file)
index 0000000..c8af0e3
--- /dev/null
@@ -0,0 +1,1218 @@
+//  (C) Copyright 2008-9 Anthony Williams 
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+#include "boost/thread/thread.hpp"
+#include "boost/thread/mutex.hpp"
+#include "boost/thread/condition.hpp"
+#include "boost/thread/future.hpp"
+#include <utility>
+#include <memory>
+#include <string>
+
+#include <boost/test/unit_test.hpp>
+
+#ifdef BOOST_HAS_RVALUE_REFS
+    template<typename T>
+    typename boost::remove_reference<T>::type&& cast_to_rval(T&& t)
+    {
+        return t;
+    }
+#else
+    template<typename T>
+    boost::detail::thread_move_t<T> cast_to_rval(T& t)
+    {
+        return boost::move(t);
+    }
+#endif
+
+struct X
+{
+private:
+    
+    X(X& other);
+    
+public:
+    
+    int i;
+    
+    X():
+        i(42)
+    {}
+#ifdef BOOST_HAS_RVALUE_REFS
+    X(X&& other):
+        i(other.i)
+    {
+        other.i=0;
+    }
+#else
+    X(boost::detail::thread_move_t<X> other):
+        i(other->i)
+    {
+        other->i=0;
+    }
+    operator boost::detail::thread_move_t<X>()
+    {
+        return boost::detail::thread_move_t<X>(*this);
+    }
+#endif
+    ~X()
+    {}
+};
+
+int make_int()
+{
+    return 42;
+}
+
+int throw_runtime_error()
+{
+    throw std::runtime_error("42");
+}
+
+void set_promise_thread(boost::promise<int>* p)
+{
+    p->set_value(42);
+}
+
+struct my_exception
+{};
+
+void set_promise_exception_thread(boost::promise<int>* p)
+{
+    p->set_exception(boost::copy_exception(my_exception()));
+}
+
+
+void test_store_value_from_thread()
+{
+    boost::promise<int> pi2;
+    boost::unique_future<int> fi2=pi2.get_future();
+    boost::thread(set_promise_thread,&pi2);
+    int j=fi2.get();
+    BOOST_CHECK(j==42);
+    BOOST_CHECK(fi2.is_ready());
+    BOOST_CHECK(fi2.has_value());
+    BOOST_CHECK(!fi2.has_exception());
+    BOOST_CHECK(fi2.get_state()==boost::future_state::ready);
+}
+
+
+void test_store_exception()
+{
+    boost::promise<int> pi3;
+    boost::unique_future<int> fi3=pi3.get_future();
+    boost::thread(set_promise_exception_thread,&pi3);
+    try
+    {
+        fi3.get();
+        BOOST_CHECK(false);
+    }
+    catch(my_exception)
+    {
+        BOOST_CHECK(true);
+    }
+    
+    BOOST_CHECK(fi3.is_ready());
+    BOOST_CHECK(!fi3.has_value());
+    BOOST_CHECK(fi3.has_exception());
+    BOOST_CHECK(fi3.get_state()==boost::future_state::ready);
+}
+
+void test_initial_state()
+{
+    boost::unique_future<int> fi;
+    BOOST_CHECK(!fi.is_ready());
+    BOOST_CHECK(!fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::uninitialized);
+    int i;
+    try
+    {
+        i=fi.get();
+        BOOST_CHECK(false);
+    }
+    catch(boost::future_uninitialized)
+    {
+        BOOST_CHECK(true);
+    }
+}
+
+void test_waiting_future()
+{
+    boost::promise<int> pi;
+    boost::unique_future<int> fi;
+    fi=pi.get_future();
+
+    int i=0;
+    BOOST_CHECK(!fi.is_ready());
+    BOOST_CHECK(!fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::waiting);
+    BOOST_CHECK(i==0);
+}
+
+void test_cannot_get_future_twice()
+{
+    boost::promise<int> pi;
+    pi.get_future();
+
+    try
+    {
+        pi.get_future();
+        BOOST_CHECK(false);
+    }
+    catch(boost::future_already_retrieved&)
+    {
+        BOOST_CHECK(true);
+    }
+}
+
+void test_set_value_updates_future_state()
+{
+    boost::promise<int> pi;
+    boost::unique_future<int> fi;
+    fi=pi.get_future();
+
+    pi.set_value(42);
+    
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+}
+
+void test_set_value_can_be_retrieved()
+{
+    boost::promise<int> pi;
+    boost::unique_future<int> fi;
+    fi=pi.get_future();
+
+    pi.set_value(42);
+    
+    int i=0;
+    BOOST_CHECK(i=fi.get());
+    BOOST_CHECK(i==42);
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+}
+
+void test_set_value_can_be_moved()
+{
+//     boost::promise<int> pi;
+//     boost::unique_future<int> fi;
+//     fi=pi.get_future();
+
+//     pi.set_value(42);
+    
+//     int i=0;
+//     BOOST_CHECK(i=fi.get());
+//     BOOST_CHECK(i==42);
+//     BOOST_CHECK(fi.is_ready());
+//     BOOST_CHECK(fi.has_value());
+//     BOOST_CHECK(!fi.has_exception());
+//     BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+}
+
+void test_future_from_packaged_task_is_waiting()
+{
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+    int i=0;
+    BOOST_CHECK(!fi.is_ready());
+    BOOST_CHECK(!fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::waiting);
+    BOOST_CHECK(i==0);
+}
+
+void test_invoking_a_packaged_task_populates_future()
+{
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+
+    pt();
+
+    int i=0;
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+    BOOST_CHECK(i=fi.get());
+    BOOST_CHECK(i==42);
+}
+
+void test_invoking_a_packaged_task_twice_throws()
+{
+    boost::packaged_task<int> pt(make_int);
+
+    pt();
+    try
+    {
+        pt();
+        BOOST_CHECK(false);
+    }
+    catch(boost::task_already_started)
+    {
+        BOOST_CHECK(true);
+    }
+}
+
+
+void test_cannot_get_future_twice_from_task()
+{
+    boost::packaged_task<int> pt(make_int);
+    pt.get_future();
+    try
+    {
+        pt.get_future();
+        BOOST_CHECK(false);
+    }
+    catch(boost::future_already_retrieved)
+    {
+        BOOST_CHECK(true);
+    }
+}
+
+void test_task_stores_exception_if_function_throws()
+{
+    boost::packaged_task<int> pt(throw_runtime_error);
+    boost::unique_future<int> fi=pt.get_future();
+
+    pt();
+
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(!fi.has_value());
+    BOOST_CHECK(fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+    try
+    {
+        fi.get();
+        BOOST_CHECK(false);
+    }
+    catch(std::exception&)
+    {
+        BOOST_CHECK(true);
+    }
+    catch(...)
+    {
+        BOOST_CHECK(!"Unknown exception thrown");
+    }
+    
+}
+
+void test_void_promise()
+{
+    boost::promise<void> p;
+    boost::unique_future<void> f=p.get_future();
+    p.set_value();
+    BOOST_CHECK(f.is_ready());
+    BOOST_CHECK(f.has_value());
+    BOOST_CHECK(!f.has_exception());
+    BOOST_CHECK(f.get_state()==boost::future_state::ready);
+    f.get();
+}
+
+void test_reference_promise()
+{
+    boost::promise<int&> p;
+    boost::unique_future<int&> f=p.get_future();
+    int i=42;
+    p.set_value(i);
+    BOOST_CHECK(f.is_ready());
+    BOOST_CHECK(f.has_value());
+    BOOST_CHECK(!f.has_exception());
+    BOOST_CHECK(f.get_state()==boost::future_state::ready);
+    BOOST_CHECK(&f.get()==&i);
+}
+
+void do_nothing()
+{}
+
+void test_task_returning_void()
+{
+    boost::packaged_task<void> pt(do_nothing);
+    boost::unique_future<void> fi=pt.get_future();
+
+    pt();
+
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+}
+
+int global_ref_target=0;
+
+int& return_ref()
+{
+    return global_ref_target;
+}
+
+void test_task_returning_reference()
+{
+    boost::packaged_task<int&> pt(return_ref);
+    boost::unique_future<int&> fi=pt.get_future();
+
+    pt();
+
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(fi.has_value());
+    BOOST_CHECK(!fi.has_exception());
+    BOOST_CHECK(fi.get_state()==boost::future_state::ready);
+    int& i=fi.get();
+    BOOST_CHECK(&i==&global_ref_target);
+}
+
+void test_shared_future()
+{
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+
+    boost::shared_future<int> sf(::cast_to_rval(fi));
+    BOOST_CHECK(fi.get_state()==boost::future_state::uninitialized);
+
+    pt();
+
+    int i=0;
+    BOOST_CHECK(sf.is_ready());
+    BOOST_CHECK(sf.has_value());
+    BOOST_CHECK(!sf.has_exception());
+    BOOST_CHECK(sf.get_state()==boost::future_state::ready);
+    BOOST_CHECK(i=sf.get());
+    BOOST_CHECK(i==42);
+}
+
+void test_copies_of_shared_future_become_ready_together()
+{
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+
+    boost::shared_future<int> sf(::cast_to_rval(fi));
+    boost::shared_future<int> sf2(sf);
+    boost::shared_future<int> sf3;
+    sf3=sf;
+    BOOST_CHECK(sf.get_state()==boost::future_state::waiting);
+    BOOST_CHECK(sf2.get_state()==boost::future_state::waiting);
+    BOOST_CHECK(sf3.get_state()==boost::future_state::waiting);
+
+    pt();
+
+    int i=0;
+    BOOST_CHECK(sf.is_ready());
+    BOOST_CHECK(sf.has_value());
+    BOOST_CHECK(!sf.has_exception());
+    BOOST_CHECK(sf.get_state()==boost::future_state::ready);
+    BOOST_CHECK(i=sf.get());
+    BOOST_CHECK(i==42);
+    i=0;
+    BOOST_CHECK(sf2.is_ready());
+    BOOST_CHECK(sf2.has_value());
+    BOOST_CHECK(!sf2.has_exception());
+    BOOST_CHECK(sf2.get_state()==boost::future_state::ready);
+    BOOST_CHECK(i=sf2.get());
+    BOOST_CHECK(i==42);
+    i=0;
+    BOOST_CHECK(sf3.is_ready());
+    BOOST_CHECK(sf3.has_value());
+    BOOST_CHECK(!sf3.has_exception());
+    BOOST_CHECK(sf3.get_state()==boost::future_state::ready);
+    BOOST_CHECK(i=sf3.get());
+    BOOST_CHECK(i==42);
+}
+
+void test_shared_future_can_be_move_assigned_from_unique_future()
+{
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+
+    boost::shared_future<int> sf;
+    sf=::cast_to_rval(fi);
+    BOOST_CHECK(fi.get_state()==boost::future_state::uninitialized);
+
+    BOOST_CHECK(!sf.is_ready());
+    BOOST_CHECK(!sf.has_value());
+    BOOST_CHECK(!sf.has_exception());
+    BOOST_CHECK(sf.get_state()==boost::future_state::waiting);
+}
+
+void test_shared_future_void()
+{
+    boost::packaged_task<void> pt(do_nothing);
+    boost::unique_future<void> fi=pt.get_future();
+
+    boost::shared_future<void> sf(::cast_to_rval(fi));
+    BOOST_CHECK(fi.get_state()==boost::future_state::uninitialized);
+
+    pt();
+
+    BOOST_CHECK(sf.is_ready());
+    BOOST_CHECK(sf.has_value());
+    BOOST_CHECK(!sf.has_exception());
+    BOOST_CHECK(sf.get_state()==boost::future_state::ready);
+    sf.get();
+}
+
+void test_shared_future_ref()
+{
+    boost::promise<int&> p;
+    boost::shared_future<int&> f(p.get_future());
+    int i=42;
+    p.set_value(i);
+    BOOST_CHECK(f.is_ready());
+    BOOST_CHECK(f.has_value());
+    BOOST_CHECK(!f.has_exception());
+    BOOST_CHECK(f.get_state()==boost::future_state::ready);
+    BOOST_CHECK(&f.get()==&i);
+}
+
+void test_can_get_a_second_future_from_a_moved_promise()
+{
+    boost::promise<int> pi;
+    boost::unique_future<int> fi=pi.get_future();
+    
+    boost::promise<int> pi2(::cast_to_rval(pi));
+    boost::unique_future<int> fi2=pi.get_future();
+
+    pi2.set_value(3);
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(!fi2.is_ready());
+    BOOST_CHECK(fi.get()==3);
+    pi.set_value(42);
+    BOOST_CHECK(fi2.is_ready());
+    BOOST_CHECK(fi2.get()==42);
+}
+
+void test_can_get_a_second_future_from_a_moved_void_promise()
+{
+    boost::promise<void> pi;
+    boost::unique_future<void> fi=pi.get_future();
+    
+    boost::promise<void> pi2(::cast_to_rval(pi));
+    boost::unique_future<void> fi2=pi.get_future();
+
+    pi2.set_value();
+    BOOST_CHECK(fi.is_ready());
+    BOOST_CHECK(!fi2.is_ready());
+    pi.set_value();
+    BOOST_CHECK(fi2.is_ready());
+}
+
+void test_unique_future_for_move_only_udt()
+{
+    boost::promise<X> pt;
+    boost::unique_future<X> fi=pt.get_future();
+
+    pt.set_value(X());
+    X res(fi.get());
+    BOOST_CHECK(res.i==42);
+}
+
+void test_unique_future_for_string()
+{
+    boost::promise<std::string> pt;
+    boost::unique_future<std::string> fi=pt.get_future();
+
+    pt.set_value(std::string("hello"));
+    std::string res(fi.get());
+    BOOST_CHECK(res=="hello");
+
+    boost::promise<std::string> pt2;
+    fi=pt2.get_future();
+
+    std::string const s="goodbye";
+    
+    pt2.set_value(s);
+    res=fi.get();
+    BOOST_CHECK(res=="goodbye");
+
+    boost::promise<std::string> pt3;
+    fi=pt3.get_future();
+
+    std::string s2="foo";
+    
+    pt3.set_value(s2);
+    res=fi.get();
+    BOOST_CHECK(res=="foo");
+}
+
+boost::mutex callback_mutex;
+unsigned callback_called=0;
+
+void wait_callback(boost::promise<int>& pi)
+{
+    boost::lock_guard<boost::mutex> lk(callback_mutex);
+    ++callback_called;
+    try
+    {
+        pi.set_value(42);
+    }
+    catch(...)
+    {
+    }
+}
+
+void do_nothing_callback(boost::promise<int>& pi)
+{
+    boost::lock_guard<boost::mutex> lk(callback_mutex);
+    ++callback_called;
+}
+
+void test_wait_callback()
+{
+    callback_called=0;
+    boost::promise<int> pi;
+    boost::unique_future<int> fi=pi.get_future();
+    pi.set_wait_callback(wait_callback);
+    fi.wait();
+    BOOST_CHECK(callback_called);
+    BOOST_CHECK(fi.get()==42);
+    fi.wait();
+    fi.wait();
+    BOOST_CHECK(callback_called==1);
+}
+
+void test_wait_callback_with_timed_wait()
+{
+    callback_called=0;
+    boost::promise<int> pi;
+    boost::unique_future<int> fi=pi.get_future();
+    pi.set_wait_callback(do_nothing_callback);
+    bool success=fi.timed_wait(boost::posix_time::milliseconds(10));
+    BOOST_CHECK(callback_called);
+    BOOST_CHECK(!success);
+    success=fi.timed_wait(boost::posix_time::milliseconds(10));
+    BOOST_CHECK(!success);
+    success=fi.timed_wait(boost::posix_time::milliseconds(10));
+    BOOST_CHECK(!success);
+    BOOST_CHECK(callback_called==3);
+    pi.set_value(42);
+    success=fi.timed_wait(boost::posix_time::milliseconds(10));
+    BOOST_CHECK(success);
+    BOOST_CHECK(callback_called==3);
+    BOOST_CHECK(fi.get()==42);
+    BOOST_CHECK(callback_called==3);
+}
+
+
+void wait_callback_for_task(boost::packaged_task<int>& pt)
+{
+    boost::lock_guard<boost::mutex> lk(callback_mutex);
+    ++callback_called;
+    try
+    {
+        pt();
+    }
+    catch(...)
+    {
+    }
+}
+
+
+void test_wait_callback_for_packaged_task()
+{
+    callback_called=0;
+    boost::packaged_task<int> pt(make_int);
+    boost::unique_future<int> fi=pt.get_future();
+    pt.set_wait_callback(wait_callback_for_task);
+    fi.wait();
+    BOOST_CHECK(callback_called);
+    BOOST_CHECK(fi.get()==42);
+    fi.wait();
+    fi.wait();
+    BOOST_CHECK(callback_called==1);
+}
+
+void test_packaged_task_can_be_moved()
+{
+    boost::packaged_task<int> pt(make_int);
+
+    boost::unique_future<int> fi=pt.get_future();
+
+    BOOST_CHECK(!fi.is_ready());
+    
+    boost::packaged_task<int> pt2(::cast_to_rval(pt));
+
+    BOOST_CHECK(!fi.is_ready());
+    try
+    {
+        pt();
+        BOOST_CHECK(!"Can invoke moved task!");
+    }
+    catch(boost::task_moved&)
+    {
+    }
+
+    BOOST_CHECK(!fi.is_ready());
+
+    pt2();
+    
+    BOOST_CHECK(fi.is_ready());
+}
+
+void test_destroying_a_promise_stores_broken_promise()
+{
+    boost::unique_future<int> f;
+    
+    {
+        boost::promise<int> p;
+        f=p.get_future();
+    }
+    BOOST_CHECK(f.is_ready());
+    BOOST_CHECK(f.has_exception());
+    try
+    {
+        f.get();
+    }
+    catch(boost::broken_promise&)
+    {
+    }
+}
+
+void test_destroying_a_packaged_task_stores_broken_promise()
+{
+    boost::unique_future<int> f;
+    
+    {
+        boost::packaged_task<int> p(make_int);
+        f=p.get_future();
+    }
+    BOOST_CHECK(f.is_ready());
+    BOOST_CHECK(f.has_exception());
+    try
+    {
+        f.get();
+    }
+    catch(boost::broken_promise&)
+    {
+    }
+}
+
+int make_int_slowly()
+{
+    boost::this_thread::sleep(boost::posix_time::seconds(1));
+    return 42;
+}
+
+void test_wait_for_either_of_two_futures_1()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    
+    boost::thread(::cast_to_rval(pt));
+    
+    unsigned const future=boost::wait_for_any(f1,f2);
+    
+    BOOST_CHECK(future==0);
+    BOOST_CHECK(f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(f1.get()==42);
+}
+
+void test_wait_for_either_of_two_futures_2()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    
+    boost::thread(::cast_to_rval(pt2));
+    
+    unsigned const future=boost::wait_for_any(f1,f2);
+    
+    BOOST_CHECK(future==1);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(f2.is_ready());
+    BOOST_CHECK(f2.get()==42);
+}
+
+void test_wait_for_either_of_three_futures_1()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    
+    boost::thread(::cast_to_rval(pt));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3);
+    
+    BOOST_CHECK(future==0);
+    BOOST_CHECK(f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(f1.get()==42);
+}
+
+void test_wait_for_either_of_three_futures_2()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    
+    boost::thread(::cast_to_rval(pt2));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3);
+    
+    BOOST_CHECK(future==1);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(f2.get()==42);
+}
+
+void test_wait_for_either_of_three_futures_3()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    
+    boost::thread(::cast_to_rval(pt3));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3);
+    
+    BOOST_CHECK(future==2);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(f3.is_ready());
+    BOOST_CHECK(f3.get()==42);
+}
+
+void test_wait_for_either_of_four_futures_1()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    
+    boost::thread(::cast_to_rval(pt));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4);
+    
+    BOOST_CHECK(future==0);
+    BOOST_CHECK(f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(f1.get()==42);
+}
+
+void test_wait_for_either_of_four_futures_2()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    
+    boost::thread(::cast_to_rval(pt2));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4);
+    
+    BOOST_CHECK(future==1);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(f2.get()==42);
+}
+
+void test_wait_for_either_of_four_futures_3()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    
+    boost::thread(::cast_to_rval(pt3));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4);
+    
+    BOOST_CHECK(future==2);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(f3.get()==42);
+}
+
+void test_wait_for_either_of_four_futures_4()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    
+    boost::thread(::cast_to_rval(pt4));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4);
+    
+    BOOST_CHECK(future==3);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(f4.is_ready());
+    BOOST_CHECK(f4.get()==42);
+}
+
+void test_wait_for_either_of_five_futures_1()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    boost::packaged_task<int> pt5(make_int_slowly);
+    boost::unique_future<int> f5(pt5.get_future());
+    
+    boost::thread(::cast_to_rval(pt));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4,f5);
+    
+    BOOST_CHECK(future==0);
+    BOOST_CHECK(f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(!f5.is_ready());
+    BOOST_CHECK(f1.get()==42);
+}
+
+void test_wait_for_either_of_five_futures_2()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    boost::packaged_task<int> pt5(make_int_slowly);
+    boost::unique_future<int> f5(pt5.get_future());
+    
+    boost::thread(::cast_to_rval(pt2));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4,f5);
+    
+    BOOST_CHECK(future==1);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(!f5.is_ready());
+    BOOST_CHECK(f2.get()==42);
+}
+void test_wait_for_either_of_five_futures_3()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    boost::packaged_task<int> pt5(make_int_slowly);
+    boost::unique_future<int> f5(pt5.get_future());
+    
+    boost::thread(::cast_to_rval(pt3));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4,f5);
+    
+    BOOST_CHECK(future==2);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(!f5.is_ready());
+    BOOST_CHECK(f3.get()==42);
+}
+void test_wait_for_either_of_five_futures_4()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    boost::packaged_task<int> pt5(make_int_slowly);
+    boost::unique_future<int> f5(pt5.get_future());
+    
+    boost::thread(::cast_to_rval(pt4));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4,f5);
+    
+    BOOST_CHECK(future==3);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(f4.is_ready());
+    BOOST_CHECK(!f5.is_ready());
+    BOOST_CHECK(f4.get()==42);
+}
+void test_wait_for_either_of_five_futures_5()
+{
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> f1(pt.get_future());
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> f2(pt2.get_future());
+    boost::packaged_task<int> pt3(make_int_slowly);
+    boost::unique_future<int> f3(pt3.get_future());
+    boost::packaged_task<int> pt4(make_int_slowly);
+    boost::unique_future<int> f4(pt4.get_future());
+    boost::packaged_task<int> pt5(make_int_slowly);
+    boost::unique_future<int> f5(pt5.get_future());
+    
+    boost::thread(::cast_to_rval(pt5));
+    
+    unsigned const future=boost::wait_for_any(f1,f2,f3,f4,f5);
+    
+    BOOST_CHECK(future==4);
+    BOOST_CHECK(!f1.is_ready());
+    BOOST_CHECK(!f2.is_ready());
+    BOOST_CHECK(!f3.is_ready());
+    BOOST_CHECK(!f4.is_ready());
+    BOOST_CHECK(f5.is_ready());
+    BOOST_CHECK(f5.get()==42);
+}
+
+void test_wait_for_either_invokes_callbacks()
+{
+    callback_called=0;
+    boost::packaged_task<int> pt(make_int_slowly);
+    boost::unique_future<int> fi=pt.get_future();
+    boost::packaged_task<int> pt2(make_int_slowly);
+    boost::unique_future<int> fi2=pt2.get_future();
+    pt.set_wait_callback(wait_callback_for_task);
+
+    boost::thread(::cast_to_rval(pt));
+    
+    boost::wait_for_any(fi,fi2);
+    BOOST_CHECK(callback_called==1);
+    BOOST_CHECK(fi.get()==42);
+}
+
+void test_wait_for_any_from_range()
+{
+    unsigned const count=10;
+    for(unsigned i=0;i<count;++i)
+    {
+        boost::packaged_task<int> tasks[count];
+        boost::unique_future<int> futures[count];
+        for(unsigned j=0;j<count;++j)
+        {
+            tasks[j]=boost::packaged_task<int>(make_int_slowly);
+            futures[j]=tasks[j].get_future();
+        }
+        boost::thread(::cast_to_rval(tasks[i]));
+    
+        boost::unique_future<int>* const future=boost::wait_for_any(futures,futures+count);
+    
+        BOOST_CHECK(future==(futures+i));
+        for(unsigned j=0;j<count;++j)
+        {
+            if(j!=i)
+            {
+                BOOST_CHECK(!futures[j].is_ready());
+            }
+            else
+            {
+                BOOST_CHECK(futures[j].is_ready());
+            }
+        }
+        BOOST_CHECK(futures[i].get()==42);
+    }
+}
+
+void test_wait_for_all_from_range()
+{
+    unsigned const count=10;
+    boost::unique_future<int> futures[count];
+    for(unsigned j=0;j<count;++j)
+    {
+        boost::packaged_task<int> task(make_int_slowly);
+        futures[j]=task.get_future();
+        boost::thread(::cast_to_rval(task));
+    }
+    
+    boost::wait_for_all(futures,futures+count);
+    
+    for(unsigned j=0;j<count;++j)
+    {
+        BOOST_CHECK(futures[j].is_ready());
+    }
+}
+
+void test_wait_for_all_two_futures()
+{
+    unsigned const count=2;
+    boost::unique_future<int> futures[count];
+    for(unsigned j=0;j<count;++j)
+    {
+        boost::packaged_task<int> task(make_int_slowly);
+        futures[j]=task.get_future();
+        boost::thread(::cast_to_rval(task));
+    }
+    
+    boost::wait_for_all(futures[0],futures[1]);
+    
+    for(unsigned j=0;j<count;++j)
+    {
+        BOOST_CHECK(futures[j].is_ready());
+    }
+}
+
+void test_wait_for_all_three_futures()
+{
+    unsigned const count=3;
+    boost::unique_future<int> futures[count];
+    for(unsigned j=0;j<count;++j)
+    {
+        boost::packaged_task<int> task(make_int_slowly);
+        futures[j]=task.get_future();
+        boost::thread(::cast_to_rval(task));
+    }
+    
+    boost::wait_for_all(futures[0],futures[1],futures[2]);
+    
+    for(unsigned j=0;j<count;++j)
+    {
+        BOOST_CHECK(futures[j].is_ready());
+    }
+}
+
+void test_wait_for_all_four_futures()
+{
+    unsigned const count=4;
+    boost::unique_future<int> futures[count];
+    for(unsigned j=0;j<count;++j)
+    {
+        boost::packaged_task<int> task(make_int_slowly);
+        futures[j]=task.get_future();
+        boost::thread(::cast_to_rval(task));
+    }
+    
+    boost::wait_for_all(futures[0],futures[1],futures[2],futures[3]);
+    
+    for(unsigned j=0;j<count;++j)
+    {
+        BOOST_CHECK(futures[j].is_ready());
+    }
+}
+
+void test_wait_for_all_five_futures()
+{
+    unsigned const count=5;
+    boost::unique_future<int> futures[count];
+    for(unsigned j=0;j<count;++j)
+    {
+        boost::packaged_task<int> task(make_int_slowly);
+        futures[j]=task.get_future();
+        boost::thread(::cast_to_rval(task));
+    }
+    
+    boost::wait_for_all(futures[0],futures[1],futures[2],futures[3],futures[4]);
+    
+    for(unsigned j=0;j<count;++j)
+    {
+        BOOST_CHECK(futures[j].is_ready());
+    }
+}
+
+
+boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
+{
+    boost::unit_test_framework::test_suite* test =
+        BOOST_TEST_SUITE("Boost.Threads: futures test suite");
+
+    test->add(BOOST_TEST_CASE(test_initial_state));
+    test->add(BOOST_TEST_CASE(test_waiting_future));
+    test->add(BOOST_TEST_CASE(test_cannot_get_future_twice));
+    test->add(BOOST_TEST_CASE(test_set_value_updates_future_state));
+    test->add(BOOST_TEST_CASE(test_set_value_can_be_retrieved));
+    test->add(BOOST_TEST_CASE(test_set_value_can_be_moved));
+    test->add(BOOST_TEST_CASE(test_store_value_from_thread));
+    test->add(BOOST_TEST_CASE(test_store_exception));
+    test->add(BOOST_TEST_CASE(test_future_from_packaged_task_is_waiting));
+    test->add(BOOST_TEST_CASE(test_invoking_a_packaged_task_populates_future));
+    test->add(BOOST_TEST_CASE(test_invoking_a_packaged_task_twice_throws));
+    test->add(BOOST_TEST_CASE(test_cannot_get_future_twice_from_task));
+    test->add(BOOST_TEST_CASE(test_task_stores_exception_if_function_throws));
+    test->add(BOOST_TEST_CASE(test_void_promise));
+    test->add(BOOST_TEST_CASE(test_reference_promise));
+    test->add(BOOST_TEST_CASE(test_task_returning_void));
+    test->add(BOOST_TEST_CASE(test_task_returning_reference));
+    test->add(BOOST_TEST_CASE(test_shared_future));
+    test->add(BOOST_TEST_CASE(test_copies_of_shared_future_become_ready_together));
+    test->add(BOOST_TEST_CASE(test_shared_future_can_be_move_assigned_from_unique_future));
+    test->add(BOOST_TEST_CASE(test_shared_future_void));
+    test->add(BOOST_TEST_CASE(test_shared_future_ref));
+    test->add(BOOST_TEST_CASE(test_can_get_a_second_future_from_a_moved_promise));
+    test->add(BOOST_TEST_CASE(test_can_get_a_second_future_from_a_moved_void_promise));
+    test->add(BOOST_TEST_CASE(test_unique_future_for_move_only_udt));
+    test->add(BOOST_TEST_CASE(test_unique_future_for_string));
+    test->add(BOOST_TEST_CASE(test_wait_callback));
+    test->add(BOOST_TEST_CASE(test_wait_callback_with_timed_wait));
+    test->add(BOOST_TEST_CASE(test_wait_callback_for_packaged_task));
+    test->add(BOOST_TEST_CASE(test_packaged_task_can_be_moved));
+    test->add(BOOST_TEST_CASE(test_destroying_a_promise_stores_broken_promise));
+    test->add(BOOST_TEST_CASE(test_destroying_a_packaged_task_stores_broken_promise));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_two_futures_1));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_two_futures_2));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_three_futures_1));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_three_futures_2));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_three_futures_3));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_four_futures_1));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_four_futures_2));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_four_futures_3));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_four_futures_4));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_five_futures_1));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_five_futures_2));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_five_futures_3));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_five_futures_4));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_of_five_futures_5));
+    test->add(BOOST_TEST_CASE(test_wait_for_either_invokes_callbacks));
+    test->add(BOOST_TEST_CASE(test_wait_for_any_from_range));
+    test->add(BOOST_TEST_CASE(test_wait_for_all_from_range));
+    test->add(BOOST_TEST_CASE(test_wait_for_all_two_futures));
+    test->add(BOOST_TEST_CASE(test_wait_for_all_three_futures));
+    test->add(BOOST_TEST_CASE(test_wait_for_all_four_futures));
+    test->add(BOOST_TEST_CASE(test_wait_for_all_five_futures));
+
+    return test;
+}
similarity index 75%
rename from deal.II/contrib/boost/libs/thread/test/test_thread_move.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_move.cpp
index 550b62dd9460c26cc7c64aa122969eacf0712e6f..b0acc3ac92ed597c670065d19edc3842719426ed 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007 Anthony Williams
+// Copyright (C) 2007-9 Anthony Williams
 //
 //  Distributed under the Boost Software License, Version 1.0. (See accompanying 
 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -33,21 +33,6 @@ void test_move_from_function_return()
     BOOST_CHECK_EQUAL(the_id,x_id);
 }
 
-boost::thread make_thread_return_lvalue(boost::thread::id* the_id)
-{
-    boost::thread t(do_nothing,the_id);
-    return boost::move(t);
-}
-
-void test_move_from_function_return_lvalue()
-{
-    boost::thread::id the_id;
-    boost::thread x=make_thread_return_lvalue(&the_id);
-    boost::thread::id x_id=x.get_id();
-    x.join();
-    BOOST_CHECK_EQUAL(the_id,x_id);
-}
-
 void test_move_assign()
 {
     boost::thread::id the_id;
@@ -66,7 +51,6 @@ boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
 
     test->add(BOOST_TEST_CASE(test_move_on_construction));
     test->add(BOOST_TEST_CASE(test_move_from_function_return));
-    test->add(BOOST_TEST_CASE(test_move_from_function_return_lvalue));
     test->add(BOOST_TEST_CASE(test_move_assign));
     return test;
 }
diff --git a/deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_move_return.cpp b/deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_move_return.cpp
new file mode 100644 (file)
index 0000000..1146df5
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2009 Anthony Williams
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include <boost/thread/thread.hpp>
+#include <boost/test/unit_test.hpp>
+
+void do_nothing(boost::thread::id* my_id)
+{
+    *my_id=boost::this_thread::get_id();
+}
+
+boost::thread make_thread_move_return(boost::thread::id* the_id)
+{
+    boost::thread t(do_nothing,the_id);
+    return boost::move(t);
+}
+
+void test_move_from_function_move_return()
+{
+    boost::thread::id the_id;
+    boost::thread x=make_thread_move_return(&the_id);
+    boost::thread::id x_id=x.get_id();
+    x.join();
+    BOOST_CHECK_EQUAL(the_id,x_id);
+}
+
+boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
+{
+    boost::unit_test_framework::test_suite* test =
+        BOOST_TEST_SUITE("Boost.Threads: thread move test suite");
+
+    test->add(BOOST_TEST_CASE(test_move_from_function_move_return));
+    return test;
+}
diff --git a/deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_return_local.cpp b/deal.II/contrib/boost-1.41.0/libs/thread/test/test_thread_return_local.cpp
new file mode 100644 (file)
index 0000000..f2f9c07
--- /dev/null
@@ -0,0 +1,35 @@
+// Copyright (C) 2009 Anthony Williams
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include <boost/thread/thread.hpp>
+#include <boost/test/unit_test.hpp>
+
+void do_nothing(boost::thread::id* my_id)
+{
+    *my_id=boost::this_thread::get_id();
+}
+
+boost::thread make_thread_return_local(boost::thread::id* the_id)
+{
+    boost::thread t(do_nothing,the_id);
+    return t;
+}
+
+void test_move_from_function_return_local()
+{
+    boost::thread::id the_id;
+    boost::thread x=make_thread_return_local(&the_id);
+    boost::thread::id x_id=x.get_id();
+    x.join();
+    BOOST_CHECK_EQUAL(the_id,x_id);
+}
+
+boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
+{
+    boost::unit_test_framework::test_suite* test =
+        BOOST_TEST_SUITE("Boost.Threads: thread move test suite");
+
+    test->add(BOOST_TEST_CASE(test_move_from_function_return_local));
+    return test;
+}
similarity index 89%
rename from deal.II/contrib/boost/libs/thread/test/test_tss.cpp
rename to deal.II/contrib/boost-1.41.0/libs/thread/test/test_tss.cpp
index 8a6545ce786e3f79eb9c3cfb822d7116f4e0f988..1423d7f1a2adb72fcb7ca74b9099080e020db155 100644 (file)
@@ -310,6 +310,39 @@ void test_tss_does_no_cleanup_with_null_cleanup_function()
     timed_test(&do_test_tss_does_no_cleanup_with_null_cleanup_function, 2);
 }
 
+void thread_with_local_tss_ptr()
+{
+    {
+        boost::thread_specific_ptr<Dummy> local_tss(tss_custom_cleanup);
+
+        local_tss.reset(new Dummy);
+    }
+    BOOST_CHECK(tss_cleanup_called);
+    tss_cleanup_called=false;
+}
+
+
+void test_tss_does_not_call_cleanup_after_ptr_destroyed()
+{
+    boost::thread t(thread_with_local_tss_ptr);
+    t.join();
+    BOOST_CHECK(!tss_cleanup_called);
+}
+
+void test_tss_cleanup_not_called_for_null_pointer()
+{
+    boost::thread_specific_ptr<Dummy> local_tss(tss_custom_cleanup);
+    local_tss.reset(new Dummy);
+    tss_cleanup_called=false;
+    local_tss.reset(0);
+    BOOST_CHECK(tss_cleanup_called);
+    tss_cleanup_called=false;
+    local_tss.reset(new Dummy);
+    BOOST_CHECK(!tss_cleanup_called);
+}
+
+
+
 boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
 {
     boost::unit_test_framework::test_suite* test =
@@ -319,6 +352,8 @@ boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
     test->add(BOOST_TEST_CASE(test_tss_with_custom_cleanup));
     test->add(BOOST_TEST_CASE(test_tss_does_no_cleanup_after_release));
     test->add(BOOST_TEST_CASE(test_tss_does_no_cleanup_with_null_cleanup_function));
+    test->add(BOOST_TEST_CASE(test_tss_does_not_call_cleanup_after_ptr_destroyed));
+    test->add(BOOST_TEST_CASE(test_tss_cleanup_not_called_for_null_pointer));
 
     return test;
 }
similarity index 96%
rename from deal.II/contrib/boost/libs/thread/test/util.inl
rename to deal.II/contrib/boost-1.41.0/libs/thread/test/util.inl
index 60f88e05440a481c08d5e3f27167d40d8e99e345..5c761d506db19d322aceddcbd2a135b87f65b209 100644 (file)
-// Copyright (C) 2001-2003\r
-// William E. Kempf\r
-// Copyright (C) 2007-8 Anthony Williams\r
-//\r
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying \r
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
-\r
-#if !defined(UTIL_INL_WEK01242003)\r
-#define UTIL_INL_WEK01242003\r
-\r
-#include <boost/thread/xtime.hpp>\r
-#include <boost/thread/mutex.hpp>\r
-#include <boost/thread/condition.hpp>\r
-#include <boost/thread/thread.hpp>\r
-\r
-#ifndef DEFAULT_EXECUTION_MONITOR_TYPE\r
-#   define DEFAULT_EXECUTION_MONITOR_TYPE execution_monitor::use_condition\r
-#endif\r
-\r
-// boostinspect:nounnamed\r
-\r
-namespace\r
-{\r
-inline boost::xtime delay(int secs, int msecs=0, int nsecs=0)\r
-{\r
-    const int MILLISECONDS_PER_SECOND = 1000;\r
-    const int NANOSECONDS_PER_SECOND = 1000000000;\r
-    const int NANOSECONDS_PER_MILLISECOND = 1000000;\r
-\r
-    boost::xtime xt;\r
-    if (boost::TIME_UTC != boost::xtime_get (&xt, boost::TIME_UTC))\r
-        BOOST_ERROR ("boost::xtime_get != boost::TIME_UTC");\r
-\r
-    nsecs += xt.nsec;\r
-    msecs += nsecs / NANOSECONDS_PER_MILLISECOND;\r
-    secs += msecs / MILLISECONDS_PER_SECOND;\r
-    nsecs += (msecs % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND;\r
-    xt.nsec = nsecs % NANOSECONDS_PER_SECOND;\r
-    xt.sec += secs + (nsecs / NANOSECONDS_PER_SECOND);\r
-\r
-    return xt;\r
-}\r
-\r
-inline bool in_range(const boost::xtime& xt, int secs=1)\r
-{\r
-    boost::xtime min = delay(-secs);\r
-    boost::xtime max = delay(0);\r
-    return (boost::xtime_cmp(xt, min) >= 0) &&\r
-        (boost::xtime_cmp(xt, max) <= 0);\r
-}\r
-\r
-class execution_monitor\r
-{\r
-public:\r
-    enum wait_type { use_sleep_only, use_mutex, use_condition };\r
-\r
-    execution_monitor(wait_type type, int secs)\r
-        : done(false), type(type), secs(secs) { }\r
-    void start()\r
-    {\r
-        if (type != use_sleep_only) {\r
-            boost::mutex::scoped_lock lock(mutex); done = false;\r
-        } else {\r
-            done = false;\r
-        }\r
-    }\r
-    void finish()\r
-    {\r
-        if (type != use_sleep_only) {\r
-            boost::mutex::scoped_lock lock(mutex);\r
-            done = true;\r
-            if (type == use_condition)\r
-                cond.notify_one();\r
-        } else {\r
-            done = true;\r
-        }\r
-    }\r
-    bool wait()\r
-    {\r
-        boost::xtime xt = delay(secs);\r
-        if (type != use_condition)\r
-            boost::thread::sleep(xt);\r
-        if (type != use_sleep_only) {\r
-            boost::mutex::scoped_lock lock(mutex);\r
-            while (type == use_condition && !done) {\r
-                if (!cond.timed_wait(lock, xt))\r
-                    break;\r
-            }\r
-            return done;\r
-        }\r
-        return done;\r
-    }\r
-\r
-private:\r
-    boost::mutex mutex;\r
-    boost::condition cond;\r
-    bool done;\r
-    wait_type type;\r
-    int secs;\r
-};\r
-\r
-template <typename F>\r
-class indirect_adapter\r
-{\r
-public:\r
-    indirect_adapter(F func, execution_monitor& monitor)\r
-        : func(func), monitor(monitor) { }\r
-    void operator()() const\r
-    {\r
-        try\r
-        {\r
-            boost::thread thrd(func);\r
-            thrd.join();\r
-        }\r
-        catch (...)\r
-        {\r
-            monitor.finish();\r
-            throw;\r
-        }\r
-        monitor.finish();\r
-    }\r
-\r
-private:\r
-    F func;\r
-    execution_monitor& monitor;\r
-    void operator=(indirect_adapter&);\r
-};\r
-\r
-template <typename F>\r
-void timed_test(F func, int secs,\r
-    execution_monitor::wait_type type=DEFAULT_EXECUTION_MONITOR_TYPE)\r
-{\r
-    execution_monitor monitor(type, secs);\r
-    indirect_adapter<F> ifunc(func, monitor);\r
-    monitor.start();\r
-    boost::thread thrd(ifunc);\r
-    BOOST_REQUIRE_MESSAGE(monitor.wait(),\r
-        "Timed test didn't complete in time, possible deadlock.");\r
-}\r
-\r
-template <typename F, typename T>\r
-class thread_binder\r
-{\r
-public:\r
-    thread_binder(const F& func, const T& param)\r
-        : func(func), param(param) { }\r
-    void operator()() const { func(param); }\r
-\r
-private:\r
-    F func;\r
-    T param;\r
-};\r
-\r
-template <typename F, typename T>\r
-thread_binder<F, T> bind(const F& func, const T& param)\r
-{\r
-    return thread_binder<F, T>(func, param);\r
-}\r
-\r
-template <typename R, typename T>\r
-class thread_member_binder\r
-{\r
-public:\r
-    thread_member_binder(R (T::*func)(), T& param)\r
-        : func(func), param(param) { }\r
-    void operator()() const { (param.*func)(); }\r
-\r
-private:\r
-    void operator=(thread_member_binder&);\r
-    \r
-    R (T::*func)();\r
-    T& param;\r
-};\r
-\r
-\r
-template <typename R, typename T>\r
-thread_member_binder<R, T> bind(R (T::*func)(), T& param)\r
-{\r
-    return thread_member_binder<R, T>(func, param);\r
-}\r
-} // namespace\r
-\r
-#endif\r
+// Copyright (C) 2001-2003
+// William E. Kempf
+// Copyright (C) 2007-8 Anthony Williams
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(UTIL_INL_WEK01242003)
+#define UTIL_INL_WEK01242003
+
+#include <boost/thread/xtime.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/condition.hpp>
+#include <boost/thread/thread.hpp>
+
+#ifndef DEFAULT_EXECUTION_MONITOR_TYPE
+#   define DEFAULT_EXECUTION_MONITOR_TYPE execution_monitor::use_condition
+#endif
+
+// boostinspect:nounnamed
+
+namespace
+{
+inline boost::xtime delay(int secs, int msecs=0, int nsecs=0)
+{
+    const int MILLISECONDS_PER_SECOND = 1000;
+    const int NANOSECONDS_PER_SECOND = 1000000000;
+    const int NANOSECONDS_PER_MILLISECOND = 1000000;
+
+    boost::xtime xt;
+    if (boost::TIME_UTC != boost::xtime_get (&xt, boost::TIME_UTC))
+        BOOST_ERROR ("boost::xtime_get != boost::TIME_UTC");
+
+    nsecs += xt.nsec;
+    msecs += nsecs / NANOSECONDS_PER_MILLISECOND;
+    secs += msecs / MILLISECONDS_PER_SECOND;
+    nsecs += (msecs % MILLISECONDS_PER_SECOND) * NANOSECONDS_PER_MILLISECOND;
+    xt.nsec = nsecs % NANOSECONDS_PER_SECOND;
+    xt.sec += secs + (nsecs / NANOSECONDS_PER_SECOND);
+
+    return xt;
+}
+
+inline bool in_range(const boost::xtime& xt, int secs=1)
+{
+    boost::xtime min = delay(-secs);
+    boost::xtime max = delay(0);
+    return (boost::xtime_cmp(xt, min) >= 0) &&
+        (boost::xtime_cmp(xt, max) <= 0);
+}
+
+class execution_monitor
+{
+public:
+    enum wait_type { use_sleep_only, use_mutex, use_condition };
+
+    execution_monitor(wait_type type, int secs)
+        : done(false), type(type), secs(secs) { }
+    void start()
+    {
+        if (type != use_sleep_only) {
+            boost::mutex::scoped_lock lock(mutex); done = false;
+        } else {
+            done = false;
+        }
+    }
+    void finish()
+    {
+        if (type != use_sleep_only) {
+            boost::mutex::scoped_lock lock(mutex);
+            done = true;
+            if (type == use_condition)
+                cond.notify_one();
+        } else {
+            done = true;
+        }
+    }
+    bool wait()
+    {
+        boost::xtime xt = delay(secs);
+        if (type != use_condition)
+            boost::thread::sleep(xt);
+        if (type != use_sleep_only) {
+            boost::mutex::scoped_lock lock(mutex);
+            while (type == use_condition && !done) {
+                if (!cond.timed_wait(lock, xt))
+                    break;
+            }
+            return done;
+        }
+        return done;
+    }
+
+private:
+    boost::mutex mutex;
+    boost::condition cond;
+    bool done;
+    wait_type type;
+    int secs;
+};
+
+template <typename F>
+class indirect_adapter
+{
+public:
+    indirect_adapter(F func, execution_monitor& monitor)
+        : func(func), monitor(monitor) { }
+    void operator()() const
+    {
+        try
+        {
+            boost::thread thrd(func);
+            thrd.join();
+        }
+        catch (...)
+        {
+            monitor.finish();
+            throw;
+        }
+        monitor.finish();
+    }
+
+private:
+    F func;
+    execution_monitor& monitor;
+    void operator=(indirect_adapter&);
+};
+
+template <typename F>
+void timed_test(F func, int secs,
+    execution_monitor::wait_type type=DEFAULT_EXECUTION_MONITOR_TYPE)
+{
+    execution_monitor monitor(type, secs);
+    indirect_adapter<F> ifunc(func, monitor);
+    monitor.start();
+    boost::thread thrd(ifunc);
+    BOOST_REQUIRE_MESSAGE(monitor.wait(),
+        "Timed test didn't complete in time, possible deadlock.");
+}
+
+template <typename F, typename T>
+class thread_binder
+{
+public:
+    thread_binder(const F& func, const T& param)
+        : func(func), param(param) { }
+    void operator()() const { func(param); }
+
+private:
+    F func;
+    T param;
+};
+
+template <typename F, typename T>
+thread_binder<F, T> bind(const F& func, const T& param)
+{
+    return thread_binder<F, T>(func, param);
+}
+
+template <typename R, typename T>
+class thread_member_binder
+{
+public:
+    thread_member_binder(R (T::*func)(), T& param)
+        : func(func), param(param) { }
+    void operator()() const { (param.*func)(); }
+
+private:
+    void operator=(thread_member_binder&);
+    
+    R (T::*func)();
+    T& param;
+};
+
+
+template <typename R, typename T>
+thread_member_binder<R, T> bind(R (T::*func)(), T& param)
+{
+    return thread_member_binder<R, T>(func, param);
+}
+} // namespace
+
+#endif
diff --git a/deal.II/contrib/boost/include/boost/bind/protect.hpp b/deal.II/contrib/boost/include/boost/bind/protect.hpp
deleted file mode 100644 (file)
index b1ff2a2..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-#ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
-#define BOOST_BIND_PROTECT_HPP_INCLUDED
-
-//
-//  protect.hpp
-//
-//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
-//
-// 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)
-//
-
-namespace boost
-{
-
-namespace _bi
-{
-
-template<class F> class protected_bind_t
-{
-public:
-
-    typedef typename F::result_type result_type;
-
-    explicit protected_bind_t(F f): f_(f)
-    {
-    }
-
-    result_type operator()()
-    {
-        return f_();
-    }
-
-    result_type operator()() const
-    {
-        return f_();
-    }
-
-    template<class A1> result_type operator()(A1 & a1)
-    {
-        return f_(a1);
-    }
-
-    template<class A1> result_type operator()(A1 & a1) const
-    {
-        return f_(a1);
-    }
-
-    template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
-    {
-        return f_(a1, a2);
-    }
-
-    template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
-    {
-        return f_(a1, a2);
-    }
-
-    template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
-    {
-        return f_(a1, a2, a3);
-    }
-
-    template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
-    {
-        return f_(a1, a2, a3);
-    }
-
-    template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
-    {
-        return f_(a1, a2, a3, a4);
-    }
-
-    template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
-    {
-        return f_(a1, a2, a3, a4);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
-    {
-        return f_(a1, a2, a3, a4, a5);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const
-    {
-        return f_(a1, a2, a3, a4, a5);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6)
-    {
-        return f_(a1, a2, a3, a4, a5, a6);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const
-    {
-        return f_(a1, a2, a3, a4, a5, a6);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7)
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8)
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7, a8);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
-    }
-
-    template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
-    {
-        return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
-    }
-
-private:
-
-    F f_;
-};
-
-} // namespace _bi
-
-template<class F> _bi::protected_bind_t<F> protect(F f)
-{
-    return _bi::protected_bind_t<F>(f);
-}
-
-} // namespace boost
-
-#endif // #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
diff --git a/deal.II/contrib/boost/include/boost/config/stdlib/modena.hpp b/deal.II/contrib/boost/include/boost/config/stdlib/modena.hpp
deleted file mode 100644 (file)
index 3d0f76b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-//  (C) Copyright Jens Maurer 2001. 
-//  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)
-
-//  See http://www.boost.org for most recent version.
-
-//  Modena C++ standard library (comes with KAI C++)
-
-#if !defined(MSIPL_COMPILE_H)
-#  include <boost/config/no_tr1/utility.hpp>
-#  if !defined(__MSIPL_COMPILE_H)
-#      error "This is not the Modena C++ library!"
-#  endif
-#endif
-
-#ifndef MSIPL_NL_TYPES
-#define BOOST_NO_STD_MESSAGES
-#endif
-
-#ifndef MSIPL_WCHART
-#define BOOST_NO_STD_WSTRING
-#endif
-
-#define BOOST_STDLIB "Modena C++ standard library"
-
-
-
-
-
diff --git a/deal.II/contrib/boost/include/boost/config/stdlib/vacpp.hpp b/deal.II/contrib/boost/include/boost/config/stdlib/vacpp.hpp
deleted file mode 100644 (file)
index 8321ee0..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-//  (C) Copyright John Maddock 2001 - 2002. 
-//  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)
-
-//  See http://www.boost.org for most recent version.
-
-#if __IBMCPP__ <= 501
-#  define BOOST_NO_STD_ALLOCATOR
-#endif
-
-#define BOOST_HAS_MACRO_USE_FACET
-#define BOOST_NO_STD_MESSAGES
-
-#define BOOST_STDLIB "Visual Age default standard library"
-
-
-
diff --git a/deal.II/contrib/boost/include/boost/date_time/filetime_functions.hpp b/deal.II/contrib/boost/include/boost/date_time/filetime_functions.hpp
deleted file mode 100644 (file)
index 415bbff..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef DATE_TIME_FILETIME_FUNCTIONS_HPP__
-#define DATE_TIME_FILETIME_FUNCTIONS_HPP__
-
-/* Copyright (c) 2004 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the
- * Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
- */
-
-/*! @file filetime_functions.hpp
- * Function(s) for converting between a FILETIME structure and a 
- * time object. This file is only available on systems that have
- * BOOST_HAS_FTIME defined.
- */
-
-#include <boost/date_time/compiler_config.hpp>
-#if defined(BOOST_HAS_FTIME) // skip this file if no FILETIME
-#include <windows.h>
-#include <boost/cstdint.hpp>
-#include <boost/date_time/time.hpp>
-
-
-namespace boost {
-namespace date_time {
-
-
-  //! Create a time object from an initialized FILETIME struct.
-  /*! Create a time object from an initialized FILETIME struct.
-   * A FILETIME struct holds 100-nanosecond units (0.0000001). When 
-   * built with microsecond resolution the FILETIME's sub second value 
-   * will be truncated. Nanosecond resolution has no truncation. */
-  template<class time_type>
-  inline
-  time_type time_from_ftime(const FILETIME& ft){
-    typedef typename time_type::date_type date_type;
-    typedef typename time_type::date_duration_type date_duration_type;
-    typedef typename time_type::time_duration_type time_duration_type;
-
-    /* OFFSET is difference between 1970-Jan-01 & 1601-Jan-01 
-     * in 100-nanosecond intervals */
-    uint64_t c1 = 27111902UL; 
-    uint64_t c2 = 3577643008UL; // issues warning without 'UL'
-    const uint64_t OFFSET = (c1 << 32) + c2;
-    const long sec_pr_day = 86400; // seconds per day
-
-    uint64_t filetime = ft.dwHighDateTime;
-    filetime <<= 32;
-    filetime += ft.dwLowDateTime;
-    filetime -= OFFSET; // filetime is now 100-nanos since 1970-Jan-01
-
-    uint64_t sec = filetime / 10000000;
-#if defined(BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG)
-    uint64_t sub_sec = (filetime % 10000000) * 100; // nanoseconds
-#else
-    uint64_t sub_sec = (filetime % 10000000) / 10; // truncate to microseconds
-#endif
-
-    // split sec into usable chunks: days, hours, minutes, & seconds
-    long _d = sec / sec_pr_day;
-    long tmp = sec % sec_pr_day;
-    long _h = tmp / 3600; // sec_pr_hour
-    tmp %= 3600;
-    long _m = tmp / 60; // sec_pr_min
-    tmp %= 60;
-    long _s = tmp; // seconds
-
-    date_duration_type dd(_d);
-    date_type d = date_type(1970, Jan, 01) + dd;
-    return time_type(d, time_duration_type(_h, _m, _s, sub_sec));
-  }
-
-}} // boost::date_time
-
-#endif // BOOST_HAS_FTIME
-
-#endif // DATE_TIME_FILETIME_FUNCTIONS_HPP__
diff --git a/deal.II/contrib/boost/include/boost/date_time/gregorian/conversion.hpp b/deal.II/contrib/boost/include/boost/date_time/gregorian/conversion.hpp
deleted file mode 100644 (file)
index 2155d30..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef _GREGORIAN__CONVERSION_HPP___
-#define _GREGORIAN__CONVERSION_HPP___
-
-/* Copyright (c) 2004-2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
- * Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
- */
-
-#include <exception>
-#include "boost/date_time/gregorian/gregorian_types.hpp"
-#include "boost/date_time/c_time.hpp"
-#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
-#  if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
-#    include "boost/date_time/gregorian/formatters_limited.hpp"
-#  else
-#    include "boost/date_time/gregorian/formatters.hpp"
-#  endif // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS
-#else
-#  include <sstream>
-#  include "boost/date_time/gregorian/gregorian_io.hpp"
-#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
-
-namespace boost {
-
-namespace gregorian {
-
-
-  //! Converts a date to a tm struct. Throws out_of_range exception if date is a special value
-  inline
-  std::tm to_tm(const date& d) 
-  {
-    if(d.is_pos_infinity() || d.is_neg_infinity() || d.is_not_a_date()){
-#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO)
-      std::string s("tm unable to handle date value of " + to_simple_string(d));
-      throw std::out_of_range(s);
-#else
-      std::stringstream ss;
-      ss << "tm unable to handle date value of " << d;
-      throw std::out_of_range(ss.str());
-#endif // USE_DATE_TIME_PRE_1_33_FACET_IO
-    }
-    std::tm datetm;
-    boost::gregorian::date::ymd_type ymd = d.year_month_day();
-    datetm.tm_year = ymd.year-1900; 
-    datetm.tm_mon = ymd.month-1; 
-    datetm.tm_mday = ymd.day;
-    datetm.tm_wday = d.day_of_week();
-    datetm.tm_yday = d.day_of_year()-1;
-    datetm.tm_hour = datetm.tm_min = datetm.tm_sec = 0;
-    datetm.tm_isdst = -1; // negative because not enough info to set tm_isdst
-    return datetm;
-  }
-
-  //! Converts a tm structure into a date dropping the any time values.
-  inline
-  date date_from_tm(const std::tm& datetm) 
-  {
-    return date(static_cast<unsigned short>(datetm.tm_year+1900), 
-                static_cast<unsigned short>(datetm.tm_mon+1), 
-                static_cast<unsigned short>(datetm.tm_mday));
-  }
-  
-
-} } //namespace boost::gregorian
-
-
-
-
-#endif
-
diff --git a/deal.II/contrib/boost/include/boost/date_time/gregorian/greg_duration.hpp b/deal.II/contrib/boost/include/boost/date_time/gregorian/greg_duration.hpp
deleted file mode 100644 (file)
index 9026645..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef GREG_DURATION_HPP___
-#define GREG_DURATION_HPP___
-
-/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
- * Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- * Author: Jeff Garland, Bart Garst 
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
- */
-
-#include "boost/date_time/date_duration.hpp"
-#if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES)
-#include "boost/date_time/date_duration_types.hpp"
-#endif
-#include "boost/date_time/int_adapter.hpp"
-
-
-namespace boost {
-namespace gregorian {
-
-
-  //!An internal date representation that includes infinities, not a date
-  typedef boost::date_time::duration_traits_adapted date_duration_rep;
-
-  //! Durations in days for gregorian system
-  /*! \ingroup date_basics
-   */
-  typedef date_time::date_duration<date_duration_rep> date_duration;
-
-  //! Shorthand for date_duration
-  typedef date_duration days;
-
-} } //namespace gregorian
-
-
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/date_time/microsec_time_clock.hpp b/deal.II/contrib/boost/include/boost/date_time/microsec_time_clock.hpp
deleted file mode 100644 (file)
index 1e946f8..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-#ifndef DATE_TIME_HIGHRES_TIME_CLOCK_HPP___
-#define DATE_TIME_HIGHRES_TIME_CLOCK_HPP___
-
-/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the
- * Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- * Author: Jeff Garland, Bart Garst
- * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
- */
-
-
-/*! @file microsec_time_clock.hpp
-  This file contains a high resolution time clock implementation.
-*/
-
-#include <boost/detail/workaround.hpp>
-#include "boost/date_time/c_time.hpp"
-#include "boost/date_time/time_clock.hpp"
-#include "boost/cstdint.hpp"
-#include "boost/shared_ptr.hpp"
-
-#ifdef BOOST_HAS_FTIME
-#include <windows.h>
-#endif
-
-#ifdef BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
-
-namespace boost {
-namespace date_time {
-
-
-  //! A clock providing microsecond level resolution
-  /*! A high precision clock that measures the local time
-   *  at a resolution up to microseconds and adjusts to the
-   *  resolution of the time system.  For example, for the
-   *  a library configuration with nano second resolution,
-   *  the last 3 places of the fractional seconds will always
-   *  be 000 since there are 1000 nano-seconds in a micro second.
-   */
-  template<class time_type>
-  class microsec_clock
-  {
-  public:
-    typedef typename time_type::date_type date_type;
-    typedef typename time_type::time_duration_type time_duration_type;
-    typedef typename time_duration_type::rep_type resolution_traits_type;
-
-    //! return a local time object for the given zone, based on computer clock
-    //JKG -- looks like we could rewrite this against universal_time
-    template<class time_zone_type>
-    static time_type local_time(shared_ptr<time_zone_type> tz_ptr) {
-      typedef typename time_type::utc_time_type utc_time_type;
-      typedef second_clock<utc_time_type> second_clock;
-      // we'll need to know the utc_offset this machine has
-      // in order to get a utc_time_type set to utc
-      utc_time_type utc_time = second_clock::universal_time();
-      time_duration_type utc_offset = second_clock::local_time() - utc_time;
-      // use micro clock to get a local time with sub seconds
-      // and adjust it to get a true utc time reading with sub seconds
-      utc_time = microsec_clock<utc_time_type>::local_time() - utc_offset;
-      return time_type(utc_time, tz_ptr);
-    }
-
-
-  private:
-    // we want this enum available for both platforms yet still private
-    enum TZ_FOR_CREATE { LOCAL, GMT };
-    
-  public:
-
-#ifdef BOOST_HAS_GETTIMEOFDAY
-    //! Return the local time based on computer clock settings
-    static time_type local_time() {
-      return create_time(LOCAL);
-    }
-
-    //! Get the current day in universal date as a ymd_type
-    static time_type universal_time()
-    {
-      return create_time(GMT);
-    }
-
-  private:
-    static time_type create_time(TZ_FOR_CREATE tz) {
-      timeval tv;
-      gettimeofday(&tv, 0); //gettimeofday does not support TZ adjust on Linux.
-      std::time_t t = tv.tv_sec;
-      boost::uint32_t fs = tv.tv_usec;
-      std::tm curr, *curr_ptr = 0;
-      if (tz == LOCAL) {
-        curr_ptr = c_time::localtime(&t, &curr);
-      } else {
-        curr_ptr = c_time::gmtime(&t, &curr);
-      }
-      date_type d(curr_ptr->tm_year + 1900,
-                  curr_ptr->tm_mon + 1,
-                  curr_ptr->tm_mday);
-      //The following line will adjusts the fractional second tick in terms
-      //of the current time system.  For example, if the time system
-      //doesn't support fractional seconds then res_adjust returns 0
-      //and all the fractional seconds return 0.
-      int adjust = resolution_traits_type::res_adjust()/1000000;
-
-      time_duration_type td(curr_ptr->tm_hour,
-                            curr_ptr->tm_min,
-                            curr_ptr->tm_sec,
-                            fs*adjust);
-      return time_type(d,td);
-
-    }
-#endif // BOOST_HAS_GETTIMEOFDAY
-
-#ifdef BOOST_HAS_FTIME
-    //! Return the local time based on computer clock settings
-    static time_type local_time() {
-      FILETIME ft;
-      #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
-      // Some runtime library implementations expect local times as the norm for ctime.
-      FILETIME ft_utc;
-      GetSystemTimeAsFileTime(&ft_utc);
-      FileTimeToLocalFileTime(&ft_utc,&ft);
-      #elif defined(BOOST_NO_GETSYSTEMTIMEASFILETIME)
-      SYSTEMTIME st;
-      GetSystemTime( &st );
-      SystemTimeToFileTime( &st, &ft );
-      #else
-      GetSystemTimeAsFileTime(&ft);
-      #endif
-      return create_time(ft, LOCAL);
-    }
-    
-    //! Return the UTC time based on computer settings
-    static time_type universal_time() {
-      FILETIME ft;
-      #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205))
-      // Some runtime library implementations expect local times as the norm for ctime.
-      FILETIME ft_utc;
-      GetSystemTimeAsFileTime(&ft_utc);
-      FileTimeToLocalFileTime(&ft_utc,&ft);
-      #elif defined(BOOST_NO_GETSYSTEMTIMEASFILETIME)
-      SYSTEMTIME st;
-      GetSystemTime( &st );
-      SystemTimeToFileTime( &st, &ft );
-      #else
-      GetSystemTimeAsFileTime(&ft);
-      #endif
-      return create_time(ft, GMT);
-    }
-
-  private:
-    static time_type create_time(FILETIME& ft, TZ_FOR_CREATE tz) {
-      // offset is difference (in 100-nanoseconds) from
-      // 1970-Jan-01 to 1601-Jan-01
-      boost::uint64_t c1 = 27111902;
-      boost::uint64_t c2 = 3577643008UL; // 'UL' removes compiler warnings
-      const boost::uint64_t OFFSET = (c1 << 32) + c2;
-
-      boost::uint64_t filetime = ft.dwHighDateTime;
-      filetime = filetime << 32;
-      filetime += ft.dwLowDateTime;
-      filetime -= OFFSET;
-      // filetime now holds 100-nanoseconds since 1970-Jan-01
-
-      // microseconds -- static casts supress warnings
-      boost::uint32_t sub_sec = static_cast<boost::uint32_t>((filetime % 10000000) / 10);
-
-      std::time_t t = static_cast<time_t>(filetime / 10000000); // seconds since epoch
-      
-      std::tm curr, *curr_ptr = 0;
-      if (tz == LOCAL) {
-        curr_ptr = c_time::localtime(&t, &curr);
-      }
-      else {
-        curr_ptr = c_time::gmtime(&t, &curr);
-      }
-      date_type d(curr_ptr->tm_year + 1900,
-                  curr_ptr->tm_mon + 1,
-                  curr_ptr->tm_mday);
-
-      //The following line will adjusts the fractional second tick in terms
-      //of the current time system.  For example, if the time system
-      //doesn't support fractional seconds then res_adjust returns 0
-      //and all the fractional seconds return 0.
-      int adjust = static_cast<int>(resolution_traits_type::res_adjust()/1000000);
-
-      time_duration_type td(curr_ptr->tm_hour,
-                            curr_ptr->tm_min,
-                            curr_ptr->tm_sec,
-                            sub_sec * adjust);
-                            //st.wMilliseconds * adjust);
-      return time_type(d,td);
-
-    }
-#endif // BOOST_HAS_FTIME
-  };
-
-
-} } //namespace date_time
-
-#endif //BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK
-
-
-#endif
-
diff --git a/deal.II/contrib/boost/include/boost/date_time/testfrmwk.hpp b/deal.II/contrib/boost/include/boost/date_time/testfrmwk.hpp
deleted file mode 100644 (file)
index 9a9ae91..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-
-#ifndef TEST_FRMWK_HPP___
-#define TEST_FRMWK_HPP___
-
-/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
- * Use, modification and distribution is subject to the 
- * Boost Software License, Version 1.0. (See accompanying
- * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
- * $Date: 2008-03-26 17:16:15 -0400 (Wed, 26 Mar 2008) $
- */
-
-
-#include <iostream>
-#include <string>
-
-//! Really simple test framework for counting and printing
-class TestStats
-{
-public:
-  static TestStats& instance() {static TestStats ts; return ts;}
-  void addPassingTest() {testcount_++; passcount_++;}
-  void addFailingTest() {testcount_++;}
-  unsigned int testcount() const {return testcount_;}
-  unsigned int passcount() const {return passcount_;}
-  void print(std::ostream& out = std::cout) const
-  {
-    out << testcount_ << " Tests Executed: " ;
-    if (passcount() != testcount()) {
-      out << (testcount() - passcount()) << " FAILURES";
-    }
-    else {
-      out << "All Succeeded" << std::endl;
-    }
-    out << std::endl;
-  }
-private:  
-  TestStats() : testcount_(0), passcount_(0) {}
-  unsigned int testcount_;
-  unsigned int passcount_;
-};
-
-
-bool check(const std::string& testname, bool testcond) 
-{
-  TestStats& stat = TestStats::instance();
-  if (testcond) {
-    std::cout << "Pass :: " << testname << " " <<  std::endl;
-    stat.addPassingTest();
-    return true;
-  }
-  else {
-    stat.addFailingTest();
-    std::cout << "FAIL :: " << testname << " " <<  std::endl;
-    return false;
-  }
-}
-
-
-int printTestStats() 
-{
-  TestStats& stat = TestStats::instance();
-  stat.print();
-  return stat.testcount() - stat.passcount();
-}
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/detail/sp_counted_base.hpp b/deal.II/contrib/boost/include/boost/detail/sp_counted_base.hpp
deleted file mode 100644 (file)
index c25a57f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef BOOST_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
-#define BOOST_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
-
-// MS compatible compilers support #pragma once
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-//
-//  detail/sp_counted_base.hpp
-//
-//  Copyright 2005, 2006 Peter Dimov
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-
-#include <boost/config.hpp>
-
-#if defined( BOOST_SP_DISABLE_THREADS )
-# include <boost/detail/sp_counted_base_nt.hpp>
-
-#elif defined( BOOST_SP_USE_SPINLOCK )
-# include <boost/detail/sp_counted_base_spin.hpp>
-
-#elif defined( BOOST_SP_USE_PTHREADS )
-# include <boost/detail/sp_counted_base_pt.hpp>
-
-#elif defined( BOOST_DISABLE_THREADS ) && !defined( BOOST_SP_ENABLE_THREADS ) && !defined( BOOST_DISABLE_WIN32 )
-# include <boost/detail/sp_counted_base_nt.hpp>
-
-#elif defined( __GNUC__ ) && ( defined( __i386__ ) || defined( __x86_64__ ) )
-# include <boost/detail/sp_counted_base_gcc_x86.hpp>
-
-#elif defined( __GNUC__ ) && defined( __ia64__ ) && !defined( __INTEL_COMPILER )
-# include <boost/detail/sp_counted_base_gcc_ia64.hpp>
-
-#elif defined(__HP_aCC) && defined(__ia64)
-# include <boost/detail/sp_counted_base_acc_ia64.hpp>
-
-#elif defined( __MWERKS__ ) && defined( __POWERPC__ )
-# include <boost/detail/sp_counted_base_cw_ppc.hpp>
-
-#elif defined( __GNUC__ ) && ( defined( __powerpc__ ) || defined( __ppc__ ) || defined( __ppc ) )
-# include <boost/detail/sp_counted_base_gcc_ppc.hpp>
-
-#elif defined(__GNUC__) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 401 ) && !defined( __arm__ ) && !defined( __hppa ) && ( !defined( __INTEL_COMPILER ) || defined( __ia64__ ) )
-# include <boost/detail/sp_counted_base_sync.hpp>
-
-#elif defined(__GNUC__) && ( defined( __sparcv9 ) || ( defined( __sparcv8 ) && ( __GNUC__ * 100 + __GNUC_MINOR__ >= 402 ) ) )
-# include <boost/detail/sp_counted_base_gcc_sparc.hpp>
-
-#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
-# include <boost/detail/sp_counted_base_w32.hpp>
-
-#elif !defined( BOOST_HAS_THREADS )
-# include <boost/detail/sp_counted_base_nt.hpp>
-
-#else
-# include <boost/detail/sp_counted_base_spin.hpp>
-
-#endif
-
-#endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_HPP_INCLUDED
diff --git a/deal.II/contrib/boost/include/boost/enable_shared_from_this.hpp b/deal.II/contrib/boost/include/boost/enable_shared_from_this.hpp
deleted file mode 100644 (file)
index 4e49f1f..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
-#define BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
-
-//
-//  enable_shared_from_this.hpp
-//
-//  Copyright (c) 2002 Peter Dimov
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//
-//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
-//
-
-#include <boost/weak_ptr.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/assert.hpp>
-#include <boost/config.hpp>
-
-namespace boost
-{
-
-template<class T> class enable_shared_from_this
-{
-protected:
-
-    enable_shared_from_this()
-    {
-    }
-
-    enable_shared_from_this(enable_shared_from_this const &)
-    {
-    }
-
-    enable_shared_from_this & operator=(enable_shared_from_this const &)
-    {
-        return *this;
-    }
-
-    ~enable_shared_from_this()
-    {
-    }
-
-public:
-
-    shared_ptr<T> shared_from_this()
-    {
-        shared_ptr<T> p(_internal_weak_this);
-        BOOST_ASSERT(p.get() == this);
-        return p;
-    }
-
-    shared_ptr<T const> shared_from_this() const
-    {
-        shared_ptr<T const> p(_internal_weak_this);
-        BOOST_ASSERT(p.get() == this);
-        return p;
-    }
-
-//  Note: No, you don't need to initialize _internal_weak_this
-//
-//  Please read the documentation, not the code
-//
-//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
-
-    typedef T _internal_element_type; // for bcc 5.5.1
-    mutable weak_ptr<_internal_element_type> _internal_weak_this;
-};
-
-} // namespace boost
-
-#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
diff --git a/deal.II/contrib/boost/include/boost/exception/diagnostic_information.hpp b/deal.II/contrib/boost/include/boost/exception/diagnostic_information.hpp
deleted file mode 100644 (file)
index 99273bc..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-//Copyright (c) 2006-2008 Emil Dotchevski and Reverge Studios, Inc.
-
-//Distributed under the Boost Software License, Version 1.0. (See accompanying
-//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef UUID_0552D49838DD11DD90146B8956D89593
-#define UUID_0552D49838DD11DD90146B8956D89593
-
-#include <boost/exception/get_error_info.hpp>
-#include <exception>
-#include <sstream>
-#include <string>
-
-namespace
-boost
-    {
-    namespace
-    exception_detail
-        {
-        inline
-        char const *
-        get_diagnostic_information( exception const & x )
-            {
-            if( error_info_container * c=x.data_.get() )
-                try
-                    {
-                    return c->diagnostic_information();
-                    }
-                catch(...)
-                    {
-                    }
-            return 0;
-            }
-        }
-
-    inline
-    std::string
-    diagnostic_information( exception const & x )
-        {
-        std::ostringstream tmp;
-        if( boost::shared_ptr<char const * const> f=get_error_info<throw_file>(x) )
-            {
-            tmp << *f;
-            if( boost::shared_ptr<int const> l=get_error_info<throw_line>(x) )
-                tmp << '(' << *l << "): ";
-            }
-        tmp << "Throw in function ";
-        if( boost::shared_ptr<char const * const> fn=get_error_info<throw_function>(x) )
-            tmp << *fn;
-        else
-            tmp << "(unknown)";
-#ifndef BOOST_NO_RTTI
-        tmp << "\nDynamic exception type: " << BOOST_EXCEPTION_DYNAMIC_TYPEID(x).name();
-        if( std::exception const * e=dynamic_cast<std::exception const *>(&x) )
-            tmp << "\nstd::exception::what: " << e->what();
-#endif
-        if( char const * s=exception_detail::get_diagnostic_information(x) )
-            if( *s )
-                tmp << '\n' << s;
-        return tmp.str();
-        }
-    }
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/detail/float_functions.hpp b/deal.II/contrib/boost/include/boost/functional/detail/float_functions.hpp
deleted file mode 100644 (file)
index 5cef36e..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#if !defined(BOOST_FUNCTIONAL_DETAIL_FLOAT_FUNCTIONS_HPP)
-#define BOOST_FUNCTIONAL_DETAIL_FLOAT_FUNCTIONS_HPP
-
-#include <boost/config/no_tr1/cmath.hpp>
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-// The C++ standard requires that the C float functions are overloarded
-// for float, double and long double in the std namespace, but some of the older
-// library implementations don't support this. On some that don't, the C99
-// float functions (frexpf, frexpl, etc.) are available.
-//
-// Some of this is based on guess work. If I don't know any better I assume that
-// the standard C++ overloaded functions are available. If they're not then this
-// means that the argument is cast to a double and back, which is inefficient
-// and will give pretty bad results for long doubles - so if you know better
-// let me know.
-
-// STLport:
-#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
-#  if (defined(__GNUC__) && __GNUC__ < 3 && (defined(linux) || defined(__linux) || defined(__linux__))) || defined(__DMC__)
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#  elif defined(BOOST_MSVC) && BOOST_MSVC < 1300
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#  else
-#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#  endif
-
-// Roguewave:
-//
-// On borland 5.51, with roguewave 2.1.1 the standard C++ overloads aren't
-// defined, but for the same version of roguewave on sunpro they are.
-#elif defined(_RWSTD_VER)
-#  if defined(__BORLANDC__)
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#    define BOOST_HASH_C99_NO_FLOAT_FUNCS
-#  elif defined(__DECCXX)
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#  else
-#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#  endif
-
-// libstdc++ (gcc 3.0 onwards, I think)
-#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
-#  define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-
-// SGI:
-#elif defined(__STL_CONFIG_H)
-#  if defined(linux) || defined(__linux) || defined(__linux__)
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#  else
-#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#  endif
-
-// Dinkumware.
-#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
-// Some versions of Visual C++ don't seem to have the C++ overloads but they
-// all seem to have the c99 float overloads
-#  if defined(BOOST_MSVC)
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-// On other platforms the C++ overloads seem to have been introduced sometime
-// before 402.
-#  elif defined(_CPPLIB_VER) && (_CPPLIB_VER >= 402)
-#    define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#  else
-#    define BOOST_HASH_USE_C99_FLOAT_FUNCS
-#  endif
-
-// Digital Mars
-#elif defined(__DMC__)
-#  define BOOST_HASH_USE_C99_FLOAT_FUNCS
-
-// Use overloaded float functions by default.
-#else
-#  define BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#endif
-
-namespace boost
-{
-    namespace hash_detail
-    {
-
-        inline float call_ldexp(float v, int exp)
-        {
-            using namespace std;
-#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS) || \
-    defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
-            return ldexp(v, exp);
-#else
-            return ldexpf(v, exp);
-#endif
-        }
-
-        inline double call_ldexp(double v, int exp)
-        {
-            using namespace std;
-            return ldexp(v, exp);
-        }
-
-        inline long double call_ldexp(long double v, int exp)
-        {
-            using namespace std;
-#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
-            return ldexp(v, exp);
-#else
-            return ldexpl(v, exp);
-#endif
-        }
-
-        inline float call_frexp(float v, int* exp)
-        {
-            using namespace std;
-#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS) || \
-    defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
-            return frexp(v, exp);
-#else
-            return frexpf(v, exp);
-#endif
-        }
-
-        inline double call_frexp(double v, int* exp)
-        {
-            using namespace std;
-            return frexp(v, exp);
-        }
-
-        inline long double call_frexp(long double v, int* exp)
-        {
-            using namespace std;
-#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
-            return frexp(v, exp);
-#else
-            return frexpl(v, exp);
-#endif
-        }
-    }
-}
-
-#if defined(BOOST_HASH_USE_C99_FLOAT_FUNCS)
-#undef BOOST_HASH_USE_C99_FLOAT_FUNCS
-#endif
-
-#if defined(BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS)
-#undef BOOST_HASH_USE_OVERLOAD_FLOAT_FUNCS
-#endif
-
-#if defined(BOOST_HASH_C99_NO_FLOAT_FUNCS)
-#undef BOOST_HASH_C99_NO_FLOAT_FUNCS
-#endif
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/detail/hash_float.hpp b/deal.II/contrib/boost/include/boost/functional/detail/hash_float.hpp
deleted file mode 100644 (file)
index dc35afb..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_DETAIL_HASH_FLOAT_HEADER)
-#define BOOST_FUNCTIONAL_DETAIL_HASH_FLOAT_HEADER
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(BOOST_MSVC)
-#pragma warning(push)
-#if BOOST_MSVC >= 1400
-#pragma warning(disable:6294) // Ill-defined for-loop: initial condition does
-                              // not satisfy test. Loop body not executed 
-#endif
-#endif
-
-#include <boost/functional/detail/float_functions.hpp>
-#include <boost/integer/static_log2.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/limits.hpp>
-#include <boost/assert.hpp>
-
-// Select implementation for the current platform.
-
-// Cygwn
-#if defined(__CYGWIN__)
-#  if defined(__i386__) || defined(_M_IX86)
-#    define BOOST_HASH_USE_x86_BINARY_HASH
-#  endif
-
-// STLport
-#elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
-// fpclassify aren't good enough on STLport.
-
-// GNU libstdc++ 3
-#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
-#  if (defined(__USE_ISOC99) || defined(_GLIBCXX_USE_C99_MATH)) && \
-      !(defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__))
-#    define BOOST_HASH_USE_FPCLASSIFY
-#  endif
-
-// Dinkumware Library, on Visual C++ 
-#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
-
-// Not using _fpclass because it is only available for double.
-
-#endif
-
-// On OpenBSD, numeric_limits is not reliable for long doubles, but
-// the macros defined in <float.h> are.
-
-#if defined(__OpenBSD__)
-#include <float.h>
-#endif
-
-namespace boost
-{
-    namespace hash_detail
-    {
-        template <class T>
-        struct limits : std::numeric_limits<T> {};
-
-#if defined(__OpenBSD__)
-        template <>
-        struct limits<long double>
-             : std::numeric_limits<long double>
-        {
-            static long double epsilon() {
-                return LDBL_EPSILON;
-            }
-
-            static long double (max)() {
-                return LDBL_MAX;
-            }
-
-            static long double (min)() {
-                return LDBL_MIN;
-            }
-
-            BOOST_STATIC_CONSTANT(int, digits = LDBL_MANT_DIG);
-            BOOST_STATIC_CONSTANT(int, max_exponent = LDBL_MAX_EXP);
-            BOOST_STATIC_CONSTANT(int, min_exponent = LDBL_MIN_EXP);
-        };
-#endif // __OpenBSD__
-
-        inline void hash_float_combine(std::size_t& seed, std::size_t value)
-        {
-            seed ^= value + (seed<<6) + (seed>>2);
-        }
-
-// A simple, non-portable hash algorithm for x86.
-#if defined(BOOST_HASH_USE_x86_BINARY_HASH)
-        inline std::size_t float_hash_impl(float v)
-        {
-            boost::uint32_t* ptr = (boost::uint32_t*)&v;
-            std::size_t seed = *ptr;
-            return seed;
-        }
-
-        inline std::size_t float_hash_impl(double v)
-        {
-            boost::uint32_t* ptr = (boost::uint32_t*)&v;
-            std::size_t seed = *ptr++;
-            hash_float_combine(seed, *ptr);
-            return seed;
-        }
-
-        inline std::size_t float_hash_impl(long double v)
-        {
-            boost::uint32_t* ptr = (boost::uint32_t*)&v;
-            std::size_t seed = *ptr++;
-            hash_float_combine(seed, *ptr++);
-            hash_float_combine(seed, *(boost::uint16_t*)ptr);
-            return seed;
-        }
-
-#else
-
-        template <class T>
-        inline std::size_t float_hash_impl(T v)
-        {
-            int exp = 0;
-
-            v = boost::hash_detail::call_frexp(v, &exp);
-
-            // A postive value is easier to hash, so combine the
-            // sign with the exponent.
-            if(v < 0) {
-                v = -v;
-                exp += limits<T>::max_exponent -
-                    limits<T>::min_exponent;
-            }
-
-            // The result of frexp is always between 0.5 and 1, so its
-            // top bit will always be 1. Subtract by 0.5 to remove that.
-            v -= T(0.5);
-            v = boost::hash_detail::call_ldexp(v,
-                    limits<std::size_t>::digits + 1);
-            std::size_t seed = static_cast<std::size_t>(v);
-            v -= seed;
-
-            // ceiling(digits(T) * log2(radix(T))/ digits(size_t)) - 1;
-            std::size_t const length
-                = (limits<T>::digits *
-                        boost::static_log2<limits<T>::radix>::value - 1)
-                / limits<std::size_t>::digits;
-
-            for(std::size_t i = 0; i != length; ++i)
-            {
-                v = boost::hash_detail::call_ldexp(v,
-                        limits<std::size_t>::digits);
-                std::size_t part = static_cast<std::size_t>(v);
-                v -= part;
-                hash_float_combine(seed, part);
-            }
-
-            hash_float_combine(seed, exp);
-
-            return seed;
-        }
-#endif
-
-        template <class T>
-        inline std::size_t float_hash_value(T v)
-        {
-#if defined(BOOST_HASH_USE_FPCLASSIFY)
-            using namespace std;
-            switch (fpclassify(v)) {
-            case FP_ZERO:
-                return 0;
-            case FP_INFINITE:
-                return (std::size_t)(v > 0 ? -1 : -2);
-            case FP_NAN:
-                return (std::size_t)(-3);
-            case FP_NORMAL:
-            case FP_SUBNORMAL:
-                return float_hash_impl(v);
-            default:
-                BOOST_ASSERT(0);
-                return 0;
-            }
-#else
-            return v == 0 ? 0 : float_hash_impl(v);
-#endif
-        }
-    }
-}
-
-#if defined(BOOST_MSVC)
-#pragma warning(pop)
-#endif
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/deque.hpp b/deal.II/contrib/boost/include/boost/functional/hash/deque.hpp
deleted file mode 100644 (file)
index 06d23c2..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_DEQUE_HPP)
-#define BOOST_FUNCTIONAL_HASH_DEQUE_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/deque.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/deque.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/list.hpp b/deal.II/contrib/boost/include/boost/functional/hash/list.hpp
deleted file mode 100644 (file)
index 201f6d0..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_LIST_HPP)
-#define BOOST_FUNCTIONAL_HASH_LIST_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/list.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/list.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/map.hpp b/deal.II/contrib/boost/include/boost/functional/hash/map.hpp
deleted file mode 100644 (file)
index 6713d85..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_MAP_HPP)
-#define BOOST_FUNCTIONAL_HASH_MAP_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/map.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/map.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/pair.hpp b/deal.II/contrib/boost/include/boost/functional/hash/pair.hpp
deleted file mode 100644 (file)
index bf076f1..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_PAIR_HPP)
-#define BOOST_FUNCTIONAL_HASH_PAIR_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/pair.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/pair.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/set.hpp b/deal.II/contrib/boost/include/boost/functional/hash/set.hpp
deleted file mode 100644 (file)
index 0533e76..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_SET_HPP)
-#define BOOST_FUNCTIONAL_HASH_SET_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/set.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/set.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/functional/hash/vector.hpp b/deal.II/contrib/boost/include/boost/functional/hash/vector.hpp
deleted file mode 100644 (file)
index 8bab799..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-// Copyright 2005-2008 Daniel James.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-//  Based on Peter Dimov's proposal
-//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
-//  issue 6.18. 
-
-#if !defined(BOOST_FUNCTIONAL_HASH_VECTOR_HPP)
-#define BOOST_FUNCTIONAL_HASH_VECTOR_HPP
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(__EDG__)
-#elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__DMC__)
-#pragma message("Warning: boost/functional/hash/vector.hpp is deprecated, use boost/functional/hash.hpp instead.")
-#elif defined(__GNUC__) || defined(__HP_aCC) || \
-    defined(__SUNPRO_CC) || defined(__IBMCPP__)
-#warning "boost/functional/hash/vector.hpp is deprecated, use boost/functional/hash.hpp instead."
-#endif
-
-#include <boost/functional/hash.hpp>
-
-#endif
diff --git a/deal.II/contrib/boost/include/boost/graph/compressed_sparse_row_graph.hpp b/deal.II/contrib/boost/include/boost/graph/compressed_sparse_row_graph.hpp
deleted file mode 100644 (file)
index d093b6a..0000000
+++ /dev/null
@@ -1,801 +0,0 @@
-// Copyright 2005-2006 The Trustees of Indiana University.
-
-// 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)
-
-//  Authors: Jeremiah Willcock
-//           Douglas Gregor
-//           Andrew Lumsdaine
-
-// Compressed sparse row graph type
-
-#ifndef BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
-#define BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
-
-#include <vector>
-#include <utility>
-#include <algorithm>
-#include <climits>
-#include <iterator>
-#include <boost/graph/graph_traits.hpp>
-#include <boost/graph/properties.hpp>
-#include <boost/graph/detail/indexed_properties.hpp>
-#include <boost/iterator/counting_iterator.hpp>
-#include <boost/integer.hpp>
-#include <boost/iterator/iterator_facade.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/graph/graph_selectors.hpp>
-#include <boost/static_assert.hpp>
-
-#ifdef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-#  error The Compressed Sparse Row graph only supports bundled properties.
-#  error You will need a compiler that conforms better to the C++ standard.
-#endif
-
-namespace boost {
-
-// A tag type indicating that the graph in question is a compressed
-// sparse row graph. This is an internal detail of the BGL.
-struct csr_graph_tag;
-
-/****************************************************************************
- * Local helper macros to reduce typing and clutter later on.               *
- ****************************************************************************/
-#define BOOST_CSR_GRAPH_TEMPLATE_PARMS                                  \
-  typename Directed, typename VertexProperty, typename EdgeProperty,    \
-  typename GraphProperty, typename Vertex, typename EdgeIndex
-#define BOOST_CSR_GRAPH_TYPE                                            \
-   compressed_sparse_row_graph<Directed, VertexProperty, EdgeProperty,  \
-                               GraphProperty, Vertex, EdgeIndex>
-
-// Forward declaration of CSR edge descriptor type, needed to pass to
-// indexed_edge_properties.
-template<typename Vertex, typename EdgeIndex>
-class csr_edge_descriptor;
-
-/** Compressed sparse row graph.
- *
- * Vertex and EdgeIndex should be unsigned integral types and should
- * specialize numeric_limits.
- */
-template<typename Directed = directedS, 
-         typename VertexProperty = void,
-         typename EdgeProperty = void,
-         typename GraphProperty = no_property,
-         typename Vertex = std::size_t,
-         typename EdgeIndex = Vertex>
-class compressed_sparse_row_graph
-   : public detail::indexed_vertex_properties<BOOST_CSR_GRAPH_TYPE, VertexProperty,
-                                              Vertex>,
-     public detail::indexed_edge_properties<BOOST_CSR_GRAPH_TYPE, EdgeProperty,
-                                            csr_edge_descriptor<Vertex,
-                                                                EdgeIndex> >
-
-{
-  typedef detail::indexed_vertex_properties<compressed_sparse_row_graph,
-                                            VertexProperty, Vertex>
-    inherited_vertex_properties;
-
-  typedef detail::indexed_edge_properties<BOOST_CSR_GRAPH_TYPE, EdgeProperty,
-                                          csr_edge_descriptor<Vertex, EdgeIndex> >
-    inherited_edge_properties;
-
- public:
-  // For Property Graph
-  typedef GraphProperty graph_property_type;
-
- protected:
-  template<typename InputIterator>
-  void
-  maybe_reserve_edge_list_storage(InputIterator, InputIterator,
-                                  std::input_iterator_tag)
-  {
-    // Do nothing: we have no idea how much storage to reserve.
-  }
-
-  template<typename InputIterator>
-  void
-  maybe_reserve_edge_list_storage(InputIterator first, InputIterator last,
-                                  std::forward_iterator_tag)
-  {
-    using std::distance;
-    typename std::iterator_traits<InputIterator>::difference_type n =
-      distance(first, last);
-    m_column.reserve(n);
-    inherited_edge_properties::reserve(n);
-  }
-
- public:
-  /* At this time, the compressed sparse row graph can only be used to
-   * create a directed graph. In the future, bidirectional and
-   * undirected CSR graphs will also be supported.
-   */
-  BOOST_STATIC_ASSERT((is_same<Directed, directedS>::value));
-
-  // Concept requirements:
-  // For Graph
-  typedef Vertex vertex_descriptor;
-  typedef csr_edge_descriptor<Vertex, EdgeIndex> edge_descriptor;
-  typedef directed_tag directed_category;
-  typedef allow_parallel_edge_tag edge_parallel_category;
-
-  class traversal_category: public incidence_graph_tag,
-                            public adjacency_graph_tag,
-                            public vertex_list_graph_tag,
-                            public edge_list_graph_tag {};
-
-  static vertex_descriptor null_vertex() { return vertex_descriptor(-1); }
-
-  // For VertexListGraph
-  typedef counting_iterator<Vertex> vertex_iterator;
-  typedef Vertex vertices_size_type;
-
-  // For EdgeListGraph
-  typedef EdgeIndex edges_size_type;
-
-  // For IncidenceGraph
-  class out_edge_iterator;
-  typedef EdgeIndex degree_size_type;
-
-  // For AdjacencyGraph
-  typedef typename std::vector<Vertex>::const_iterator adjacency_iterator;
-
-  // For EdgeListGraph
-  class edge_iterator;
-
-  // For BidirectionalGraph (not implemented)
-  typedef void in_edge_iterator;
-
-  // For internal use
-  typedef csr_graph_tag graph_tag;
-
-  // Constructors
-
-  // Default constructor: an empty graph.
-  compressed_sparse_row_graph()
-    : m_rowstart(1, EdgeIndex(0)), m_column(0), m_property(),
-      m_last_source(0) {}
-
-  //  From number of vertices and sorted list of edges
-  template<typename InputIterator>
-  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
-                              vertices_size_type numverts,
-                              edges_size_type numedges = 0,
-                              const GraphProperty& prop = GraphProperty())
-    : inherited_vertex_properties(numverts), m_rowstart(numverts + 1),
-      m_column(0), m_property(prop), m_last_source(numverts)
-  {
-    // Reserving storage in advance can save us lots of time and
-    // memory, but it can only be done if we have forward iterators or
-    // the user has supplied the number of edges.
-    if (numedges == 0) {
-      typedef typename std::iterator_traits<InputIterator>::iterator_category
-        category;
-      maybe_reserve_edge_list_storage(edge_begin, edge_end, category());
-    } else {
-      m_column.reserve(numedges);
-    }
-
-    EdgeIndex current_edge = 0;
-    Vertex current_vertex_plus_one = 1;
-    m_rowstart[0] = 0;
-    for (InputIterator ei = edge_begin; ei != edge_end; ++ei) {
-      Vertex src = ei->first;
-      Vertex tgt = ei->second;
-      for (; current_vertex_plus_one != src + 1; ++current_vertex_plus_one)
-        m_rowstart[current_vertex_plus_one] = current_edge;
-      m_column.push_back(tgt);
-      ++current_edge;
-    }
-
-    // The remaining vertices have no edges
-    for (; current_vertex_plus_one != numverts + 1; ++current_vertex_plus_one)
-      m_rowstart[current_vertex_plus_one] = current_edge;
-
-    // Default-construct properties for edges
-    inherited_edge_properties::resize(m_column.size());
-  }
-
-  //  From number of vertices and sorted list of edges
-  template<typename InputIterator, typename EdgePropertyIterator>
-  compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
-                              EdgePropertyIterator ep_iter,
-                              vertices_size_type numverts,
-                              edges_size_type numedges = 0,
-                              const GraphProperty& prop = GraphProperty())
-    : inherited_vertex_properties(numverts), m_rowstart(numverts + 1),
-      m_column(0), m_property(prop), m_last_source(numverts)
-  {
-    // Reserving storage in advance can save us lots of time and
-    // memory, but it can only be done if we have forward iterators or
-    // the user has supplied the number of edges.
-    if (numedges == 0) {
-      typedef typename std::iterator_traits<InputIterator>::iterator_category
-        category;
-      maybe_reserve_edge_list_storage(edge_begin, edge_end, category());
-    } else {
-      m_column.reserve(numedges);
-    }
-
-    EdgeIndex current_edge = 0;
-    Vertex current_vertex_plus_one = 1;
-    m_rowstart[0] = 0;
-    for (InputIterator ei = edge_begin; ei != edge_end; ++ei, ++ep_iter) {
-      Vertex src = ei->first;
-      Vertex tgt = ei->second;
-      for (; current_vertex_plus_one != src + 1; ++current_vertex_plus_one)
-        m_rowstart[current_vertex_plus_one] = current_edge;
-      m_column.push_back(tgt);
-      inherited_edge_properties::push_back(*ep_iter);
-      ++current_edge;
-    }
-
-    // The remaining vertices have no edges
-    for (; current_vertex_plus_one != numverts + 1; ++current_vertex_plus_one)
-      m_rowstart[current_vertex_plus_one] = current_edge;
-  }
-
-  //   Requires IncidenceGraph, a vertex index map, and a vertex(n, g) function
-  template<typename Graph, typename VertexIndexMap>
-  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi,
-                              vertices_size_type numverts,
-                              edges_size_type numedges)
-    : m_property(), m_last_source(0)
-  {
-    assign(g, vi, numverts, numedges);
-  }
-
-  //   Requires VertexListGraph and EdgeListGraph
-  template<typename Graph, typename VertexIndexMap>
-  compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi)
-    : m_property(), m_last_source(0)
-  {
-    assign(g, vi, num_vertices(g), num_edges(g));
-  }
-
-  // Requires vertex index map plus requirements of previous constructor
-  template<typename Graph>
-  explicit compressed_sparse_row_graph(const Graph& g)
-    : m_property(), m_last_source(0)
-  {
-    assign(g, get(vertex_index, g), num_vertices(g), num_edges(g));
-  }
-
-  // From any graph (slow and uses a lot of memory)
-  //   Requires IncidenceGraph, a vertex index map, and a vertex(n, g) function
-  //   Internal helper function
-  template<typename Graph, typename VertexIndexMap>
-  void
-  assign(const Graph& g, const VertexIndexMap& vi,
-         vertices_size_type numverts, edges_size_type numedges)
-  {
-    inherited_vertex_properties::resize(numverts);
-    m_rowstart.resize(numverts + 1);
-    m_column.resize(numedges);
-    EdgeIndex current_edge = 0;
-    typedef typename boost::graph_traits<Graph>::vertex_descriptor g_vertex;
-    typedef typename boost::graph_traits<Graph>::edge_descriptor g_edge;
-    typedef typename boost::graph_traits<Graph>::out_edge_iterator
-      g_out_edge_iter;
-
-    for (Vertex i = 0; i != numverts; ++i) {
-      m_rowstart[i] = current_edge;
-      g_vertex v = vertex(i, g);
-      EdgeIndex num_edges_before_this_vertex = current_edge;
-      g_out_edge_iter ei, ei_end;
-      for (tie(ei, ei_end) = out_edges(v, g); ei != ei_end; ++ei) {
-        m_column[current_edge++] = get(vi, target(*ei, g));
-      }
-      std::sort(m_column.begin() + num_edges_before_this_vertex,
-                m_column.begin() + current_edge);
-    }
-    m_rowstart[numverts] = current_edge;
-    m_last_source = numverts;
-  }
-
-  // Requires the above, plus VertexListGraph and EdgeListGraph
-  template<typename Graph, typename VertexIndexMap>
-  void assign(const Graph& g, const VertexIndexMap& vi)
-  {
-    assign(g, vi, num_vertices(g), num_edges(g));
-  }
-
-  // Requires the above, plus a vertex_index map.
-  template<typename Graph>
-  void assign(const Graph& g)
-  {
-    assign(g, get(vertex_index, g), num_vertices(g), num_edges(g));
-  }
-
-  using inherited_vertex_properties::operator[];
-  using inherited_edge_properties::operator[];
-
-  // private: non-portable, requires friend templates
-  inherited_vertex_properties&       vertex_properties()       {return *this;}
-  const inherited_vertex_properties& vertex_properties() const {return *this;}
-  inherited_edge_properties&       edge_properties()       { return *this; }
-  const inherited_edge_properties& edge_properties() const { return *this; }
-
-  std::vector<EdgeIndex> m_rowstart;
-  std::vector<Vertex> m_column;
-  GraphProperty m_property;
-  Vertex m_last_source; // Last source of added edge, plus one
-};
-
-template<typename Vertex, typename EdgeIndex>
-class csr_edge_descriptor
-{
- public:
-  Vertex src;
-  EdgeIndex idx;
-
-  csr_edge_descriptor(Vertex src, EdgeIndex idx): src(src), idx(idx) {}
-  csr_edge_descriptor(): src(0), idx(0) {}
-
-  bool operator==(const csr_edge_descriptor& e) const {return idx == e.idx;}
-  bool operator!=(const csr_edge_descriptor& e) const {return idx != e.idx;}
-  bool operator<(const csr_edge_descriptor& e) const {return idx < e.idx;}
-  bool operator>(const csr_edge_descriptor& e) const {return idx > e.idx;}
-  bool operator<=(const csr_edge_descriptor& e) const {return idx <= e.idx;}
-  bool operator>=(const csr_edge_descriptor& e) const {return idx >= e.idx;}
-};
-
-// Construction functions
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-add_vertex(BOOST_CSR_GRAPH_TYPE& g) {
-  Vertex old_num_verts_plus_one = g.m_rowstart.size();
-  g.m_rowstart.push_back(EdgeIndex(0));
-  g.vertex_properties().resize(num_vertices(g));
-  return old_num_verts_plus_one - 1;
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-add_vertices(typename BOOST_CSR_GRAPH_TYPE::vertices_size_type count, BOOST_CSR_GRAPH_TYPE& g) {
-  Vertex old_num_verts_plus_one = g.m_rowstart.size();
-  g.m_rowstart.resize(old_num_verts_plus_one + count, EdgeIndex(0));
-  g.vertex_properties().resize(num_vertices(g));
-  return old_num_verts_plus_one - 1;
-}
-
-// This function requires that (src, tgt) be lexicographically at least as
-// large as the largest edge in the graph so far
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
-add_edge(Vertex src, Vertex tgt, BOOST_CSR_GRAPH_TYPE& g) {
-  assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
-          src < num_vertices(g));
-  EdgeIndex num_edges_orig = g.m_column.size();
-  for (; g.m_last_source <= src; ++g.m_last_source)
-    g.m_rowstart[g.m_last_source] = num_edges_orig;
-  g.m_rowstart[src + 1] = num_edges_orig + 1;
-  g.m_column.push_back(tgt);
-  typedef typename BOOST_CSR_GRAPH_TYPE::edge_push_back_type push_back_type;
-  g.edge_properties().push_back(push_back_type());
-  return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
-}
-
-// This function requires that (src, tgt) be lexicographically at least as
-// large as the largest edge in the graph so far
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
-add_edge(Vertex src, Vertex tgt,
-         typename BOOST_CSR_GRAPH_TYPE::edge_bundled const& p,
-         BOOST_CSR_GRAPH_TYPE& g) {
-  assert ((g.m_last_source == 0 || src >= g.m_last_source - 1) &&
-          src < num_vertices(g));
-  EdgeIndex num_edges_orig = g.m_column.size();
-  for (; g.m_last_source <= src; ++g.m_last_source)
-    g.m_rowstart[g.m_last_source] = num_edges_orig;
-  g.m_rowstart[src + 1] = num_edges_orig + 1;
-  g.m_column.push_back(tgt);
-  g.edge_properties().push_back(p);
-  return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, num_edges_orig);
-}
-
-
-// From VertexListGraph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-num_vertices(const BOOST_CSR_GRAPH_TYPE& g) {
-  return g.m_rowstart.size() - 1;
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-std::pair<counting_iterator<Vertex>, counting_iterator<Vertex> >
-inline vertices(const BOOST_CSR_GRAPH_TYPE& g) {
-  return std::make_pair(counting_iterator<Vertex>(0),
-                        counting_iterator<Vertex>(num_vertices(g)));
-}
-
-// From IncidenceGraph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-class BOOST_CSR_GRAPH_TYPE::out_edge_iterator
-  : public iterator_facade<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
-                           typename BOOST_CSR_GRAPH_TYPE::edge_descriptor,
-                           std::random_access_iterator_tag,
-                           const typename BOOST_CSR_GRAPH_TYPE::edge_descriptor&,
-                           typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast>
-{
- public:
-  typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
-
-  out_edge_iterator() {}
-  // Implicit copy constructor OK
-  explicit out_edge_iterator(edge_descriptor edge) : m_edge(edge) { }
-
- private:
-  // iterator_facade requirements
-  const edge_descriptor& dereference() const { return m_edge; }
-
-  bool equal(const out_edge_iterator& other) const
-  { return m_edge == other.m_edge; }
-
-  void increment() { ++m_edge.idx; }
-  void decrement() { ++m_edge.idx; }
-  void advance(difference_type n) { m_edge.idx += n; }
-
-  difference_type distance_to(const out_edge_iterator& other) const
-  { return other.m_edge.idx - m_edge.idx; }
-
-  edge_descriptor m_edge;
-
-  friend class iterator_core_access;
-};
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-source(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e,
-       const BOOST_CSR_GRAPH_TYPE&)
-{
-  return e.src;
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-target(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e,
-       const BOOST_CSR_GRAPH_TYPE& g)
-{
-  return g.m_column[e.idx];
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline std::pair<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
-                 typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator>
-out_edges(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor ed;
-  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator it;
-  EdgeIndex v_row_start = g.m_rowstart[v];
-  EdgeIndex next_row_start = g.m_rowstart[v + 1];
-  return std::make_pair(it(ed(v, v_row_start)),
-                        it(ed(v, (std::max)(v_row_start, next_row_start))));
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline EdgeIndex
-out_degree(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  EdgeIndex v_row_start = g.m_rowstart[v];
-  EdgeIndex next_row_start = g.m_rowstart[v + 1];
-  return (std::max)(v_row_start, next_row_start) - v_row_start;
-}
-
-// From AdjacencyGraph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline std::pair<typename BOOST_CSR_GRAPH_TYPE::adjacency_iterator,
-                 typename BOOST_CSR_GRAPH_TYPE::adjacency_iterator>
-adjacent_vertices(Vertex v, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  EdgeIndex v_row_start = g.m_rowstart[v];
-  EdgeIndex next_row_start = g.m_rowstart[v + 1];
-  return std::make_pair(g.m_column.begin() + v_row_start,
-                        g.m_column.begin() +
-                                (std::max)(v_row_start, next_row_start));
-}
-
-// Extra, common functions
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor
-vertex(typename graph_traits<BOOST_CSR_GRAPH_TYPE>::vertex_descriptor i, 
-       const BOOST_CSR_GRAPH_TYPE&)
-{
-  return i;
-}
-
-// Unlike for an adjacency_matrix, edge_range and edge take lg(out_degree(i))
-// time
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline std::pair<typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator,
-                 typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator>
-edge_range(Vertex i, Vertex j, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename std::vector<Vertex>::const_iterator adj_iter;
-  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
-  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor edge_desc;
-  std::pair<adj_iter, adj_iter> raw_adjacencies = adjacent_vertices(i, g);
-  std::pair<adj_iter, adj_iter> adjacencies =
-    std::equal_range(raw_adjacencies.first, raw_adjacencies.second, j);
-  EdgeIndex idx_begin = adjacencies.first - g.m_column.begin();
-  EdgeIndex idx_end = adjacencies.second - g.m_column.begin();
-  return std::make_pair(out_edge_iter(edge_desc(i, idx_begin)),
-                        out_edge_iter(edge_desc(i, idx_end)));
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline std::pair<typename BOOST_CSR_GRAPH_TYPE::edge_descriptor, bool>
-edge(Vertex i, Vertex j, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename BOOST_CSR_GRAPH_TYPE::out_edge_iterator out_edge_iter;
-  std::pair<out_edge_iter, out_edge_iter> range = edge_range(i, j, g);
-  if (range.first == range.second)
-    return std::make_pair(typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(),
-                          false);
-  else
-    return std::make_pair(*range.first, true);
-}
-
-// Find an edge given its index in the graph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename BOOST_CSR_GRAPH_TYPE::edge_descriptor
-edge_from_index(EdgeIndex idx, const BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename std::vector<EdgeIndex>::const_iterator row_start_iter;
-  assert (idx < num_edges(g));
-  row_start_iter src_plus_1 =
-    std::upper_bound(g.m_rowstart.begin(),
-                     g.m_rowstart.begin() + g.m_last_source + 1,
-                     idx);
-    // Get last source whose rowstart is at most idx
-    // upper_bound returns this position plus 1
-  Vertex src = (src_plus_1 - g.m_rowstart.begin()) - 1;
-  return typename BOOST_CSR_GRAPH_TYPE::edge_descriptor(src, idx);
-}
-
-// From EdgeListGraph
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-class BOOST_CSR_GRAPH_TYPE::edge_iterator
-{
- public:
-  typedef std::forward_iterator_tag iterator_category;
-  typedef edge_descriptor value_type;
-
-  typedef const edge_descriptor* pointer;
-
-  typedef edge_descriptor reference;
-  typedef typename int_t<CHAR_BIT * sizeof(EdgeIndex)>::fast difference_type;
-
-  edge_iterator() : rowstart_array(0), current_edge(), end_of_this_vertex(0) {}
-
-  edge_iterator(const compressed_sparse_row_graph& graph,
-                edge_descriptor current_edge,
-                EdgeIndex end_of_this_vertex)
-    : rowstart_array(&graph.m_rowstart[0]), current_edge(current_edge),
-      end_of_this_vertex(end_of_this_vertex) {}
-
-  // From InputIterator
-  reference operator*() const { return current_edge; }
-  pointer operator->() const { return &current_edge; }
-
-  bool operator==(const edge_iterator& o) const {
-    return current_edge == o.current_edge;
-  }
-  bool operator!=(const edge_iterator& o) const {
-    return current_edge != o.current_edge;
-  }
-
-  edge_iterator& operator++() {
-    ++current_edge.idx;
-    while (current_edge.idx == end_of_this_vertex) {
-      ++current_edge.src;
-      end_of_this_vertex = rowstart_array[current_edge.src + 1];
-    }
-    return *this;
-  }
-
-  edge_iterator operator++(int) {
-    edge_iterator temp = *this;
-    ++*this;
-    return temp;
-  }
-
- private:
-  const EdgeIndex* rowstart_array;
-  edge_descriptor current_edge;
-  EdgeIndex end_of_this_vertex;
-};
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline EdgeIndex
-num_edges(const BOOST_CSR_GRAPH_TYPE& g)
-{
-  return g.m_column.size();
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-std::pair<typename BOOST_CSR_GRAPH_TYPE::edge_iterator,
-          typename BOOST_CSR_GRAPH_TYPE::edge_iterator>
-edges(const BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename BOOST_CSR_GRAPH_TYPE::edge_iterator ei;
-  typedef typename BOOST_CSR_GRAPH_TYPE::edge_descriptor edgedesc;
-  if (g.m_rowstart.size() == 1 || g.m_column.empty()) {
-    return std::make_pair(ei(), ei());
-  } else {
-    // Find the first vertex that has outgoing edges
-    Vertex src = 0;
-    while (g.m_rowstart[src + 1] == 0) ++src;
-    return std::make_pair(ei(g, edgedesc(src, 0), g.m_rowstart[src + 1]),
-                          ei(g, edgedesc(num_vertices(g), g.m_column.size()), 0));
-  }
-}
-
-// For Property Graph
-
-// Graph properties
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag, class Value>
-inline void
-set_property(BOOST_CSR_GRAPH_TYPE& g, Tag, const Value& value)
-{
-  get_property_value(g.m_property, Tag()) = value;
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag>
-inline
-typename graph_property<BOOST_CSR_GRAPH_TYPE, Tag>::type&
-get_property(BOOST_CSR_GRAPH_TYPE& g, Tag)
-{
-  return get_property_value(g.m_property, Tag());
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, class Tag>
-inline
-const
-typename graph_property<BOOST_CSR_GRAPH_TYPE, Tag>::type&
-get_property(const BOOST_CSR_GRAPH_TYPE& g, Tag)
-{
-  return get_property_value(g.m_property, Tag());
-}
-
-// Add edge_index property map
-template<typename Index, typename Descriptor>
-struct csr_edge_index_map
-{
-  typedef Index                     value_type;
-  typedef Index                     reference;
-  typedef Descriptor                key_type;
-  typedef readable_property_map_tag category;
-};
-
-template<typename Index, typename Descriptor>
-inline Index
-get(const csr_edge_index_map<Index, Descriptor>&,
-    const typename csr_edge_index_map<Index, Descriptor>::key_type& key)
-{
-  return key.idx;
-}
-
-// Doing the right thing here (by unifying with vertex_index_t and
-// edge_index_t) breaks GCC.
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename Tag>
-struct property_map<BOOST_CSR_GRAPH_TYPE, Tag>
-{
-private:
-  typedef identity_property_map vertex_index_type;
-  typedef typename graph_traits<BOOST_CSR_GRAPH_TYPE>::edge_descriptor
-    edge_descriptor;
-  typedef csr_edge_index_map<EdgeIndex, edge_descriptor> edge_index_type;
-
-  typedef typename mpl::if_<is_same<Tag, edge_index_t>,
-                            edge_index_type,
-                            detail::error_property_not_found>::type
-    edge_or_none;
-
-public:
-  typedef typename mpl::if_<is_same<Tag, vertex_index_t>,
-                            vertex_index_type,
-                            edge_or_none>::type type;
-
-  typedef type const_type;
-};
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline identity_property_map
-get(vertex_index_t, const BOOST_CSR_GRAPH_TYPE&)
-{
-  return identity_property_map();
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline Vertex
-get(vertex_index_t,
-    const BOOST_CSR_GRAPH_TYPE&, Vertex v)
-{
-  return v;
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
-get(edge_index_t, const BOOST_CSR_GRAPH_TYPE&)
-{
-  typedef typename property_map<BOOST_CSR_GRAPH_TYPE, edge_index_t>::const_type
-    result_type;
-  return result_type();
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS>
-inline EdgeIndex
-get(edge_index_t, const BOOST_CSR_GRAPH_TYPE&,
-    typename BOOST_CSR_GRAPH_TYPE::edge_descriptor e)
-{
-  return e.idx;
-}
-
-// Support for bundled properties
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-struct property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>
-{
-private:
-  typedef graph_traits<BOOST_CSR_GRAPH_TYPE> traits;
-  typedef VertexProperty vertex_bundled;
-  typedef EdgeProperty edge_bundled;
-  typedef typename mpl::if_c<(detail::is_vertex_bundle<vertex_bundled, edge_bundled, Bundle>::value),
-                     typename traits::vertex_descriptor,
-                     typename traits::edge_descriptor>::type
-    descriptor;
-
-public:
-  typedef bundle_property_map<BOOST_CSR_GRAPH_TYPE, descriptor, Bundle, T>
-    type;
-  typedef bundle_property_map<const BOOST_CSR_GRAPH_TYPE, descriptor, Bundle,
-                              const T> const_type;
-};
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-inline
-typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::type
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g)
-{
-  typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
-                                T Bundle::*>::type
-    result_type;
-  return result_type(&g, p);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle>
-inline
-typename property_map<BOOST_CSR_GRAPH_TYPE, T Bundle::*>::const_type
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g)
-{
-  typedef typename property_map<BOOST_CSR_GRAPH_TYPE,
-                                T Bundle::*>::const_type
-    result_type;
-  return result_type(&g, p);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
-         typename Key>
-inline T
-get(T Bundle::* p, BOOST_CSR_GRAPH_TYPE const & g,
-    const Key& key)
-{
-  return get(get(p, g), key);
-}
-
-template<BOOST_CSR_GRAPH_TEMPLATE_PARMS, typename T, typename Bundle,
-         typename Key>
-inline void
-put(T Bundle::* p, BOOST_CSR_GRAPH_TYPE& g,
-    const Key& key, const T& value)
-{
-  put(get(p, g), key, value);
-}
-
-#undef BOOST_CSR_GRAPH_TYPE
-#undef BOOST_CSR_GRAPH_TEMPLATE_PARMS
-
-} // end namespace boost
-
-#endif // BOOST_GRAPH_COMPRESSED_SPARSE_ROW_GRAPH_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/detail/incremental_components.hpp b/deal.II/contrib/boost/include/boost/graph/detail/incremental_components.hpp
deleted file mode 100644 (file)
index cf08bea..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-//=======================================================================
-// Copyright 2002 Indiana University.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-
-#ifndef BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
-#define BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
-
-#include <boost/operators.hpp>
-#include <boost/pending/disjoint_sets.hpp>
-
-namespace boost {
-
-  namespace detail {
-
-    //=========================================================================
-    // Implementation detail of incremental_components
-
-
-    //-------------------------------------------------------------------------
-    // Helper functions for the component_index class
-    
-    // Record the representative vertices in the header array.
-    // Representative vertices now point to the component number.
-    
-    template <class Parent, class OutputIterator, class Integer>
-    inline void
-    build_components_header(Parent p, 
-                            OutputIterator header,
-                            Integer num_nodes)
-    {
-      Parent component = p;
-      Integer component_num = 0;
-      for (Integer v = 0; v != num_nodes; ++v) 
-        if (p[v] == v) {
-          *header++ = v;
-          component[v] = component_num++;
-        }
-    }
-    
-    
-    // Pushes x onto the front of the list. The list is represented in
-    // an array.
-    template <class Next, class T, class V>
-    inline void array_push_front(Next next, T& head, V x)
-    {
-      T tmp = head;
-      head = x;
-      next[x] = tmp;
-    }
-    
-    
-    // Create a linked list of the vertices in each component
-    // by reusing the representative array.
-    template <class Parent1, class Parent2, 
-              class Integer>
-    void
-    link_components(Parent1 component, Parent2 header, 
-                    Integer num_nodes, Integer num_components)
-    {
-      // Make the non-representative vertices point to their component
-      Parent1 representative = component;
-      for (Integer v = 0; v != num_nodes; ++v)
-        if (component[v] >= num_components
-            || header[component[v]] != v)
-          component[v] = component[representative[v]];
-      
-      // initialize the "head" of the lists to "NULL"
-      std::fill_n(header, num_components, num_nodes);
-      
-      // Add each vertex to the linked list for its component
-      Parent1 next = component;
-      for (Integer k = 0; k != num_nodes; ++k)
-        array_push_front(next, header[component[k]], k);
-    }
-    
-
-    
-    template <class IndexContainer, class HeaderContainer>
-    void
-    construct_component_index(IndexContainer& index, HeaderContainer& header)
-    {
-      typedef typename IndexContainer::value_type Integer;
-      build_components_header(index.begin(), 
-                              std::back_inserter(header),
-                              Integer(index.end() - index.begin()));
-      
-      link_components(index.begin(), header.begin(),
-                      Integer(index.end() - index.begin()), 
-                      Integer(header.end() - header.begin()));
-    }
-    
-    
-    
-    template <class IndexIterator, class Integer, class Distance>
-    class component_iterator 
-      : boost::forward_iterator_helper< 
-    component_iterator<IndexIterator,Integer,Distance>,
-              Integer, Distance,Integer*, Integer&>
-    {
-    public:
-      typedef component_iterator self;
-      
-      IndexIterator next;
-      Integer node;
-      
-      typedef std::forward_iterator_tag iterator_category;
-      typedef Integer value_type;
-      typedef Integer& reference;
-      typedef Integer* pointer;
-      typedef Distance difference_type;
-      
-      component_iterator() {}
-      component_iterator(IndexIterator x, Integer i) 
-        : next(x), node(i) {}
-      Integer operator*() const {
-        return node;
-      }
-      self& operator++() {
-        node = next[node];
-        return *this;
-      }
-    };
-    
-    template <class IndexIterator, class Integer, class Distance>
-    inline bool 
-    operator==(const component_iterator<IndexIterator, Integer, Distance>& x,
-               const component_iterator<IndexIterator, Integer, Distance>& y)
-    {
-      return x.node == y.node;
-    }
-  
-  } // namespace detail
-  
-} // namespace detail
-
-#endif // BOOST_GRAPH_DETAIL_INCREMENTAL_COMPONENTS_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/erdos_renyi_generator.hpp b/deal.II/contrib/boost/include/boost/graph/erdos_renyi_generator.hpp
deleted file mode 100644 (file)
index 605b0e1..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2004, 2005 The Trustees of Indiana University.
-
-// 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)
-
-//  Authors: Jeremiah Willcock
-//           Douglas Gregor
-//           Andrew Lumsdaine
-#ifndef BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
-#define BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
-
-#include <cassert>
-#include <iterator>
-#include <utility>
-#include <boost/shared_ptr.hpp>
-#include <boost/random/uniform_int.hpp>
-#include <boost/graph/graph_traits.hpp>
-#include <boost/random/geometric_distribution.hpp>
-#include <boost/type_traits/is_base_and_derived.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/config/no_tr1/cmath.hpp>
-
-namespace boost {
-
-  template<typename RandomGenerator, typename Graph>
-  class erdos_renyi_iterator
-  {
-    typedef typename graph_traits<Graph>::directed_category directed_category;
-    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
-    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
-
-    BOOST_STATIC_CONSTANT
-      (bool,
-       is_undirected = (is_base_and_derived<undirected_tag,
-                                            directed_category>::value
-                        || is_same<undirected_tag, directed_category>::value));
-
-  public:
-    typedef std::input_iterator_tag iterator_category;
-    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
-    typedef const value_type& reference;
-    typedef const value_type* pointer;
-    typedef void difference_type;
-
-    erdos_renyi_iterator() : gen(), n(0), edges(0), allow_self_loops(false) {}
-    erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n, 
-                         double fraction = 0.0, bool allow_self_loops = false)
-      : gen(&gen), n(n), edges(edges_size_type(fraction * n * n)),
-        allow_self_loops(allow_self_loops)
-    { 
-      if (is_undirected) edges = edges / 2;
-      next(); 
-    }
-
-    erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n, 
-                         edges_size_type m, bool allow_self_loops = false)
-      : gen(&gen), n(n), edges(m),
-        allow_self_loops(allow_self_loops)
-    { 
-      next(); 
-    }
-
-    reference operator*() const { return current; }
-    pointer operator->() const { return &current; }
-    
-    erdos_renyi_iterator& operator++()
-    { 
-      --edges;
-      next();
-      return *this;
-    }
-
-    erdos_renyi_iterator operator++(int)
-    {
-      erdos_renyi_iterator temp(*this);
-      ++(*this);
-      return temp;
-    }
-
-    bool operator==(const erdos_renyi_iterator& other) const
-    { return edges == other.edges; }
-
-    bool operator!=(const erdos_renyi_iterator& other) const
-    { return !(*this == other); }
-
-  private:
-    void next()
-    {
-      uniform_int<vertices_size_type> rand_vertex(0, n-1);
-      current.first = rand_vertex(*gen);
-      do {
-        current.second = rand_vertex(*gen);
-      } while (current.first == current.second && !allow_self_loops);
-    }
-
-    RandomGenerator* gen;
-    vertices_size_type n;
-    edges_size_type edges;
-    bool allow_self_loops;
-    value_type current;
-  };
-
-  template<typename RandomGenerator, typename Graph>
-  class sorted_erdos_renyi_iterator
-  {
-    typedef typename graph_traits<Graph>::directed_category directed_category;
-    typedef typename graph_traits<Graph>::vertices_size_type vertices_size_type;
-    typedef typename graph_traits<Graph>::edges_size_type edges_size_type;
-
-    BOOST_STATIC_CONSTANT
-      (bool,
-       is_undirected = (is_base_and_derived<undirected_tag,
-                                            directed_category>::value
-                        || is_same<undirected_tag, directed_category>::value));
-
-  public:
-    typedef std::input_iterator_tag iterator_category;
-    typedef std::pair<vertices_size_type, vertices_size_type> value_type;
-    typedef const value_type& reference;
-    typedef const value_type* pointer;
-    typedef void difference_type;
-
-    sorted_erdos_renyi_iterator()
-      : gen(), rand_vertex(0.5), n(0), allow_self_loops(false),
-    src((std::numeric_limits<vertices_size_type>::max)()), tgt(0), prob(0) {}
-    sorted_erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n, 
-                    double prob = 0.0, 
-                                bool allow_self_loops = false)
-      : gen(),
-        // The "1.0 - prob" in the next line is to work around a Boost.Random
-        // (and TR1) bug in the specification of geometric_distribution.  It
-        // should be replaced by "prob" when the issue is fixed.
-        rand_vertex(1.0 - prob),
-    n(n), allow_self_loops(allow_self_loops), src(0), tgt(0), prob(prob)
-    { 
-      this->gen.reset(new uniform_01<RandomGenerator>(gen));
-
-      if (prob == 0.0) {src = (std::numeric_limits<vertices_size_type>::max)(); return;}
-      next(); 
-    }
-
-    reference operator*() const { return current; }
-    pointer operator->() const { return &current; }
-    
-    sorted_erdos_renyi_iterator& operator++()
-    { 
-      next();
-      return *this;
-    }
-
-    sorted_erdos_renyi_iterator operator++(int)
-    {
-      sorted_erdos_renyi_iterator temp(*this);
-      ++(*this);
-      return temp;
-    }
-
-    bool operator==(const sorted_erdos_renyi_iterator& other) const
-    { return src == other.src && tgt == other.tgt; }
-
-    bool operator!=(const sorted_erdos_renyi_iterator& other) const
-    { return !(*this == other); }
-
-  private:
-    void next()
-    {
-      using std::sqrt;
-      using std::floor;
-
-      // In order to get the edges from the generator in sorted order, one
-      // effective (but slow) procedure would be to use a
-      // bernoulli_distribution for each legal (src, tgt) pair.  Because of the
-      // O(n^2) cost of that, a geometric distribution is used.  The geometric
-      // distribution tells how many times the bernoulli_distribution would
-      // need to be run until it returns true.  Thus, this distribution can be
-      // used to step through the edges which are actually present.  Everything
-      // beyond "tgt += increment" is done to effectively convert linear
-      // indexing (the partial sums of the geometric distribution output) into
-      // graph edges.
-      assert (src != (std::numeric_limits<vertices_size_type>::max)());
-      vertices_size_type increment = rand_vertex(*gen);
-      tgt += increment;
-      if (is_undirected) {
-    // Update src and tgt based on position of tgt
-    // Basically, we want the greatest src_increment such that (in \bbQ):
-    // src_increment * (src + allow_self_loops + src_increment - 1/2) <= tgt
-    // The result of the LHS of this, evaluated with the computed
-    // src_increment, is then subtracted from tgt
-    double src_minus_half = (src + allow_self_loops) - 0.5;
-    double disc = src_minus_half * src_minus_half + 2 * tgt;
-    double src_increment_fp = floor(sqrt(disc) - src_minus_half);
-    vertices_size_type src_increment = vertices_size_type(src_increment_fp);
-    if (src + src_increment >= n) {
-      src = n;
-    } else {
-      tgt -= (src + allow_self_loops) * src_increment + 
-         src_increment * (src_increment - 1) / 2;
-      src += src_increment;
-    }
-      } else {
-    // Number of out edge positions possible from each vertex in this graph
-    vertices_size_type possible_out_edges = n - (allow_self_loops ? 0 : 1);
-    src += (std::min)(n - src, tgt / possible_out_edges);
-    tgt %= possible_out_edges;
-      }
-      // Set end of graph code so (src, tgt) will be the same as for the end
-      // sorted_erdos_renyi_iterator
-      if (src >= n) {src = (std::numeric_limits<vertices_size_type>::max)(); tgt = 0;}
-      // Copy (src, tgt) into current
-      current.first = src;
-      current.second = tgt;
-      // Adjust for (src, src) edge being forbidden
-      if (!allow_self_loops && tgt >= src) ++current.second;
-    }
-
-    shared_ptr<uniform_01<RandomGenerator> > gen;
-    geometric_distribution<vertices_size_type> rand_vertex;
-    vertices_size_type n;
-    bool allow_self_loops;
-    vertices_size_type src, tgt;
-    value_type current;
-    double prob;
-  };
-
-} // end namespace boost
-
-#endif // BOOST_GRAPH_ERDOS_RENYI_GENERATOR_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/exception.hpp b/deal.II/contrib/boost/include/boost/graph/exception.hpp
deleted file mode 100644 (file)
index 09c82ed..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-//=======================================================================
-// Copyright 2002 Indiana University.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-
-#ifndef BOOST_GRAPH_EXCEPTION_HPP
-#define BOOST_GRAPH_EXCEPTION_HPP
-
-#include <stdexcept>
-#include <string>
-
-namespace boost {
-
-  struct bad_graph : public std::invalid_argument {
-    bad_graph(const std::string& what_arg)
-      : std::invalid_argument(what_arg) { }
-  };
-
-  struct not_a_dag : public bad_graph {
-    not_a_dag()
-        : bad_graph("The graph must be a DAG.") { } 
-  };
-
-  struct negative_edge : public bad_graph {
-    negative_edge()
-      : bad_graph("The graph may not contain an edge with negative weight."){ }
-  };
-
-  struct negative_cycle : public bad_graph {
-    negative_cycle()
-      : bad_graph("The graph may not contain negative cycles.") { }
-  };
-  struct not_connected : public bad_graph {
-    not_connected()
-      : bad_graph("The graph must be connected.") { }
-  };
-
-} // namespace boost
-
-#endif // BOOST_GRAPH_EXCEPTION_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/graph_concepts.hpp b/deal.II/contrib/boost/include/boost/graph/graph_concepts.hpp
deleted file mode 100644 (file)
index c6a3fe6..0000000
+++ /dev/null
@@ -1,510 +0,0 @@
-//
-//=======================================================================
-// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-//
-#ifndef BOOST_GRAPH_CONCEPTS_HPP
-#define BOOST_GRAPH_CONCEPTS_HPP
-
-#include <boost/config.hpp>
-#include <boost/graph/graph_traits.hpp>
-#include <boost/property_map.hpp>
-#include <boost/graph/properties.hpp>
-#include <boost/concept_check.hpp>
-#include <boost/detail/workaround.hpp>
-
-#include <boost/concept/detail/concept_def.hpp>
-
-namespace boost
-{
-// dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
-// you want to use vector_as_graph, it is!  I'm sure the graph
-// library leaves these out all over the place.  Probably a
-// redesign involving specializing a template with a static
-// member function is in order :(
-//
-// It is needed in order to allow us to write using boost::vertices as
-// needed for ADL when using vector_as_graph below.
-#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)            \
- && !BOOST_WORKAROUND(__GNUC__, <= 2)                       \
- && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
-# define BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
-#endif 
-
-#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
-template <class T>
-typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&);
-#endif      
-
-  namespace concepts {
-  BOOST_concept(MultiPassInputIterator,(T)) {
-    BOOST_CONCEPT_USAGE(MultiPassInputIterator) {
-        BOOST_CONCEPT_ASSERT((InputIterator<T>));
-    }
-  };
-
-  BOOST_concept(Graph,(G))
-  {
-    typedef typename graph_traits<G>::vertex_descriptor vertex_descriptor;
-    typedef typename graph_traits<G>::directed_category directed_category;
-    typedef typename graph_traits<G>::edge_parallel_category
-      edge_parallel_category;
-      
-      typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-   
-      BOOST_CONCEPT_USAGE(Graph)
-      {
-          BOOST_CONCEPT_ASSERT((DefaultConstructible<vertex_descriptor>));
-          BOOST_CONCEPT_ASSERT((EqualityComparable<vertex_descriptor>));
-          BOOST_CONCEPT_ASSERT((Assignable<vertex_descriptor>));
-      }
-      G g;      
-  };
-
-  BOOST_concept(IncidenceGraph,(G))
-    : Graph<G>
-  {
-      typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-      typedef typename graph_traits<G>::out_edge_iterator
-      out_edge_iterator;
-      
-      typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-      
-      BOOST_CONCEPT_USAGE(IncidenceGraph) {
-          BOOST_CONCEPT_ASSERT((MultiPassInputIterator<out_edge_iterator>));
-          BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
-          BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
-          BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
-          BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
-                                incidence_graph_tag>));
-
-          p = out_edges(u, g);
-          n = out_degree(u, g);
-          e = *p.first;
-          u = source(e, g);
-          v = target(e, g);
-          const_constraints(g);
-      }
-      void const_constraints(const G& cg) {
-          p = out_edges(u, cg);
-          n = out_degree(u, cg);
-          e = *p.first;
-          u = source(e, cg);
-          v = target(e, cg);
-      }
-      std::pair<out_edge_iterator, out_edge_iterator> p;
-      typename graph_traits<G>::vertex_descriptor u, v;
-      typename graph_traits<G>::edge_descriptor e;
-      typename graph_traits<G>::degree_size_type n;
-      G g;
-  };
-
-  BOOST_concept(BidirectionalGraph,(G))
-    : IncidenceGraph<G>
-  {
-    typedef typename graph_traits<G>::in_edge_iterator
-      in_edge_iterator;
-    typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-
-    BOOST_CONCEPT_USAGE(BidirectionalGraph) {
-      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<in_edge_iterator>));
-      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
-        bidirectional_graph_tag>));
-
-      p = in_edges(v, g);
-      n = in_degree(v, g);
-      e = *p.first;
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-      p = in_edges(v, cg);
-      n = in_degree(v, cg);
-      e = *p.first;
-    }
-    std::pair<in_edge_iterator, in_edge_iterator> p;
-    typename graph_traits<G>::vertex_descriptor v;
-    typename graph_traits<G>::edge_descriptor e;
-    typename graph_traits<G>::degree_size_type n;
-    G g;
-  };
-
-  BOOST_concept(AdjacencyGraph,(G))
-    : Graph<G>
-  {
-    typedef typename graph_traits<G>::adjacency_iterator
-      adjacency_iterator;
-    typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-
-    BOOST_CONCEPT_USAGE(AdjacencyGraph) {
-      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<adjacency_iterator>));
-      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
-        adjacency_graph_tag>));
-
-      p = adjacent_vertices(v, g);
-      v = *p.first;
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-      p = adjacent_vertices(v, cg);
-    }
-    std::pair<adjacency_iterator,adjacency_iterator> p;
-    typename graph_traits<G>::vertex_descriptor v;
-    G g;
-  };
-
-  BOOST_concept(VertexListGraph,(G))
-    : Graph<G>
-  {
-    typedef typename graph_traits<G>::vertex_iterator vertex_iterator;
-    typedef typename graph_traits<G>::vertices_size_type vertices_size_type;
-    typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-
-    BOOST_CONCEPT_USAGE(VertexListGraph) {
-      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<vertex_iterator>));
-      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
-        vertex_list_graph_tag>));
-
-#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
-      // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
-      // you want to use vector_as_graph, it is!  I'm sure the graph
-      // library leaves these out all over the place.  Probably a
-      // redesign involving specializing a template with a static
-      // member function is in order :(
-      using boost::vertices;
-#endif      
-      p = vertices(g);
-      v = *p.first;
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-#ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
-      // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
-      // you want to use vector_as_graph, it is!  I'm sure the graph
-      // library leaves these out all over the place.  Probably a
-      // redesign involving specializing a template with a static
-      // member function is in order :(
-      using boost::vertices;
-#endif 
-      
-      p = vertices(cg);
-      v = *p.first;
-      V = num_vertices(cg);
-    }
-    std::pair<vertex_iterator,vertex_iterator> p;
-    typename graph_traits<G>::vertex_descriptor v;
-    G g;
-    vertices_size_type V;
-  };
-
-  BOOST_concept(EdgeListGraph,(G))
-    : Graph<G>
-  {
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-    typedef typename graph_traits<G>::edge_iterator edge_iterator;
-    typedef typename graph_traits<G>::edges_size_type edges_size_type;
-    typedef typename graph_traits<G>::traversal_category
-      traversal_category;
-
-    BOOST_CONCEPT_USAGE(EdgeListGraph) {
-      BOOST_CONCEPT_ASSERT((MultiPassInputIterator<edge_iterator>));
-      BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
-      BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
-      BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
-      BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
-        edge_list_graph_tag>));
-
-      p = edges(g);
-      e = *p.first;
-      u = source(e, g);
-      v = target(e, g);
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-      p = edges(cg);
-      E = num_edges(cg);
-      e = *p.first;
-      u = source(e, cg);
-      v = target(e, cg);
-    }
-    std::pair<edge_iterator,edge_iterator> p;
-    typename graph_traits<G>::vertex_descriptor u, v;
-    typename graph_traits<G>::edge_descriptor e;
-    edges_size_type E;
-    G g;
-  };
-
-  BOOST_concept(VertexAndEdgeListGraph,(G))
-    : VertexListGraph<G>
-    , EdgeListGraph<G>
-  {
-  };
-
-  // Where to put the requirement for this constructor?
-  //      G g(n_vertices);
-  // Not in mutable graph, then LEDA graph's can't be models of
-  // MutableGraph.
-
-  BOOST_concept(EdgeMutableGraph,(G))
-  {
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-
-    BOOST_CONCEPT_USAGE(EdgeMutableGraph) {
-      p = add_edge(u, v, g);
-      remove_edge(u, v, g);
-      remove_edge(e, g);
-      clear_vertex(v, g);
-    }
-    G g;
-    edge_descriptor e;
-    std::pair<edge_descriptor, bool> p;
-    typename graph_traits<G>::vertex_descriptor u, v;
-  };
-
-  BOOST_concept(VertexMutableGraph,(G))
-  {
-
-      BOOST_CONCEPT_USAGE(VertexMutableGraph) {
-      v = add_vertex(g);
-      remove_vertex(v, g);
-    }
-    G g;
-    typename graph_traits<G>::vertex_descriptor u, v;
-  };
-
-  BOOST_concept(MutableGraph,(G))
-    : EdgeMutableGraph<G>
-    , VertexMutableGraph<G>
-  {
-  };
-
-  template <class edge_descriptor>
-  struct dummy_edge_predicate {
-    bool operator()(const edge_descriptor&) const {
-      return false;
-    }
-  };
-
-  BOOST_concept(MutableIncidenceGraph,(G))
-    : MutableGraph<G>
-  {
-    BOOST_CONCEPT_USAGE(MutableIncidenceGraph) {
-      remove_edge(iter, g);
-      remove_out_edge_if(u, p, g);
-    }
-    G g;
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-    dummy_edge_predicate<edge_descriptor> p;
-    typename boost::graph_traits<G>::vertex_descriptor u;
-    typename boost::graph_traits<G>::out_edge_iterator iter;
-  };
-
-  BOOST_concept(MutableBidirectionalGraph,(G))
-    : MutableIncidenceGraph<G>
-  {
-      BOOST_CONCEPT_USAGE(MutableBidirectionalGraph)
-      {
-          remove_in_edge_if(u, p, g);
-      }
-      G g;
-      typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-      dummy_edge_predicate<edge_descriptor> p;
-      typename boost::graph_traits<G>::vertex_descriptor u;
-  };
-
-  BOOST_concept(MutableEdgeListGraph,(G))
-    : EdgeMutableGraph<G>
-  {
-    BOOST_CONCEPT_USAGE(MutableEdgeListGraph) {
-      remove_edge_if(p, g);
-    }
-    G g;
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-    dummy_edge_predicate<edge_descriptor> p;
-  };
-
-  BOOST_concept(VertexMutablePropertyGraph,(G))
-    : VertexMutableGraph<G>
-  {
-    BOOST_CONCEPT_USAGE(VertexMutablePropertyGraph) {
-      v = add_vertex(vp, g);
-    }
-    G g;
-    typename graph_traits<G>::vertex_descriptor v;
-    typename vertex_property<G>::type vp;
-  };
-
-  BOOST_concept(EdgeMutablePropertyGraph,(G))
-    : EdgeMutableGraph<G>
-  {
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-
-    BOOST_CONCEPT_USAGE(EdgeMutablePropertyGraph) {
-      p = add_edge(u, v, ep, g);
-    }
-    G g;
-    std::pair<edge_descriptor, bool> p;
-    typename graph_traits<G>::vertex_descriptor u, v;
-    typename edge_property<G>::type ep;
-  };
-
-  BOOST_concept(AdjacencyMatrix,(G))
-    : Graph<G>
-  {
-    typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
-
-    BOOST_CONCEPT_USAGE(AdjacencyMatrix) {      
-      p = edge(u, v, g);
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-      p = edge(u, v, cg);
-    }
-    typename graph_traits<G>::vertex_descriptor u, v;
-    std::pair<edge_descriptor, bool> p;
-    G g;
-  };
-
-  BOOST_concept(ReadablePropertyGraph,(G)(X)(Property))
-    : Graph<G>
-  {
-    typedef typename property_map<G, Property>::const_type const_Map;
-    
-    BOOST_CONCEPT_USAGE(ReadablePropertyGraph)
-    {
-      BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<const_Map, X>));
-
-      const_constraints(g);
-    }
-    void const_constraints(const G& cg) {
-      const_Map pmap = get(Property(), cg);
-      pval = get(Property(), cg, x);
-      ignore_unused_variable_warning(pmap);
-    }
-    G g;
-    X x;
-    typename property_traits<const_Map>::value_type pval;
-  };
-
-  BOOST_concept(PropertyGraph,(G)(X)(Property))
-    : ReadablePropertyGraph<G, X, Property>
-  {
-    typedef typename property_map<G, Property>::type Map;
-    BOOST_CONCEPT_USAGE(PropertyGraph) {
-      BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<Map, X>));
-
-      Map pmap = get(Property(), g);
-      pval = get(Property(), g, x);
-      put(Property(), g, x, pval);
-      ignore_unused_variable_warning(pmap);
-    }
-    G g;
-    X x;
-    typename property_traits<Map>::value_type pval;
-  };
-
-  BOOST_concept(LvaluePropertyGraph,(G)(X)(Property))
-    : ReadablePropertyGraph<G, X, Property>
-  {
-    typedef typename property_map<G, Property>::type Map;
-    typedef typename property_map<G, Property>::const_type const_Map;
-
-    BOOST_CONCEPT_USAGE(LvaluePropertyGraph) {
-      BOOST_CONCEPT_ASSERT((LvaluePropertyMapConcept<const_Map, X>));
-
-      pval = get(Property(), g, x);
-      put(Property(), g, x, pval);
-    }
-    G g;
-    X x;
-    typename property_traits<Map>::value_type pval;
-  };
-
-  // This needs to move out of the graph library
-  BOOST_concept(Buffer,(B))
-  {
-    BOOST_CONCEPT_USAGE(Buffer) {
-      b.push(t);
-      b.pop();
-      typename B::value_type& v = b.top();
-      const_constraints(b);
-      ignore_unused_variable_warning(v);
-    }
-    void const_constraints(const B& cb) {
-      const typename B::value_type& v = cb.top();
-      n = cb.size();
-      bool e = cb.empty();
-      ignore_unused_variable_warning(v);
-      ignore_unused_variable_warning(e);
-    }
-    typename B::size_type n;
-    typename B::value_type t;
-    B b;
-  };
-
-  BOOST_concept(ColorValue,(C))
-    : EqualityComparable<C>
-    , DefaultConstructible<C>
-  {
-    BOOST_CONCEPT_USAGE(ColorValue) {
-      c = color_traits<C>::white();
-      c = color_traits<C>::gray();
-      c = color_traits<C>::black();
-    }
-    C c;
-  };
-
-  BOOST_concept(BasicMatrix,(M)(I)(V))
-  {
-    BOOST_CONCEPT_USAGE(BasicMatrix) {
-      V& elt = A[i][j];
-      const_constraints(A);
-      ignore_unused_variable_warning(elt);      
-    }
-    void const_constraints(const M& cA) {
-      const V& elt = cA[i][j];
-      ignore_unused_variable_warning(elt);      
-    }
-    M A;
-    I i, j;
-  };
-
-  } // end namespace concepts
-
-  using boost::concepts::MultiPassInputIteratorConcept;
-  using boost::concepts::GraphConcept;
-  using boost::concepts::IncidenceGraphConcept;
-  using boost::concepts::BidirectionalGraphConcept;
-  using boost::concepts::AdjacencyGraphConcept;
-  using boost::concepts::VertexListGraphConcept;
-  using boost::concepts::EdgeListGraphConcept;
-  using boost::concepts::VertexAndEdgeListGraphConcept;
-  using boost::concepts::EdgeMutableGraphConcept;
-  using boost::concepts::VertexMutableGraphConcept;
-  using boost::concepts::MutableGraphConcept;
-  using boost::concepts::MutableIncidenceGraphConcept;
-  using boost::concepts::MutableBidirectionalGraphConcept;
-  using boost::concepts::MutableEdgeListGraphConcept;
-  using boost::concepts::VertexMutablePropertyGraphConcept;
-  using boost::concepts::EdgeMutablePropertyGraphConcept;
-  using boost::concepts::AdjacencyMatrixConcept;
-  using boost::concepts::ReadablePropertyGraphConcept;
-  using boost::concepts::PropertyGraphConcept;
-  using boost::concepts::LvaluePropertyGraphConcept;
-  using boost::concepts::BufferConcept;
-  using boost::concepts::ColorValueConcept;
-  using boost::concepts::BasicMatrixConcept;
-} // namespace boost
-
-#include <boost/concept/detail/concept_undef.hpp>
-
-#endif /* BOOST_GRAPH_CONCEPTS_H */
diff --git a/deal.II/contrib/boost/include/boost/graph/graph_traits.hpp b/deal.II/contrib/boost/include/boost/graph/graph_traits.hpp
deleted file mode 100644 (file)
index 1c5a265..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-//=======================================================================
-// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-
-#ifndef BOOST_GRAPH_TRAITS_HPP
-#define BOOST_GRAPH_TRAITS_HPP
-
-#include <boost/config.hpp>
-#include <iterator>
-#include <boost/tuple/tuple.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_same.hpp>
-#include <boost/iterator/iterator_categories.hpp>
-#include <boost/iterator/iterator_adaptor.hpp>
-#include <boost/detail/workaround.hpp>
-
-namespace boost {
-
-  template <typename G>
-  struct graph_traits {
-    typedef typename G::vertex_descriptor      vertex_descriptor;
-    typedef typename G::edge_descriptor        edge_descriptor;
-    typedef typename G::adjacency_iterator     adjacency_iterator;
-    typedef typename G::out_edge_iterator      out_edge_iterator;
-    typedef typename G::in_edge_iterator       in_edge_iterator;
-    typedef typename G::vertex_iterator        vertex_iterator;
-    typedef typename G::edge_iterator          edge_iterator;
-
-    typedef typename G::directed_category      directed_category;
-    typedef typename G::edge_parallel_category edge_parallel_category;
-    typedef typename G::traversal_category     traversal_category;
-
-    typedef typename G::vertices_size_type     vertices_size_type;
-    typedef typename G::edges_size_type        edges_size_type;
-    typedef typename G::degree_size_type       degree_size_type;
-
-    static inline vertex_descriptor null_vertex();
-  };
-
-  template <typename G>
-  inline typename graph_traits<G>::vertex_descriptor
-  graph_traits<G>::null_vertex()
-  {
-    return G::null_vertex();
-  }
-
-  // directed_category tags
-  struct directed_tag { };
-  struct undirected_tag { };
-  struct bidirectional_tag : public directed_tag { };
-
-  namespace detail {
-    inline bool is_directed(directed_tag) { return true; }
-    inline bool is_directed(undirected_tag) { return false; }
-  }
-
-  template <typename Graph>
-  bool is_directed(const Graph&) { 
-    typedef typename graph_traits<Graph>::directed_category Cat;
-    return detail::is_directed(Cat());
-  }
-  template <typename Graph>
-  bool is_undirected(const Graph& g) { 
-    return ! is_directed(g);
-  }
-
-  // edge_parallel_category tags
-  struct allow_parallel_edge_tag {};
-  struct disallow_parallel_edge_tag {};
-
-  namespace detail {
-    inline bool allows_parallel(allow_parallel_edge_tag) { return true; }
-    inline bool allows_parallel(disallow_parallel_edge_tag) { return false; }
-  }
-
-  template <typename Graph>
-  bool allows_parallel_edges(const Graph&) { 
-    typedef typename graph_traits<Graph>::edge_parallel_category Cat;
-    return detail::allows_parallel(Cat());
-  }
-
-  // traversal_category tags
-  struct incidence_graph_tag { };
-  struct adjacency_graph_tag { };
-  struct bidirectional_graph_tag : 
-    public virtual incidence_graph_tag { };
-  struct vertex_list_graph_tag { };
-  struct edge_list_graph_tag { };
-  struct adjacency_matrix_tag { };
-
-  //?? not the right place ?? Lee
-  typedef boost::forward_traversal_tag multi_pass_input_iterator_tag;
-
-  template <typename G>
-  struct edge_property_type {
-    typedef typename G::edge_property_type type;
-  };
-  template <typename G>
-  struct vertex_property_type {
-    typedef typename G::vertex_property_type type;
-  };
-  template <typename G>
-  struct graph_property_type {
-    typedef typename G::graph_property_type type;
-  };
-
-  struct no_vertex_bundle {};
-  struct no_edge_bundle {};
-
-  template<typename G>
-  struct vertex_bundle_type
-  {
-    typedef typename G::vertex_bundled type;
-  };
-
-  template<typename G>
-  struct edge_bundle_type
-  {
-    typedef typename G::edge_bundled type;
-  };
-
-  namespace graph { namespace detail {
-    template<typename Graph, typename Descriptor>
-    class bundled_result
-    {
-      typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
-      typedef typename mpl::if_c<(is_same<Descriptor, Vertex>::value),
-                                 vertex_bundle_type<Graph>,
-                                 edge_bundle_type<Graph> >::type bundler;
-
-    public:
-      typedef typename bundler::type type;
-    };
-  } } // end namespace graph::detail
-} // namespace boost
-
-// Since pair is in namespace std, Koenig lookup will find source and
-// target if they are also defined in namespace std.  This is illegal,
-// but the alternative is to put source and target in the global
-// namespace which causes name conflicts with other libraries (like
-// SUIF).
-namespace std {
-
-  /* Some helper functions for dealing with pairs as edges */
-  template <class T, class G>
-  T source(pair<T,T> p, const G&) { return p.first; }
-
-  template <class T, class G>
-  T target(pair<T,T> p, const G&) { return p.second; }
-
-}
-
-#if defined(__GNUC__) && defined(__SGI_STL_PORT)
-// For some reason g++ with STLport does not see the above definition
-// of source() and target() unless we bring them into the boost
-// namespace.
-namespace boost {
-  using std::source;
-  using std::target;
-}
-#endif
-
-#endif // BOOST_GRAPH_TRAITS_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/howard_cycle_ratio.hpp b/deal.II/contrib/boost/include/boost/graph/howard_cycle_ratio.hpp
deleted file mode 100644 (file)
index ec24871..0000000
+++ /dev/null
@@ -1,611 +0,0 @@
-/*!
-* Copyright 2007  Technical University of Catalonia
-*
-* 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)
-*
-*  Authors: Dmitry Bufistov
-*           Andrey Parfenov
-*/
-
-#ifndef BOOST_GRAPH_HOWARD_CYCLE_RATIO_HOWARD_HPP
-#define BOOST_GRAPH_HOWARD_CYCLE_RATIO_HOWARD_HPP
-
-/*!
-* \file Maximum cycle ratio algorithm (Jean Cochet-Terrasson, Guy
-* Cochen and others) 
-*/
-#include <exception>
-#include <set> 
-#include <boost/bind.hpp>
-#include <boost/lexical_cast.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/remove_const.hpp>
-#include <boost/type_traits/is_signed.hpp>
-#include <boost/concept_check.hpp>
-#include <boost/graph/adjacency_list.hpp>
-#include <boost/graph/reverse_graph.hpp>
-#include <boost/graph/breadth_first_search.hpp>
-#include <boost/graph/iteration_macros.hpp>
-
-namespace boost {
-  namespace detail {
-    /// To avoid round error.
-    static const double mcr_howard_ltolerance = 0.00001; 
-
-    /*!
-     * Calculate maximum cycle ratio of "good" directed multigraph
-     * g. Use Howard's iteration policy algorithm ("Numerical
-     * Computation of Spectral Elements in MAX-PLUS algebra" by Jean
-     * Cochet-Terrasson, Guy Cochen and others).
-     *
-     * \param g = (V, E) - a "good" directed multigraph (out_degree of
-     * each vertex is greater then 0). If graph is strongly connected
-     * then it is "good".
-     *
-     * \param vim - Vertex Index, read property Map: V -> [0,
-     * num_vertices(g)).
-     *
-     * \param ewm - edge weight read property map: E -> R
-     *
-     * \param ewm2 - edge weight2 read property map: E -> R+
-     *
-     * \return maximum_{for all cycles C}CR(C), or
-     * -(std::numeric_limits<double>)::max() if g is not "good".
-     */
-    template <typename TGraph, typename TVertexIndexMap, 
-              typename TWeight1EdgeMap, typename TWeight2EdgeMap >      
-    class Cmcr_Howard 
-    {
-    public:
-      Cmcr_Howard(const TGraph& g, TVertexIndexMap vim, TWeight1EdgeMap ewm, 
-                  TWeight2EdgeMap ew2m) 
-        : m_g(g), m_vim(vim), m_ew1m(ewm), m_ew2m(ew2m),
-          m_g2pi_g_vm(std::vector<pi_vertex_t>().end(), m_vim), /// Stupid dummy initialization
-          m_minus_infinity(-(std::numeric_limits<double>::max)())
-      {
-        typedef typename boost::graph_traits<TGraph>::directed_category DirCat;
-        BOOST_STATIC_ASSERT((boost::is_convertible<DirCat*, boost::directed_tag*>::value == true));
-        m_cr = m_minus_infinity;
-      }
-        
-      double operator()() 
-      {
-        return maximum_cycle_ratio_Howard(); 
-      }
-
-      virtual ~Cmcr_Howard() { }
-
-    protected:
-      typedef typename boost::graph_traits<TGraph>::vertex_descriptor 
-        mcr_vertex_t;
-      typedef typename boost::graph_traits<TGraph>::edge_descriptor     
-        mcr_edge_t;
-
-      const TGraph&     m_g;
-      typedef   std::vector<double>     eigenmode_t;
-      eigenmode_t       m_eigen_value;
-      eigenmode_t       m_eigen_vector;
-      TVertexIndexMap   m_vim;
-      TWeight1EdgeMap   m_ew1m;
-      TWeight2EdgeMap   m_ew2m;
-
-      typedef typename boost::remove_const<typename boost::property_traits<TWeight1EdgeMap>::value_type>::type mcr_edge_weight1_t;
-      typedef typename boost::remove_const<typename boost::property_traits<TWeight2EdgeMap>::value_type>::type  mcr_edge_weight2_t;
-      typedef typename boost::adjacency_list<
-                         boost::listS, boost::vecS, boost::bidirectionalS, 
-                         boost::no_property, 
-                         boost::property<boost::edge_weight_t, 
-                                         mcr_edge_weight1_t, 
-                                         boost::property<boost::edge_weight2_t,
-                                                         mcr_edge_weight2_t> > >
-        pi_graph_t;
-      typedef typename boost::property_map<pi_graph_t, boost::vertex_index_t>::type   TPiGraphVertexIndexMap;
-      typedef typename boost::property_map<pi_graph_t, boost::edge_weight_t>::type    TPiGraphEdgeWeight1Map;
-      typedef typename boost::property_map<pi_graph_t, boost::edge_weight2_t>::type   TPiGraphEdgeWeight2Map;
-        
-      typedef typename boost::property_traits<TPiGraphVertexIndexMap>::value_type     pigraph_vertex_index_t;
-        
-      pi_graph_t        m_pi_g;
-      typedef   typename boost::graph_traits<pi_graph_t>::vertex_descriptor pi_vertex_t;
-      typedef   typename boost::graph_traits<pi_graph_t>::edge_descriptor pi_edge_t;
-      typedef   typename boost::iterator_property_map<typename std::vector<pi_vertex_t>::iterator, TVertexIndexMap> g2pi_g_vm_t;
-      g2pi_g_vm_t m_g2pi_g_vm; ///Graph to Pi graph vertex map
-      std::vector<pi_vertex_t> m_g2pig;
-      int       m_step_number;
-      const double m_minus_infinity;
-      typedef typename std::vector<mcr_edge_t>        critical_cycle_t;
-      double m_cr; ///Cycle ratio that already has been found
-
-      class bad_graph 
-      {
-      public:
-        typedef typename boost::property_traits<TVertexIndexMap>::value_type
-          v_index_t;
-
-        bad_graph(v_index_t bvi) : bad_vertex_index(bvi) {}
-        v_index_t what() const throw() 
-        {
-          return bad_vertex_index;
-        }
-
-      private:
-        v_index_t       bad_vertex_index;
-      };
-
-      double maximum_cycle_ratio_Howard()
-      {
-        try 
-          {
-            construct_pi_graph();
-          }
-        catch (const bad_graph& a)
-          {
-            return m_minus_infinity;
-          }
-        std::vector<double>  max_eigen_val(boost::num_vertices(m_g));
-        m_eigen_value.resize(boost::num_vertices(m_g)); 
-        m_eigen_vector.resize(boost::num_vertices(m_g));
-        m_step_number = 0;
-        do 
-          {
-            pi_eingen_value(get(vertex_index, m_pi_g), get(boost::edge_weight, m_pi_g), get(boost::edge_weight2, m_pi_g));
-            ++m_step_number;
-          } 
-        while (improve_policy_try1(max_eigen_val) || improve_policy_try2(max_eigen_val));
-        return *(std::max_element(m_eigen_value.begin(), m_eigen_value.end()));
-      }
-
-      /*! 
-       *  Construct an arbitrary policy m_pi_g. 
-       */       
-      void      construct_pi_graph() 
-      {
-        m_g2pig.resize(boost::num_vertices(m_g));
-        m_g2pi_g_vm = boost::make_iterator_property_map(m_g2pig.begin(), m_vim);
-        BGL_FORALL_VERTICES_T(vd, m_g, TGraph)
-          {
-            m_g2pi_g_vm[vd] = boost::add_vertex(m_pi_g);
-            store_pivertex(m_g2pi_g_vm[vd], vd);
-          }
-        BGL_FORALL_VERTICES_T(vd1, m_g, TGraph)
-          {
-            if (boost::out_edges(vd1, m_g).first == boost::out_edges(vd1, m_g).second) throw bad_graph(m_vim[vd1]);
-            mcr_edge_t ed = *boost::out_edges(vd1, m_g).first;
-            pi_edge_t pied = boost::add_edge(m_g2pi_g_vm[source(ed, m_g)], m_g2pi_g_vm[target(ed, m_g)], m_pi_g).first;
-            boost::put(boost::edge_weight, m_pi_g, pied, m_ew1m[ed]);
-            boost::put(boost::edge_weight2, m_pi_g, pied, m_ew2m[ed]);
-          }
-      }
-        
-      class bfs_eingmode_visitor : public boost::default_bfs_visitor 
-      {
-      public:
-        bfs_eingmode_visitor(TPiGraphVertexIndexMap vi_m, TPiGraphEdgeWeight1Map w_m, TPiGraphEdgeWeight2Map& d_m,
-                             eigenmode_t& e_val, eigenmode_t& e_vec, double ev) : m_index_map(vi_m), m_weight_map(w_m), m_delay_map(d_m), 
-                                                                                  m_eig_value(&e_val), m_eig_vec(&e_vec), m_eigen_value(ev) { }
-                
-        template < typename Edge, typename  g_t>
-        void examine_edge(Edge e, const g_t & g) const
-        {
-          typedef       typename boost::graph_traits<g_t>::vertex_descriptor Vertex;
-          Vertex u = boost::target(e, g), v = boost::source(e, g);
-          pigraph_vertex_index_t ind = m_index_map[u];
-          (*m_eig_value)[ind] =  m_eigen_value;
-          (*m_eig_vec)[ind] = m_weight_map[e] - m_eigen_value * m_delay_map[e] + (*m_eig_vec)[m_index_map[v]];
-        }
-      private:
-        TPiGraphVertexIndexMap  m_index_map; 
-        TPiGraphEdgeWeight1Map  m_weight_map;
-        TPiGraphEdgeWeight2Map  m_delay_map;
-        eigenmode_t*    m_eig_value;
-        eigenmode_t*    m_eig_vec;
-        double                  m_eigen_value;
-      };
-
-      /*!
-       *  Find a vertex in the Pi Graph which belongs to cycle, just a DFV until back edge found
-       */
-      pi_vertex_t       find_good_source(const pi_vertex_t start_vertex) 
-      {
-        pi_vertex_t     good_vertex = start_vertex;
-        typename std::set<pi_vertex_t>  s; 
-        s.insert(start_vertex);
-        do 
-          {
-            good_vertex = boost::target(*boost::out_edges(good_vertex, m_pi_g).first, m_pi_g);
-          } 
-        while (s.insert(good_vertex).second);
-        return good_vertex;
-      }
-      virtual   void    store_pivertex(pi_vertex_t pivd, mcr_vertex_t vd) {}
-      virtual void      store_critical_edge(pi_edge_t   ed, critical_cycle_t& cc) {}
-      virtual void      store_critical_cycle(critical_cycle_t& cc) {}
-        
-      /*!
-       * \param startV - vertex that belongs to a cycle in policy graph m_pi_g
-       */
-      double    calculate_eigen_value(pi_vertex_t       startV) 
-      {
-        std::pair<double, double>       accum_sums(0., 0.);
-        pi_vertex_t vd = startV;
-        critical_cycle_t        cc;
-        do 
-          {
-            pi_edge_t tmp_ed = *(boost::out_edges(vd, m_pi_g).first);
-            store_critical_edge(tmp_ed, cc);
-            accum_sums.first += boost::get(boost::edge_weight, m_pi_g, tmp_ed); 
-            accum_sums.second += boost::get(boost::edge_weight2, m_pi_g, tmp_ed);
-            vd = boost::target(tmp_ed, m_pi_g);
-          } 
-        while (vd != startV);
-        //assert((std::abs<double>(accum_sums.first) <= 0.00000001) && "Division by zerro!");
-        double cr = accum_sums.first / accum_sums.second;
-        if (cr > m_cr) 
-          {
-            m_cr = cr;
-            store_critical_cycle(cc);
-          }
-        else
-          {
-                                                        
-          }
-        return  cr;
-      }
-
-      /*!
-       * Value determination. Find a generalized eigenmode (n^{k+1}, x^{k+1}) of A^{Ï_{k+1}} of the pi graph (Algorithm IV.1).
-       */
-      void pi_eingen_value(
-                           TPiGraphVertexIndexMap index_map,
-                           TPiGraphEdgeWeight1Map weight_map, 
-                           TPiGraphEdgeWeight2Map weigh2_map) 
-      {
-        using namespace boost;
-        typedef std::vector<default_color_type> color_map_t;
-        color_map_t     vcm(num_vertices(m_pi_g), white_color);//Vertex color map
-        color_map_t::iterator   uv_itr = vcm.begin(); //Undiscovered vertex
-        reverse_graph<pi_graph_t>       rev_g(m_pi_g); //For backward breadth visit
-
-        while ((uv_itr = std::find_if(uv_itr, vcm.end(), 
-                                      boost::bind(std::equal_to<default_color_type>(), boost::white_color, _1))) != vcm.end()) 
-          ///While there are undiscovered vertices
-          {
-            pi_vertex_t gv = find_good_source(pi_vertex_t(uv_itr - vcm.begin()));
-            pigraph_vertex_index_t      gv_ind = index_map[gv];
-            m_eigen_value[gv_ind] = calculate_eigen_value(gv) ;
-            bfs_eingmode_visitor        bfs_vis(index_map, weight_map, weigh2_map, m_eigen_value, m_eigen_vector, m_eigen_value[gv_ind]); 
-            typename boost::queue<pi_vertex_t> Q;
-            breadth_first_visit(rev_g, gv, Q, bfs_vis, make_iterator_property_map(vcm.begin(), index_map));
-          }
-      }
-
-      void improve_policy(mcr_vertex_t vd, mcr_edge_t new_edge)
-      {
-        remove_edge(*(out_edges(m_g2pi_g_vm[vd], m_pi_g).first), m_pi_g);
-        pi_edge_t ned = add_edge(m_g2pi_g_vm[vd], m_g2pi_g_vm[target(new_edge, m_g)], m_pi_g).first;
-        put(edge_weight, m_pi_g, ned, m_ew1m[new_edge]);
-        put(edge_weight2, m_pi_g, ned, m_ew2m[new_edge]);               
-      }
-      /*!
-       * Policy Improvement. Improve the policy graph. The new policy graph has greater cycle ratio.
-       * \return false if nothing can be improved.
-       */
-      bool  improve_policy_try1(std::vector<double>&  max_eing_vals) 
-      {
-        bool  improved = false;
-        BGL_FORALL_VERTICES_T(vd, m_g, TGraph) 
-          {
-            double      max_ev = m_minus_infinity;/// Maximum eigen value for vertex
-            mcr_edge_t  cr_ed;///Critical edge
-
-            BGL_FORALL_OUTEDGES_T(vd, outed, m_g, TGraph) 
-              {
-                if (m_eigen_value[m_vim[target(outed, m_g)]] > max_ev) 
-                  {
-                    max_ev = m_eigen_value[m_vim[boost::target(outed, m_g)]];
-                    cr_ed = outed;
-                  }
-              }
-            if (max_ev > m_eigen_value[get(m_vim,vd)]) 
-              {
-                improve_policy(vd, cr_ed);
-                improved = true;
-              }
-            max_eing_vals[get(m_vim,vd)] = max_ev;
-          }
-        return  improved;
-      }
-
-      /*!
-       * \param max_eigen_values[u] = max_(for all adjacent vertices (u,v)) m_eigen_value[v]
-       */
-      bool improve_policy_try2(const std::vector<double>& max_eigen_values) 
-      {
-        bool  improved = false;
-        BGL_FORALL_VERTICES_T(vd, m_g, TGraph) 
-          {
-            mcr_edge_t  impr_edge;
-            double      max_val = m_minus_infinity; 
-            BGL_FORALL_OUTEDGES_T(vd, outed, m_g, TGraph) 
-              {
-                ///If vertex vd is in the K(vd) set 
-                if (max_eigen_values[get(m_vim, vd)] <= m_eigen_value[get(m_vim, target(outed, m_g))])  
-                  {
-                    double c_val = m_ew1m[outed] - m_ew2m[outed] * m_eigen_value[m_vim[boost::target(outed, m_g)]] + 
-                      m_eigen_vector[m_vim[boost::target(outed, m_g)]];
-                    if (c_val > max_val) 
-                      {
-                        max_val = c_val;
-                        impr_edge = outed;
-                      }
-                  }
-              }
-            if ((max_val - m_eigen_vector[get(m_vim, vd)]) > mcr_howard_ltolerance) 
-              ///If m_eigen_vector[vd] == max_val
-              {
-                improve_policy(vd, impr_edge);
-                improved = true;
-              }
-          }
-        return improved;
-      }
-    };///Cmcr_Howard
-
-    /*!
-     * \return maximum cycle ratio and one critical cycle.
-     */
-    template <typename TGraph, typename TVertexIndexMap, typename TWeight1EdgeMap, typename TWeight2EdgeMap>
-    class Cmcr_Howard1  : public        Cmcr_Howard<TGraph, TVertexIndexMap, TWeight1EdgeMap, TWeight2EdgeMap>
-    {
-    public:
-      typedef Cmcr_Howard<TGraph, TVertexIndexMap, TWeight1EdgeMap, TWeight2EdgeMap> inhr_t;  
-      Cmcr_Howard1(const TGraph& g, TVertexIndexMap vim, TWeight1EdgeMap ewm, TWeight2EdgeMap ew2m) : inhr_t(g, vim, ewm, ew2m) 
-      { 
-        m_pi_g2g.resize(boost::num_vertices(g));
-        m_pi_g2g_vm = boost::make_iterator_property_map(m_pi_g2g.begin(), boost::get(boost::vertex_index, this->m_pi_g));
-      }
-
-      void      get_critical_cycle(typename inhr_t::critical_cycle_t& cc) { return cc.swap(m_critical_cycle); }
-    protected:
-      void      store_pivertex(typename inhr_t::pi_vertex_t pivd, typename inhr_t::mcr_vertex_t vd) 
-      {
-        m_pi_g2g_vm[pivd] = vd;
-      }
-      void      store_critical_edge(typename inhr_t::pi_edge_t  ed, typename inhr_t::critical_cycle_t& cc)
-      {
-        typename inhr_t::pi_vertex_t s = boost::source(ed, this->m_pi_g);
-        typename inhr_t::pi_vertex_t t = boost::target(ed, this->m_pi_g);
-        assert(boost::edge(m_pi_g2g_vm[s], m_pi_g2g_vm[t], this->m_g).second);
-        cc.push_back(boost::edge(m_pi_g2g_vm[s], m_pi_g2g_vm[t], this->m_g).first); ///Store corresponding edge of the m_g
-      }
-      void      store_critical_cycle(typename inhr_t::critical_cycle_t& cc) 
-      {
-        m_critical_cycle.swap(cc);
-      }
-    private:
-      typename inhr_t::critical_cycle_t m_critical_cycle;
-      typedef   typename boost::iterator_property_map<typename std::vector<typename inhr_t::mcr_vertex_t>::iterator, typename inhr_t::TPiGraphVertexIndexMap> pi_g2g_vm_t;
-      pi_g2g_vm_t       m_pi_g2g_vm; ///Maps policy graph vertices to input graph vertices
-      typename std::vector<typename inhr_t::mcr_vertex_t> m_pi_g2g;
-    };
-
-    /*!
-     * Add sink vertex - this will make any graph good, the selfloop will have ratio equal to infinity
-     * Properties must be "self increasing"
-     */
-    template <typename TGraph, typename TWeight1EdgeMap, typename TWeight2EdgeMap>
-    typename boost::graph_traits<TGraph>::vertex_descriptor 
-    make_graph_good(TGraph& g, TWeight1EdgeMap ewm, TWeight2EdgeMap ew2m, 
-                    typename boost::property_traits<TWeight1EdgeMap>::value_type infinity)
-    {
-      typedef typename boost::graph_traits<TGraph>::edge_descriptor Edge;
-      typename boost::graph_traits<TGraph>::vertex_descriptor sink = boost::add_vertex(g);
-        
-      BGL_FORALL_VERTICES_T(vd, g, TGraph) 
-        {
-          Edge newed = boost::add_edge(vd, sink, g).first;
-          boost::put(ewm, newed, 0);
-          boost::put(ew2m, newed, 1);
-        }
-      Edge selfed = boost::edge(sink, sink, g).first;
-      boost::put(ewm, selfed, infinity);
-      return sink;
-    }
-
-    /*!
-     * Construct from input graph g "safe" (suitable for maximum_cycle_ratio1() call) version - safeg 
-     */
-    template <typename TG, typename TIndVertexMap, typename TW1EdgeMap, typename TW2EdgeMap, typename TSafeG, typename SafeG2GEdgeMap>
-    void construct_safe_graph(const TG& g, TIndVertexMap vim, TW1EdgeMap ew1m, TW2EdgeMap ew2m, TSafeG& safeg, SafeG2GEdgeMap& sg2gm)
-    {
-      assert(num_vertices(g) == num_vertices(safeg));
-      typedef typename graph_traits<TSafeG>::edge_descriptor tmp_edge_t;
-      typedef typename graph_traits<TG>::edge_descriptor edge_t;
-      typename graph_traits<TG>::edge_iterator  ei, ei_end;
-
-      for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei) 
-        {
-          tmp_edge_t tmped = add_edge(vim[source(*ei, g)], vim[target(*ei, g)], safeg).first;
-          sg2gm[tmped] = *ei;
-          put(edge_weight, safeg, tmped, get(ew1m, *ei));
-          put(edge_weight2, safeg, tmped, get(ew2m, *ei));
-        }
-    }
-
-    template <typename TGraph, typename TVertexIndexMap, typename TWeight1EdgeMap, typename TWeight2EdgeMap>
-    double      maximum_cycle_ratio_good_graph(const TGraph& g, TVertexIndexMap vim, TWeight1EdgeMap ewm, TWeight2EdgeMap ew2m,
-                                               typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0) 
-    {
-      if (pcc == 0)  
-        {
-          return        detail::Cmcr_Howard<TGraph, TVertexIndexMap, TWeight1EdgeMap, TWeight2EdgeMap>(g, vim, ewm, ew2m)();
-        } 
-      else 
-        {
-          detail::Cmcr_Howard1<TGraph, TVertexIndexMap, TWeight1EdgeMap, TWeight2EdgeMap> obj(g, vim, ewm, ew2m);
-          double maxcr = obj();
-          obj.get_critical_cycle(*pcc);
-          return        maxcr;
-        }
-    }
-
-    template <typename TGraph, typename TVertexIndexMap, typename TWeight1EdgeMap, typename TWeight2EdgeMap, typename TEdgeIndexMap>
-    double  minimum_cycle_ratio_good_graph(const TGraph& g, TVertexIndexMap vim, TWeight1EdgeMap ewm, 
-                                           TWeight2EdgeMap ew2m, TEdgeIndexMap eim,
-                                           typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0)
-    {
-      typedef   typename boost::remove_const<typename boost::property_traits<TWeight1EdgeMap>::value_type>::type weight_value_t;
-      BOOST_STATIC_ASSERT(!is_integral<weight_value_t>::value || is_signed<weight_value_t>::value);
-      typename  std::vector<weight_value_t> ne_w(boost::num_edges(g));
-      BGL_FORALL_EDGES_T(ed, g, TGraph)  ne_w[boost::get(eim, ed)] = -ewm[ed];
-      return -maximum_cycle_ratio_good_graph(g, vim, boost::make_iterator_property_map(ne_w.begin(), eim), ew2m, pcc);
-    }
-
-    /*!
-     * \param g directed multigraph.
-     * \param pcc - pointer to the critical edges list.
-     * \param minus_infinity must be small enough to garanty that g has at least one cycle with greater ratio.
-     * \return minus_infinity if there're no cycles in the graph
-     */
-    template <typename TGraph, typename TWeight1EdgeMap, typename TWeight2EdgeMap>
-    double      maximum_cycle_ratio1(const TGraph& g, TWeight1EdgeMap ewm, TWeight2EdgeMap ew2m,
-                                     typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                                     typename boost::property_traits<TWeight1EdgeMap>::value_type minus_infinity = -(std::numeric_limits<int>::max)()) 
-    {
-      typedef typename boost::graph_traits<TGraph>::vertex_descriptor Vertex;
-      typedef typename boost::graph_traits<TGraph>::edge_descriptor Edge;
-      boost::function_requires< boost::ReadWritePropertyMapConcept<TWeight1EdgeMap, Edge> >();
-      boost::function_requires< boost::ReadWritePropertyMapConcept<TWeight2EdgeMap, Edge> >();
-        
-      TGraph& ncg = const_cast<TGraph&>(g);
-      Vertex sink = detail::make_graph_good(ncg, ewm, ew2m, minus_infinity );
-
-      double res = maximum_cycle_ratio_good_graph(ncg, boost::get(boost::vertex_index, g), ewm, ew2m, pcc);
-      boost::clear_vertex(sink, ncg); boost::remove_vertex(sink, ncg);
-      return    res;
-    }
-
-    /*!
-     * Edge index MUST be in diapazon [0,..., num_edges(g)-1]
-     * \return plus_infinity if g has no cycles.
-     */
-    template <typename TGraph, typename TWeight1EdgeMap, typename TWeight2EdgeMap, typename TEdgeIndexMap>
-    double      minimum_cycle_ratio1(const TGraph& g, TWeight1EdgeMap ewm, TWeight2EdgeMap ew2m, TEdgeIndexMap eim, 
-                                     typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                                     typename boost::property_traits<TWeight1EdgeMap>::value_type plus_infinity = (std::numeric_limits<int>::max)()
-                                     ) 
-    {
-      typedef typename boost::property_traits<TEdgeIndexMap>::value_type ei_t;
-      typedef typename boost::graph_traits<TGraph>::vertex_descriptor Vertex;
-      typedef typename boost::graph_traits<TGraph>::edge_descriptor Edge;
-
-      boost::function_requires< boost::ReadWritePropertyMapConcept<TWeight1EdgeMap, Edge> >();
-      boost::function_requires< boost::ReadWritePropertyMapConcept<TWeight2EdgeMap, Edge> >();
-      boost::function_requires< boost::ReadWritePropertyMapConcept<TEdgeIndexMap, Edge> >();
-        
-      TGraph& ncg = const_cast<TGraph&>(g);
-
-      ei_t      nei = ei_t(boost::num_edges(g));
-      Vertex sink = detail::make_graph_good(ncg, ewm, ew2m, plus_infinity );
-      ///Maintain edge index invariant
-      BGL_FORALL_VERTICES_T(vd, ncg, TGraph) 
-        {
-          typename boost::graph_traits<TGraph>::edge_descriptor ed = boost::edge(vd, sink, ncg).first;
-          boost::put(eim, ed, nei++);
-        }
-      double res = minimum_cycle_ratio_good_graph(ncg, boost::get(boost::vertex_index, ncg), ewm, ew2m, eim, pcc);
-      boost::clear_vertex(sink, ncg); boost::remove_vertex(sink, ncg);
-      return    res;
-    }
-    struct edge_less_than  
-    {
-      template <typename TEdgeDescriptor> bool operator()(const TEdgeDescriptor& x, const TEdgeDescriptor& y) const
-      {
-        return x.get_property() < y.get_property();
-      }
-    };
-  }///namespace detail
-  namespace 
-  {
-    template <typename TW1, typename TW2> struct safe_graph 
-    {
-      typedef typename boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, boost::no_property, 
-                                             typename boost::property<boost::edge_weight_t, TW1, typename boost::property<boost::edge_weight2_t, TW2> > > type;
-    };
-  }
-
-  /*!
-   * Calculate the maximum cycle ratio (mcr) of the directed multigraph g.
-   * \param g directed multigraph
-   * \param pcc - If provided then a critical cycle will be written to corresponding vector.
-   * \param minus_infinity small enough value to garanty that g has at least one cycle with greater ratio.
-   * \return mcr or minus_infinity if g has no cycles.
-   */
-  template <typename TGraph, typename TVertexIndexMap, typename TW1EdgeMap, typename TW2EdgeMap>
-  double        maximum_cycle_ratio(const TGraph& g, TVertexIndexMap vim, TW1EdgeMap ew1m, TW2EdgeMap ew2m,
-                                    typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                                    typename boost::property_traits<TW1EdgeMap>::value_type minus_infinity = 
-                                    -(std::numeric_limits<int>::max)())
-  {
-    typedef     typename remove_const<typename property_traits<TW1EdgeMap>::value_type>::type w1_t;
-    typedef     typename remove_const<typename property_traits<TW2EdgeMap>::value_type>::type w2_t;
-    typedef     typename safe_graph<w1_t, w2_t>::type safe_graph_t;
-    typedef typename graph_traits<safe_graph_t>::edge_descriptor tmp_edge_t;
-    typedef typename graph_traits<TGraph>::edge_descriptor edge_t;
-    typename std::map<tmp_edge_t, edge_t, detail::edge_less_than>       tmpg2g;
-    std::vector<tmp_edge_t> cc;
-    safe_graph_t sg(num_vertices(g));
-    detail::construct_safe_graph(g, vim, ew1m, ew2m, sg, tmpg2g);
-    double  mcr = maximum_cycle_ratio1(sg, get(edge_weight, sg), get(edge_weight2, sg), pcc ? &cc : 0, minus_infinity);
-    if (pcc && (mcr > minus_infinity)) 
-      {
-        pcc->clear();
-        for (typename std::vector<tmp_edge_t>::iterator it = cc.begin(); it != cc.end(); ++it) pcc->push_back(tmpg2g[*it]);
-      }
-    return mcr;
-  }
-
-  template <typename TGraph, typename TVertexIndexMap, typename TW1EdgeMap, typename TW2EdgeMap, typename TIndEdgeMap>
-  double        minimum_cycle_ratio(const TGraph& g, TVertexIndexMap vim, TW1EdgeMap ew1m, TW2EdgeMap ew2m, TIndEdgeMap eim, 
-                                    typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                                    typename boost::property_traits<TW1EdgeMap>::value_type plus_infinity = 
-                                    (std::numeric_limits<int>::max)())
-  {
-    typedef     typename boost::remove_const<typename boost::property_traits<TW1EdgeMap>::value_type>::type weight_value_t;
-    BOOST_STATIC_ASSERT(!is_integral<weight_value_t>::value || is_signed<weight_value_t>::value);
-    typename    std::vector<weight_value_t> ne_w(boost::num_edges(g));
-    BGL_FORALL_EDGES_T(ed, g, TGraph)  ne_w[boost::get(eim, ed)] = -ew1m[ed];
-    return -maximum_cycle_ratio(g, vim, boost::make_iterator_property_map(ne_w.begin(), eim), ew2m, pcc, -plus_infinity);
-  }
-  /*!
-   * Calculate maximum mean cycle of directed weighted multigraph.
-   * \param g directed multigraph
-   * \return maximum mean cycle of g or minus_infinity if g has no cycles.
-   */
-  template <typename TGraph, typename TVertexIndexMap, typename TWeightEdgeMap, typename TIndEdgeMap>
-  double  maximum_mean_cycle(const TGraph& g, TVertexIndexMap vim, TWeightEdgeMap ewm, TIndEdgeMap eim,
-                             typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                             typename boost::property_traits<TWeightEdgeMap>::value_type minus_infinity =
-                             -(std::numeric_limits<int>::max)())
-  {
-    typedef     typename boost::remove_const<typename boost::property_traits<TWeightEdgeMap>::value_type>::type weight_value_t;
-    typedef     typename boost::graph_traits<TGraph>::edge_descriptor Edge;
-    typename    std::vector<weight_value_t> ed_w2(boost::num_edges(g), 1);
-    return maximum_cycle_ratio(g, vim, ewm, boost::make_iterator_property_map(ed_w2.begin(), eim), pcc, minus_infinity);
-  }
-
-  template <typename TGraph, typename TVertexIndexMap, typename TWeightEdgeMap, typename TIndEdgeMap>
-  double  minimum_mean_cycle(const TGraph& g, TVertexIndexMap vim, TWeightEdgeMap ewm, TIndEdgeMap eim,
-                             typename std::vector<typename boost::graph_traits<TGraph>::edge_descriptor>* pcc = 0,
-                             typename boost::property_traits<TWeightEdgeMap>::value_type plus_infinity =
-                             (std::numeric_limits<int>::max)())
-  {
-    typedef     typename boost::remove_const<typename boost::property_traits<TWeightEdgeMap>::value_type>::type weight_value_t;
-    typedef     typename boost::graph_traits<TGraph>::edge_descriptor Edge;
-    typename    std::vector<weight_value_t> ed_w2(boost::num_edges(g), 1);
-    return      minimum_cycle_ratio(g, vim, ewm, boost::make_iterator_property_map(ed_w2.begin(), eim), eim, pcc, plus_infinity);
-  }
-} //namespace boost
-#endif
diff --git a/deal.II/contrib/boost/include/boost/graph/incremental_components.hpp b/deal.II/contrib/boost/include/boost/graph/incremental_components.hpp
deleted file mode 100644 (file)
index 4cb571b..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-//
-//=======================================================================
-// Copyright 1997-2001 University of Notre Dame.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-//
-
-#ifndef BOOST_INCREMENTAL_COMPONENTS_HPP
-#define BOOST_INCREMENTAL_COMPONENTS_HPP
-
-#include <boost/detail/iterator.hpp>
-#include <boost/graph/detail/incremental_components.hpp>
-
-namespace boost {
-
-  // A connected component algorithm for the case when dynamically
-  // adding (but not removing) edges is common.  The
-  // incremental_components() function is a preparing operation. Call
-  // same_component to check whether two vertices are in the same
-  // component, or use disjoint_set::find_set to determine the
-  // representative for a vertex.
-
-  // This version of connected components does not require a full
-  // Graph. Instead, it just needs an edge list, where the vertices of
-  // each edge need to be of integer type. The edges are assumed to
-  // be undirected. The other difference is that the result is stored in
-  // a container, instead of just a decorator.  The container should be
-  // empty before the algorithm is called. It will grow during the
-  // course of the algorithm. The container must be a model of
-  // BackInsertionSequence and RandomAccessContainer
-  // (std::vector is a good choice). After running the algorithm the
-  // index container will map each vertex to the representative
-  // vertex of the component to which it belongs.
-  //
-  // Adapted from an implementation by Alex Stepanov. The disjoint
-  // sets data structure is from Tarjan's "Data Structures and Network
-  // Algorithms", and the application to connected components is
-  // similar to the algorithm described in Ch. 22 of "Intro to
-  // Algorithms" by Cormen, et. all.
-  //  
-  // RankContainer is a random accessable container (operator[] is
-  // defined) with a value type that can represent an integer part of
-  // a binary log of the value type of the corresponding
-  // ParentContainer (char is always enough) its size_type is no less
-  // than the size_type of the corresponding ParentContainer
-
-  // An implementation of disjoint sets can be found in
-  // boost/pending/disjoint_sets.hpp
-  
-  template <class EdgeListGraph, class DisjointSets>
-  void incremental_components(EdgeListGraph& g, DisjointSets& ds)
-  {
-    typename graph_traits<EdgeListGraph>::edge_iterator e, end;
-    for (tie(e,end) = edges(g); e != end; ++e)
-      ds.union_set(source(*e,g),target(*e,g));
-  }
-  
-  template <class ParentIterator>
-  void compress_components(ParentIterator first, ParentIterator last)
-  {
-    for (ParentIterator current = first; current != last; ++current) 
-      detail::find_representative_with_full_compression(first, current-first);
-  }
-  
-  template <class ParentIterator>
-  typename boost::detail::iterator_traits<ParentIterator>::difference_type
-  component_count(ParentIterator first, ParentIterator last)
-  {
-    std::ptrdiff_t count = 0;
-    for (ParentIterator current = first; current != last; ++current) 
-      if (*current == current - first) ++count; 
-    return count;
-  }
-  
-  // This algorithm can be applied to the result container of the
-  // connected_components algorithm to normalize
-  // the components.
-  template <class ParentIterator>
-  void normalize_components(ParentIterator first, ParentIterator last)
-  {
-    for (ParentIterator current = first; current != last; ++current) 
-      detail::normalize_node(first, current - first);
-  }
-  
-  template <class VertexListGraph, class DisjointSets> 
-  void initialize_incremental_components(VertexListGraph& G, DisjointSets& ds)
-  {
-    typename graph_traits<VertexListGraph>
-      ::vertex_iterator v, vend;
-    for (tie(v, vend) = vertices(G); v != vend; ++v)
-      ds.make_set(*v);
-  }
-
-  template <class Vertex, class DisjointSet>
-  inline bool same_component(Vertex u, Vertex v, DisjointSet& ds)
-  {
-    return ds.find_set(u) == ds.find_set(v);
-  }
-
-  // considering changing the so that it initializes with a pair of
-  // vertex iterators and a parent PA.
-  
-  template <class IndexT>
-  class component_index
-  {
-  public://protected: (avoid friends for now)
-    typedef std::vector<IndexT> MyIndexContainer;
-    MyIndexContainer header;
-    MyIndexContainer index;
-    typedef typename MyIndexContainer::size_type SizeT;
-    typedef typename MyIndexContainer::const_iterator IndexIter;
-  public:
-    typedef detail::component_iterator<IndexIter, IndexT, SizeT> 
-      component_iterator;
-    class component {
-      friend class component_index;
-    protected:
-      IndexT number;
-      const component_index<IndexT>* comp_ind_ptr;
-      component(IndexT i, const component_index<IndexT>* p) 
-        : number(i), comp_ind_ptr(p) {}
-    public:
-      typedef component_iterator iterator;
-      typedef component_iterator const_iterator;
-      typedef IndexT value_type;
-      iterator begin() const {
-        return iterator( comp_ind_ptr->index.begin(),
-                         (comp_ind_ptr->header)[number] );
-      }
-      iterator end() const {
-        return iterator( comp_ind_ptr->index.begin(), 
-                         comp_ind_ptr->index.size() );
-      }
-    };
-    typedef SizeT size_type;
-    typedef component value_type;
-    
-#if defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)
-    template <class Iterator>
-    component_index(Iterator first, Iterator last) 
-    : index(std::distance(first, last))
-    { 
-      std::copy(first, last, index.begin());
-      detail::construct_component_index(index, header);
-    }
-#else
-    template <class Iterator>
-    component_index(Iterator first, Iterator last) 
-      : index(first, last)
-    { 
-      detail::construct_component_index(index, header);
-    }
-#endif
-
-    component operator[](IndexT i) const {
-      return component(i, this);
-    }
-    SizeT size() const {
-      return header.size();
-    }
-    
-  };
-
-} // namespace boost
-
-#endif // BOOST_INCREMENTAL_COMPONENTS_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/named_function_params.hpp b/deal.II/contrib/boost/include/boost/graph/named_function_params.hpp
deleted file mode 100644 (file)
index db77ae3..0000000
+++ /dev/null
@@ -1,795 +0,0 @@
-//=======================================================================
-// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
-// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-
-#ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
-#define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
-
-#include <boost/graph/properties.hpp>
-
-namespace boost {
-
-  struct distance_compare_t { };
-  struct distance_combine_t { };
-  struct distance_inf_t { };
-  struct distance_zero_t { };
-  struct buffer_param_t { };
-  struct edge_copy_t { };
-  struct vertex_copy_t { };
-  struct vertex_isomorphism_t { };
-  struct vertex_invariant_t { };
-  struct vertex_invariant1_t { };
-  struct vertex_invariant2_t { };
-  struct edge_compare_t { };
-  struct vertex_max_invariant_t { };
-  struct orig_to_copy_t { };
-  struct root_vertex_t { };
-  struct attractive_force_t { };
-  struct repulsive_force_t { };
-  struct force_pairs_t { };
-  struct cooling_t { };
-  struct vertex_displacement_t { };
-  struct iterations_t { };
-  struct diameter_range_t { };
-  struct learning_constant_range_t { };
-
-  namespace detail {
-    template <class T>
-    struct wrap_ref {
-      wrap_ref(T& r) : ref(r) {}
-      T& ref;
-    };
-  }
-
-  template <typename T, typename Tag, typename Base = no_property>
-  struct bgl_named_params : public Base
-  {
-    typedef bgl_named_params self;
-    typedef Base next_type;
-    typedef Tag tag_type;
-    typedef T value_type;
-    bgl_named_params(T v) : m_value(v) { }
-    bgl_named_params(T v, const Base& b) : Base(b), m_value(v) { }
-    T m_value;
-
-    template <typename WeightMap>
-    bgl_named_params<WeightMap, edge_weight_t, self>
-    weight_map(const WeightMap& pmap) const {
-      typedef bgl_named_params<WeightMap, edge_weight_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename WeightMap>
-    bgl_named_params<WeightMap, edge_weight2_t, self>
-    weight_map2(const WeightMap& pmap) const {
-      typedef bgl_named_params<WeightMap, edge_weight2_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename DistanceMap>
-    bgl_named_params<DistanceMap, vertex_distance_t, self>
-    distance_map(const DistanceMap& pmap) const {
-      typedef bgl_named_params<DistanceMap, vertex_distance_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename PredecessorMap>
-    bgl_named_params<PredecessorMap, vertex_predecessor_t, self>
-    predecessor_map(const PredecessorMap& pmap) const {
-      typedef bgl_named_params<PredecessorMap, vertex_predecessor_t, self> 
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename RankMap>
-    bgl_named_params<RankMap, vertex_rank_t, self>
-    rank_map(const RankMap& pmap) const {
-      typedef bgl_named_params<RankMap, vertex_rank_t, self> 
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename RootMap>
-    bgl_named_params<RootMap, vertex_root_t, self>
-    root_map(const RootMap& pmap) const {
-      typedef bgl_named_params<RootMap, vertex_root_t, self> 
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename Vertex>
-    bgl_named_params<Vertex, root_vertex_t, self>
-    root_vertex(const Vertex& r) const {
-      typedef bgl_named_params<Vertex, root_vertex_t, self> Params;
-      return Params(r, *this);
-    }
-
-    template <typename EdgeCentralityMap>
-    bgl_named_params<EdgeCentralityMap, edge_centrality_t, self>
-    edge_centrality_map(const EdgeCentralityMap& r) const {
-      typedef bgl_named_params<EdgeCentralityMap, edge_centrality_t, self> Params;
-      return Params(r, *this);
-    }
-
-    template <typename CentralityMap>
-    bgl_named_params<CentralityMap, vertex_centrality_t, self>
-    centrality_map(const CentralityMap& r) const {
-      typedef bgl_named_params<CentralityMap, vertex_centrality_t, self> Params;
-      return Params(r, *this);
-    }
-
-    template <typename ColorMap>
-    bgl_named_params<ColorMap, vertex_color_t, self>
-    color_map(const ColorMap& pmap) const {
-      typedef bgl_named_params<ColorMap, vertex_color_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename ColorMap>
-    bgl_named_params<ColorMap, vertex_color_t, self>
-    vertex_color_map(const ColorMap& pmap) const {
-      typedef bgl_named_params<ColorMap, vertex_color_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename ColorMap>
-    bgl_named_params<ColorMap, edge_color_t, self>
-    edge_color_map(const ColorMap& pmap) const {
-      typedef bgl_named_params<ColorMap, edge_color_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename CapacityMap>
-    bgl_named_params<CapacityMap, edge_capacity_t, self>
-    capacity_map(CapacityMap pmap) {
-      typedef bgl_named_params<CapacityMap, edge_capacity_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename Residual_CapacityMap>
-    bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t, self>
-    residual_capacity_map(Residual_CapacityMap pmap) {
-      typedef bgl_named_params<Residual_CapacityMap, 
-        edge_residual_capacity_t, self>
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename ReverseMap>
-    bgl_named_params<ReverseMap, edge_reverse_t, self>
-    reverse_edge_map(ReverseMap pmap) {
-      typedef bgl_named_params<ReverseMap, 
-        edge_reverse_t, self>
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename DiscoverTimeMap>
-    bgl_named_params<DiscoverTimeMap, vertex_discover_time_t, self>
-    discover_time_map(const DiscoverTimeMap& pmap) const {
-      typedef bgl_named_params<DiscoverTimeMap, vertex_discover_time_t, self>
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename LowPointMap>
-    bgl_named_params<LowPointMap, vertex_lowpoint_t, self>
-    lowpoint_map(const LowPointMap& pmap) const {
-      typedef bgl_named_params<LowPointMap, vertex_lowpoint_t, self>
-        Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename IndexMap>
-    bgl_named_params<IndexMap, vertex_index_t, self>
-    vertex_index_map(const IndexMap& pmap) const {
-      typedef bgl_named_params<IndexMap, vertex_index_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename IndexMap>
-    bgl_named_params<IndexMap, vertex_index1_t, self>
-    vertex_index1_map(const IndexMap& pmap) const {
-      typedef bgl_named_params<IndexMap, vertex_index1_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename IndexMap>
-    bgl_named_params<IndexMap, vertex_index2_t, self>
-    vertex_index2_map(const IndexMap& pmap) const {
-      typedef bgl_named_params<IndexMap, vertex_index2_t, self> Params;
-      return Params(pmap, *this);
-    }
-
-    template <typename Visitor>
-    bgl_named_params<Visitor, graph_visitor_t, self>
-    visitor(const Visitor& vis) const {
-      typedef bgl_named_params<Visitor, graph_visitor_t, self> Params;
-      return Params(vis, *this);
-    }
-
-    template <typename Compare>
-    bgl_named_params<Compare, distance_compare_t, self>
-    distance_compare(Compare cmp) const {
-      typedef bgl_named_params<Compare, distance_compare_t, self> Params;
-      return Params(cmp, *this);
-    }
-
-    template <typename Combine>
-    bgl_named_params<Combine, distance_combine_t, self>
-    distance_combine(Combine cmb) const {
-      typedef bgl_named_params<Combine, distance_combine_t, self> Params;
-      return Params(cmb, *this);
-    }
-
-    template <typename Init>
-    bgl_named_params<Init, distance_inf_t, self>
-    distance_inf(Init init) const {
-      typedef bgl_named_params<Init, distance_inf_t, self> Params;
-      return Params(init, *this);
-    }
-
-    template <typename Init>
-    bgl_named_params<Init, distance_zero_t, self>
-    distance_zero(Init init) const {
-      typedef bgl_named_params<Init, distance_zero_t, self> Params;
-      return Params(init, *this);
-    }
-
-    template <typename Buffer>
-    bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t, self>
-    buffer(Buffer& b) const {
-      typedef bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t, self> 
-        Params;
-      return Params(detail::wrap_ref<Buffer>(b), *this);
-    }
-
-    template <typename Copier>
-    bgl_named_params<Copier, edge_copy_t, self>
-    edge_copy(const Copier& c) const {
-      typedef bgl_named_params<Copier, edge_copy_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename Copier>
-    bgl_named_params<Copier, vertex_copy_t, self>
-    vertex_copy(const Copier& c) const {
-      typedef bgl_named_params<Copier, vertex_copy_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename Orig2CopyMap>
-    bgl_named_params<Orig2CopyMap, orig_to_copy_t, self>
-    orig_to_copy(const Orig2CopyMap& c) const {
-      typedef bgl_named_params<Orig2CopyMap, orig_to_copy_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename IsoMap>
-    bgl_named_params<IsoMap, vertex_isomorphism_t, self>
-    isomorphism_map(const IsoMap& c) const {
-      typedef bgl_named_params<IsoMap, vertex_isomorphism_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename VertexInvar>
-    bgl_named_params<VertexInvar, vertex_invariant_t, self>
-    vertex_invariant(const VertexInvar& c) const {
-      typedef bgl_named_params<VertexInvar, vertex_invariant_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename VertexInvar>
-    bgl_named_params<VertexInvar, vertex_invariant1_t, self>
-    vertex_invariant1(const VertexInvar& c) const {
-      typedef bgl_named_params<VertexInvar, vertex_invariant1_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename VertexInvar>
-    bgl_named_params<VertexInvar, vertex_invariant2_t, self>
-    vertex_invariant2(const VertexInvar& c) const {
-      typedef bgl_named_params<VertexInvar, vertex_invariant2_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename VertexMaxInvar>
-    bgl_named_params<VertexMaxInvar, vertex_max_invariant_t, self>
-    vertex_max_invariant(const VertexMaxInvar& c) const {
-      typedef bgl_named_params<VertexMaxInvar, vertex_max_invariant_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename VertexDisplacement>
-    bgl_named_params<VertexDisplacement, vertex_displacement_t, self>
-    displacement_map(const VertexDisplacement& c) const {
-      typedef bgl_named_params<VertexDisplacement, vertex_displacement_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename AttractiveForce>
-    bgl_named_params<AttractiveForce, attractive_force_t, self>
-    attractive_force(const AttractiveForce& c) {
-      typedef bgl_named_params<AttractiveForce, attractive_force_t, self> Params;
-      return Params(c, *this);
-    }
-    
-    template <typename RepulsiveForce>
-    bgl_named_params<RepulsiveForce, repulsive_force_t, self>
-    repulsive_force(const RepulsiveForce& c) {
-      typedef bgl_named_params<RepulsiveForce, repulsive_force_t, self> Params;
-      return Params(c, *this);
-    }
-    
-    template <typename ForcePairs>
-    bgl_named_params<ForcePairs, force_pairs_t, self>
-    force_pairs(const ForcePairs& c) {
-      typedef bgl_named_params<ForcePairs, force_pairs_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename Cooling>
-    bgl_named_params<Cooling, cooling_t, self>
-    cooling(const Cooling& c) {
-      typedef bgl_named_params<Cooling, cooling_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template <typename TP>
-    bgl_named_params<TP, iterations_t, self>
-    iterations(const TP& c) {
-      typedef bgl_named_params<TP, iterations_t, self> Params;
-      return Params(c, *this);
-    }    
-
-    template<typename TP>
-    bgl_named_params<std::pair<TP, TP>, diameter_range_t, self>
-    diameter_range(const std::pair<TP, TP>& c) {
-      typedef bgl_named_params<std::pair<TP, TP>, diameter_range_t, self> Params;
-      return Params(c, *this);
-    }
-
-    template<typename TP>
-    bgl_named_params<std::pair<TP, TP>, learning_constant_range_t, self>
-    learning_constant_range(const std::pair<TP, TP>& c) {
-      typedef bgl_named_params<std::pair<TP, TP>, learning_constant_range_t, self>
-        Params;
-      return Params(c, *this);
-    }
-  };
-
-  template <typename WeightMap>
-  bgl_named_params<WeightMap, edge_weight_t>
-  weight_map(WeightMap pmap) {
-    typedef bgl_named_params<WeightMap, edge_weight_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename WeightMap>
-  bgl_named_params<WeightMap, edge_weight2_t>
-  weight_map2(WeightMap pmap) {
-    typedef bgl_named_params<WeightMap, edge_weight2_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename DistanceMap>
-  bgl_named_params<DistanceMap, vertex_distance_t>
-  distance_map(DistanceMap pmap) {
-    typedef bgl_named_params<DistanceMap, vertex_distance_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename PredecessorMap>
-  bgl_named_params<PredecessorMap, vertex_predecessor_t>
-  predecessor_map(PredecessorMap pmap) {
-    typedef bgl_named_params<PredecessorMap, vertex_predecessor_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename RankMap>
-  bgl_named_params<RankMap, vertex_rank_t>
-  rank_map(RankMap pmap) {
-    typedef bgl_named_params<RankMap, vertex_rank_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename RootMap>
-  bgl_named_params<RootMap, vertex_root_t>
-  root_map(RootMap pmap) {
-    typedef bgl_named_params<RootMap, vertex_root_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename Vertex>
-  bgl_named_params<Vertex, root_vertex_t>
-  root_vertex(const Vertex& r) {
-    typedef bgl_named_params<Vertex, root_vertex_t> Params;
-    return Params(r);
-  }
-
-  template <typename EdgeCentralityMap>
-  bgl_named_params<EdgeCentralityMap, edge_centrality_t>
-  edge_centrality_map(const EdgeCentralityMap& r) {
-    typedef bgl_named_params<EdgeCentralityMap, edge_centrality_t> Params;
-    return Params(r);
-  }
-
-  template <typename CentralityMap>
-  bgl_named_params<CentralityMap, vertex_centrality_t>
-  centrality_map(const CentralityMap& r) {
-    typedef bgl_named_params<CentralityMap, vertex_centrality_t> Params;
-    return Params(r);
-  }
-
-  template <typename ColorMap>
-  bgl_named_params<ColorMap, vertex_color_t>
-  color_map(ColorMap pmap) {
-    typedef bgl_named_params<ColorMap, vertex_color_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename CapacityMap>
-  bgl_named_params<CapacityMap, edge_capacity_t>
-  capacity_map(CapacityMap pmap) {
-    typedef bgl_named_params<CapacityMap, edge_capacity_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename Residual_CapacityMap>
-  bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t>
-  residual_capacity_map(Residual_CapacityMap pmap) {
-    typedef bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t>
-      Params;
-    return Params(pmap);
-  }
-
-  template <typename ReverseMap>
-  bgl_named_params<ReverseMap, edge_reverse_t>
-  reverse_edge_map(ReverseMap pmap) {
-    typedef bgl_named_params<ReverseMap, edge_reverse_t>
-      Params;
-    return Params(pmap);
-  }
-
-  template <typename DiscoverTimeMap>
-  bgl_named_params<DiscoverTimeMap, vertex_discover_time_t>
-  discover_time_map(DiscoverTimeMap pmap) {
-    typedef bgl_named_params<DiscoverTimeMap, vertex_discover_time_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename LowPointMap>
-  bgl_named_params<LowPointMap, vertex_lowpoint_t>
-  lowpoint_map(LowPointMap pmap) {
-    typedef bgl_named_params<LowPointMap, vertex_lowpoint_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename IndexMap>
-  bgl_named_params<IndexMap, vertex_index_t>
-  vertex_index_map(IndexMap pmap) {
-    typedef bgl_named_params<IndexMap, vertex_index_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename IndexMap>
-  bgl_named_params<IndexMap, vertex_index1_t>
-  vertex_index1_map(const IndexMap& pmap) {
-    typedef bgl_named_params<IndexMap, vertex_index1_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename IndexMap>
-  bgl_named_params<IndexMap, vertex_index2_t>
-  vertex_index2_map(const IndexMap& pmap) {
-    typedef bgl_named_params<IndexMap, vertex_index2_t> Params;
-    return Params(pmap);
-  }
-
-  template <typename Visitor>
-  bgl_named_params<Visitor, graph_visitor_t>
-  visitor(const Visitor& vis) {
-    typedef bgl_named_params<Visitor, graph_visitor_t> Params;
-    return Params(vis);
-  }
-
-  template <typename Compare>
-  bgl_named_params<Compare, distance_compare_t>
-  distance_compare(Compare cmp) {
-    typedef bgl_named_params<Compare, distance_compare_t> Params;
-    return Params(cmp);
-  }
-
-  template <typename Combine>
-  bgl_named_params<Combine, distance_combine_t>
-  distance_combine(Combine cmb) {
-    typedef bgl_named_params<Combine, distance_combine_t> Params;
-    return Params(cmb);
-  }
-
-  template <typename Init>
-  bgl_named_params<Init, distance_inf_t>
-  distance_inf(Init init) {
-    typedef bgl_named_params<Init, distance_inf_t> Params;
-    return Params(init);
-  }
-
-  template <typename Init>
-  bgl_named_params<Init, distance_zero_t>
-  distance_zero(Init init) {
-    typedef bgl_named_params<Init, distance_zero_t> Params;
-    return Params(init);
-  }
-
-  template <typename Buffer>
-  bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t>
-  buffer(Buffer& b) {
-    typedef bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t> Params;
-    return Params(detail::wrap_ref<Buffer>(b));
-  }
-
-  template <typename Copier>
-  bgl_named_params<Copier, edge_copy_t>
-  edge_copy(const Copier& c) {
-    typedef bgl_named_params<Copier, edge_copy_t> Params;
-    return Params(c);
-  }
-
-  template <typename Copier>
-  bgl_named_params<Copier, vertex_copy_t>
-  vertex_copy(const Copier& c) {
-    typedef bgl_named_params<Copier, vertex_copy_t> Params;
-    return Params(c);
-  }
-
-  template <typename Orig2CopyMap>
-  bgl_named_params<Orig2CopyMap, orig_to_copy_t>
-  orig_to_copy(const Orig2CopyMap& c) {
-    typedef bgl_named_params<Orig2CopyMap, orig_to_copy_t> Params;
-    return Params(c);
-  }
-
-  template <typename IsoMap>
-  bgl_named_params<IsoMap, vertex_isomorphism_t>
-  isomorphism_map(const IsoMap& c) {
-    typedef bgl_named_params<IsoMap, vertex_isomorphism_t> Params;
-    return Params(c);
-  }
-
-  template <typename VertexInvar>
-  bgl_named_params<VertexInvar, vertex_invariant_t>
-  vertex_invariant(const VertexInvar& c) {
-    typedef bgl_named_params<VertexInvar, vertex_invariant_t> Params;
-    return Params(c);
-  }
-
-  template <typename VertexInvar>
-  bgl_named_params<VertexInvar, vertex_invariant1_t>
-  vertex_invariant1(const VertexInvar& c) {
-    typedef bgl_named_params<VertexInvar, vertex_invariant1_t> Params;
-    return Params(c);
-  }
-
-  template <typename VertexInvar>
-  bgl_named_params<VertexInvar, vertex_invariant2_t>
-  vertex_invariant2(const VertexInvar& c) {
-    typedef bgl_named_params<VertexInvar, vertex_invariant2_t> Params;
-    return Params(c);
-  }
-
-  template <typename VertexMaxInvar>
-  bgl_named_params<VertexMaxInvar, vertex_max_invariant_t>
-  vertex_max_invariant(const VertexMaxInvar& c) {
-    typedef bgl_named_params<VertexMaxInvar, vertex_max_invariant_t> Params;
-    return Params(c);
-  }
-
-  template <typename VertexDisplacement>
-  bgl_named_params<VertexDisplacement, vertex_displacement_t>
-  displacement_map(const VertexDisplacement& c) {
-    typedef bgl_named_params<VertexDisplacement, vertex_displacement_t> Params;
-    return Params(c);
-  }
-
-  template <typename AttractiveForce>
-  bgl_named_params<AttractiveForce, attractive_force_t>
-  attractive_force(const AttractiveForce& c) {
-    typedef bgl_named_params<AttractiveForce, attractive_force_t> Params;
-    return Params(c);
-  }
-
-  template <typename RepulsiveForce>
-  bgl_named_params<RepulsiveForce, repulsive_force_t>
-  repulsive_force(const RepulsiveForce& c) {
-    typedef bgl_named_params<RepulsiveForce, repulsive_force_t> Params;
-    return Params(c);
-  }
-
-  template <typename ForcePairs>
-  bgl_named_params<ForcePairs, force_pairs_t>
-  force_pairs(const ForcePairs& c) {
-    typedef bgl_named_params<ForcePairs, force_pairs_t> Params;
-    return Params(c);
-  }
-
-  template <typename Cooling>
-  bgl_named_params<Cooling, cooling_t>
-  cooling(const Cooling& c) {
-    typedef bgl_named_params<Cooling, cooling_t> Params;
-    return Params(c);
-  }
-
-  template <typename T>
-  bgl_named_params<T, iterations_t>
-  iterations(const T& c) {
-    typedef bgl_named_params<T, iterations_t> Params;
-    return Params(c);
-  }    
-  
-  template<typename T>
-  bgl_named_params<std::pair<T, T>, diameter_range_t>
-  diameter_range(const std::pair<T, T>& c) {
-    typedef bgl_named_params<std::pair<T, T>, diameter_range_t> Params;
-    return Params(c);
-  }
-  
-  template<typename T>
-  bgl_named_params<std::pair<T, T>, learning_constant_range_t>
-  learning_constant_range(const std::pair<T, T>& c) {
-    typedef bgl_named_params<std::pair<T, T>, learning_constant_range_t>
-      Params;
-    return Params(c);
-  }
-
-  //===========================================================================
-  // Functions for extracting parameters from bgl_named_params
-
-  template <class Tag1, class Tag2, class T1, class Base>
-  inline
-  typename property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type
-  get_param(const bgl_named_params<T1,Tag1,Base>& p, Tag2 tag2)
-  {
-    enum { match = detail::same_property<Tag1,Tag2>::value };
-    typedef typename
-      property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type T2;
-    T2* t2 = 0;
-    typedef detail::property_value_dispatch<match> Dispatcher;
-    return Dispatcher::const_get_value(p, t2, tag2);
-  }
-
-
-  namespace detail {
-    // MSVC++ workaround
-    template <class Param>
-    struct choose_param_helper {
-      template <class Default> struct result { typedef Param type; };
-      template <typename Default>
-      static const Param& apply(const Param& p, const Default&) { return p; }
-    };
-    template <>
-    struct choose_param_helper<error_property_not_found> {
-      template <class Default> struct result { typedef Default type; };
-      template <typename Default>
-      static const Default& apply(const error_property_not_found&, const Default& d)
-        { return d; }
-    };
-  } // namespace detail
-
-  template <class P, class Default> 
-  const typename detail::choose_param_helper<P>::template result<Default>::type&
-  choose_param(const P& param, const Default& d) { 
-    return detail::choose_param_helper<P>::apply(param, d);
-  }
-
-  template <typename T>
-  inline bool is_default_param(const T&) { return false; }
-
-  inline bool is_default_param(const detail::error_property_not_found&)
-    { return true; }
-
-  namespace detail {
-
-    struct choose_parameter {
-      template <class P, class Graph, class Tag>
-      struct bind_ {
-        typedef const P& const_result_type;
-        typedef const P& result_type;
-        typedef P type;
-      };
-
-      template <class P, class Graph, class Tag>
-      static typename bind_<P, Graph, Tag>::const_result_type
-      const_apply(const P& p, const Graph&, Tag&) 
-      { return p; }
-
-      template <class P, class Graph, class Tag>
-      static typename bind_<P, Graph, Tag>::result_type
-      apply(const P& p, Graph&, Tag&) 
-      { return p; }
-    };
-
-    struct choose_default_param {
-      template <class P, class Graph, class Tag>
-      struct bind_ {
-        typedef typename property_map<Graph, Tag>::type 
-          result_type;
-        typedef typename property_map<Graph, Tag>::const_type 
-          const_result_type;
-        typedef typename property_map<Graph, Tag>::const_type 
-          type;
-      };
-
-      template <class P, class Graph, class Tag>
-      static typename bind_<P, Graph, Tag>::const_result_type
-      const_apply(const P&, const Graph& g, Tag tag) { 
-        return get(tag, g); 
-      }
-      template <class P, class Graph, class Tag>
-      static typename bind_<P, Graph, Tag>::result_type
-      apply(const P&, Graph& g, Tag tag) { 
-        return get(tag, g); 
-      }
-    };
-
-    template <class Param>
-    struct choose_property_map {
-      typedef choose_parameter type;
-    };
-    template <>
-    struct choose_property_map<detail::error_property_not_found> {
-      typedef choose_default_param type;
-    };
-
-    template <class Param, class Graph, class Tag>
-    struct choose_pmap_helper {
-      typedef typename choose_property_map<Param>::type Selector;
-      typedef typename Selector:: template bind_<Param, Graph, Tag> Bind;
-      typedef Bind type;
-      typedef typename Bind::result_type result_type;
-      typedef typename Bind::const_result_type const_result_type;
-      typedef typename Bind::type result;
-    };
-
-    // used in the max-flow algorithms
-    template <class Graph, class P, class T, class R>
-    struct edge_capacity_value
-    {
-      typedef bgl_named_params<P, T, R> Params;
-      typedef typename property_value< Params, edge_capacity_t>::type Param;
-      typedef typename detail::choose_pmap_helper<Param, Graph,
-        edge_capacity_t>::result CapacityEdgeMap;
-      typedef typename property_traits<CapacityEdgeMap>::value_type type;
-    };
-
-  } // namespace detail
-  
-
-  // Use this function instead of choose_param() when you want
-  // to avoid requiring get(tag, g) when it is not used. 
-  template <typename Param, typename Graph, typename PropertyTag>
-  typename
-    detail::choose_pmap_helper<Param,Graph,PropertyTag>::const_result_type
-  choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag)
-  { 
-    typedef typename 
-      detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
-    return Choice::const_apply(p, g, tag);
-  }
-
-  template <typename Param, typename Graph, typename PropertyTag>
-  typename detail::choose_pmap_helper<Param,Graph,PropertyTag>::result_type
-  choose_pmap(const Param& p, Graph& g, PropertyTag tag)
-  { 
-    typedef typename 
-      detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice;
-    return Choice::apply(p, g, tag);
-  }
-
-} // namespace boost
-
-#endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/plod_generator.hpp b/deal.II/contrib/boost/include/boost/graph/plod_generator.hpp
deleted file mode 100644 (file)
index 9a63ec8..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-// Copyright 2004 The Trustees of Indiana University.
-
-// 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)
-
-//  Authors: Douglas Gregor
-//           Andrew Lumsdaine
-#ifndef BOOST_GRAPH_PLOD_GENERATOR_HPP
-#define BOOST_GRAPH_PLOD_GENERATOR_HPP
-
-#include <iterator>
-#include <utility>
-#include <boost/random/uniform_int.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/graph/graph_traits.hpp>
-#include <vector>
-#include <map>
-#include <boost/config/no_tr1/cmath.hpp>
-
-namespace boost {
-
-  template<typename RandomGenerator, typename Graph>
-  class plod_iterator
-  {
-    typedef std::vector<std::pair<std::size_t, std::size_t> > out_degrees_t;
-    typedef typename graph_traits<Graph>::directed_category directed_category;
-
-  public:
-    typedef std::input_iterator_tag iterator_category;
-    typedef std::pair<std::size_t, std::size_t> value_type;
-    typedef const value_type& reference;
-    typedef const value_type* pointer;
-    typedef void difference_type;
-
-    plod_iterator() 
-      : gen(0), out_degrees(), degrees_left(0), allow_self_loops(false) { }
-
-    plod_iterator(RandomGenerator& gen, std::size_t n,  
-                  double alpha, double beta, bool allow_self_loops = false)
-      : gen(&gen), n(n), out_degrees(new out_degrees_t),
-        degrees_left(0), allow_self_loops(allow_self_loops)
-    {
-      using std::pow;
-
-      uniform_int<std::size_t> x(0, n-1);
-      for (std::size_t i = 0; i != n; ++i) {
-        std::size_t xv = x(gen);
-    std::size_t degree = (xv == 0? 0 : std::size_t(beta * pow(xv, -alpha)));
-    if (degree != 0) {
-      out_degrees->push_back(std::make_pair(i, degree));
-    }
-        degrees_left += degree;
-      }
-
-      next(directed_category());
-    }
-
-    reference operator*() const { return current; }
-    pointer operator->() const { return &current; }
-    
-    plod_iterator& operator++()
-    { 
-      next(directed_category());
-      return *this;
-    }
-
-    plod_iterator operator++(int)
-    {
-      plod_iterator temp(*this);
-      ++(*this);
-      return temp;
-    }
-
-    bool operator==(const plod_iterator& other) const
-    { 
-      return degrees_left == other.degrees_left; 
-    }
-
-    bool operator!=(const plod_iterator& other) const
-    { return !(*this == other); }
-
-  private:
-    void next(directed_tag)
-    {
-      uniform_int<std::size_t> x(0, out_degrees->size()-1);
-      std::size_t source;
-      do {
-        source = x(*gen);
-      } while ((*out_degrees)[source].second == 0);
-      current.first = (*out_degrees)[source].first;
-      do {
-        current.second = x(*gen);
-      } while (current.first == current.second && !allow_self_loops);
-      --degrees_left;
-      if (--(*out_degrees)[source].second == 0) {
-        (*out_degrees)[source] = out_degrees->back();
-        out_degrees->pop_back();
-      }
-    }
-
-    void next(undirected_tag)
-    {
-      std::size_t source, target;
-      while (true) {
-        /* We may get to the point where we can't actually find any
-           new edges, so we just add some random edge and set the
-           degrees left = 0 to signal termination. */
-        if (out_degrees->size() < 2) {
-          uniform_int<std::size_t> x(0, n);
-          current.first  = x(*gen);
-          do {
-            current.second = x(*gen);
-          } while (current.first == current.second && !allow_self_loops);
-          degrees_left = 0;
-          out_degrees->clear();
-          return;
-        }
-
-        uniform_int<std::size_t> x(0, out_degrees->size()-1);
-
-        // Select source vertex
-        source = x(*gen);
-        if ((*out_degrees)[source].second == 0) {
-          (*out_degrees)[source] = out_degrees->back();
-          out_degrees->pop_back();
-          continue;
-        } 
-
-        // Select target vertex
-        target = x(*gen);
-        if ((*out_degrees)[target].second == 0) {
-          (*out_degrees)[target] = out_degrees->back();
-          out_degrees->pop_back();
-          continue;
-        } else if (source != target 
-                   || (allow_self_loops && (*out_degrees)[source].second > 2)) {
-          break;
-        }
-      }
-
-      // Update degree counts
-      --(*out_degrees)[source].second;
-      --degrees_left;
-      --(*out_degrees)[target].second;
-      --degrees_left;
-      current.first  = (*out_degrees)[source].first;
-      current.second = (*out_degrees)[target].first;
-    }
-
-    RandomGenerator* gen;
-    std::size_t n;
-    shared_ptr<out_degrees_t> out_degrees;
-    std::size_t degrees_left;
-    bool allow_self_loops;
-    value_type current;
-  };
-
-} // end namespace boost
-
-#endif // BOOST_GRAPH_PLOD_GENERATOR_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/random_layout.hpp b/deal.II/contrib/boost/include/boost/graph/random_layout.hpp
deleted file mode 100644 (file)
index b65950d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2004 The Trustees of Indiana University.
-
-// 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)
-
-//  Authors: Douglas Gregor
-//           Andrew Lumsdaine
-#ifndef BOOST_GRAPH_RANDOM_LAYOUT_HPP
-#define BOOST_GRAPH_RANDOM_LAYOUT_HPP
-
-#include <boost/graph/graph_traits.hpp>
-#include <boost/random/uniform_int.hpp>
-#include <boost/random/uniform_01.hpp>
-#include <boost/random/uniform_real.hpp>
-#include <boost/type_traits/is_integral.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace boost {
-
-template<typename Graph, typename PositionMap, typename Dimension, 
-         typename RandomNumberGenerator>
-void
-random_graph_layout(const Graph& g, PositionMap position_map,
-                    Dimension minX, Dimension maxX, 
-                    Dimension minY, Dimension maxY,
-                    RandomNumberGenerator& gen)
-{
-  typedef typename mpl::if_<is_integral<Dimension>,
-                            uniform_int<Dimension>,
-                            uniform_real<Dimension> >::type distrib_t;
-  typedef typename mpl::if_<is_integral<Dimension>,
-                            RandomNumberGenerator&,
-                            uniform_01<RandomNumberGenerator, Dimension> >
-    ::type gen_t;
-
-  gen_t my_gen(gen);
-  distrib_t x(minX, maxX);
-  distrib_t y(minY, maxY);
-  typename graph_traits<Graph>::vertex_iterator vi, vi_end;
-  for(tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi) {
-    position_map[*vi].x = x(my_gen);
-    position_map[*vi].y = y(my_gen);
-  }
-}
-
-} // end namespace boost
-
-#endif // BOOST_GRAPH_RANDOM_LAYOUT_HPP
diff --git a/deal.II/contrib/boost/include/boost/graph/subgraph.hpp b/deal.II/contrib/boost/include/boost/graph/subgraph.hpp
deleted file mode 100644 (file)
index 91d2e05..0000000
+++ /dev/null
@@ -1,872 +0,0 @@
-//=======================================================================
-// Copyright 2001 University of Notre Dame.
-// Authors: Jeremy G. Siek and Lie-Quan Lee
-//
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
-//=======================================================================
-
-#ifndef BOOST_SUBGRAPH_HPP
-#define BOOST_SUBGRAPH_HPP
-
-// UNDER CONSTRUCTION
-
-#include <boost/config.hpp>
-#include <list>
-#include <vector>
-#include <map>
-#include <cassert>
-#include <boost/graph/graph_traits.hpp>
-#include <boost/graph/properties.hpp>
-#include <boost/iterator/indirect_iterator.hpp>
-
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-namespace boost {
-
-  struct subgraph_tag { };
-
-  // Invariants of an induced subgraph:
-  //   - If vertex u is in subgraph g, then u must be in g.parent().
-  //   - If edge e is in subgraph g, then e must be in g.parent().
-  //   - If edge e=(u,v) is in the root graph, then edge e
-  //     is also in any subgraph that contains both vertex u and v.
-
-  // The Graph template parameter must have a vertex_index
-  // and edge_index internal property. It is assumed that
-  // the vertex indices are assigned automatically by the
-  // graph during a call to add_vertex(). It is not
-  // assumed that the edge vertices are assigned automatically,
-  // they are explicitly assigned here.
-
-  template <typename Graph>
-  class subgraph {
-    typedef graph_traits<Graph> Traits;
-    typedef std::list<subgraph<Graph>*> ChildrenList;
-  public:
-    // Graph requirements
-    typedef typename Traits::vertex_descriptor         vertex_descriptor;
-    typedef typename Traits::edge_descriptor           edge_descriptor;
-    typedef typename Traits::directed_category         directed_category;
-    typedef typename Traits::edge_parallel_category    edge_parallel_category;
-    typedef typename Traits::traversal_category        traversal_category;
-
-    static vertex_descriptor null_vertex()
-    {
-      return Traits::null_vertex();
-    }
-
-
-    // IncidenceGraph requirements
-    typedef typename Traits::out_edge_iterator         out_edge_iterator;
-    typedef typename Traits::degree_size_type          degree_size_type;
-
-    // AdjacencyGraph requirements
-    typedef typename Traits::adjacency_iterator        adjacency_iterator;
-
-    // VertexListGraph requirements
-    typedef typename Traits::vertex_iterator           vertex_iterator;
-    typedef typename Traits::vertices_size_type        vertices_size_type;
-
-    // EdgeListGraph requirements
-    typedef typename Traits::edge_iterator             edge_iterator;
-    typedef typename Traits::edges_size_type           edges_size_type;
-
-    typedef typename Traits::in_edge_iterator          in_edge_iterator;
-
-    typedef typename Graph::edge_property_type         edge_property_type;
-    typedef typename Graph::vertex_property_type       vertex_property_type;
-    typedef subgraph_tag                               graph_tag;
-    typedef Graph                                      graph_type;
-    typedef typename Graph::graph_property_type        graph_property_type;
-
-    // Constructors
-
-    // Create the main graph, the root of the subgraph tree
-    subgraph()
-      : m_parent(0), m_edge_counter(0)
-    { }
-    subgraph(const graph_property_type& p)
-      : m_graph(p), m_parent(0), m_edge_counter(0)
-    { }
-    subgraph(vertices_size_type n,
-             const graph_property_type& p = graph_property_type())
-      : m_graph(n, p), m_parent(0), m_edge_counter(0), m_global_vertex(n)
-    {
-      typename Graph::vertex_iterator v, v_end;
-      vertices_size_type i = 0;
-      for (tie(v, v_end) = vertices(m_graph); v != v_end; ++v)
-        m_global_vertex[i++] = *v;
-    }
-
-    // copy constructor
-    subgraph(const subgraph& x)
-      : m_graph(x.m_graph), m_parent(x.m_parent),
-      m_edge_counter(x.m_edge_counter),
-      m_global_vertex(x.m_global_vertex),
-      m_global_edge(x.m_global_edge)
-    {
-      // Do a deep copy
-      for (typename ChildrenList::const_iterator i = x.m_children.begin();
-           i != x.m_children.end(); ++i)
-        m_children.push_back(new subgraph<Graph>( **i ));
-    }
-
-
-    ~subgraph() {
-      for (typename ChildrenList::iterator i = m_children.begin();
-           i != m_children.end(); ++i)
-        delete *i;
-    }
-
-
-    // Create a subgraph
-    subgraph<Graph>& create_subgraph() {
-      m_children.push_back(new subgraph<Graph>());
-      m_children.back()->m_parent = this;
-      return *m_children.back();
-    }
-
-    // Create a subgraph with the specified vertex set.
-    template <typename VertexIterator>
-    subgraph<Graph>& create_subgraph(VertexIterator first,
-                                     VertexIterator last)
-    {
-      m_children.push_back(new subgraph<Graph>());
-      m_children.back()->m_parent = this;
-      for (; first != last; ++first)
-        add_vertex(*first, *m_children.back());
-      return *m_children.back();
-    }
-
-    // local <-> global descriptor conversion functions
-    vertex_descriptor local_to_global(vertex_descriptor u_local) const
-    {
-      return m_global_vertex[u_local];
-    }
-    vertex_descriptor global_to_local(vertex_descriptor u_global) const
-    {
-      vertex_descriptor u_local; bool in_subgraph;
-      tie(u_local, in_subgraph) = this->find_vertex(u_global);
-      assert(in_subgraph == true);
-      return u_local;
-    }
-    edge_descriptor local_to_global(edge_descriptor e_local) const
-    {
-      return m_global_edge[get(get(edge_index, m_graph), e_local)];
-    }
-    edge_descriptor global_to_local(edge_descriptor e_global) const
-    {
-      return
-        (*m_local_edge.find(get(get(edge_index, root().m_graph), e_global))).second;
-    }
-
-    // Is vertex u (of the root graph) contained in this subgraph?
-    // If so, return the matching local vertex.
-    std::pair<vertex_descriptor, bool>
-    find_vertex(vertex_descriptor u_global) const
-    {
-      typename std::map<vertex_descriptor, vertex_descriptor>::const_iterator
-        i = m_local_vertex.find(u_global);
-      bool valid = i != m_local_vertex.end();
-      return std::make_pair((valid ? (*i).second : null_vertex()), valid);
-    }
-
-    // Return the parent graph.
-    subgraph& parent() { return *m_parent; }
-    const subgraph& parent() const { return *m_parent; }
-
-    bool is_root() const { return m_parent == 0; }
-
-    // Return the root graph of the subgraph tree.
-    subgraph& root() {
-      if (this->is_root())
-        return *this;
-      else
-        return m_parent->root();
-    }
-    const subgraph& root() const {
-      if (this->is_root())
-        return *this;
-      else
-        return m_parent->root();
-    }
-
-    // Return the children subgraphs of this graph/subgraph.
-    // Use a list of pointers because the VC++ std::list doesn't like
-    // storing incomplete type.
-    typedef indirect_iterator<
-        typename ChildrenList::const_iterator
-      , subgraph<Graph>
-      , std::bidirectional_iterator_tag
-    >
-    children_iterator;
-
-    typedef indirect_iterator<
-        typename ChildrenList::const_iterator
-      , subgraph<Graph> const
-      , std::bidirectional_iterator_tag
-    >
-    const_children_iterator;
-
-    std::pair<const_children_iterator, const_children_iterator>
-    children() const
-    {
-      return std::make_pair(const_children_iterator(m_children.begin()),
-                            const_children_iterator(m_children.end()));
-    }
-
-    std::pair<children_iterator, children_iterator>
-    children()
-    {
-      return std::make_pair(children_iterator(m_children.begin()),
-                            children_iterator(m_children.end()));
-    }
-
-    std::size_t num_children() const { return m_children.size(); }
-
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-    // Bundled properties support
-    template<typename Descriptor>
-    typename graph::detail::bundled_result<Graph, Descriptor>::type&
-    operator[](Descriptor x)
-    { 
-      if (m_parent == 0) return m_graph[x];
-      else return root().m_graph[local_to_global(x)];
-    }
-
-    template<typename Descriptor>
-    typename graph::detail::bundled_result<Graph, Descriptor>::type const&
-    operator[](Descriptor x) const
-    { 
-      if (m_parent == 0) return m_graph[x];
-      else return root().m_graph[local_to_global(x)];
-    }
-#endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-
-    //  private:
-    typedef typename property_map<Graph, edge_index_t>::type EdgeIndexMap;
-    typedef typename property_traits<EdgeIndexMap>::value_type edge_index_type;
-    BOOST_STATIC_ASSERT((!is_same<edge_index_type, 
-                        boost::detail::error_property_not_found>::value));
-
-    Graph m_graph;
-    subgraph<Graph>* m_parent;
-    edge_index_type m_edge_counter; // for generating unique edge indices
-    ChildrenList m_children;
-    std::vector<vertex_descriptor> m_global_vertex; // local -> global
-    std::map<vertex_descriptor, vertex_descriptor> m_local_vertex;  // global -> local
-    std::vector<edge_descriptor> m_global_edge;              // local -> global
-    std::map<edge_index_type, edge_descriptor> m_local_edge; // global -> local
-
-    edge_descriptor
-    local_add_edge(vertex_descriptor u_local, vertex_descriptor v_local,
-                   edge_descriptor e_global)
-    {
-      edge_descriptor e_local;
-      bool inserted;
-      tie(e_local, inserted) = add_edge(u_local, v_local, m_graph);
-      put(edge_index, m_graph, e_local, m_edge_counter++);
-      m_global_edge.push_back(e_global);
-      m_local_edge[get(get(edge_index, this->root()), e_global)] = e_local;
-      return e_local;
-    }
-
-  };
-
-#ifndef BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-  template<typename Graph>
-  struct vertex_bundle_type<subgraph<Graph> > : vertex_bundle_type<Graph> { };
-
-  template<typename Graph>
-  struct edge_bundle_type<subgraph<Graph> > : edge_bundle_type<Graph> { };
-#endif // BOOST_GRAPH_NO_BUNDLED_PROPERTIES
-
-  //===========================================================================
-  // Functions special to the Subgraph Class
-
-  template <typename G>
-  typename subgraph<G>::vertex_descriptor
-  add_vertex(typename subgraph<G>::vertex_descriptor u_global,
-             subgraph<G>& g)
-  {
-    assert(!g.is_root());
-    typename subgraph<G>::vertex_descriptor u_local, v_global, uu_global;
-    typename subgraph<G>::edge_descriptor e_global;
-
-    u_local = add_vertex(g.m_graph);
-    g.m_global_vertex.push_back(u_global);
-    g.m_local_vertex[u_global] = u_local;
-
-    subgraph<G>& r = g.root();
-
-    // remember edge global and local maps
-    {
-      typename subgraph<G>::out_edge_iterator ei, ei_end;
-      for (tie(ei, ei_end) = out_edges(u_global, r);
-           ei != ei_end; ++ei) {
-        e_global = *ei;
-        v_global = target(e_global, r);
-        if (g.find_vertex(v_global).second == true)
-          g.local_add_edge(u_local, g.global_to_local(v_global), e_global);
-      }
-    }
-    if (is_directed(g)) { // not necessary for undirected graph
-      typename subgraph<G>::vertex_iterator vi, vi_end;
-      typename subgraph<G>::out_edge_iterator ei, ei_end;
-      for (tie(vi, vi_end) = vertices(r); vi != vi_end; ++vi) {
-        v_global = *vi;
-        if (g.find_vertex(v_global).second)
-          for (tie(ei, ei_end) = out_edges(*vi, r); ei != ei_end; ++ei) {
-            e_global = *ei;
-            uu_global = target(e_global, r);
-            if (uu_global == u_global && g.find_vertex(v_global).second)
-              g.local_add_edge(g.global_to_local(v_global), u_local, e_global);
-          }
-      }
-    }
-
-    return u_local;
-  }
-
-  //===========================================================================
-  // Functions required by the IncidenceGraph concept
-
-  template <typename G>
-  std::pair<typename graph_traits<G>::out_edge_iterator,
-            typename graph_traits<G>::out_edge_iterator>
-  out_edges(typename graph_traits<G>::vertex_descriptor u_local,
-            const subgraph<G>& g)
-    { return out_edges(u_local, g.m_graph); }
-
-  template <typename G>
-  typename graph_traits<G>::degree_size_type
-  out_degree(typename graph_traits<G>::vertex_descriptor u_local,
-             const subgraph<G>& g)
-    { return out_degree(u_local, g.m_graph); }
-
-  template <typename G>
-  typename graph_traits<G>::vertex_descriptor
-  source(typename graph_traits<G>::edge_descriptor e_local,
-         const subgraph<G>& g)
-    { return source(e_local, g.m_graph); }
-
-  template <typename G>
-  typename graph_traits<G>::vertex_descriptor
-  target(typename graph_traits<G>::edge_descriptor e_local,
-         const subgraph<G>& g)
-    { return target(e_local, g.m_graph); }
-
-  //===========================================================================
-  // Functions required by the BidirectionalGraph concept
-
-  template <typename G>
-  std::pair<typename graph_traits<G>::in_edge_iterator,
-            typename graph_traits<G>::in_edge_iterator>
-  in_edges(typename graph_traits<G>::vertex_descriptor u_local,
-            const subgraph<G>& g)
-    { return in_edges(u_local, g.m_graph); }
-
-  template <typename G>
-  typename graph_traits<G>::degree_size_type
-  in_degree(typename graph_traits<G>::vertex_descriptor u_local,
-             const subgraph<G>& g)
-    { return in_degree(u_local, g.m_graph); }
-
-  template <typename G>
-  typename graph_traits<G>::degree_size_type
-  degree(typename graph_traits<G>::vertex_descriptor u_local,
-             const subgraph<G>& g)
-    { return degree(u_local, g.m_graph); }
-
-  //===========================================================================
-  // Functions required by the AdjacencyGraph concept
-
-  template <typename G>
-  std::pair<typename subgraph<G>::adjacency_iterator,
-            typename subgraph<G>::adjacency_iterator>
-  adjacent_vertices(typename subgraph<G>::vertex_descriptor u_local,
-                    const subgraph<G>& g)
-    { return adjacent_vertices(u_local, g.m_graph); }
-
-  //===========================================================================
-  // Functions required by the VertexListGraph concept
-
-  template <typename G>
-  std::pair<typename subgraph<G>::vertex_iterator,
-            typename subgraph<G>::vertex_iterator>
-  vertices(const subgraph<G>& g)
-    { return vertices(g.m_graph); }
-
-  template <typename G>
-  typename subgraph<G>::vertices_size_type
-  num_vertices(const subgraph<G>& g)
-    { return num_vertices(g.m_graph); }
-
-  //===========================================================================
-  // Functions required by the EdgeListGraph concept
-
-  template <typename G>
-  std::pair<typename subgraph<G>::edge_iterator,
-            typename subgraph<G>::edge_iterator>
-  edges(const subgraph<G>& g)
-    { return edges(g.m_graph); }
-
-  template <typename G>
-  typename subgraph<G>::edges_size_type
-  num_edges(const subgraph<G>& g)
-    { return num_edges(g.m_graph); }
-
-  //===========================================================================
-  // Functions required by the AdjacencyMatrix concept
-
-  template <typename G>
-  std::pair<typename subgraph<G>::edge_descriptor, bool>
-  edge(typename subgraph<G>::vertex_descriptor u_local,
-       typename subgraph<G>::vertex_descriptor v_local,
-       const subgraph<G>& g)
-  {
-    return edge(u_local, v_local, g.m_graph);
-  }
-
-  //===========================================================================
-  // Functions required by the MutableGraph concept
-
-  namespace detail {
-
-    template <typename Vertex, typename Edge, typename Graph>
-    void add_edge_recur_down
-    (Vertex u_global, Vertex v_global, Edge e_global, subgraph<Graph>& g);
-
-    template <typename Vertex, typename Edge, typename Children, typename G>
-    void children_add_edge(Vertex u_global, Vertex v_global, Edge e_global,
-                           Children& c, subgraph<G>* orig)
-    {
-      for (typename Children::iterator i = c.begin(); i != c.end(); ++i)
-        if ((*i)->find_vertex(u_global).second
-            && (*i)->find_vertex(v_global).second)
-          add_edge_recur_down(u_global, v_global, e_global, **i, orig);
-    }
-
-    template <typename Vertex, typename Edge, typename Graph>
-    void add_edge_recur_down
-      (Vertex u_global, Vertex v_global, Edge e_global, subgraph<Graph>& g,
-       subgraph<Graph>* orig)
-    {
-      if (&g != orig ) {
-        // add local edge only if u_global and v_global are in subgraph g
-        Vertex u_local, v_local;
-        bool u_in_subgraph, v_in_subgraph;
-        tie(u_local, u_in_subgraph) = g.find_vertex(u_global);
-        tie(v_local, v_in_subgraph) = g.find_vertex(v_global);
-        if (u_in_subgraph && v_in_subgraph)
-          g.local_add_edge(u_local, v_local, e_global);
-      }
-      children_add_edge(u_global, v_global, e_global, g.m_children, orig);
-    }
-
-    template <typename Vertex, typename Graph>
-    std::pair<typename subgraph<Graph>::edge_descriptor, bool>
-    add_edge_recur_up(Vertex u_global, Vertex v_global,
-                      const typename Graph::edge_property_type& ep,
-                      subgraph<Graph>& g, subgraph<Graph>* orig)
-    {
-      if (g.is_root()) {
-        typename subgraph<Graph>::edge_descriptor e_global;
-        bool inserted;
-        tie(e_global, inserted) = add_edge(u_global, v_global, ep, g.m_graph);
-        put(edge_index, g.m_graph, e_global, g.m_edge_counter++);
-        g.m_global_edge.push_back(e_global);
-        children_add_edge(u_global, v_global, e_global, g.m_children, orig);
-        return std::make_pair(e_global, inserted);
-      } else
-        return add_edge_recur_up(u_global, v_global, ep, *g.m_parent, orig);
-    }
-
-  } // namespace detail
-
-  // Add an edge to the subgraph g, specified by the local vertex
-  // descriptors u and v. In addition, the edge will be added to any
-  // other subgraphs which contain vertex descriptors u and v.
-
-  template <typename G>
-  std::pair<typename subgraph<G>::edge_descriptor, bool>
-  add_edge(typename subgraph<G>::vertex_descriptor u_local,
-           typename subgraph<G>::vertex_descriptor v_local,
-           const typename G::edge_property_type& ep,
-           subgraph<G>& g)
-  {
-    if (g.is_root()) // u_local and v_local are really global
-      return detail::add_edge_recur_up(u_local, v_local, ep, g, &g);
-    else {
-      typename subgraph<G>::edge_descriptor e_local, e_global;
-      bool inserted;
-      tie(e_global, inserted) = detail::add_edge_recur_up
-        (g.local_to_global(u_local), g.local_to_global(v_local), ep, g, &g);
-      e_local = g.local_add_edge(u_local, v_local, e_global);
-      return std::make_pair(e_local, inserted);
-    }
-  }
-
-  template <typename G>
-  std::pair<typename subgraph<G>::edge_descriptor, bool>
-  add_edge(typename subgraph<G>::vertex_descriptor u,
-           typename subgraph<G>::vertex_descriptor v,
-           subgraph<G>& g)
-  {
-    typename G::edge_property_type ep;
-    return add_edge(u, v, ep, g);
-  }
-
-  namespace detail {
-
-    //-------------------------------------------------------------------------
-    // implementation of remove_edge(u,v,g)
-
-    template <typename Vertex, typename Graph>
-    void remove_edge_recur_down(Vertex u_global, Vertex v_global,
-                                subgraph<Graph>& g);
-
-    template <typename Vertex, typename Children>
-    void children_remove_edge(Vertex u_global, Vertex v_global,
-                              Children& c)
-    {
-      for (typename Children::iterator i = c.begin(); i != c.end(); ++i)
-        if ((*i)->find_vertex(u_global).second
-            && (*i)->find_vertex(v_global).second)
-          remove_edge_recur_down(u_global, v_global, **i);
-    }
-
-    template <typename Vertex, typename Graph>
-    void remove_edge_recur_down(Vertex u_global, Vertex v_global,
-                                subgraph<Graph>& g)
-    {
-      Vertex u_local, v_local;
-      u_local = g.m_local_vertex[u_global];
-      v_local = g.m_local_vertex[v_global];
-      remove_edge(u_local, v_local, g.m_graph);
-      children_remove_edge(u_global, v_global, g.m_children);
-    }
-
-    template <typename Vertex, typename Graph>
-    void remove_edge_recur_up(Vertex u_global, Vertex v_global,
-                              subgraph<Graph>& g)
-    {
-      if (g.is_root()) {
-        remove_edge(u_global, v_global, g.m_graph);
-        children_remove_edge(u_global, v_global, g.m_children);
-      } else
-        remove_edge_recur_up(u_global, v_global, *g.m_parent);
-    }
-
-    //-------------------------------------------------------------------------
-    // implementation of remove_edge(e,g)
-
-    template <typename Edge, typename Graph>
-    void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g);
-
-    template <typename Edge, typename Children>
-    void children_remove_edge(Edge e_global, Children& c)
-    {
-      for (typename Children::iterator i = c.begin(); i != c.end(); ++i)
-        if ((*i)->find_vertex(source(e_global, **i)).second
-            && (*i)->find_vertex(target(e_global, **i)).second)
-          remove_edge_recur_down(source(e_global, **i),
-                                 target(e_global, **i), **i);
-    }
-
-    template <typename Edge, typename Graph>
-    void remove_edge_recur_down(Edge e_global, subgraph<Graph>& g)
-    {
-      remove_edge(g.global_to_local(e_global), g.m_graph);
-      children_remove_edge(e_global, g.m_children);
-    }
-
-    template <typename Edge, typename Graph>
-    void remove_edge_recur_up(Edge e_global, subgraph<Graph>& g)
-    {
-      if (g.is_root()) {
-        remove_edge(e_global, g.m_graph);
-        children_remove_edge(e_global, g.m_children);
-      } else
-        remove_edge_recur_up(e_global, *g.m_parent);
-    }
-
-  } // namespace detail
-
-  template <typename G>
-  void
-  remove_edge(typename subgraph<G>::vertex_descriptor u_local,
-              typename subgraph<G>::vertex_descriptor v_local,
-              subgraph<G>& g)
-  {
-    if (g.is_root())
-      detail::remove_edge_recur_up(u_local, v_local, g);
-    else
-      detail::remove_edge_recur_up(g.local_to_global(u_local),
-                                   g.local_to_global(v_local), g);
-  }
-
-  template <typename G>
-  void
-  remove_edge(typename subgraph<G>::edge_descriptor e_local,
-              subgraph<G>& g)
-  {
-    if (g.is_root())
-      detail::remove_edge_recur_up(e_local, g);
-    else
-      detail::remove_edge_recur_up(g.local_to_global(e_local), g);
-  }
-
-  template <typename Predicate, typename G>
-  void
-  remove_edge_if(Predicate p, subgraph<G>& g)
-  {
-    // This is wrong...
-    remove_edge_if(p, g.m_graph);
-  }
-
-  template <typename G>
-  void
-  clear_vertex(typename subgraph<G>::vertex_descriptor v_local,
-               subgraph<G>& g)
-  {
-    // this is wrong...
-    clear_vertex(v_local, g.m_graph);
-  }
-
-  namespace detail {
-
-    template <typename G>
-    typename subgraph<G>::vertex_descriptor
-    add_vertex_recur_up(subgraph<G>& g)
-    {
-      typename subgraph<G>::vertex_descriptor u_local, u_global;
-      if (g.is_root()) {
-        u_global = add_vertex(g.m_graph);
-        g.m_global_vertex.push_back(u_global);
-      } else {
-        u_global = add_vertex_recur_up(*g.m_parent);
-        u_local = add_vertex(g.m_graph);
-        g.m_global_vertex.push_back(u_global);
-        g.m_local_vertex[u_global] = u_local;
-      }
-      return u_global;
-    }
-
-  } // namespace detail
-
-  template <typename G>
-  typename subgraph<G>::vertex_descriptor
-  add_vertex(subgraph<G>& g)
-  {
-    typename subgraph<G>::vertex_descriptor  u_local, u_global;
-    if (g.is_root()) {
-      u_global = add_vertex(g.m_graph);
-      g.m_global_vertex.push_back(u_global);
-      u_local = u_global;
-    } else {
-      u_global = detail::add_vertex_recur_up(g.parent());
-      u_local = add_vertex(g.m_graph);
-      g.m_global_vertex.push_back(u_global);
-      g.m_local_vertex[u_global] = u_local;
-    }
-    return u_local;
-  }
-
-  template <typename G>
-  void remove_vertex(typename subgraph<G>::vertex_descriptor u,
-                     subgraph<G>& g)
-  {
-    // UNDER CONSTRUCTION
-    assert(false);
-  }
-
-
-  //===========================================================================
-  // Functions required by the PropertyGraph concept
-
-  template <typename GraphPtr, typename PropertyMap, typename Tag>
-  class subgraph_global_property_map
-    : public put_get_helper<
-        typename property_traits<PropertyMap>::reference,
-        subgraph_global_property_map<GraphPtr, PropertyMap, Tag> >
-  {
-    typedef property_traits<PropertyMap> Traits;
-  public:
-    typedef typename Traits::category category;
-    typedef typename Traits::value_type value_type;
-    typedef typename Traits::key_type key_type;
-    typedef typename Traits::reference reference;
-
-    subgraph_global_property_map() { }
-
-    subgraph_global_property_map(GraphPtr g)
-      : m_g(g) { }
-
-    inline reference operator[](key_type e_local) const {
-      PropertyMap pmap = get(Tag(), m_g->root().m_graph);
-      if (m_g->m_parent == 0)
-        return pmap[e_local];
-      else
-        return pmap[m_g->local_to_global(e_local)];
-    }
-    GraphPtr m_g;
-  };
-
-  template <typename GraphPtr, typename PropertyMap, typename Tag>
-  class subgraph_local_property_map
-    : public put_get_helper<
-        typename property_traits<PropertyMap>::reference,
-        subgraph_local_property_map<GraphPtr, PropertyMap, Tag> >
-  {
-    typedef property_traits<PropertyMap> Traits;
-  public:
-    typedef typename Traits::category category;
-    typedef typename Traits::value_type value_type;
-    typedef typename Traits::key_type key_type;
-    typedef typename Traits::reference reference;
-
-    subgraph_local_property_map() { }
-
-    subgraph_local_property_map(GraphPtr g)
-      : m_g(g) { }
-
-    inline reference operator[](key_type e_local) const {
-      PropertyMap pmap = get(Tag(), *m_g);
-      return pmap[e_local];
-    }
-    GraphPtr m_g;
-  };
-
-  namespace detail {
-
-    struct subgraph_any_pmap {
-      template <class Tag, class SubGraph, class Property>
-      class bind_ {
-        typedef typename SubGraph::graph_type Graph;
-        typedef SubGraph* SubGraphPtr;
-        typedef const SubGraph* const_SubGraphPtr;
-        typedef typename property_map<Graph, Tag>::type PMap;
-        typedef typename property_map<Graph, Tag>::const_type const_PMap;
-      public:
-        typedef subgraph_global_property_map<SubGraphPtr, PMap, Tag> type;
-        typedef subgraph_global_property_map<const_SubGraphPtr, const_PMap, Tag>
-          const_type;
-      };
-    };
-    struct subgraph_id_pmap {
-      template <class Tag, class SubGraph, class Property>
-      struct bind_ {
-        typedef typename SubGraph::graph_type Graph;
-        typedef SubGraph* SubGraphPtr;
-        typedef const SubGraph* const_SubGraphPtr;
-        typedef typename property_map<Graph, Tag>::type PMap;
-        typedef typename property_map<Graph, Tag>::const_type const_PMap;
-      public:
-        typedef subgraph_local_property_map<SubGraphPtr, PMap, Tag> type;
-        typedef subgraph_local_property_map<const_SubGraphPtr, const_PMap, Tag>
-          const_type;
-      };
-    };
-    template <class Tag>
-    struct subgraph_choose_pmap_helper {
-      typedef subgraph_any_pmap type;
-    };
-    template <>
-    struct subgraph_choose_pmap_helper<vertex_index_t> {
-      typedef subgraph_id_pmap type;
-    };
-    template <class Tag, class Graph, class Property>
-    struct subgraph_choose_pmap {
-      typedef typename subgraph_choose_pmap_helper<Tag>::type Helper;
-      typedef typename Helper::template bind_<Tag, Graph, Property> Bind;
-      typedef typename Bind::type type;
-      typedef typename Bind::const_type const_type;
-    };
-    struct subgraph_property_generator {
-      template <class SubGraph, class Property, class Tag>
-      struct bind_ {
-        typedef subgraph_choose_pmap<Tag, SubGraph, Property> Choice;
-        typedef typename Choice::type type;
-        typedef typename Choice::const_type const_type;
-      };
-    };
-
-  } // namespace detail
-
-  template <>
-  struct vertex_property_selector<subgraph_tag> {
-    typedef detail::subgraph_property_generator type;
-  };
-
-  template <>
-  struct edge_property_selector<subgraph_tag> {
-    typedef detail::subgraph_property_generator type;
-  };
-
-  template <typename G, typename Property>
-  typename property_map< subgraph<G>, Property>::type
-  get(Property, subgraph<G>& g)
-  {
-    typedef typename property_map< subgraph<G>, Property>::type PMap;
-    return PMap(&g);
-  }
-
-  template <typename G, typename Property>
-  typename property_map< subgraph<G>, Property>::const_type
-  get(Property, const subgraph<G>& g)
-  {
-    typedef typename property_map< subgraph<G>, Property>::const_type PMap;
-    return PMap(&g);
-  }
-
-  template <typename G, typename Property, typename Key>
-  typename property_traits<
-    typename property_map< subgraph<G>, Property>::const_type
-  >::value_type
-  get(Property, const subgraph<G>& g, const Key& k)
-  {
-    typedef typename property_map< subgraph<G>, Property>::const_type PMap;
-    PMap pmap(&g);
-    return pmap[k];
-  }
-
-  template <typename G, typename Property, typename Key, typename Value>
-  void
-  put(Property, subgraph<G>& g, const Key& k, const Value& val)
-  {
-    typedef typename property_map< subgraph<G>, Property>::type PMap;
-    PMap pmap(&g);
-    pmap[k] = val;
-  }
-
-  template <typename G, typename Tag>
-  inline
-  typename graph_property<G, Tag>::type&
-  get_property(subgraph<G>& g, Tag tag) {
-    return get_property(g.m_graph, tag);
-  }
-
-  template <typename G, typename Tag>
-  inline
-  const typename graph_property<G, Tag>::type&
-  get_property(const subgraph<G>& g, Tag tag) {
-    return get_property(g.m_graph, tag);
-  }
-
-  //===========================================================================
-  // Miscellaneous Functions
-
-  template <typename G>
-  typename subgraph<G>::vertex_descriptor
-  vertex(typename subgraph<G>::vertices_size_type n, const subgraph<G>& g)
-  {
-    return vertex(n, g.m_graph);
-  }
-
-} // namespace boost
-
-#endif // BOOST_SUBGRAPH_HPP
diff --git a/deal.II/contrib/boost/include/boost/iostreams/device/file_descriptor.hpp b/deal.II/contrib/boost/include/boost/iostreams/device/file_descriptor.hpp
deleted file mode 100644 (file)
index 65f5dc0..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
-// (C) Copyright 2003-2007 Jonathan Turkanis
-// 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.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Inspired by fdstream.hpp, (C) Copyright Nicolai M. Josuttis 2001,
-// available at http://www.josuttis.com/cppcode/fdstream.html.
-
-#ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <string>                          // file pathnames.
-#include <boost/cstdint.hpp>               // intmax_t.
-#include <boost/iostreams/categories.hpp>  // tags.
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/windows_posix.hpp>
-#include <boost/iostreams/detail/ios.hpp>  // openmode, seekdir, int types.
-#include <boost/iostreams/positioning.hpp>
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost { namespace iostreams {
-
-class BOOST_IOSTREAMS_DECL file_descriptor {
-public:
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    typedef void*  handle_type;  // A.k.a HANDLE
-#else
-    typedef int    handle_type;
-#endif
-    typedef char   char_type;
-    struct category
-        : seekable_device_tag,
-          closable_tag
-        { };
-    file_descriptor();
-    explicit file_descriptor(handle_type fd, bool close_on_exit = false);
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    explicit file_descriptor(int fd, bool close_on_exit = false);
-#endif
-    explicit file_descriptor( const std::string& path,
-                              BOOST_IOS::openmode mode =
-                                  BOOST_IOS::in | BOOST_IOS::out,
-                              BOOST_IOS::openmode base_mode =
-                                  BOOST_IOS::in | BOOST_IOS::out );
-    explicit file_descriptor( const char* path,
-                              BOOST_IOS::openmode mode =
-                                  BOOST_IOS::in | BOOST_IOS::out,
-                              BOOST_IOS::openmode base_mode =
-                                  BOOST_IOS::in | BOOST_IOS::out );
-    void open( const std::string& path,
-               BOOST_IOS::openmode =
-                   BOOST_IOS::in | BOOST_IOS::out,
-               BOOST_IOS::openmode base_mode =
-                   BOOST_IOS::in | BOOST_IOS::out );
-    void open( const char* path,
-               BOOST_IOS::openmode =
-                   BOOST_IOS::in | BOOST_IOS::out,
-               BOOST_IOS::openmode base_mode =
-                   BOOST_IOS::in | BOOST_IOS::out );
-    bool is_open() const { return pimpl_->flags_ != 0; }
-    std::streamsize read(char_type* s, std::streamsize n);
-    std::streamsize write(const char_type* s, std::streamsize n);
-    std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
-    void close();
-    handle_type handle() const { return pimpl_->handle_; }
-private:
-    struct impl {
-        impl() : 
-            #ifdef BOOST_IOSTREAMS_WINDOWS
-                handle_(reinterpret_cast<handle_type>(-1)), 
-            #else
-                handle_(-1),
-            #endif
-                flags_(0) 
-            { }
-        impl(handle_type fd, bool close_on_exit)
-            : handle_(fd), flags_(0)
-        { if (close_on_exit) flags_ |= impl::close_on_exit; }
-        ~impl() 
-        { if (flags_ & close_on_exit) close_impl(*this); }
-        enum flags {
-            close_on_exit = 1,
-            append = 4
-        };
-        handle_type  handle_;
-        int          flags_;
-    };
-    friend struct impl;
-
-    static void close_impl(impl&);
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    static handle_type int_to_handle(int fd);
-#endif
-
-    shared_ptr<impl> pimpl_;
-};
-
-struct file_descriptor_source : private file_descriptor {
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    typedef void*  handle_type;  // A.k.a HANDLE
-#else
-    typedef int    handle_type;
-#endif
-    typedef char   char_type;
-    struct category
-      : input_seekable,
-        device_tag,
-        closable_tag
-      { };
-    using file_descriptor::read;
-    using file_descriptor::seek;
-    using file_descriptor::open;
-    using file_descriptor::is_open;
-    using file_descriptor::close;
-    using file_descriptor::handle;
-    file_descriptor_source() { }
-    explicit file_descriptor_source(handle_type fd, bool close_on_exit = false)
-        : file_descriptor(fd, close_on_exit)
-        { }
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    explicit file_descriptor_source(int fd, bool close_on_exit = false)
-        : file_descriptor(fd, close_on_exit)
-        { }
-#endif
-    explicit file_descriptor_source( const std::string& path,
-                                     BOOST_IOS::openmode m = BOOST_IOS::in )
-        : file_descriptor(path, m & ~BOOST_IOS::out, BOOST_IOS::in)
-        { }
-    explicit file_descriptor_source( const char* path,
-                                     BOOST_IOS::openmode m = BOOST_IOS::in )
-        : file_descriptor(path, m & ~BOOST_IOS::out, BOOST_IOS::in)
-        { }
-};
-
-struct file_descriptor_sink : private file_descriptor {
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    typedef void*  handle_type;  // A.k.a HANDLE
-#else
-    typedef int    handle_type;
-#endif
-    typedef char   char_type;
-    struct category
-      : output_seekable,
-        device_tag,
-        closable_tag
-      { };
-    using file_descriptor::write;
-    using file_descriptor::seek;
-    using file_descriptor::open;
-    using file_descriptor::is_open;
-    using file_descriptor::close;
-    using file_descriptor::handle;
-    file_descriptor_sink() { }
-    explicit file_descriptor_sink(handle_type fd, bool close_on_exit = false)
-        : file_descriptor(fd, close_on_exit)
-        { }
-#ifdef BOOST_IOSTREAMS_WINDOWS
-    explicit file_descriptor_sink(int fd, bool close_on_exit = false)
-        : file_descriptor(fd, close_on_exit)
-        { }
-#endif
-    explicit file_descriptor_sink( const std::string& path,
-                                   BOOST_IOS::openmode m = BOOST_IOS::out )
-        : file_descriptor(path, m & ~BOOST_IOS::in, BOOST_IOS::out)
-        { }
-    explicit file_descriptor_sink( const char* path,
-                                   BOOST_IOS::openmode m = BOOST_IOS::out )
-        : file_descriptor(path, m & ~BOOST_IOS::in, BOOST_IOS::out)
-        { }
-};
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
-
-#endif // #ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
diff --git a/deal.II/contrib/boost/include/boost/iostreams/device/mapped_file.hpp b/deal.II/contrib/boost/include/boost/iostreams/device/mapped_file.hpp
deleted file mode 100644 (file)
index 3a604c7..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
-// (C) Copyright 2003-2007 Jonathan Turkanis
-// (C) Copyright Craig Henderson 2002.   'boost/memmap.hpp' from sandbox
-// 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.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-//
-// This header and its accompanying source file libs/iostreams/memmap.cpp are
-// an adaptation of Craig Henderson's memmory mapped file library. The
-// interface has been revised significantly, but the underlying OS-specific
-// code is essentially the same, with some code from Boost.Filesystem
-// mixed in. (See notations in source.)
-//
-// The following changes have been made:
-//
-// 1. OS-specific code put in a .cpp file.
-// 2. Name of main class changed to mapped_file.
-// 3. mapped_file given an interface similar to std::fstream (open(),
-//    is_open(), close()) and std::string (data(), size(), begin(), end()).
-// 4. An additional class readonly_mapped_file has been provided as a
-//    convenience.
-// 5. [Obsolete: Error states are reported using filesystem::error_code.]
-// 6. Read-only or read-write states are specified using ios_base::openmode.
-// 7. Access to the underlying file handles and to security parameters
-//    has been removed.
-//
-
-#ifndef BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>                   // make sure size_t is in std.
-#include <cstddef>                            // size_t.
-#include <string>                             // pathnames.
-#include <utility>                            // pair.
-#include <boost/config.hpp>                   // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/close.hpp>
-#include <boost/iostreams/concepts.hpp>
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/ios.hpp>     // openmode.
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-struct mapped_file_impl;
-
-} // End namespace detail.
-
-struct mapped_file_params {
-    explicit mapped_file_params()
-    #if BOOST_WORKAROUND(BOOST_MSVC, < 1400) && defined(BOOST_RWSTD_VER) || \
-        defined(__BORLANDC__) && defined(_CPPLIB_VER)
-        /**/
-        : mode(std::ios_base::openmode(0)),
-    #else
-        : mode(),
-    #endif
-          offset(0), length(static_cast<std::size_t>(-1)),
-          new_file_size(0), hint(0)
-        { }
-    explicit mapped_file_params(const std::string& path)
-        : path(path),
-    #if BOOST_WORKAROUND(BOOST_MSVC, < 1400) && defined(BOOST_RWSTD_VER) || \
-        defined(__BORLANDC__) && defined(_CPPLIB_VER)
-          mode(std::ios_base::openmode(0)),
-    #else
-          mode(),
-    #endif
-          offset(0), length(static_cast<std::size_t>(-1)),
-          new_file_size(0), hint(0)
-        { }
-    std::string          path;
-    BOOST_IOS::openmode  mode;
-    stream_offset        offset;
-    std::size_t          length;
-    stream_offset        new_file_size;
-    const char*          hint;
-};
-
-//------------------Definition of mapped_file_source--------------------------//
-
-class BOOST_IOSTREAMS_DECL mapped_file_source {
-private:
-    struct safe_bool_helper { int x; };         // From Bronek Kozicki.
-    typedef int safe_bool_helper::* safe_bool;
-    friend struct operations<mapped_file_source>;
-public:
-    typedef char               char_type;
-    struct category
-        : public source_tag,
-          public direct_tag,
-          public closable_tag
-        { };
-    typedef std::size_t        size_type;
-    typedef const char*        iterator;
-    BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));
-
-    mapped_file_source() { }
-    explicit mapped_file_source(mapped_file_params);
-    explicit mapped_file_source( const std::string& path,
-                                 size_type length = max_length,
-                                 boost::intmax_t offset = 0 );
-
-    //--------------Stream interface------------------------------------------//
-
-    void open(mapped_file_params params);
-    void open( const std::string& path,
-               size_type length = max_length,
-               boost::intmax_t offset = 0 );
-    bool is_open() const;
-    void close();
-
-    operator safe_bool() const;
-    bool operator!() const;
-    BOOST_IOS::openmode mode() const;
-
-    //--------------Container interface---------------------------------------//
-
-    size_type size() const;
-    const char* data() const;
-    iterator begin() const;
-    iterator end() const;
-
-    //--------------Query admissible offsets----------------------------------//
-
-    // Returns the allocation granularity for virtual memory. Values passed
-    // as offsets must be multiples of this value.
-    static int alignment();
-private:
-    friend class mapped_file;
-    typedef detail::mapped_file_impl impl_type;
-    void open_impl(mapped_file_params);
-
-    boost::shared_ptr<impl_type> pimpl_;
-};
-
-//------------------Definition of mapped_file---------------------------------//
-
-class BOOST_IOSTREAMS_DECL mapped_file {
-private:
-    typedef mapped_file_source delegate_type;
-    delegate_type delegate_;
-    friend struct operations<mapped_file>;
-public:
-    typedef char                           char_type;
-    struct category
-        : public seekable_device_tag,
-          public direct_tag,
-          public closable_tag
-        { };
-    typedef mapped_file_source::size_type  size_type;
-    typedef char*                          iterator;
-    typedef const char*                    const_iterator;
-    BOOST_STATIC_CONSTANT(size_type, max_length = delegate_type::max_length);
-    mapped_file() { }
-    explicit mapped_file(mapped_file_params p);
-    explicit mapped_file( const std::string& path,
-                          BOOST_IOS::openmode mode =
-                              BOOST_IOS::in | BOOST_IOS::out,
-                          size_type length = max_length,
-                          stream_offset offset = 0 );
-
-    //--------------Conversion to readonly_mapped_file------------------------//
-
-    operator mapped_file_source&() { return delegate_; }
-    operator const mapped_file_source&() const { return delegate_; }
-
-    //--------------Stream interface------------------------------------------//
-
-    void open(mapped_file_params p);
-    void open( const std::string& path,
-               BOOST_IOS::openmode mode =
-                   BOOST_IOS::in | BOOST_IOS::out,
-               size_type length = max_length,
-               stream_offset offset = 0 );
-    bool is_open() const { return delegate_.is_open(); }
-    void close() { delegate_.close(); }
-    operator delegate_type::safe_bool() const { return delegate_; }
-    bool operator!() const { return !is_open(); }
-    BOOST_IOS::openmode mode() const { return delegate_.mode(); }
-
-    //--------------Container interface---------------------------------------//
-
-    size_type size() const { return delegate_.size(); }
-    char* data() const 
-    { 
-        return (mode() & BOOST_IOS::out) ?
-            const_cast<char*>(delegate_.data()) :
-            0;
-    }
-    const char* const_data() const { return delegate_.data(); }
-    iterator begin() const { return data(); }
-    const_iterator const_begin() const { return data(); }
-    iterator end() const { return data() + size(); }
-    const_iterator const_end() const { return data() + size(); }
-
-    //--------------Query admissible offsets----------------------------------//
-
-    // Returns the allocation granularity for virtual memory. Values passed
-    // as offsets must be multiples of this value.
-    static int alignment() { return mapped_file_source::alignment(); }
-};
-
-struct BOOST_IOSTREAMS_DECL mapped_file_sink : private mapped_file {
-    friend struct operations<mapped_file_sink>;
-    typedef char char_type;
-    struct category
-        : public sink_tag,
-          public direct_tag,
-          public closable_tag
-        { };
-    using mapped_file::close;
-    using mapped_file::size;
-    explicit mapped_file_sink(mapped_file_params p);
-    explicit mapped_file_sink( const std::string& path,
-                               size_type length = max_length,
-                               boost::intmax_t offset = 0 );
-    void open(mapped_file_params p);
-    void open( const std::string& path,
-               size_type length = max_length,
-               boost::intmax_t offset = 0 );
-};
-
-//------------------Specialization of direct_impl-----------------------------//
-
-template<>
-struct operations<boost::iostreams::mapped_file_source>
-    : detail::close_impl<closable_tag>
-{
-    static std::pair<char*, char*>
-    input_sequence(boost::iostreams::mapped_file_source& src)
-    {
-        return std::make_pair( const_cast<char*>(src.begin()),
-                               const_cast<char*>(src.end()) );
-    }
-};
-
-template<>
-struct operations<boost::iostreams::mapped_file_sink>
-    : detail::close_impl<closable_tag>
-{
-    static std::pair<char*, char*>
-    output_sequence(boost::iostreams::mapped_file_sink& sink)
-    { 
-        return std::make_pair(sink.begin(), sink.end()); 
-    }
-};
-
-template<>
-struct operations<boost::iostreams::mapped_file>
-    : detail::close_impl<closable_tag>
-{
-    static std::pair<char*, char*>
-    input_sequence(boost::iostreams::mapped_file& file)
-    { 
-        return std::make_pair(file.begin(), file.end()); 
-    }
-    static std::pair<char*, char*>
-    output_sequence(boost::iostreams::mapped_file& file)
-    { 
-        return std::make_pair(file.begin(), file.end()); 
-    }
-};
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
diff --git a/deal.II/contrib/boost/include/boost/math/special_functions/fpclassify.hpp b/deal.II/contrib/boost/include/boost/math/special_functions/fpclassify.hpp
deleted file mode 100644 (file)
index f2f0f75..0000000
+++ /dev/null
@@ -1,253 +0,0 @@
-//  Copyright John Maddock 2005-2006.
-//  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)
-
-#ifndef BOOST_MATH_FPCLASSIFY_HPP
-#define BOOST_MATH_FPCLASSIFY_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <math.h>
-#include <boost/config/no_tr1/cmath.hpp>
-#include <boost/limits.hpp>
-#include <boost/math/tools/real_cast.hpp>
-#include <boost/type_traits/is_floating_point.hpp>
-#include <boost/math/special_functions/math_fwd.hpp>
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#include <float.h>
-#endif
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-  namespace std{ using ::abs; using ::fabs; }
-#endif
-
-#ifndef FP_NORMAL
-
-#define FP_ZERO        0
-#define FP_NORMAL      1
-#define FP_INFINITE    2
-#define FP_NAN         3
-#define FP_SUBNORMAL   4
-
-#else
-
-#define BOOST_HAS_FPCLASSIFY
-
-#ifndef fpclassify
-#  if (defined(__GLIBCPP__) || defined(__GLIBCXX__)) \
-         && defined(_GLIBCXX_USE_C99_MATH) \
-         && !(defined(_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC) \
-         && (_GLIBCXX_USE_C99_FP_MACROS_DYNAMIC != 0))
-#     ifdef _STLP_VENDOR_CSTD 
-#        define BOOST_FPCLASSIFY_PREFIX ::_STLP_VENDOR_CSTD:: 
-#     else 
-#        define BOOST_FPCLASSIFY_PREFIX ::std::
-#     endif
-#  else
-#     undef BOOST_HAS_FPCLASSIFY
-#     define BOOST_FPCLASSIFY_PREFIX
-#  endif
-#elif (defined(__HP_aCC) && !defined(__hppa))
-// aCC 6 appears to do "#define fpclassify fpclassify" which messes us up a bit!
-#  define BOOST_FPCLASSIFY_PREFIX ::
-#else
-#  define BOOST_FPCLASSIFY_PREFIX
-#endif
-
-#ifdef __MINGW32__
-#  undef BOOST_HAS_FPCLASSIFY
-#endif
-
-#endif
-
-namespace boost{ 
-
-#if defined(BOOST_HAS_FPCLASSIFY) || defined(isnan)
-//
-// This must not be located in any namespace under boost::math
-// otherwise we can get into an infinite loop if isnan is
-// a #define for "isnan" !
-//
-namespace math_detail{
-
-template <class T>
-inline bool is_nan_helper(T t, const boost::true_type&)
-{
-#ifdef isnan
-   return isnan(t);
-#else // BOOST_HAS_FPCLASSIFY
-   return (BOOST_FPCLASSIFY_PREFIX fpclassify(t) == (int)FP_NAN);
-#endif
-}
-
-template <class T>
-inline bool is_nan_helper(T t, const boost::false_type&)
-{
-   return false;
-}
-
-}
-
-#endif // defined(BOOST_HAS_FPCLASSIFY) || defined(isnan)
-
-namespace math{
-
-namespace detail{
-
-template <class T>
-inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const mpl::true_&)
-{
-   // whenever possible check for Nan's first:
-#ifdef BOOST_HAS_FPCLASSIFY
-   if(::boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
-      return FP_NAN;
-#elif defined(isnan)
-   if(boost::math_detail::is_nan_helper(t, ::boost::is_floating_point<T>()))
-      return FP_NAN;
-#elif defined(_MSC_VER) || defined(__BORLANDC__)
-   if(::_isnan(boost::math::tools::real_cast<double>(t)))
-      return FP_NAN;
-#endif
-   // std::fabs broken on a few systems especially for long long!!!!
-   T at = (t < T(0)) ? -t : t;
-
-   // Use a process of exclusion to figure out
-   // what kind of type we have, this relies on
-   // IEEE conforming reals that will treat
-   // Nan's as unordered.  Some compilers
-   // don't do this once optimisations are
-   // turned on, hence the check for nan's above.
-   if(at <= (std::numeric_limits<T>::max)())
-   {
-      if(at >= (std::numeric_limits<T>::min)())
-         return FP_NORMAL;
-      return (at != 0) ? FP_SUBNORMAL : FP_ZERO;
-   }
-   else if(at > (std::numeric_limits<T>::max)())
-      return FP_INFINITE;
-   return FP_NAN;
-}
-
-template <class T>
-inline int fpclassify_imp BOOST_NO_MACRO_EXPAND(T t, const mpl::false_&)
-{
-   // 
-   // An unknown type with no numeric_limits support,
-   // so what are we supposed to do we do here?
-   //
-   return t == 0 ? FP_ZERO : FP_NORMAL;
-}
-
-}  // namespace detail
-
-template <class T>
-inline int fpclassify BOOST_NO_MACRO_EXPAND(T t)
-{
-#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
-   if(std::numeric_limits<T>::is_specialized)
-      return detail::fpclassify_imp(t, mpl::true_());
-   return detail::fpclassify_imp(t, mpl::false_());
-#else
-   return detail::fpclassify_imp(t, mpl::bool_< ::std::numeric_limits<T>::is_specialized>());
-#endif
-}
-
-#if defined(BOOST_HAS_FPCLASSIFY)
-inline int fpclassify BOOST_NO_MACRO_EXPAND(float t)
-{
-   return BOOST_FPCLASSIFY_PREFIX fpclassify(t);
-}
-inline int fpclassify BOOST_NO_MACRO_EXPAND(double t)
-{
-   return BOOST_FPCLASSIFY_PREFIX fpclassify(t);
-}
-#if !defined(__CYGWIN__) && !defined(__HP_aCC) && !defined(BOOST_INTEL) && !defined(BOOST_NO_NATIVE_LONG_DOUBLE_FP_CLASSIFY)
-// The native fpclassify broken for long doubles with aCC
-// use portable one instead....
-inline int fpclassify BOOST_NO_MACRO_EXPAND(long double t)
-{
-   return BOOST_FPCLASSIFY_PREFIX fpclassify(t);
-}
-#endif
-
-#elif defined(_MSC_VER)
-// This only works for type double, for both float
-// and long double it gives misleading answers.
-inline int fpclassify BOOST_NO_MACRO_EXPAND(double t)
-{
-   switch(::_fpclass(t))
-   {
-   case _FPCLASS_SNAN /* Signaling NaN */ :
-   case _FPCLASS_QNAN /* Quiet NaN */ :
-      return FP_NAN;
-   case _FPCLASS_NINF /*Negative infinity ( -INF) */ :
-   case _FPCLASS_PINF /* Positive infinity (+INF) */ :
-      return FP_INFINITE;
-   case _FPCLASS_NN /* Negative normalized non-zero */ :
-   case _FPCLASS_PN /* Positive normalized non-zero */ :
-      return FP_NORMAL;
-   case _FPCLASS_ND /* Negative denormalized */:
-   case _FPCLASS_PD /* Positive denormalized */ :
-      return FP_SUBNORMAL;
-   case _FPCLASS_NZ /* Negative zero ( - 0) */ :
-   case _FPCLASS_PZ /* Positive 0 (+0) */ :
-      return FP_ZERO;
-   default:
-      /**/ ;
-   }
-   return FP_NAN;  // should never get here!!!
-}
-#endif
-
-template <class T>
-inline bool isfinite BOOST_NO_MACRO_EXPAND(T z)
-{
-   int t = (::boost::math::fpclassify)(z);
-   return (t != (int)FP_NAN) && (t != (int)FP_INFINITE);
-}
-
-template <class T>
-inline bool isinf BOOST_NO_MACRO_EXPAND(T t)
-{
-   return (::boost::math::fpclassify)(t) == (int)FP_INFINITE;
-}
-
-template <class T>
-inline bool isnan BOOST_NO_MACRO_EXPAND(T t)
-{
-   return (::boost::math::fpclassify)(t) == (int)FP_NAN;
-}
-#ifdef isnan
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<float>(float t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<double>(double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<long double>(long double t){ return ::boost::math_detail::is_nan_helper(t, boost::true_type()); }
-#elif defined(BOOST_MSVC)
-#  pragma warning(push)
-#  pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' 
-#  pragma warning(disable: 4244) // conversion from 'long double' to 'double',
-// No possible loss of data because they are same size.
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<float>(float t){ return _isnan(t); }
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<double>(double t){ return _isnan(t); }
-template <> inline bool isnan BOOST_NO_MACRO_EXPAND<long double>(long double t){ return _isnan(t); }
-#pragma warning (pop)
-#endif
-
-template <class T>
-inline bool isnormal BOOST_NO_MACRO_EXPAND(T t)
-{
-   return (::boost::math::fpclassify)(t) == (int)FP_NORMAL;
-}
-
-} // namespace math
-} // namespace boost
-
-#endif // BOOST_MATH_FPCLASSIFY_HPP
-
-
-
-
-
diff --git a/deal.II/contrib/boost/include/boost/math/special_functions/sign.hpp b/deal.II/contrib/boost/include/boost/math/special_functions/sign.hpp
deleted file mode 100644 (file)
index 7ff4504..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-//  (C) Copyright John Maddock 2006.
-//  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)
-
-#ifndef BOOST_MATH_TOOLS_SIGN_HPP
-#define BOOST_MATH_TOOLS_SIGN_HPP
-
-#ifdef _MSC_VER
-#pragma once
-#endif
-
-#include <boost/math/tools/config.hpp>
-#include <boost/math/special_functions/math_fwd.hpp>
-
-namespace boost{ namespace math{ 
-
-template <class T>
-inline int sign BOOST_NO_MACRO_EXPAND(const T& z)
-{
-   return (z == 0) ? 0 : (z < 0) ? -1 : 1;
-}
-
-template <class T>
-inline int signbit BOOST_NO_MACRO_EXPAND(const T& z)
-{
-   return (z < 0) ? 1 : 0;
-}
-
-template <class T>
-inline T copysign BOOST_NO_MACRO_EXPAND(const T& x, const T& y)
-{
-   BOOST_MATH_STD_USING
-   return fabs(x) * boost::math::sign(y);
-}
-
-} // namespace math
-} // namespace boost
-
-
-#endif // BOOST_MATH_TOOLS_SIGN_HPP
-
-
diff --git a/deal.II/contrib/boost/include/boost/pending/property_serialize.hpp b/deal.II/contrib/boost/include/boost/pending/property_serialize.hpp
deleted file mode 100644 (file)
index 5ec9c98..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-//  (C) Copyright Jeremy Siek 2006
-//  Distributed under the Boost Software License, Version 1.0. (See
-//  accompanying file LICENSE_1_0.txt or copy at
-//  http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_PROPERTY_SERIALIZE_HPP
-#define BOOST_PROPERTY_SERIALIZE_HPP
-
-#include <boost/pending/property.hpp>
-
-#include <boost/serialization/base_object.hpp>
-#include <boost/serialization/nvp.hpp>
-
-namespace boost {
-  template<class Archive>
-  inline void serialize(Archive&, no_property&, const unsigned int) { }
-
-  template<class Archive, class Tag, class T, class Base>
-  void 
-  serialize(Archive& ar, property<Tag, T, Base>& prop, 
-            const unsigned int version) 
-  {
-    ar & serialization::make_nvp( "property_base" , boost::serialization::base_object<Base>(prop) );
-    ar & serialization::make_nvp( "property_value" , prop.m_value );
-  }
-} // end namespace boost
-
-#endif // BOOST_PROPERTY_SERIALIZE_HPP
diff --git a/deal.II/contrib/boost/include/boost/random/uniform_01.hpp b/deal.II/contrib/boost/include/boost/random/uniform_01.hpp
deleted file mode 100644 (file)
index 9f51d3e..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/* boost random/uniform_01.hpp header file
- *
- * Copyright Jens Maurer 2000-2001
- * 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)
- *
- * See http://www.boost.org for most recent version including documentation.
- *
- * $Id: uniform_01.hpp 41369 2007-11-25 18:07:19Z bemandawes $
- *
- * Revision history
- *  2001-02-18  moved to individual header files
- */
-
-#ifndef BOOST_RANDOM_UNIFORM_01_HPP
-#define BOOST_RANDOM_UNIFORM_01_HPP
-
-#include <iostream>
-#include <boost/config.hpp>
-#include <boost/limits.hpp>
-#include <boost/static_assert.hpp>
-
-namespace boost {
-
-// Because it is so commonly used: uniform distribution on the real [0..1)
-// range.  This allows for specializations to avoid a costly int -> float
-// conversion plus float multiplication
-template<class UniformRandomNumberGenerator, class RealType = double>
-class uniform_01
-{
-public:
-  typedef UniformRandomNumberGenerator base_type;
-  typedef RealType result_type;
-
-  BOOST_STATIC_CONSTANT(bool, has_fixed_range = false);
-
-#if !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) && !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300)
-  BOOST_STATIC_ASSERT(!std::numeric_limits<RealType>::is_integer);
-#endif
-
-  explicit uniform_01(base_type rng)
-    : _rng(rng),
-      _factor(result_type(1) /
-              (result_type((_rng.max)()-(_rng.min)()) +
-               result_type(std::numeric_limits<base_result>::is_integer ? 1 : 0)))
-  {
-  }
-  // compiler-generated copy ctor and copy assignment are fine
-
-  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(0); }
-  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return result_type(1); }
-  base_type& base() { return _rng; }
-  const base_type& base() const { return _rng; }
-  void reset() { }
-
-  result_type operator()() {
-    for (;;) {
-      result_type result = result_type(_rng() - (_rng.min)()) * _factor;
-      if (result < result_type(1))
-       return result;
-    }
-  }
-
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
-  template<class CharT, class Traits>
-  friend std::basic_ostream<CharT,Traits>&
-  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_01& u)
-  {
-    os << u._rng;
-    return os;
-  }
-
-  template<class CharT, class Traits>
-  friend std::basic_istream<CharT,Traits>&
-  operator>>(std::basic_istream<CharT,Traits>& is, uniform_01& u)
-  {
-    is >> u._rng;
-    return is;
-  }
-#endif
-
-private:
-  typedef typename base_type::result_type base_result;
-  base_type _rng;
-  result_type _factor;
-};
-
-#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
-//  A definition is required even for integral static constants
-template<class UniformRandomNumberGenerator, class RealType>
-const bool uniform_01<UniformRandomNumberGenerator, RealType>::has_fixed_range;
-#endif
-
-} // namespace boost
-
-#endif // BOOST_RANDOM_UNIFORM_01_HPP
diff --git a/deal.II/contrib/boost/include/boost/random/uniform_int.hpp b/deal.II/contrib/boost/include/boost/random/uniform_int.hpp
deleted file mode 100644 (file)
index fb6a8f3..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/* boost random/uniform_int.hpp header file
- *
- * Copyright Jens Maurer 2000-2001
- * 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)
- *
- * See http://www.boost.org for most recent version including documentation.
- *
- * $Id: uniform_int.hpp 47233 2008-07-08 16:22:46Z steven_watanabe $
- *
- * Revision history
- *  2001-04-08  added min<max assertion (N. Becker)
- *  2001-02-18  moved to individual header files
- */
-
-#ifndef BOOST_RANDOM_UNIFORM_INT_HPP
-#define BOOST_RANDOM_UNIFORM_INT_HPP
-
-#include <cassert>
-#include <iostream>
-#include <boost/config.hpp>
-#include <boost/limits.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/detail/workaround.hpp>
-#include <boost/random/uniform_smallint.hpp>
-#include <boost/random/detail/signed_unsigned_tools.hpp>
-#include <boost/type_traits/make_unsigned.hpp>
-#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
-#include <boost/type_traits/is_float.hpp>
-#endif
-
-namespace boost {
-
-// uniform integer distribution on [min, max]
-template<class IntType = int>
-class uniform_int
-{
-public:
-  typedef IntType input_type;
-  typedef IntType result_type;
-  typedef typename make_unsigned<result_type>::type range_type;
-
-  explicit uniform_int(IntType min_arg = 0, IntType max_arg = 9)
-    : _min(min_arg), _max(max_arg)
-  {
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
-    // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope
-    BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);
-#endif
-    assert(min_arg <= max_arg);
-    init();
-  }
-
-  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
-  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
-  void reset() { }
-  
-  // can't have member function templates out-of-line due to MSVC bugs
-  template<class Engine>
-  result_type operator()(Engine& eng)
-  {
-    typedef typename Engine::result_type base_result;
-    // ranges are always unsigned
-    typedef typename make_unsigned<base_result>::type base_unsigned;
-    const base_result bmin = (eng.min)();
-    const base_unsigned brange =
-      random::detail::subtract<base_result>()((eng.max)(), (eng.min)());
-
-    if(_range == 0) {
-      return _min;    
-    } else if(brange == _range) {
-      // this will probably never happen in real life
-      // basically nothing to do; just take care we don't overflow / underflow
-      base_unsigned v = random::detail::subtract<base_result>()(eng(), bmin);
-      return random::detail::add<base_unsigned, result_type>()(v, _min);
-    } else if(brange < _range) {
-      // use rejection method to handle things like 0..3 --> 0..4
-      for(;;) {
-        // concatenate several invocations of the base RNG
-        // take extra care to avoid overflows
-        range_type limit;
-        if(_range == (std::numeric_limits<range_type>::max)()) {
-          limit = _range/(range_type(brange)+1);
-          if(_range % range_type(brange)+1 == range_type(brange))
-            ++limit;
-        } else {
-          limit = (_range+1)/(range_type(brange)+1);
-        }
-        // We consider "result" as expressed to base (brange+1):
-        // For every power of (brange+1), we determine a random factor
-        range_type result = range_type(0);
-        range_type mult = range_type(1);
-        while(mult <= limit) {
-          result += random::detail::subtract<base_result>()(eng(), bmin) * mult;
-          mult *= range_type(brange)+range_type(1);
-        }
-        if(mult == limit)
-          // _range+1 is an integer power of brange+1: no rejections required
-          return result;
-        // _range/mult < brange+1  -> no endless loop
-        result += uniform_int<range_type>(0, _range/mult)(eng) * mult;
-        if(result <= _range)
-          return random::detail::add<range_type, result_type>()(result, _min);
-      }
-    } else {                   // brange > range
-      if(brange / _range > 4 /* quantization_cutoff */ ) {
-        // the new range is vastly smaller than the source range,
-        // so quantization effects are not relevant
-        return boost::uniform_smallint<result_type>(_min, _max)(eng);
-      } else {
-        // use rejection method to handle cases like 0..5 -> 0..4
-        for(;;) {
-          base_unsigned result =
-           random::detail::subtract<base_result>()(eng(), bmin);
-          // result and range are non-negative, and result is possibly larger
-          // than range, so the cast is safe
-          if(result <= static_cast<base_unsigned>(_range))
-            return random::detail::add<base_unsigned, result_type>()(result, _min);
-        }
-      }
-    }
-  }
-
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
-  template<class CharT, class Traits>
-  friend std::basic_ostream<CharT,Traits>&
-  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_int& ud)
-  {
-    os << ud._min << " " << ud._max;
-    return os;
-  }
-
-  template<class CharT, class Traits>
-  friend std::basic_istream<CharT,Traits>&
-  operator>>(std::basic_istream<CharT,Traits>& is, uniform_int& ud)
-  {
-# if BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(13102292)) && BOOST_MSVC == 1400
-      return detail::extract_uniform_int(is, ud, ud.impl);
-# else
-   is >> std::ws >> ud._min >> std::ws >> ud._max;
-    ud.init();
-    return is;
-# endif
-  }
-#endif
-
-private:
-  void init()
-  {
-    _range = random::detail::subtract<result_type>()(_max, _min);
-  }
-
-  // The result_type may be signed or unsigned, but the _range is always
-  // unsigned.
-  result_type _min, _max;
-  range_type _range;
-};
-
-} // namespace boost
-
-#endif // BOOST_RANDOM_UNIFORM_INT_HPP
diff --git a/deal.II/contrib/boost/include/boost/random/uniform_smallint.hpp b/deal.II/contrib/boost/include/boost/random/uniform_smallint.hpp
deleted file mode 100644 (file)
index 1f00fe7..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-/* boost random/uniform_smallint.hpp header file
- *
- * Copyright Jens Maurer 2000-2001
- * 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)
- *
- * See http://www.boost.org for most recent version including documentation.
- *
- * $Id: uniform_smallint.hpp 47233 2008-07-08 16:22:46Z steven_watanabe $
- *
- * Revision history
- *  2001-04-08  added min<max assertion (N. Becker)
- *  2001-02-18  moved to individual header files
- */
-
-#ifndef BOOST_RANDOM_UNIFORM_SMALLINT_HPP
-#define BOOST_RANDOM_UNIFORM_SMALLINT_HPP
-
-#include <cassert>
-#include <iostream>
-#include <boost/config.hpp>
-#include <boost/limits.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/random/uniform_01.hpp>
-#include <boost/detail/workaround.hpp>
-#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
-#include <boost/type_traits/is_float.hpp>
-#endif
-
-
-namespace boost {
-
-// uniform integer distribution on a small range [min, max]
-
-namespace detail {
-
-template <class InputStream, class UniformInt, class Impl>
-InputStream& extract_uniform_int(InputStream& is, UniformInt& ud, Impl& impl)
-{
-    typename UniformInt::result_type min, max;
-    is >> std::ws >> min >> std::ws >> max;
-    impl.set(min, max);
-    return is;
-}
-
-template<class UniformRandomNumberGenerator, class IntType>
-struct uniform_smallint_integer
-{
-public:
-  typedef UniformRandomNumberGenerator base_type;
-  typedef IntType result_type;
-
-  uniform_smallint_integer(base_type & rng, IntType min_arg, IntType max_arg)
-    : _rng(&rng)
-  { set(min_arg, max_arg); }
-
-  void set(result_type min, result_type max);
-  
-  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
-  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
-  base_type& base() const { return *_rng; }
-  
-  result_type operator()()
-  {
-    // we must not use the low bits here, because LCGs get very bad then
-    return (((*_rng)() - (_rng->min)()) / _factor) % _range + _min;
-  }
-
-private:
-  typedef typename base_type::result_type base_result;
-  base_type * _rng;
-  IntType _min, _max;
-  base_result _range;
-  base_result _factor;
-};
-
-template<class UniformRandomNumberGenerator, class IntType>
-void uniform_smallint_integer<UniformRandomNumberGenerator, IntType>::
-set(result_type min_arg, result_type max_arg) 
-{
-  _min = min_arg;
-  _max = max_arg;
-  assert(min_arg <= max_arg);
-
-  _range = static_cast<base_result>(_max-_min)+1;
-  _factor = 1;
-  
-  // LCGs get bad when only taking the low bits.
-  // (probably put this logic into a partial template specialization)
-  // Check how many low bits we can ignore before we get too much
-  // quantization error.
-  base_result r_base = (_rng->max)() - (_rng->min)();
-  if(r_base == (std::numeric_limits<base_result>::max)()) {
-    _factor = 2;
-    r_base /= 2;
-  }
-  r_base += 1;
-  if(r_base % _range == 0) {
-    // No quantization effects, good
-    _factor = r_base / _range;
-  } else {
-    // carefully avoid overflow; pessimizing heree
-    for( ; r_base/_range/32 >= _range; _factor *= 2)
-      r_base /= 2;
-  }
-}
-
-template<class UniformRandomNumberGenerator, class IntType>
-class uniform_smallint_float
-{
-public:
-  typedef UniformRandomNumberGenerator base_type;
-  typedef IntType result_type;
-
-  uniform_smallint_float(base_type & rng, IntType min_arg, IntType max_arg)
-    : _rng(rng)
-  {
-    // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope
-#if !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS) && !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300)
-    BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);
-    BOOST_STATIC_ASSERT(!std::numeric_limits<typename base_type::result_type>::is_integer);
-#endif
-
-    assert(min_arg <= max_arg);
-    set(min_arg, max_arg);
-  }
-
-  void set(result_type min_arg, result_type max_arg)
-  {
-    _min = min_arg;
-    _max = max_arg;
-    _range = static_cast<base_result>(_max-_min)+1;
-  }
-
-  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
-  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
-  base_type& base() const { return _rng.base(); }
-
-  result_type operator()()
-  {
-    return static_cast<IntType>(_rng() * _range) + _min;
-  }
-
-private:
-  typedef typename base_type::result_type base_result;
-  uniform_01<base_type> _rng;
-  IntType _min, _max;
-  base_result _range;
-};
-
-
-} // namespace detail
-
-
-
-
-template<class IntType = int>
-class uniform_smallint
-{
-public:
-  typedef IntType input_type;
-  typedef IntType result_type;
-
-  explicit uniform_smallint(IntType min_arg = 0, IntType max_arg = 9)
-    : _min(min_arg), _max(max_arg)
-  {
-#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
-    // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope
-    BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);
-#endif
- }
-
-  result_type min BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _min; }
-  result_type max BOOST_PREVENT_MACRO_SUBSTITUTION () const { return _max; }
-  void reset() { }
-
-  template<class Engine>
-  result_type operator()(Engine& eng)
-  {
-    typedef typename Engine::result_type base_result;
-    base_result _range = static_cast<base_result>(_max-_min)+1;
-    base_result _factor = 1;
-    
-    // LCGs get bad when only taking the low bits.
-    // (probably put this logic into a partial template specialization)
-    // Check how many low bits we can ignore before we get too much
-    // quantization error.
-    base_result r_base = (eng.max)() - (eng.min)();
-    if(r_base == (std::numeric_limits<base_result>::max)()) {
-      _factor = 2;
-      r_base /= 2;
-    }
-    r_base += 1;
-    if(r_base % _range == 0) {
-      // No quantization effects, good
-      _factor = r_base / _range;
-    } else {
-      // carefully avoid overflow; pessimizing heree
-      for( ; r_base/_range/32 >= _range; _factor *= 2)
-        r_base /= 2;
-    }
-
-    return ((eng() - (eng.min)()) / _factor) % _range + _min;
-  }
-
-#if !defined(BOOST_NO_OPERATORS_IN_NAMESPACE) && !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)
-  template<class CharT, class Traits>
-  friend std::basic_ostream<CharT,Traits>&
-  operator<<(std::basic_ostream<CharT,Traits>& os, const uniform_smallint& ud)
-  {
-    os << ud._min << " " << ud._max;
-    return os;
-  }
-
-  template<class CharT, class Traits>
-  friend std::basic_istream<CharT,Traits>&
-  operator>>(std::basic_istream<CharT,Traits>& is, uniform_smallint& ud)
-  {
-# if BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(13102292)) && BOOST_MSVC > 1300
-      return detail::extract_uniform_int(is, ud, ud._impl);
-# else
-    is >> std::ws >> ud._min >> std::ws >> ud._max;
-    return is;
-# endif
-  }
-#endif
-
-private:
-  result_type _min;
-  result_type _max;
-};
-
-} // namespace boost
-
-#endif // BOOST_RANDOM_UNIFORM_SMALLINT_HPP
diff --git a/deal.II/contrib/boost/include/boost/static_warning.hpp b/deal.II/contrib/boost/include/boost/static_warning.hpp
deleted file mode 100644 (file)
index 24a662a..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef BOOST_STATIC_WARNING_HPP
-#define BOOST_STATIC_WARNING_HPP
-
-//  (C) Copyright Robert Ramey 2003. Jonathan Turkanis 2004.
-// Use, modification and distribution is subject to the Boost Software
-// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
-// MS compatible compilers support #pragma once
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-// http://www.boost.org/LICENSE_1_0.txt)
-
-//  See http://www.boost.org/libs/static_assert for documentation.
-
-/*
- Revision history:
-   15 June  2003 - Initial version.
-   31 March 2004 - improved diagnostic messages and portability 
-                   (Jonathan Turkanis)
-   03 April 2004 - works on VC6 at class and namespace scope
-                 - ported to DigitalMars
-                 - static warnings disabled by default; when enabled,
-                   uses pragmas to enable required compiler warnings
-                   on MSVC, Intel, Metrowerks and Borland 5.x.
-                   (Jonathan Turkanis)
-   30 May 2004   - tweaked for msvc 7.1 and gcc 3.3
-                 - static warnings ENabled by default; when enabled,
-                   (Robert Ramey)
-*/
-
-#include <boost/config.hpp>
-
-//
-// Implementation
-// Makes use of the following warnings:
-//  1. GCC prior to 3.3: division by zero.
-//  2. BCC 6.0 preview: unreferenced local variable.
-//  3. DigitalMars: returning address of local automatic variable.
-//  4. VC6: class previously seen as struct (as in 'boost/mpl/print.hpp')
-//  5. All others: deletion of pointer to incomplete type.
-//
-// The trick is to find code which produces warnings containing the name of
-// a structure or variable. Details, with same numbering as above:
-// 1. static_warning_impl<B>::value is zero iff B is false, so diving an int
-//    by this value generates a warning iff B is false.
-// 2. static_warning_impl<B>::type has a constructor iff B is true, so an
-//    unreferenced variable of this type generates a warning iff B is false.
-// 3. static_warning_impl<B>::type overloads operator& to return a dynamically
-//    allocated int pointer only is B is true, so  returning the address of an
-//    automatic variable of this type generates a warning iff B is fasle.
-// 4. static_warning_impl<B>::STATIC_WARNING is decalred as a struct iff B is 
-//    false. 
-// 5. static_warning_impl<B>::type is incomplete iff B is false, so deleting a
-//    pointer to this type generates a warning iff B is false.
-//
-
-//------------------Enable selected warnings----------------------------------//
-
-// Enable the warnings relied on by BOOST_STATIC_WARNING, where possible. The 
-// only pragma which is absolutely necessary here is for Borland 5.x, since 
-// W8073 is disabled by default. If enabling selected warnings is considered 
-// unacceptable, this section can be replaced with:
-//   #if defined(__BORLANDC__) && (__BORLANDC__ <= 0x600)
-//    pragma warn +stu
-//   #endif
-
-# if defined(BOOST_MSVC)
-#  pragma warning(2:4150) // C4150: deletion of pointer to incomplete type 'type'.
-# elif defined(BOOST_INTEL) && (defined(__WIN32__) || defined(WIN32))
-#  pragma warning(2:457) // #457: delete of pointer to incomplete class.
-# elif defined(__BORLANDC__) && (__BORLANDC__ <= 0x600)
-#  pragma warn +stu  // W8073: Undefined structure 'structure'.
-# elif defined(__MWERKS__)
-#  pragma extended_errorcheck on // Enable 'extended error checking'.
-# endif
-
-//------------------Configure-------------------------------------------------//
-
-# if defined(__BORLANDC__) && (__BORLANDC__ >= 0x600)
-#  define BOOST_HAS_DESCRIPTIVE_UNREFERENCED_VARIABLE_WARNING
-# elif defined(__GNUC__) && !defined(BOOST_INTEL) // && (__GNUC__ * 100 + __GNUC_MINOR__ <= 302)
-#  define BOOST_HAS_DESCRIPTIVE_DIVIDE_BY_ZERO_WARNING
-# elif defined(__DMC__)
-#  define BOOST_HAS_DESCRIPTIVE_RETURNING_ADDRESS_OF_TEMPORARY_WARNING
-# elif defined(BOOST_MSVC) // && (BOOST_MSVC < 1300)
-#  define BOOST_NO_PREDEFINED_LINE_MACRO
-#  pragma warning(disable:4094) // C4094: untagged 'stuct' declared no symbols
-#endif
-
-//------------------Helper templates------------------------------------------//
-
-namespace boost {
-
-struct STATIC_WARNING;
-
-template<bool>
-struct static_warning_impl;
-
-template<>
-struct static_warning_impl<false> {
-    enum { value = 0 };
-    #if !defined(BOOST_HAS_DESCRIPTIVE_UNREFERENCED_VARIABLE_WARNING) && \
-        !defined(BOOST_HAS_DESCRIPTIVE_RETURNING_ADDRESS_OF_TEMPORARY_WARNING)
-        typedef boost::STATIC_WARNING type;
-    #else
-        typedef int type;
-    #endif
-    #if defined(BOOST_NO_PREDEFINED_LINE_MACRO)
-        struct STATIC_WARNING { };
-    #endif
-};
-
-template<>
-struct static_warning_impl<true> {
-    enum { value = 1 };
-    struct type { type() { } int* operator&() { return new int; } };
-    #if defined(BOOST_NO_PREDEFINED_LINE_MACRO)
-        class STATIC_WARNING { };
-    #endif
-};
-
-} // namespace boost
-
-//------------------Definition of BOOST_STATIC_WARNING------------------------//
-
-#if defined(BOOST_HAS_DESCRIPTIVE_UNREFERENCED_VARIABLE_WARNING)
-#    define BOOST_STATIC_WARNING_IMPL(B)                   \
-     struct BOOST_JOIN(STATIC_WARNING, __LINE__) {         \
-       void f() {                                          \
-           ::boost::static_warning_impl<(bool)( B )>::type \
-           STATIC_WARNING;                                 \
-       }                                                   \
-     }                                                     \
-     /**/
-#elif defined(BOOST_HAS_DESCRIPTIVE_RETURNING_ADDRESS_OF_TEMPORARY_WARNING)
-#    define BOOST_STATIC_WARNING_IMPL(B)                        \
-     struct BOOST_JOIN(STATIC_WARNING, __LINE__) {              \
-        int* f() {                                              \
-            ::boost::static_warning_impl<(bool)( B )>::type     \
-            STATIC_WARNING;                                     \
-            return &STATIC_WARNING;                             \
-        }                                                       \
-     }                                                          \
-     /**/
-#elif defined(BOOST_HAS_DESCRIPTIVE_DIVIDE_BY_ZERO_WARNING)
-#    define BOOST_STATIC_WARNING_IMPL(B)                             \
-     struct BOOST_JOIN(STATIC_WARNING, __LINE__) {                   \
-         int f() { int STATIC_WARNING = 1;                           \
-                   return STATIC_WARNING /                           \
-                   boost::static_warning_impl<(bool)( B )>::value; } \
-     }                                                               \
-     /**/
-#elif defined(BOOST_NO_PREDEFINED_LINE_MACRO) 
-     // VC6; __LINE__ macro broken when -ZI is used see Q199057, so 
-     // non-conforming workaround is used.
-#    define BOOST_STATIC_WARNING_IMPL(B)                       \
-     struct {                                                  \
-        struct S {                                             \
-            typedef boost::static_warning_impl<(bool)( B )> f; \
-            friend class f::STATIC_WARNING;                    \
-        };                                                     \
-     }                                                         \
-     /**/
-#else // Deletion of pointer to incomplete type.
-#    define BOOST_STATIC_WARNING_IMPL(B)                     \
-     struct BOOST_JOIN(STATIC_WARNING, __LINE__) {           \
-         ::boost::static_warning_impl<(bool)( B )>::type* p; \
-         void f() { delete p; }                              \
-     }                                                       \
-     /**/
-#endif
-
-#ifndef BOOST_DISABLE_STATIC_WARNINGS
-# define BOOST_STATIC_WARNING(B) BOOST_STATIC_WARNING_IMPL(B)
-#else // #ifdef BOOST_ENABLE_STATIC_WARNINGS //-------------------------------//
-# define BOOST_STATIC_WARNING(B) BOOST_STATIC_WARNING_IMPL(true)
-#endif
-
-#endif // BOOST_STATIC_WARNING_HPP
diff --git a/deal.II/contrib/boost/include/boost/thread/exceptions.hpp b/deal.II/contrib/boost/include/boost/thread/exceptions.hpp
deleted file mode 100644 (file)
index 49e244f..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (C) 2001-2003
-// William E. Kempf
-// Copyright (C) 2007-8 Anthony Williams
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#ifndef BOOST_THREAD_EXCEPTIONS_PDM070801_H
-#define BOOST_THREAD_EXCEPTIONS_PDM070801_H
-
-#include <boost/thread/detail/config.hpp>
-
-//  pdm: Sorry, but this class is used all over the place & I end up
-//       with recursive headers if I don't separate it
-//  wek: Not sure why recursive headers would cause compilation problems
-//       given the include guards, but regardless it makes sense to
-//       seperate this out any way.
-
-#include <string>
-#include <stdexcept>
-
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost
-{
-
-    class BOOST_THREAD_DECL thread_interrupted
-    {};
-
-class BOOST_THREAD_DECL thread_exception : public std::exception
-{
-protected:
-    thread_exception();
-    thread_exception(int sys_err_code);
-
-public:
-    ~thread_exception() throw();
-
-    int native_error() const;
-
-private:
-    int m_sys_err;
-};
-
-    class condition_error:
-        public std::exception
-    {
-    public:
-        const char* what() const throw()
-        {
-            return "Condition error";
-        }
-    };
-    
-
-class BOOST_THREAD_DECL lock_error : public thread_exception
-{
-public:
-    lock_error();
-    lock_error(int sys_err_code);
-    ~lock_error() throw();
-
-    virtual const char* what() const throw();
-};
-
-class BOOST_THREAD_DECL thread_resource_error : public thread_exception
-{
-public:
-    thread_resource_error();
-    thread_resource_error(int sys_err_code);
-    ~thread_resource_error() throw();
-
-    virtual const char* what() const throw();
-};
-
-class BOOST_THREAD_DECL unsupported_thread_option : public thread_exception
-{
-public:
-    unsupported_thread_option();
-    unsupported_thread_option(int sys_err_code);
-    ~unsupported_thread_option() throw();
-
-    virtual const char* what() const throw();
-};
-
-class BOOST_THREAD_DECL invalid_thread_argument : public thread_exception
-{
-public:
-    invalid_thread_argument();
-    invalid_thread_argument(int sys_err_code);
-    ~invalid_thread_argument() throw();
-
-    virtual const char* what() const throw();
-};
-
-class BOOST_THREAD_DECL thread_permission_error : public thread_exception
-{
-public:
-    thread_permission_error();
-    thread_permission_error(int sys_err_code);
-    ~thread_permission_error() throw();
-
-    virtual const char* what() const throw();
-};
-
-} // namespace boost
-
-#include <boost/config/abi_suffix.hpp>
-
-#endif // BOOST_THREAD_CONFIG_PDM070801_H
-
-// Change log:
-//    3 Jan 03  WEKEMPF Modified for DLL implementation.
-
diff --git a/deal.II/contrib/boost/include/boost/vector_property_map.hpp b/deal.II/contrib/boost/include/boost/vector_property_map.hpp
deleted file mode 100644 (file)
index ab619de..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (C) Vladimir Prus 2003.
-// 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)
-//
-// See http://www.boost.org/libs/graph/vector_property_map.html for
-// documentation.
-//
-
-#ifndef VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
-#define VECTOR_PROPERTY_MAP_HPP_VP_2003_03_04
-
-#include <boost/property_map.hpp>
-#include <boost/shared_ptr.hpp>
-#include <vector>
-
-namespace boost {
-    template<typename T, typename IndexMap = identity_property_map>
-    class vector_property_map
-        : public boost::put_get_helper< 
-              typename std::iterator_traits< 
-                  typename std::vector<T>::iterator >::reference,
-              vector_property_map<T, IndexMap> >
-    {
-    public:
-        typedef typename property_traits<IndexMap>::key_type  key_type;
-        typedef T value_type;
-        typedef typename std::iterator_traits< 
-            typename std::vector<T>::iterator >::reference reference;
-        typedef boost::lvalue_property_map_tag category;
-        
-        vector_property_map(const IndexMap& index = IndexMap())
-        : store(new std::vector<T>()), index(index)
-        {}
-
-        vector_property_map(unsigned initial_size, 
-                            const IndexMap& index = IndexMap())
-        : store(new std::vector<T>(initial_size)), index(index)
-        {}
-
-        typename std::vector<T>::iterator storage_begin()
-        {
-            return store->begin();
-        }
-
-        typename std::vector<T>::iterator storage_end()
-        {
-            return store->end();
-        }
-
-        typename std::vector<T>::const_iterator storage_begin() const
-        {
-            return store->begin();
-        }
-
-        typename std::vector<T>::const_iterator storage_end() const
-        {
-            return store->end();
-        }
-                           
-    public:
-        // Copy ctor absent, default semantics is OK.
-        // Assignment operator absent, default semantics is OK.
-        // CONSIDER: not sure that assignment to 'index' is correct.
-        
-        reference operator[](const key_type& v) const {
-            typename property_traits<IndexMap>::value_type i = get(index, v);
-            if (static_cast<unsigned>(i) >= store->size()) {
-                store->resize(i + 1, T());
-            }
-            return (*store)[i];
-        }
-    private:
-        // Conceptually, we have a vector of infinite size. For practical 
-        // purposes, we start with an empty vector and grow it as needed.
-        // Note that we cannot store pointer to vector here -- we cannot
-        // store pointer to data, because if copy of property map resizes
-        // the vector, the pointer to data will be invalidated. 
-        // I wonder if class 'pmap_ref' is simply needed.
-        shared_ptr< std::vector<T> > store;        
-        IndexMap index;
-    };
-    
-    template<typename T, typename IndexMap>
-    vector_property_map<T, IndexMap>
-    make_vector_property_map(IndexMap index)
-    {
-        return vector_property_map<T, IndexMap>(index);
-    }
-}
-
-#endif
diff --git a/deal.II/contrib/boost/libs/thread/src/pthread/exceptions.cpp b/deal.II/contrib/boost/libs/thread/src/pthread/exceptions.cpp
deleted file mode 100644 (file)
index 8881303..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (C) 2001-2003
-// William E. Kempf
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/thread/detail/config.hpp>
-
-#include <boost/thread/exceptions.hpp>
-#include <cstring>
-#include <string>
-
-namespace boost {
-
-thread_exception::thread_exception()
-    : m_sys_err(0)
-{
-}
-
-thread_exception::thread_exception(int sys_err_code)
-    : m_sys_err(sys_err_code)
-{
-}
-
-thread_exception::~thread_exception() throw()
-{
-}
-
-int thread_exception::native_error() const
-{
-    return m_sys_err; 
-}
-
-lock_error::lock_error()
-{
-}
-
-lock_error::lock_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-lock_error::~lock_error() throw()
-{
-}
-
-const char* lock_error::what() const throw()
-{
-    return "boost::lock_error";
-}
-
-thread_resource_error::thread_resource_error()
-{
-}
-
-thread_resource_error::thread_resource_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-thread_resource_error::~thread_resource_error() throw()
-{
-}
-
-const char* thread_resource_error::what() const throw()
-{
-    return "boost::thread_resource_error";
-}
-
-unsupported_thread_option::unsupported_thread_option()
-{
-}
-
-unsupported_thread_option::unsupported_thread_option(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-unsupported_thread_option::~unsupported_thread_option() throw()
-{
-}
-
-const char* unsupported_thread_option::what() const throw()
-{
-    return "boost::unsupported_thread_option";
-}
-
-invalid_thread_argument::invalid_thread_argument()
-{
-}
-
-invalid_thread_argument::invalid_thread_argument(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-invalid_thread_argument::~invalid_thread_argument() throw()
-{
-}
-
-const char* invalid_thread_argument::what() const throw()
-{
-    return "boost::invalid_thread_argument";
-}
-
-thread_permission_error::thread_permission_error()
-{
-}
-
-thread_permission_error::thread_permission_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-thread_permission_error::~thread_permission_error() throw()
-{
-}
-
-const char* thread_permission_error::what() const throw()
-{
-    return "boost::thread_permission_error";
-}
-
-} // namespace boost
diff --git a/deal.II/contrib/boost/libs/thread/src/win32/exceptions.cpp b/deal.II/contrib/boost/libs/thread/src/win32/exceptions.cpp
deleted file mode 100644 (file)
index 8881303..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (C) 2001-2003
-// William E. Kempf
-//
-//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
-//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-#include <boost/thread/detail/config.hpp>
-
-#include <boost/thread/exceptions.hpp>
-#include <cstring>
-#include <string>
-
-namespace boost {
-
-thread_exception::thread_exception()
-    : m_sys_err(0)
-{
-}
-
-thread_exception::thread_exception(int sys_err_code)
-    : m_sys_err(sys_err_code)
-{
-}
-
-thread_exception::~thread_exception() throw()
-{
-}
-
-int thread_exception::native_error() const
-{
-    return m_sys_err; 
-}
-
-lock_error::lock_error()
-{
-}
-
-lock_error::lock_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-lock_error::~lock_error() throw()
-{
-}
-
-const char* lock_error::what() const throw()
-{
-    return "boost::lock_error";
-}
-
-thread_resource_error::thread_resource_error()
-{
-}
-
-thread_resource_error::thread_resource_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-thread_resource_error::~thread_resource_error() throw()
-{
-}
-
-const char* thread_resource_error::what() const throw()
-{
-    return "boost::thread_resource_error";
-}
-
-unsupported_thread_option::unsupported_thread_option()
-{
-}
-
-unsupported_thread_option::unsupported_thread_option(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-unsupported_thread_option::~unsupported_thread_option() throw()
-{
-}
-
-const char* unsupported_thread_option::what() const throw()
-{
-    return "boost::unsupported_thread_option";
-}
-
-invalid_thread_argument::invalid_thread_argument()
-{
-}
-
-invalid_thread_argument::invalid_thread_argument(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-invalid_thread_argument::~invalid_thread_argument() throw()
-{
-}
-
-const char* invalid_thread_argument::what() const throw()
-{
-    return "boost::invalid_thread_argument";
-}
-
-thread_permission_error::thread_permission_error()
-{
-}
-
-thread_permission_error::thread_permission_error(int sys_err_code)
-    : thread_exception(sys_err_code)
-{
-}
-
-thread_permission_error::~thread_permission_error() throw()
-{
-}
-
-const char* thread_permission_error::what() const throw()
-{
-    return "boost::thread_permission_error";
-}
-
-} // namespace boost

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.